"""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}]"