diff --git a/AGENTS.md b/AGENTS.md index 2886e17..a93b1d3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -38,6 +38,6 @@ app/repository/core_ro.py # Core 只读 + check_suitability(R-02) scripts/core/reset.ps1 # 本地灌 Core 模拟库 ``` -**当前分支:** `merger` · **测试基线:** `python -m pytest` → 795 passed · **Redis:** Docker `6380` · **前端:** `cd web && npm run build/test` +**当前分支:** `merger` · **测试基线:** `python -m pytest` → 804 passed · **Redis:** Docker `6380` · **前端:** `cd web && npm run build/test` 技术选型硬阀门见 MEMORY 第 3、7 节。Cursor 以 `.cursor/rules/project-memory.mdc` 为准。 diff --git a/docs/memory/FLOW.md b/docs/memory/FLOW.md index 1dec963..9749a18 100644 --- a/docs/memory/FLOW.md +++ b/docs/memory/FLOW.md @@ -20,7 +20,12 @@ ③ Core 模拟库(L0) .\scripts\core\reset.ps1 → 创建 jinrong_core + 28 客户 / 12 产品 / 持仓交易种子 - (风控演示:再执行 scripts/demo/prepare_risk_demo.sql 刷新测评日期 · PRD §10.2) + (风控演示:`.\scripts\demo\prepare_all.ps1` 或 `prepare_risk_demo.sql` · PRD §10.2) + +④b 数据分析问数(可选) + mysql … < scripts/agent/migrate-analyst-d07-d11.sql # 若未建 analyst 资产表 + mysql … < scripts/agent/seed-analyst-metric-dict.sql + mysql … < scripts/agent/seed-analyst-query-templates.sql # 模板缓存演示 ④ Agent 共用底座(若库未建) mysql -u root -p < docs/项目框架设计/表设计/01-mysql-共用底座.sql @@ -39,7 +44,7 @@ uvicorn app.main:app --reload GET http://127.0.0.1:8000/health → {"status":"ok"} cd web && npm run dev → 5173 代理 8000 - python -m pytest → 786 passed 1 skipped + python -m pytest → 804 passed 1 skipped RBAC 联调账号:scripts/dev/rbac-seed-reference.md ``` @@ -54,13 +59,13 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md Client → Gateway(JWT/RBAC) → api/chat → agent_service(LangGraph) → Tools → 存储 → 响应 + audit_log ``` -当前:**风控全链路 + Wave 0 共用底座 + 代销平台 v0.1 + AL-09 + 客服 S2 Wave3 部分 + 前端 P0(2026-09-10,`merger`)**。**测试基线:`python -m pytest` → 786 passed 1 skipped** · **`web/` 19 Vitest 绿**。 +当前:**风控全链路 + Wave 0 共用底座 + 代销平台 v0.1 + AL-09 + 客服 S2 Wave3 + 数据分析 D-06 + 前端 P0 Demo(2026-09-10,`merger`)**。**测试基线:`python -m pytest` → 804 passed 1 skipped** · **`web/` 19 Vitest 绿 · `npm run build` 绿**。 -**下一步(统筹 P1):** 接口契约发群 · 风控前端 polish(台账筛选)· **客服** L1/L2 Redis 热读(风控不做 L1/L2)· customer 阈值 push(未做)。 +**下一步(统筹 P1):** merger commit · 20 题 battery · 客服验收 · analyst D-09/N-03/N-07 · **客服** L1/L2 Redis(风控不做 L1/L2)。 -**本机已就位状态(2026-09-10):** `.env` 含 `REDIS_URL=redis://127.0.0.1:6380/0`;pytest **786 绿**;客户 Chat SSE 已接 `prepare_customer_stream`。 +**本机已就位状态(2026-09-10):** `.env` 含 `REDIS_URL=redis://127.0.0.1:6380/0`;pytest **804 绿**;问数 D-06 结果+模板缓存已接;前端四角色 Demo 可 walkthrough。 -**本机已知坑:** `mysql.exe` 不在 PATH;`reset.ps1` 自动化用 `MYSQL_PWD`;**6379 常被 Windows Redis 3.x 占用** → 项目 Docker 映射 **6380**;Milvus 中文路径需英文 `MILVUS_URI`;重装环境后 `python -c "import jose, redis"` 自检。 +**本机已知坑:** `mysql.exe` 不在 PATH;`reset.ps1` 自动化用 `MYSQL_PWD`;**6379 常被 Windows Redis 3.x 占用** → 项目 Docker 映射 **6380**;Milvus 中文路径需英文 `MILVUS_URI`;问数模板需灌 `seed-analyst-query-templates.sql` 才见蓝色「模板命中」标签;`battery_report.json` **不入库**(`.gitignore`)。 ------ diff --git a/docs/memory/FRAMEWORK.md b/docs/memory/FRAMEWORK.md index 9f0f934..3a1bd2b 100644 --- a/docs/memory/FRAMEWORK.md +++ b/docs/memory/FRAMEWORK.md @@ -35,15 +35,15 @@ | 模块 | 职责 | 依赖 | 代码状态 | | --- | --- | --- | --- | | Agent Gateway / Auth SDK | JWT、RBAC、归属校验 | Redis、MySQL customer_advisor_rel | **已实现(T-01 + AL-09)**:模块 `service/auth_service.py` + `api/deps.py`;宿主 `gateway/` 四件套并存;`/api/auth/login` 统一走 `issue_dev_token`;S2 接缝 `auth_adapter.module_auth_from_host` | -| 客户财富 Agent | L1 画像、事实查询、阈值提醒 | Core RO、Milvus 产品库 | **S2 + Wave3 部分(2026-09-10)**:Chat SSE · 1B/R1 · **C-04 阈值** · **C-05 nav** · **C-11 匹配** · 13 槽 L1 · **786 pytest** +| 客户财富 Agent | L1 画像、事实查询、阈值提醒 | Core RO、Milvus 产品库 | **S2 + Wave3(2026-09-10)**:Chat SSE · 1B/R1 · C-04/C-05/C-11 · **804 pytest** | 代理人助手 Agent | L2 画像、RAG、草稿 | L1 只读、Milvus | 空壳 service(chat 骨架已通) | -| 数据分析 Agent | NL→SQL→解读 | Core RO、画像只读 | **S3+P2 + 445cfbb 护栏/口径(2026-09-10)**:guardrail Decimal/编号/时间窗 · 流水 N-01 消歧 · **795 pytest** | +| 数据分析 Agent | NL→SQL→解读 | Core RO、画像只读 | **S3+P2+D-06(2026-09-10)**:guardrail/口径 · **结果缓存+写侧失效** · **模板填参**(`template_service`)· **804 pytest** | | 风控监测 Agent | 预警、L3、R-02 适当性 | 交易事件、AML 名单 | **已实现 B1~B9b + C1~C6(FR-1~10)**:事件线 + 对话线 + 集中度/时效升级/代理人行为链;**AL-09 已并入 `merger` 分支** | | Core 只读层 | L0 事实查询 | `jinrong_core` | **已实现 + 已接对话 Tool(T-04)**:core_ro 经 app/tool/core_tools.py 三只读 Tool(L0/持仓/流水)进 chat;风控扩展查询照旧 | | 共用底座 | 会话、审计、输入防护 | MySQL 11 表 + Redis | **已接入(2026-09-07)**:会话(T-06 session_repository + memory_service 窗口)、审计中间件(T-02 http_access + input_guard_log 双写)、agent_tool_call Tool 留痕(T-04)、输入防护(T-03 input_guard:注入词表纯函数检测 + oversize + Redis 固定窗口限流,chat 链路 限流→注入/超长→归属) | | 对话编排 | LangGraph StateGraph + DeepSeek | langgraph/langchain-openai | **已实现**:customer/advisor/risk/analyst 四线;**analyst 问数**独立 `analyst_agent`(非 chat StateGraph) | | 同步脚本 | 归属、Neo4j | Core → agent / 图库 | **sync_*.py 已实现** | -| 前端 Demo(`web/`) | 四角色工作台、平台读 UI、Chat | FastAPI v0.1 + chat B/C | **P0 已接(2026-09-09)**:ChatPanel/SSE · 游客试聊 · 平台只读 · 行情 · 风控台账+处置 · **问数工作台** · 模拟交易演示页 · **19 Vitest** | +| 前端 Demo(`web/`) | 四角色工作台、平台读 UI、Chat | FastAPI v0.1 + chat B/C | **P0 Demo 齐备(2026-09-10)**:四角色页+Chat/SSE · 问数+模板标签 · 风控四页 · 行情 · **19 Vitest** · 分析对话仍占位 | ------ diff --git a/docs/memory/ITERATION.md b/docs/memory/ITERATION.md index 719aae3..5708118 100644 --- a/docs/memory/ITERATION.md +++ b/docs/memory/ITERATION.md @@ -23,4 +23,6 @@ | 2026-09-09 | **客服 Agent 代码合并**(`customer-service-agent` 只增不盖) | 用户要求合并上传内容 | `客服Agent-合并说明.md` · Wave1~5 新增文件 · CS-C-11 迁移 SQL · wave 测试暂 ignore | | 2026-09-10 | **客服 Wave3 批次**:1B 共用 sanitize · C-04/C-05/C-11 等 · **786 pytest** | 用户「全做」批次 | MEMORY / REQUIREMENTS / FLOW / TODO / 课程 | | 2026-09-10 | **数据分析 Agent 护栏/口径迭代**(cherry-pick `445cfbb` 功能层)· guardrail Decimal/编号/时间窗 · 流水 N-01 消歧 · battery 脚本改 `issue_dev_token` | 远程 `data-analysis-agent` 未合 merger | guardrail / dict_service / wave6 测试 / `数据分析Agent-代码迭代.md` | -| 2026-09-10 | **客服合规拍板落地**:1B sanitize 分治 · R1 L1 Top-K · MEMORY/课程/测试包 | 误转人工 + 画像膨胀 | MEMORY §3 · TEST-2026-09-10-CS-001 · 776 pytest | +| 2026-09-10 | **数据分析 D-06 缓存**:结果缓存表世代 + 写侧 bump(trade/alert/L3)· **模板填参**(`template_service`)· 问数页 template/cache 标签 · `804 pytest` | 用户拍板 D-06 必须 · PII 脱敏暂缓 | cache_service / template_service / analyst_agent / web | +| 2026-09-10 | **风控前端 P1 + 演示**:台账筛选 · 适当性/AML 页 · `prepare_all.ps1` · 深潜课模块 7 | 2026-09-10 拍板收口 | web/risk · scripts/demo · docs/course | +| 2026-09-10 | **`battery_report.json` 不入库** | 本地跑分产物 | `.gitignore` | diff --git a/docs/memory/MEMORY.md b/docs/memory/MEMORY.md index 82e2e36..44099de 100644 --- a/docs/memory/MEMORY.md +++ b/docs/memory/MEMORY.md @@ -9,7 +9,7 @@ **项目是什么:** 金融四 Agent(客户财富 / 代理人 / 数据分析 / 风控)共用数据层与合规底座;**不**互调 LLM,跨 Agent 走 L1/L2/L3 画像与预警表。 -**当前进度:** 需求与表设计已定 · **风控 + 平台 API + 客服 S2 Wave3 部分 + 数据分析 S3/P2(445cfbb 护栏/口径)** · **795 pytest** · **19 Vitest** · **Redis @ 6380** +**当前进度:** 需求与表设计已定 · **风控 + 平台 API + 客服 S2 Wave3 + 数据分析 S3/P2/D-06 + 前端四角色 P0 Demo** · **804 pytest** · **19 Vitest** · **Redis @ 6380** · **`merger` 工作区未 commit** **工作分支:** 团队开发在 **`merger`**;历史 `risk-control-agent` 交付冻结。 @@ -24,8 +24,8 @@ | `app/api/risk.py` `simulate.py` `deps.py` | **已实现** | 风控 4 API + 模拟网关路由 + **JWT 鉴权工厂(T-01:Bearer 全环境优先;debug 头仅 dev+无 RS256 公钥时兜底;AGENT_ACCESS_MATRIX 准入)** | | `app/api/chat.py` `audit_middleware.py` | **已实现** | POST /api/chat · **POST /api/chat/stream(customer 分流 → prepare_customer_stream)** · visitor · sessions 三端点 | | `app/api/customers.py` `products.py` `advisors.py` `staff.py` `compliance.py` | **已实现(v0.1)** | 代销平台 REST;`get_platform_auth_context`(无 X-Agent-Type);Service 层 `app/service/platform/` | -| `app/api/analyst.py` `analyst_auth_adapter.py` | **已实现(S3)** | 问数 `POST /api/analyst/chat` · dashboard/assets/metrics · **`get_platform_auth_context`(无 X-Agent-Type)** · customer `self` 域 | -| `app/service/analyst_agent.py` 等 | **已实现(S3)** | SQL guard · guardrail · analytics_repo · 编排 | +| `app/api/analyst.py` `analyst_auth_adapter.py` | **已实现(S3+D-06)** | 问数 `POST /api/analyst/chat` · dashboard/assets/metrics · **`get_platform_auth_context`** · `meta.template_hit` / `cache_hit` | +| `app/service/analyst_agent.py` `template_service.py` `cache_service.py` | **已实现(S3+D-06)** | NL2SQL 编排 · guardrail · **结果缓存(表世代键)+ 写侧 bump**(`analyst_cache_invalidate`)· **模板填参**(published `analytics_query_template`) | | `app/api/knowledge.py` `admin.py` | 空壳 | 待审计查询台与知识库 API(T-21 拍板一期只做脚本入库,上传/重建端点不做) | | `app/service/platform/` | **已实现(v0.1)** | 封装 core_ro + `PLATFORM_RESPONSE_DESENSITIZE` 脱敏开关 | | `app/service/embedding.py` `milvus_service.py` `rag_service.py` | **已实现(T21-1/2/4)** | Ollama bge-m3 1024 维(失败不静默降级)/ kb_product_rules 建集合+upsert+合规过滤检索 / search_knowledge→chunks+source_refs 溯源 | @@ -45,10 +45,10 @@ | `app/service/threshold_service.py` | **已实现(C-04)** | L1 `threshold_pref_summary` → `customer_threshold_config`;持仓查询加权盈亏 vs 阈值 → `customer_notify_log` | | `app/utils/sanitize_postprocess.py` | **已实现(1B 共用)** | 数据查询 intent(含 nav_query)违禁 → 回退 fact_text;RAG/闲聊 → COMPLIANCE_REJECT;均不自动 transfer | | `scripts/core/*.sql` + `reset.ps1` | **已实现** | Core 模拟库 DDL + 种子 | -| `scripts/agent/` `scripts/demo/` `scripts/dev/` | **已实现** | AML 种子 + 演示数据 + `run_sql_file.py` + **`start-redis.ps1`**(Docker Redis 优先)+ issue_dev_token | +| `scripts/agent/` `scripts/demo/` `scripts/dev/` | **已实现** | AML 种子 · **`prepare_all.ps1` 一键灌库** · `seed-analyst-query-templates.sql`(模板缓存)· `run_query_battery.py`(**不入库**)· `start-redis.ps1` | | `scripts/sync/*.py` | **已实现** | 归属同步 + Neo4j 全图 | -| `tests/` | **已实现** | **795 用例** 1 skipped(Wave3 customer + threshold + sanitize_postprocess + 1B/R1) -| `docs/course/` | **交互课程集(2026-09-09)** | 打开 `docs/course/index.html` 导览中心 · 总览 + 7 模块深潜课 | +| `tests/` | **已实现** | **804 用例** 1 skipped(Wave6 template/cache + Wave3 customer + 1B/R1) +| `docs/course/` | **交互课程集** | 导览中心 + 风控深潜 **7 模块**(含模块 7 写侧并发) | `docs/PRD/PRD-风控监测Agent.md` | **已冻结(v1.1)** | 风控 PRD v1.0 + v1.1 追加 FR-8/9/10(§4A)+ 规则表附录 | | `docs/项目框架设计/实现方案-风控追加需求v1.1-C4C6.md` | **已定稿** | C4~C6 编码依据(经独立 AI 评审修订闭环);分支/进度速览另见项目根 `交接文档.md` | | `docs/项目框架设计/合并注意事项-风控模块并入main.md` | **AL-09 已执行(2026-09-08)** | 合并接线完成;接缝见《风控Agent模块边界与合并接缝标注.md》 | @@ -58,7 +58,7 @@ | `docs/项目框架设计/接口契约-代销平台API-v0.2-行情扩展草案.md` | **草案(2026-09-09)** | `nav-snapshot` · `sync_market_nav` · 前端产品行情 Phase B | | `docs/项目框架设计/表设计/` | 已定 | Agent 共用 11 表 + agent 专用 SQL | | `docs/项目框架设计/Core模拟底座/` | 已定 | 无真实 Core 时的 L0 方案 | -| `web/` | **P0+P2(2026-09-09)** | 四 Agent Chat(**customer SSE**)· 问数+看板+资产沉淀 · 风控台账/模拟交易 · `api/analyst.ts` | +| `web/` | **P0 Demo 齐备(2026-09-10)** | 四角色 Dashboard/Chat · 问数工作台(**模板/缓存标签**)· 资产沉淀 · 风控台账筛选+适当性+AML+模拟交易 · 平台行情 · **分析对话仍为轻量占位**(NL2SQL 走问数页) | **本地 bootstrap(首次):** 完整步骤与前置说明见 `FLOW.md` §0(权威),速览: @@ -69,15 +69,15 @@ 4. mysql … < 01-mysql-共用底座.sql # jinrong_agent 共用 11 表 mysql … < 02-mysql-agent专用.sql # 风控四表 + risk_aml_list 5. mysql … < scripts/agent/seed-aml-list.sql # AML 名单(Windows 乱码:`python scripts/dev/fix_utf8_seed.py`) - (风控演示:scripts/demo/prepare_risk_demo.sql,reset 后重跑) + (风控演示:`.\scripts\demo\prepare_all.ps1` 或 `prepare_risk_demo.sql` · PRD §10.2) 6. python scripts/sync/sync_advisor_rel.py && python scripts/sync/sync_neo4j.py 7. `docker compose up -d redis`(或 `.\scripts\dev\start-redis.ps1`)→ **REDIS_URL=redis://127.0.0.1:6380/0**(Docker Redis 7;避开本机 Windows Redis 占 6379) -8. uvicorn … · python -m pytest(**795 绿**);问数冒烟 · 可选 `mysql … < scripts/agent/seed-analyst-metric-dict.sql` +8. uvicorn … · python -m pytest(**804 绿**);问数:`seed-analyst-metric-dict.sql` + **`seed-analyst-query-templates.sql`**(模板命中) ``` **AL-09 合并后架构(一句话):** 宿主 `gateway/` + 模块 `deps.py` **双栈并存**;对外登录/token **统一**;chat/risk 均走模块鉴权;接缝 S2 用 `auth_adapter`。 -**下一步(见 TODO):** 接口契约发群(复制稿)· 风控前端 polish(台账筛选等)· 客服 L1/L2 Redis(**风控不做 L1/L2**)· Vitest 补测(可选) +**下一步(见 TODO):** git commit `merger` · 20 题 battery 实跑 · 客服手工验收/TEST-LOG · 接口契约发群 · analyst Q17/Q7 挂账 · D-09/N-03/N-07 未做 **Redis(2026-09-09):** 推荐 **Docker** `jinrong-redis`(`redis:7-alpine`)· 宿主机 **6380** → 容器 6379 · `.env` `REDIS_URL=redis://127.0.0.1:6380/0` · 客户端 **RESP2**(`database.py` / `redis_gateway.py`)。 @@ -102,8 +102,8 @@ ## 1. 项目简介 - **名称:** JinRong 金融四 Agent 智能管家 -- **当前阶段:** **代销平台 v0.1 + AL-09 + 客服 S2 + 数据分析 S3/P2 + 前端 P0(2026-09-09)** -- **当前优先级:** 接口契约发群 · 风控前端 polish · 客服画像 Redis L1/L2(风控仅 L3 已接) +- **当前阶段:** **代销平台 v0.1 + AL-09 + 客服 S2 Wave3 + 数据分析 S3/P2/D-06 + 前端 P0 Demo(2026-09-10)** +- **当前优先级:** merger 提交 · battery 跑分 · 客服验收 · analyst 多轮/溯源/转人工(规格缺口)· 客服 L1/L2 Redis(风控仅 L3) ------ @@ -180,8 +180,10 @@ Core 模拟:scripts/core/reset.ps1 · 文档 docs/项目框架设计/Core模 依赖:requirements.txt(LangGraph + langchain-core/openai + FastAPI + SQLAlchemy) 启动:uvicorn app.main:app --reload → GET /health Redis:`docker compose up -d redis` · `REDIS_URL=redis://127.0.0.1:6380/0` · `scripts/dev/start-redis.ps1` -测试:python -m pytest(**795 绿**;集成需本机 MySQL + `risk_aml_list` + `prepare_risk_demo.sql`) -前端:cd web && npm run dev · npm run build/test/lint(**19** Vitest) +测试:python -m pytest(**804 绿**;集成需本机 MySQL + AML + 风控演示数据) +前端:cd web && npm run dev · npm run build/test/lint(**19** Vitest)· 四角色 Demo 见 `docs/frontend/FRONTEND-HANDOFF.md` §8 +问数模板:mysql … < scripts/agent/seed-analyst-query-templates.sql +风控一键灌库:.\scripts\demo\prepare_all.ps1 运维/演示脚本:scripts/demo/subscribe_alerts.py(订阅推送演示)· rebuild_alerts.py TRD-xxx(引擎异常补偿重放) JWT 联调:python scripts/dev/issue_dev_token.py --sub STAFF-30001 --roles risk_officer(+ Authorization: Bearer + X-Agent-Type) 配置:.env(见 .env.example) @@ -229,6 +231,6 @@ RBAC 联调账号:scripts/dev/rbac-seed-reference.md 2. 改动属于 api / service / tool / repository 哪一层? 3. 是否需 customer_id 归属与 JWT RBAC? 4. Core 是模拟库只读还是 agent 库读写? -5. 如何验证?(`python -m pytest` **795 绿** · Redis **6380** · uvicorn + `/health` · 客户助手 Chat SSE · 测试包 `docs/memory/tests/2026-09-10-customer-1b-r1/`) +5. 如何验证?(`python -m pytest` **804 绿** · Redis **6380** · uvicorn + `/health` · 问数页模板标签 · 测试包 `docs/memory/tests/2026-09-10-customer-1b-r1/`) 大任务:FRAMEWORK/FLOW 与实现状态不符时先更新 memory 再编码(用户确认跳过除外)。 diff --git a/docs/memory/TODO.md b/docs/memory/TODO.md index f619d41..6e472a1 100644 --- a/docs/memory/TODO.md +++ b/docs/memory/TODO.md @@ -5,18 +5,18 @@ ## 进行中 -**2026-09-10 批次**(`merger` · 基线 **795 pytest**):客服 Wave3 + 数据分析 445cfbb 功能层已落工作区 · **未 commit** +**2026-09-10 批次**(`merger` · 基线 **804 pytest** · `npm run build` 绿):客服 Wave3 + analyst D-06/445cfbb + 风控前端三页 + 课程/文档 · **未 commit** ### 本批次 · 优先收尾(推荐顺序) -- [ ] **git commit `merger`**:客服 Wave3 + analyst guardrail/dict + 课程 layout 修复 + 文档(你确认后执行) -- [x] **风控深潜课改版(方案 1 · 6 模块 · 读者 dev)**:见 `docs/superpowers/specs/2026-09-10-risk-course-design.md` · 模块 1–6 已写 · `build_all.py` 已跑 +- [ ] **git commit `merger`**:Wave3 + analyst D-06/模板缓存 + 风控前端/灌库/深潜课7 + 问数 UI 标签 + 文档(你确认后执行) +- [x] **风控深潜课改版(方案 1 · 7 模块 · 读者 dev)**:模块 1–7 已写(含写侧并发)· `jinrong-module-risk/index.html` 已拼接 - [ ] **数据分析 · 20 题 live battery**:`uvicorn` + DeepSeek → `python scripts/dev/run_query_battery.py` → 本地写 `scripts/dev/battery_report.json`(**已拍板:不入库** · 见 `.gitignore`) - [ ] **客服 · 手工验收**:`docs/memory/tests/2026-09-10-customer-1b-r1/MANUAL-CHECKLIST.md`(CUST-9527 持仓/sanitize/R1 种子) - [ ] **客服 · Redis DEL**:灌 R1 种子后 `redis-cli -p 6380 DEL profile:l1:CUST-9527`(6380 未起则先 `start-redis.ps1`) - [ ] **测试包签核**:`TEST-LOG-2026-09-10-CS-001` → 模块负责人 zhangyong 确认 - [ ] **接口契约发群稿**:`docs/项目管理/接口契约发群-2026-09-09.md`(复制到群即完成) -- [ ] **口径字典种子**:本机执行 `scripts/agent/seed-analyst-metric-dict.sql`(若未灌) +- [ ] **口径字典/问数模板种子**:本机执行 `seed-analyst-metric-dict.sql` · **`seed-analyst-query-templates.sql`**(若未灌) ### 需拍板(定了再开任务) @@ -48,9 +48,11 @@ ### 前端 `web/` · P0 收尾 -> 主链路已通;以下为 polish / 文档 / 已知接缝缺口。 +> **四角色 Demo 主链路已通**(登录 → Dashboard → Chat/问数/风控 REST);以下为 polish / 规格缺口。 -- [x] 四角色 Dashboard · 平台只读 · ChatPanel · 游客试聊 · 行情 · 风控台账页 · 问数工作台(`AnalystQueryPage`) +- [x] 四角色 Dashboard · 平台只读 · ChatPanel · 游客试聊 · 行情 · 风控台账+筛选+适当性+AML+模拟交易 · 问数工作台+资产沉淀 +- [x] **问数结果标签**:`AnalystQueryPage` 展示 `template_hit` / `cache_hit`(2026-09-10) +- [ ] **分析对话与问数合一** / **看板钻取** — 规格 D-09/D-12,往后排 - [ ] **Vitest 补测**(可选):`useChatPanel` · `api/analyst.ts` mock - [x] **simulate 交易 UI**:风控菜单「模拟交易」+ `RiskSimulatePage` + `api/simulate.ts`(演示说明 · A-3/A-1 预设) - [x] **接口契约发群稿**(见 `docs/项目管理/接口契约发群-2026-09-09.md` · 复制到群即完成) @@ -82,7 +84,7 @@ ### 数据分析 Agent · S3 接缝(2026-09-09 已接线) -> 清单:`docs/项目框架设计/数据分析Agent-合并说明.md` · **795 passed** · 冒烟 `scripts/dev/smoke_analyst.py` +> 清单:`docs/项目框架设计/数据分析Agent-合并说明.md` · **804 passed** · 冒烟 `scripts/dev/smoke_analyst.py` - [x] merge + 接缝(`analyst_router` · `analyst_auth_adapter` · 问数走 `get_platform_auth_context`) - [x] customer `self` 域 + 「AI 分析有风险」尾注 @@ -93,7 +95,9 @@ - [x] **P2 · 口径字典种子 SQL**(`scripts/agent/seed-analyst-metric-dict.sql` · 本机需手工执行) - [x] **customer Chat SSE**(`chat.py` stream → `prepare_customer_stream` · 前端 `mode="stream"`) - [x] **STAFF-30001/30002 追加 risk_demo**(`jwt_service.py` · 模拟交易页可造预警) -- [x] **445cfbb 功能层 cherry-pick**(2026-09-10):`guardrail.py` · `dict_service.py` 流水消歧 · wave6 测试 · `run_query_battery.py` · `数据分析Agent-代码迭代.md` +- [x] **445cfbb 功能层 cherry-pick**(2026-09-10):`guardrail.py` · `dict_service.py` · wave6 测试 · `run_query_battery.py` +- [x] **D-06 双层缓存**(2026-09-10):结果缓存+表世代写侧失效 · 模板填参 · 问数页标签 · 种子 SQL +- [ ] **D-09 多轮追问** · **N-03 溯源明细** · **N-07 转人工** — 前后端均未做 ### 数据分析 Agent · 445cfbb 合入后开放项 @@ -197,6 +201,7 @@ - [x] 2026-09-05 `core_ro.py` + `settings.mysql_core_database` + sync 脚本 - [x] 2026-09-05 Agent 编排依赖改为 LangGraph(requirements.txt) - [x] 2026-09-05 memory 文件夹更新(新 Agent 交接清单) -- [x] 2026-09-10 客服 Wave3 + analyst 445cfbb cherry-pick + 课程 layout 修复(工作区 · **795 pytest** · 未 commit) +- [x] 2026-09-10 merger 批次(工作区 · **804 pytest** · 未 commit):Wave3 · analyst D-06 · 风控前端/灌库/深潜课7 · 问数 template 标签 +- [x] 2026-09-10 客服 Wave3 + analyst 445cfbb cherry-pick + 课程 layout 修复(**795 pytest** · 已并入上项) - [x] 2026-09-09 数据分析 Agent S3 合并接线 + 问数页 + 迁移/冒烟(`773 passed` · commit `af9fb71`) - [x] 2026-09-09 数据分析 Agent 需求规格定稿 v1.1(`docs/需求拆解/01-数据分析Agent需求规格.md`) diff --git a/web/src/pages/analytics/AnalystQueryPage.tsx b/web/src/pages/analytics/AnalystQueryPage.tsx index 865b868..2ac1091 100644 --- a/web/src/pages/analytics/AnalystQueryPage.tsx +++ b/web/src/pages/analytics/AnalystQueryPage.tsx @@ -1,4 +1,4 @@ -import { Alert, Button, Card, Collapse, Input, Row, Col, Space, Spin, Table, Typography } from 'antd' +import { Alert, Button, Card, Collapse, Input, Row, Col, Space, Spin, Table, Tag, Typography } from 'antd' import type { ColumnsType } from 'antd/es/table' import { useEffect, useState } from 'react' import { getAnalystDashboard, postAnalystChat, type AnalystChatResponse } from '../../api/analyst' @@ -140,6 +140,18 @@ export function AnalystQueryPage() { description={result.suggestions?.join(' · ')} /> ) : null} + {(result.status === 'success' || result.status === 'degrade') && + (result.meta.template_hit || result.meta.cache_hit) ? ( + + {result.meta.template_hit ? ( + + 模板命中 + {result.meta.template_key ? ` · ${result.meta.template_key}` : ''} + + ) : null} + {result.meta.cache_hit ? 结果缓存 : null} + + ) : null} {(result.status === 'success' || result.status === 'degrade') && result.answer ? ( {result.answer} @@ -168,9 +180,7 @@ export function AnalystQueryPage() { items={[ { key: 'sql', - label: `SQL(${result.meta.row_count} 行 · ${result.meta.exec_ms} ms${ - result.meta.cache_hit ? ' · 缓存命中' : '' - })`, + label: `SQL(${result.meta.row_count} 行 · ${result.meta.exec_ms} ms)`, children:
{result.sql}
, }, ]}