模块 3 · REST 与对话 Tool

台账 REST 要带 risk 头
对话靠六只 Tool

风控REST 走模块鉴权工厂(deps.py 的 get_auth_context),前端必须带 X-Agent-Type: risk。 风控对话走顾问通用编排(agent_service.py)的 risk 分支 + SSE;Tool 由风控对话 Tool 注册表(chat_tools.py)注册 六只只读 Tool,经对话 Tool 编排(tool_service.py)分发。

预警 REST 两端点

GET /api/risk/alerts

risk_officer / risk_manager 全量;compliance 强制只看 aml;响应含 disclaimer

POST /api/risk/alerts/{id}/handle

仅 risk_officer;handler_result 三枚举 + 审计;409 状态冲突

曾踩过的坑: web/src/api/risk.ts 若漏 X-Agent-Type: risk,JWT 正确也 401。 问数 API 则相反——不要带这个头。

风控对话 Tool(chat_tools.py)注册表(C1 + 扩展)

风控对话 Tool(app/service/risk/chat_tools.py)
alert_query — 客户或全量待审预警
customer_context — L0 + L3 + 待审预警
suitability_check — 只读校验 + 审计落库
aml_lookup — 名单匹配
query_overdue_alerts — 超期未处置(FR-9)
query_agent_behavior — 代理人行为链(FR-10)

红线:Tool 只读,不生成预警单、不处置、不改正式风险等级。

群聊:风控问「今天多少待审预警」

前端 · risk.ts + simulate
apiFetch('/api/risk/alerts', {
  token, agentType: 'risk',  // 必须
})
// RiskSimulatePage → /api/simulate/trade 同样带 risk
白话

台账页、模拟交易页、风控对话——凡走 get_auth_context 的都要声明 risk 线。

处置预警用 handle REST;日常问数用对话 Tool,两者不要混接口。

风控对话里问「代理人 STAFF-Q 有没有越权记录」,应触发哪个 Tool?

仓库现状(2026-09-10):STAFF-30001 含 risk_demo;python -m pytest → 825 passed。