

events[] 落地:工具调用、SQL 结果、sources、latency、error 统一事件化,前端可直接渲染 Timeline。router.decision 输出 why + evidence,右栏可视化,误路由可定位可回归。events[] 承载工具链与调试信息,更适合渐进替换。text/event-stream)推送 event: chain / event: done(可选 token)。router.decision,携带 candidate/final/rule_hits/evidence/fallback。Content-Type: text/event-stream,并直接返回 upstream.body(ReadableStream),让上游事件无损到达 UI。\n\n 切块,仅消费完整块,避免 chunk 边界造成半截 JSON 丢事件。event: chain 的 data 转为统一 ChainEvent,追加到 events[],中栏 Timeline 逐条增长。response.answer → 最后一条 assistant.message → 最后一条 tool.call.end.payload.output.answer,避免“链路有输出但看不到结论”。events[] 提取 router.decision,展示 final_mode/rule_hits/evidence/fallback,让误路由“可解释、可复现、可截图验收”。count=0 误解释为“未查到数据/系统异常”的风险。{ ok, run_id, mode, events[] },便于测试与回放。event: chain(单条 event JSON),结束输出 event: done。tool.call.start/end、sql.result、rag.sources、assistant.message、error、latency、router.decision。faiss-cpu。TEXT2SQL_DEBUG=1)。.env 来源。no_data。router.decision 的 evidence 增加更稳定的字段(例如 ddl_hits/fts_hits/top_tables),并在前端面板做结构化展示
flowchart LR
U[用户输入] --> UI[前端 Unified Chat UI]
UI -->|POST SSE| BFF[Next BFF /api/py/unified/chat/stream]
BFF -->|透传| PY[后端 Unified Chat]
PY --> R[Intent Router v1]
R -->|router.decision| EVT[events[] / chain events]
PY -->|rag| RAG[RAG 链路]
PY -->|text2sql| T2S[Text2SQL v1]
RAG --> EVT
T2S --> EVT
EVT -->|event: chain| UI
UI --> TL[Timeline 实时追加]
UI --> DBG[Router 决策 Debug]
UI --> ANS[最终答案兜底抽取]