聊天式交互改造(Web UI 升级)

- 前端由分步表单页升级为 DeepSeek 式聊天页(static/chat.html)
- 新增 chat 包:意图识别(intent.py)+ ChatAgent(agent.py)自动驱动
  解析→影响→生成→QA 整条工作流,影响确认节点反问、错误分支兜底
- store.py 扩展 pending_intent 字段与 chat_messages 表
- app.py 新增 POST/GET /api/chat/{sid}/messages,GET / 返回聊天页
- README/design.md 同步聊天模式说明;测试 4 文件覆盖
- 全量 pytest 522 passed / 99.03%,覆盖率红线达标
This commit is contained in:
lhl
2026-08-27 05:11:40 +08:00
parent 215c605650
commit 838a93720e
14 changed files with 1275 additions and 150 deletions
+28 -2
View File
@@ -41,6 +41,10 @@ class _FakeEngine:
)
class ChatMessageReq(BaseModel):
content: str
class SessionCreate(BaseModel):
user_id: str = "default"
@@ -65,6 +69,7 @@ def create_app(
engine: Any = None,
) -> FastAPI:
store = store or SessionStore()
is_fake = engine == "fake"
if engine == "fake":
engine = _FakeEngine()
elif engine is None:
@@ -72,8 +77,11 @@ def create_app(
service = GenesisService(store=store, data_root=data_root, engine=engine)
from genesis.chat.agent import ChatAgent
chat_agent = ChatAgent(service=service, fake=is_fake, engine=engine)
static_dir = Path(__file__).parent / "static"
index_html = (static_dir / "index.html").read_text(encoding="utf-8") if (static_dir / "index.html").exists() else "<html><body>Genesis Web UI</body></html>"
chat_html = (static_dir / "chat.html").read_text(encoding="utf-8") if (static_dir / "chat.html").exists() else "<html><body>Genesis Chat</body></html>"
app = FastAPI(title="Genesis API", version=VERSION)
@@ -85,7 +93,7 @@ def create_app(
@app.get("/", response_class=HTMLResponse)
def index():
return index_html
return chat_html
# ---------- 会话 ----------
@@ -232,6 +240,24 @@ def create_app(
raise _error(404, "RESULT_NOT_FOUND", "QA 报告不存在")
return FileResponse(rec.qa_report_path, media_type="application/json", filename="qa-report.json")
# ---------- 聊天 ----------
@app.post("/api/chat/{sid}/messages")
def chat_message(sid: str, body: ChatMessageReq):
try:
result = chat_agent.handle_message(sid, body.content)
except SessionNotFoundError:
raise _error(404, "SESSION_NOT_FOUND", f"会话不存在: {sid}")
return result
@app.get("/api/chat/{sid}/messages")
def chat_history(sid: str):
try:
service.get_session(sid)
except SessionNotFoundError:
raise _error(404, "SESSION_NOT_FOUND", f"会话不存在: {sid}")
return service.store.list_messages(sid)
return app