54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
"""手册生成入口:优先调用 AI,失败则回退到离线模板。"""
|
|
|
|
import os
|
|
|
|
import requests
|
|
|
|
from handbook.templates import render_offline_handbook
|
|
|
|
SYSTEM_PROMPT = (
|
|
"你是一名专业的文档撰写助手,擅长编写结构清晰、条理分明的登记手册。"
|
|
"请使用 Markdown 输出,包含封面信息、目录、正文(总则、登记范围、登记流程、"
|
|
"登记信息字段、附则)以及附录。语言简洁、专业、可执行。"
|
|
)
|
|
|
|
|
|
def _call_openai(topic: str) -> str:
|
|
api_key = os.environ.get("OPENAI_API_KEY")
|
|
base_url = os.environ.get("OPENAI_BASE_URL", "https://api.openai.com/v1").rstrip("/")
|
|
model = os.environ.get("OPENAI_MODEL", "gpt-4o-mini")
|
|
|
|
if not api_key:
|
|
raise RuntimeError("未配置 OPENAI_API_KEY")
|
|
|
|
resp = requests.post(
|
|
f"{base_url}/chat/completions",
|
|
headers={
|
|
"Authorization": f"Bearer {api_key}",
|
|
"Content-Type": "application/json",
|
|
},
|
|
json={
|
|
"model": model,
|
|
"messages": [
|
|
{"role": "system", "content": SYSTEM_PROMPT},
|
|
{
|
|
"role": "user",
|
|
"content": f"请为主题「{topic}」生成一份完整的登记手册。",
|
|
},
|
|
],
|
|
"temperature": 0.7,
|
|
},
|
|
timeout=60,
|
|
)
|
|
resp.raise_for_status()
|
|
payload = resp.json()
|
|
return payload["choices"][0]["message"]["content"].strip()
|
|
|
|
|
|
def generate_handbook(topic: str) -> str:
|
|
"""生成登记手册 Markdown 文本。"""
|
|
try:
|
|
return _call_openai(topic)
|
|
except Exception: # noqa: BLE001
|
|
return render_offline_handbook(topic)
|