模块 3 · Agent 与页面

AnalystAgent.run
+ 看板与资产 API

问数主脑是 AnalystAgent.run;页面侧 AnalystQueryPage(P2) 同时拉 GET /dashboard 卡片和 POST /chat 结果。 口径沉淀走 POST /assets(仅 analyst 角色可写)。

AnalystAgent.run 要点

鉴权与域

assert_analyst_query_access → domain;resolve_analyst_scope → customer_id 白名单。

消歧与生成

_detect_ambiguity 命中则 _clarify 返回 suggestions;否则 _generate_sql。

执行与缓存

validate → execute_readonly;Redis 按权限指纹 + SQL hash 缓存结果。

解读与留痕

_generate_verified_answer + guardrail;_persist 写 analytics_query_log。

返回体 AnalystResponse: answer + table + sql + meta(exec_ms, cache_hit, cost_est)+ disclaimer + status(success / degrade / clarify)。

dashboard / assets API

GET /dashboard

按角色返回 cards 文案 + metrics:analyst 全库统计、customer 本人持仓、advisor 名下 AUM 等。

POST /assets

kind=dict/few_shot/template;仅 analyst 角色,写入口径资产表。

GET /ops/metrics

运营侧查询总量与被拦截次数,与 dashboard 卡片分离。

CODE · AnalystQueryPage.tsx(P2)
useEffect(() => getAnalystDashboard(token))
setDashMetrics(d.metrics)
setDashCards(d.cards)
// 用户点查询
const resp = await postAnalystChat(token, question)
setResult(resp)  // Table + Collapse(SQL)
白话

进页面先拉看板 MetricCard,数字来自 /dashboard 不是 chat。

提问才走 AnalystAgent.run,结果区展示解读、表格、可折叠 SQL。

apiFetch 只带 token,与 risk.ts 的 X-Agent-Type 头无关。

理财师 STAFF-10086 能调用 POST /api/analyst/assets 沉淀口径吗?