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