模块 1 · 问数入口

问数工作台 vs 分析对话
两套门,别走错

数据分析 Agent 走平台鉴权(get_platform_auth_context), 和对话线不同——不要带 X-Agent-Type。 像进档案室查账:只出示工牌(JWT),不用说明「我是来聊天还是来问数」。

前端两条菜单

问数工作台

/app/analytics/query → AnalystQueryPage
真·NL→SQL:表格 + SQL + 解读,调 POST /api/analyst/chat

分析对话(占位)

/app/analytics/chat → AnalystChatShell
横幅写明「轻量对话占位;查数请用问数工作台」——还没接独立问数图

指挥 AI 改功能时: 要表格和 SQL 就改 问数 REST(analyst.py) / NL→SQL 编排(analyst_agent.py); 要聊天体验才碰 analytics/chat 占位页,别和问数混成一个接口。
customer self 域: 客户 token 进问数 → domain=self, SQL 安全校验(sql_guard.py)强制 SQL 带本人 customer_id;免责声明追加 CUSTOMER_AI_RISK_NOTE。

后端「四件套」路由

全部挂在 问数 REST(app/api/analyst.py),前缀 /api/analyst:

POST /chat
问数主入口 → AnalystAgent.run()
GET /dashboard
智能看板卡片(按角色返回 metrics)
POST /assets
口径/样例沉淀(仅 analyst 角色可写)
GET /ops/metrics
运营指标:查询总量 / 被拦截次数

群聊:分析员点「提问」之后

STAFF-20001 在问数工作台输入「客户总数是多少」——简化版:

前端 · analyst.ts
await apiFetch('/api/analyst/chat', {
  method: 'POST',
  token,  // Bearer JWT only
  body: JSON.stringify({ question, session_id }),
})
白话

问数和读持仓一样:登录令牌够了,不用声明 Agent 类型。

后端用角色(analyst/advisor/customer…)决定能查哪片数据域,不靠 X-Agent-Type。

问数工作台调 POST /api/analyst/chat,请求头要带 X-Agent-Type: analyst 吗?