AI 生成: 一个基于 Flask 的 Web 应用,用户输入主题后由 AI 生成结构化的登记手册,包含封面、目录、正文与附录,并支持导出为 Markdown 文件。

This commit is contained in:
admin
2026-09-30 20:41:38 +08:00
commit 1750ff3a83
9 changed files with 498 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
"""AI 登记手册生成器包。"""
+53
View File
@@ -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)
+82
View File
@@ -0,0 +1,82 @@
"""内置离线模板,用于未配置 AI 时的示例生成。"""
from datetime import date
def render_offline_handbook(topic: str) -> str:
"""根据主题生成结构化的登记手册 Markdown 文本。"""
today = date.today().isoformat()
sections = [
(
"一、总则",
[
f"本手册用于规范「{topic}」相关事项的登记流程,确保信息完整、准确、可追溯。",
"所有登记人员应按照本手册要求填写相关字段,不得遗漏或伪造信息。",
"本手册的解释权归登记管理部门所有。",
],
),
(
"二、登记范围",
[
f"凡涉及「{topic}」的新增、变更、注销等事项,均应进行登记。",
"登记对象包括但不限于:基本信息、责任主体、时间节点、附件材料。",
],
),
(
"三、登记流程",
[
"1. 申请人填写登记表并提交相关证明材料。",
"2. 登记人员核对材料完整性,必要时要求补充。",
"3. 审核通过后录入系统,生成唯一登记编号。",
"4. 登记结果通知申请人,并归档留存。",
],
),
(
"四、登记信息字段",
[
"| 字段 | 说明 | 是否必填 |",
"| --- | --- | --- |",
"| 登记编号 | 系统自动生成 | 是 |",
f"| 主题 | 与「{topic}」相关的事项名称 | 是 |",
"| 申请人 | 提交登记的主体 | 是 |",
"| 登记日期 | 登记完成日期 | 是 |",
"| 备注 | 补充说明 | 否 |",
],
),
(
"五、附则",
[
"本手册自发布之日起施行。",
"如遇政策调整,以最新规定为准。",
],
),
]
lines = [
f"# {topic} 登记手册",
"",
f"**生成日期:** {today}",
"",
"## 目录",
"",
]
for title, _ in sections:
lines.append(f"- {title}")
lines.append("")
for title, paragraphs in sections:
lines.append(f"## {title}")
lines.append("")
for p in paragraphs:
lines.append(p)
lines.append("")
lines.append("## 附录")
lines.append("")
lines.append("- 登记表模板")
lines.append("- 常见问题解答")
lines.append("- 联系方式")
lines.append("")
return "\n".join(lines)