Files
GostGenerator/web/backend/app/services/espd/ro_ai.py
T
2026-09-08 10:10:30 +03:00

69 lines
3.2 KiB
Python

"""Generate «Руководство оператора» text via OpenRouter."""
from __future__ import annotations
from pathlib import Path
from app.core.config import get_settings
EXAMPLE_PATH = Path(__file__).resolve().parents[2] / "espd_templates" / "ro_mat.txt"
SYSTEM_PROMPT = """Ты — технический писатель. Твоя задача: по краткому описанию программы составить текст «Руководство оператора» по ГОСТ ЕСПД (ГОСТ 19.503-79 и др.).
Структура документа: 1) Назначение программы; 2) Условия выполнения программы; 3) Установка программы; 4) Работа с программой.
Пиши строго по образцу: тот же стиль, нумерация разделов и подпунктов (1.1, 1.2, 2.1, 3.1.1 и т.д.), без лишних пояснений и без упоминания ИИ."""
def _load_example() -> str:
if not EXAMPLE_PATH.exists():
return ""
return EXAMPLE_PATH.read_text(encoding="utf-8", errors="replace")
def generate_ro_content(progname: str, decimal: str, user_description: str) -> str:
settings = get_settings()
api_key = (settings.openrouter_api_key or "").strip()
if not api_key:
return "[Ошибка: не задан OPENROUTER_API_KEY.]"
example = _load_example()
user_prompt = f"""Составь полный текст «Руководство оператора» по ГОСТ ЕСПД.
Данные документа:
- Обозначение (децимальный номер): {decimal}
- Название программы: {progname}
Описание от заказчика (что за программа, для какой системы, что должна делать):
{user_description}
Образец оформления и стиля (придерживайся этой структуры и нумерации):
---
{example[:12000] if example else "Структура: 1. Назначение программы; 2. Условия выполнения; 3. Установка; 4. Работа с программой."}
---
Выведи только текст руководства, без предисловий."""
try:
from openai import OpenAI
client = OpenAI(
base_url=settings.openrouter_base_url.rstrip("/"),
api_key=api_key,
default_headers={
"Authorization": f"Bearer {api_key}",
"HTTP-Referer": "https://gostgenerator.local",
"X-Title": "GostGenerator Web ESPD",
},
)
response = client.chat.completions.create(
model=settings.openrouter_model or "deepseek/deepseek-chat",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_prompt},
],
temperature=0.4,
max_tokens=4000,
)
text = response.choices[0].message.content or ""
return text.strip()
except Exception as e:
return f"[Ошибка генерации: {e}]"