from flask import Flask, request, jsonify
import requests

app = Flask(name)

KOBOLD_URL = "http://localhost:5001/api/v1/generate" # Убедись, что этот адрес совпадает с тем, на котором работает KoboldCpp

def build_prompt(text, gender):
gender_note = {
"male": "Перевод выполняется в мужском роде.",
"female": "Перевод выполняется в женском роде."
}.get(gender, "")

prompt = f"""### Instruction:

Translate the following text to Russian.
Keep <tags>, numbers, and line breaks exactly as they are. Do not add any new ones.

  • Перевод должен быть дословным, в стиле официальной русской локализации Skyrim.
  • Не добавляй ничего от себя.
  • Переводи "you" как "ты".
  • {gender_note}
  • Используй официальные переводы имён и мест:
    Whiterun = Вайтран, Solitude = Солитьюд, Windhelm = Виндхельм, Riften = Рифтен, Solstheim = Солстхейм,
    Ulfric Stormcloak = Ульфрик Буревестник, Elisif the Fair = Элисиф Прекрасная,
    Talos = Талос, Sovngarde = Совнгард, College of Winterhold = Коллегия Винтерхолда,
    Dark Brotherhood = Тёмное Братство, Alduin = Алдуин, Paarthurnax = Партурнакс,
    Thalmor = Талмор, Delphine = Делфина, jarl = ярл, Thane = тан,
    Draugr = драугр, Forsworn = изгой, Falmer = фалмер, Housecarl = хускарл, Companions = Соратники, Stormcloak = Братья Бури.

TEXT:
{text}

Ответ должен содержать только переведённый текст — без комментариев и пояснений.
"""
return prompt

@app.route("/v1/chat/completions", methods=["POST"])
def chat_completions():
data = request.get_json()

try:
    user_message = data["messages"][-1]["content"]
except (KeyError, IndexError):
    return jsonify({"error": "Invalid request format"}), 400

# Здесь можно вручную установить род, или извлекать из чего-то
gender = "male"  # по умолчанию
prompt = build_prompt(user_message, gender)

kobold_payload = {
    "prompt": prompt,
    "n": 1,
    "max_context_length": 2048,
    "max_length": 700,
    "rep_pen": 1.05,
    "rep_pen_range": 360,
    "rep_pen_slope": 0.7,
    "sampler_order": [6, 0, 1, 3, 4, 2, 5],
    "temperature": 0.4,
    "top_p": 0.95,
    "top_k": 80,
    "top_a": 0,
    "typical": 1,
    "tfs": 1,
    "trim_stop": True,
    "min_p": 0,
    "dynatemp_range": 0,
    "dynatemp_exponent": 1,
    "smoothing_factor": 0,
    "banned_tokens": [],
    "presence_penalty": 0,
    "logit_bias": {},
    "stop_sequence": ["###", "\n\n"]
}

try:
    response = requests.post(KOBOLD_URL, json=kobold_payload)
    response.raise_for_status()
    result = response.json()

    translated_text = result["results"][0]["text"].strip()

    return jsonify({
        "id": "chatcmpl-local",
        "object": "chat.completion",
        "choices": [
            {
                "index": 0,
                "message": {
                    "role": "assistant",
                    "content": translated_text
                },
                "finish_reason": "stop"
            }
        ],
        "usage": {
            "prompt_tokens": len(prompt.split()),
            "completion_tokens": len(translated_text.split()),
            "total_tokens": len(prompt.split()) + len(translated_text.split())
        }
    })
except Exception as e:
    return jsonify({"error": str(e)}), 500

if name == "main":
app.run(port=11434)

Edit Report
Pub: 11 May 2025 15:24 UTC
Views: 10