AI 生成: 一个基于 Flask 的 Web 应用,用户输入主题后由 AI 生成结构化的登记手册,包含封面、目录、正文与附录,并支持导出为 Markdown 文件。
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
"""手册生成入口:优先调用 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)
|
||||
Reference in New Issue
Block a user