- Added a new visitor chat API endpoint (`/api/chat/visitor`) to allow unauthenticated users to engage in conversations without requiring customer data. - Introduced a visitor context dependency to manage visitor interactions seamlessly. - Enhanced the chat API to support explicit session termination and improved response handling for customer service interactions. - Updated the database configuration to include Redis client support for caching visitor data. - Added a new customer note repository to persist user notes independently of the L1 profile slots. This update significantly improves the customer service experience by enabling visitor interactions and ensuring efficient data handling for both registered and unregistered users.
17 KiB
TODO
大任务开始时更新;完成一步打钩并验证后再往下。
新 Agent: 先看MEMORY.md§0 交接清单,再从此处取下一项。
进行中
AL-09 合并接线已完成(2026-09-08,merger 分支):JWT 统一 · 模块 chat/agent/memory 恢复 · auth_adapter 接线 · trace 中间件修复(应用异常 re-raise)· 530 passed 0 skipped ✓
待办(统筹 · P1 推荐顺序)
- 代销平台 API v0.1 实现(2026-09-08):
customers/products/advisors/staff/compliance+service/platform/+PLATFORM_RESPONSE_DESENSITIZE· 530 passed 0 skipped web/P0 脚手架 init(2026-09-09):Vite+AntD+HashRouter · 登录真接 · AppLayout · 四角色路由 · 占位页 · 见web/README.md· 设计docs/superpowers/specs/2026-09-09-frontend-p0-design.md- 接口契约发群(login + 平台读 API + simulate/trade;强调重复功能以平台路径为准)
- 前端 P0 真接(见下方「前端 web/ · P0 待接」子清单;顺序见 frontend spec §6)
- 同步
MEMORY/REQUIREMENTS/FRAMEWORK与各 Agent 负责人联调节奏
前端 web/ · P0 待接(后端已就绪)
现状:除登录外,业务页均为
PlaceholderPage;api/仅auth.ts;无ChatPanel。
- 四角色「收益/洞察」登录首页(2026-09-09 ·
web/src/pages/dashboard/*):静奢 UI(Tailwind v4 +tokens.css)· Hero+图表+明细 · 真接平台 API · 交接见docs/frontend/FRONTEND-HANDOFF.md - 平台 API client(Dashboard 子集)(2026-09-09):
customers/products/risk(listPendingAlerts)/advisors+ApiErrorResult· 完整 CRUD/处置等见下方未接项 - customer 只读页(一条链路跑通):档案 / 持仓 / 流水等 · 真调 v0.1
- 共享
/app/market:GET /api/products+ 逐产品GET .../nav· 静态净值 Alert ChatPanel+ SSE 解析:sessions 列表 / messages / close · 首帧 meta/disclaimer ·[DONE]收尾- customer Chat:
POST /api/chat/stream·X-Agent-Type: customer - risk Chat:
POST /api/chat/stream·X-Agent-Type: risk(后端 六 只读 Tool 已就绪,见下方风控盘点) - risk 预警台账全页:
GET /api/risk/alerts筛选/分页表格 +POST .../handle处置 UI(Dashboard 首页已只读预览) /app/analytics模块:PermissionGate + query 占位 + analyst Chat(矩阵 403 真展示)- advisor Chat:SSE + AgentBanner(能力弱处提示)
- Vitest:
authStore· SSE 解析 ·mergeProductNavRows等(spec §5;Dashboard 纯函数 8 例已绿)
待办(模块侧开放项)
客服 Agent · S2 接缝(2026-09-09 已接线 · 并行分流)
清单:
docs/项目框架设计/客服Agent-合并说明.md§3–§4 · 原则只增不盖、不覆盖main.py/chat.py/agent_service.py整体。
- 跑迁移 SQL:
scripts/agent/migrate-customer-agent-cs-c11.sql(conversation_archive·customer_notes) - 挂游客路由:
POST /api/chat/visitor→main.py - 编排接缝(并行):
X-Agent-Type: customer→customer_service.run_customer_chat;其余 Agent 仍agent_service.chat - Wave 3 测试解禁:
test_wave3_customer_service.py19 例绿 · 基线 554 passed - Wave 1/2/4/5 解禁:
tests/conftest.py移出剩余collect_ignore· 修接缝后全 wave 绿 - 可选接线:
profile_service/note_service/ 客服 KB 脚本与 Milvus 集合(scripts/kb/*)— 按需求择项
风控 Agent · 后端已就绪 · 前端/运维未接(盘点 2026-09-09)
HTTP 接口(后端已实现 · 前端/演示未接)
POST /api/risk/alerts/{alert_id}/handle:人工处置(confirmed_normal/confirmed_suspicious/reported)· 前端台账页 +api/risk.ts封装GET /api/risk/alerts(完整能力):alert_type/customer_id/ 日期窗 / 分页 · Dashboard 仅用status=pending_review子集POST /api/risk/suitability/check:风控线适当性直调(过渡路径 · 带 audit)· 前端未接POST /api/compliance/suitability-check:平台 canonical 适当性 · 前端未接(发群口径以此为准)POST /api/risk/aml/scan:全量 AML 手动扫描 · 仅 risk_officer · 无 UIPOST /api/simulate/trade:模拟交易 → 规则引擎动态出预警 · 无 UI(演示走 Swagger / curl)
对话 Tool(需 risk Chat SSE 才触达)
- risk Chat SSE:
POST /api/chat/stream·X-Agent-Type: risk alert_query/customer_context/suitability_check/aml_lookup/query_overdue_alertsquery_agent_behavior:函数+意图已有 · 未写入RISK_TOOL_REGISTRY→ 会TOOL_UNKNOWN(接线前必修)
运维 / 动态演示(无 UI · 见 演示SOP-风控模块.md)
scripts/demo/subscribe_alerts.py:订阅 Redisrisk:pub:alert实时推送(Pub/Sub 无持久化,须先开订阅再发交易)scripts/cron/escalation_scan.py:超期未处置升级(FR-9 · 需库内已有pending_review且created_at超阈值)scripts/cron/agent_behavior_scan.py:代理人行为链扫描(FR-10 · 需 audit_log 先积累越权/诱导交易痕迹)scripts/demo/rebuild_alerts.py:按trade_id幂等重放引擎(engine_error 补偿)
演示种子 / 测试数据补充(测未接接口 · 非 everyday reset.ps1)
Core reset 后
risk_alert为空、AML/测评可能未就位;测预警/处置/推送/FR-9/FR-10 须先补数据。
scripts/agent/seed-aml-list.sql:8 条 AML 名单(A-5:CUST-1002展示名故意命中)scripts/demo/prepare_risk_demo.sql:6 客户测评刷新(可交易);CUST-1004保持过期(FM-03 阻断演示)- 风控走查重灌(SOP §2):双库 DROP + agent 表 + 上两项 +
sync_advisor_rel(reset.ps1只重建 core) - 动态造预警 · A-1~A-5:
POST /api/simulate/trade(Swagger/curl)— A-3CUST-3001/PROD-510300/50 万 · A-4CUST-9527连发 4 笔 · A-5CUST-1002/PROD-005828/100 - Redis 实时推送演示:终端 1
subscribe_alerts.py→ 终端 2 发 simulate/trade(Pub/Sub 无持久化) - FR-9 超期升级:库内
pending_review且created_at超RISK_ESCALATION_L1_HOURS(默认 4h)→escalation_scan.py - FR-10 代理人行为链:A-12 ① 同一
X-Debug-Actor=STAFF-10087发 3 组赎回+申购 + 越权 audit →agent_behavior_scan.py - L3 监测档数据:A-5 AML 命中后
customer_profile_l3.monitor_tier=high(测customer_contextTool / Dashboard 高风险客户数) - 适当性阻断样例:A-1
CUST-1001/PROD-161725/1 万 · A-2CUST-4001/2 万(测 handle/台账 suitability 单) - 引擎补偿:
rebuild_alerts.py <trade_id>(engine_error 场景) - 可选 dev 静态预警 seed:2~3 条
pending_review样例(免每次 simulate;与集成测试当日窗冲突须文档说明) - 链式 reset 脚本:AML + prepare 并入
reset.ps1或新增scripts/demo/prepare_all.ps1
画像 Redis · cache-aside(2026-09-09)
-
L3 热读:
get_profile_l3cache-aside(读 Redis miss → MySQL → SET EX 5m;写 upsert DEL)·customer_contextTool 已走此路径 -
L1 热读/写:
ProfileHotCache仅在客服线customer_service.py· 宿主POST /api/chat未接 -
L2 热读/写:表与 JWT scope 已有 · Repository/Redis 未实现
-
chat 链路
risk_suitability_log.actor_id暂落 SYSTEM(run_tool 统一透传需动 core_tools/kb_tools 冻结 func 契约,发起者留痕已由 agent_tool_call 覆盖)——AL-06 遗留,动 Tool 契约前先出方案 -
【前端接入·方案 B】chat 拉侧三端点(commit
8328c24,2026-09-08):GET /api/chat/sessions(本人+本 Agent 线分页列表)、GET /api/chat/sessions/{id}/messages(历史消息升序分页,closed 仍可读)、POST /api/chat/sessions/{id}/close(active→closed,重复/非 active 409);chat.py 抽_resolve_agent_type/_assert_chat_entry/_guard_session三守卫供四端点共用,POST "" 行为零回归;risk_manager 在对话线数据面保持 403(PRD 4A.1)。测试 482→494 绿;独立评审 P0=0,P1(close 并发 rowcount 静默 200)已修复 -
【前端接入·方案 C】SSE 流式对话(commit
01ec5fc,2026-09-08):新增POST /api/chat/stream(OpenAI 兼容 chunk:首帧 meta → delta → finish_reason=stop →[DONE]);agent_service.stream_chat生成器 +needs_disclaimer;_guard_request/_prepare_turn与同步端点共用守卫;session_repository.insert_turnuser+assistant 同事务落库(修评审 P0/P1)。测试 494→503 绿。遗留:无心跳帧、断连留空会话待清理 -
chat 同步/流式落库免责声明口径统一(2026-09-09):
chat.py_assistant_content_for_persist· sync/stream 共用 ·test_chat回归 -
2026-09-05 memory 文件夹更新(新 Agent 交接清单)
AL-09 已完成(2026-09-08)——见
docs/项目框架设计/合并注意事项-风控模块并入main.md执行记录。
-
【AL-09】合并接线(2026-09-08):JWT 统一 · 模块 chat 恢复 · auth_adapter · test_module_boundary 绿 · 502 pytest 绿
-
T-04 Core RO 封装为 Tool 节点;A-01 归属校验(chat Tool 接入 + agent_tool_call 落库)—— 完成(2026-09-07):
app/tool/core_tools.py(L0/持仓/流水三只读 Tool + TOOL_REGISTRY 白名单)+app/service/tool_service.py(关键词意图仅 customer/advisor;归属校验对齐 deps.assert_customer_access 口径——Tool 层拒绝不抛 403 而 blocked 留痕,纵深防御;run_tool 执行+落库,落库失败降级)+ agent_service 图 tool 节点(START→tool→llm→guard;结果注入 LLM 上下文,降级回复带摘要)+ session_repository.insert_tool_call(message_id 一期 NULL)。A-01 口径:本任务只做 Tool 层归属校验语义(customer 本人/advisor assigned/risk_officer 全量/其余拒),A-01 完整场景(代理人画像)仍归 T-20;risk 分支四 Tool 归 C1 复用 run_tool。评审闭环(2026-09-07):首评 P1×2+P2×3+P3×2 → 修复40a9ee2→ 复审 P2×1+P3×4 → 修复1216d26,pytest 321 绿;入参白名单+days 钳制、公共鉴权双写utils/authz.py、list_holdings LIMIT 均落地 -
T-21 Milvus Lite + kb_product_rules 首批入库 —— 完成(2026-09-07,commits e34973f~535c8a0 共 6 个 + 评审闭环 9cc2e59):
app/service/embedding.py(Ollama bge-m3 批量 /api/embed 1024 维,四类失败一律 EmbeddingError 不静默降级)+app/service/milvus_service.py(kb_product_rules 幂等建集合+upsert+search_kb 溯源/effective_date 合规过滤)+data/kb/6 只种子产品手册(prospectus/fee/rule/risk 四节 24 块)+scripts/kb/build_kb.py(--dry-run/--kb-dir)+app/service/rag_service.py落地(search_knowledge→chunks+source_refs,异常上抛防 LLM 编造)+app/tool/kb_tools.py挂注册表第三层(ToolSpec 新增 skip_access_check:公开知识无归属语义,advisor 无绑定客户可查;意图层限定 customer/advisor,risk 不开放——用户拍板)+ tool_node 按 spec 白名单注入 query + summarize 溯源口径。真库验收:24 块入库,search_knowledge("基金申购") Top3 命中申赎规则(score 0.73+),溯源完整。三坑收口:Milvus Lite 跨进程重开须显式 load / faiss 不支持中文路径(本机 .env 改 C:/Users/YUAN/.jinrong/milvus/)/ build_kb sys.path 引导。知识库 API(上传/重建端点)一期不做(knowledge.py 仍空壳,用户拍板),425 绿 -
T-03 输入防护规则(F-03:prompt_injection/oversize/限流)—— 完成(2026-09-07,commits 497554d/65b45aa/cc6f34f/207fc79):
app/service/input_guard.py(注入短语词表 42 条四类纯函数检测 +inspect_messageoversize 4000 先于 injection +check_rate_limitRedis INCR 固定窗口 actor 级 30 次/分 fail-open)+ chat 路由接入(顺序:鉴权→准入→空白→限流 429→注入/超长 400→归属→会话;被拒 fail-fast 不建会话不落消息,blocked 落 input_guard_log,留痕降级不改拒绝语义;Pydantic 硬顶 20000,业务限 4000 移 guard 层换留痕)+ redis_gateway.incr + settings.guard_rate_limit_*;拍板:命中即拒不清洗、仅 blocked 留痕、词表代码常量可审计。独立 AI 评审 PASS with findings(P0=0;P2×3 已收口:词表断言修正/补 7 条同构变体/窗口 TTL 断言+EXPIRE 失败取舍锁定;P3 已收 session_id 截断,挂账对抗变体扩表),378 绿 -
风控阶段 C(C0 pytest-asyncio / C1 chat_tools / C2 risk 分支 StateGraph / C3 A-6 验收)—— 完成(2026-09-07):
app/service/risk/chat_tools.py四只读 Tool(alert_query/customer_context/suitability_check/aml_lookup)挂RISK_TOOL_REGISTRY;tool_service.run_tool改查 core+risk 统一注册表get_registered_tool且恒传risk_repo;_normalize_params读 spec 白名单;match_intent按 agent 分组扩 risk 关键词;agent_service.tool_node守卫放宽(requires_customer=False允许无绑定客户,支撑 A-6 全量待审);A-6 验收+诱导处置边界(无处置 Tool、系统提示禁自动处置、诱导只触发只读且预警状态不变);独立 AI 评审 PASS(P0=0,P2 补 advisor 归属/空 product_id 单测已收口),345 绿,tagrisk-m3
风控模块(PRD v1.0 已冻结 · docs/PRD/PRD-风控监测Agent.md,事件驱动线不依赖 T-07 可先行)
- T-30 风控事件线 —— 全部完成(B1~B9b,M2 tag risk-m2):规则引擎/预警聚合/L3/AML/交易网关/4 API/演示走查 11/11 PASS + 核查单①~⑥收口,均经独立 AI 评审闭环;scan_all 幂等读后写无锁留痕(接批量时 run_locked)
- T-31
service/suitability.py公共校验(SUIT-001008)+008 编号体系已随 AL-05 换核退役,判定内核改为 main 的 core_ro.check_suitability(C×R 矩阵 + JR-AST/FM 契约),测试按 main 契约重写(原 77 例作废,全量基线 425→406)**POST /api/risk/suitability/check—— **交付=suitability 服务函数+单测(77 例;check API 随 B6 带鉴权+直调审计);MySQL 手工 SQL 对照(阶段 A 评审 P2-8)2026-09-07 收口:4 组演示组合真库 SQL 推导与函数判定逐项一致(演示 SOP 核查单附行)。【2026-09-07 阶段一退役】SUIT-001 - T-32 预警台账与人工处置 API + 对话线 —— 台账/处置 API 已由 B6 覆盖并复审通过(A-7/A-9 用例绿);交付=对话线,归阶段 C(C1~C3,T-07 已就绪)
已完成
- 2026-09-07 风控 M2 收尾(M4 复核):MEMORY/TODO 状态与边界文字对齐(任务映射 T-30/T-31/T-32 口径确认;B7 复审留痕「成功响应不包裹外壳」演进口径维持并登记开发计划 M4 节)——风控阶段 B 正式完结
- 2026-09-07 T-01 JWT 鉴权(commit
36f476f+ 评审闭环 61711cb):app/service/auth_service.pyAuth SDK(HS256 dev/RS256 生产、必填 claims 显式校验、jti 吊销 fail-open、RS256/HS256 算法白名单互斥)+deps.get_auth_context工厂替换(Bearer 全环境优先;debug 头降级 dev 兜底,双闸门=APP_ENV+无 RS256 公钥)+ X-Agent-Type 交叉校验(手册 §4.6/§5.4 AGENT_ACCESS_MATRIX)+scripts/dev/issue_dev_token.py签发 CLI + lifespan 改验 jwt_ready - 2026-09-07 T-02 审计中间件(commit 3cec034):
app/api/audit_middleware.pyhttp_access 全量访问审计(actor 经 request.state.auth,排障路径/OPTIONS 跳过,写库失败降级)+ 独立 request_id(X-Request-Id 贯通,B7 复审 P3-4)+ 422/404/405/500 统一错误体(500 由 trace 中间件兜底回写 trace 头,B7 复审 P2-2)+ input_guard_log 双写(挂账⑧收口;401 归 platform、四 Agent 入口写 guard) - 2026-09-07 T-07 LangGraph 骨架(commit fb18c04):
agent_serviceStateGraph(llm→guard)+ DeepSeek/langchain-openai(无 key 降级明确标注)+ 四 Agent 边界 system prompt + customer/risk 免责声明(has_disclaimer)+ 单测 mock LLM 不依赖外网 - 2026-09-07 T-06 chat 最小闭环(commit ee5c78a):
api/chat.pyPOST /api/chat(X-Agent-Type 分流+准入+归属校验+SessionGuard AUTH_403_SESSION_AGENT+closed 409)+session_repository(agent_session/agent_message)+memory_service(Redis 窗口 sess:{agent}:{id}:msgs TTL2h N≤20,miss/异常回源 MySQL)+ main 挂载 - 2026-09-07 Wave 0 独立 AI 评审有条件通过→闭环(commit 61711cb):P2×5(python-jose>=3.5.0 防 CVE / audit 降级测试 / JWT 通道 chat 用例 / debug 兜底纵深防御 / 留痕失败降级显式化)+ P3×11 顺手,273 测试绿
- 2026-09-05 init 项目记忆目录 +
app/脚手架(api/service/tool/model/config/utils) - 2026-09-05 需求拆解文档(业务场景/矩阵/合规)
- 2026-09-05 表设计 + 技术选型 + JWT 手册
- 2026-09-05 Core 模拟库
scripts/core/*+reset.ps1+ 文档 - 2026-09-05
core_ro.py+settings.mysql_core_database+ sync 脚本 - 2026-09-05 Agent 编排依赖改为 LangGraph(requirements.txt)
- 2026-09-05 memory 文件夹更新(新 Agent 交接清单)