张胜宇
2b408dc602
feat(W29): 对话内区间涨跌图(零新数字路径)+ 客服业务层事项轴
## 对话内图表(W29)
按「零新数字」路径实现:图只画答复正文里**已经写出来**的数字,不引入任何新数值
(新不变量 INV-8:图内每个数值必须能在同轮文字中找到)。
- E6 出口 data 增 trend_chart(纯增量,只搬运模板已写出的数字:最新净值 /
四个区间涨跌 / 区间首末净值 / 区间高低 / 数据日期)
- 新增 trend-chart.js:**全 DOM API 构建**(widget.js 的 addMessage 一律 textContent,
图表若拼 HTML 串等于把那层 XSS 防护重新打开),涨红跌绿(中国市场惯例)
- widget.js 从 result.tool_calls.data 取数 ⇒ **零后端读取改动**
(result.data 只对 financial_nl2sql 暴露;走 tool_calls 这个已落库的 JSON 列免会签)
验证(真实净值数据 511810 / 160 个净值点、区间 -9.19/5.28/15.27/-6.53):
- jsdom 渲染 11/11 通过;颜色序列 [绿,红,红,绿]
- INV-8 独立断言:图上 18 个可见数字 **100% 命中答复正文**(extra_numbers=[])
- 空数据三态返回 null;label 里塞 <img onerror=...> 后 DOM 中 img 元素数 0
## 客服业务层(W28 遗留,本次一并提交)
- app/core/service_topic.py(新增):业务事项轴 —— 12 个 SVC-* 事项码 ×
处理主体 × 留痕等级;只做留痕统计,不参与任何判定
- customer_service.py 的 E5b 双段话术(删掉「换个说法再问我一次」= 把问题推回客户)、
kb_miss 显式声明(不再靠文本比对,话术一变化比对就静默失效)、
意图漂移护栏(分类器判闲聊但含业务实质则不采信)
- customer_service_rules.py:substantive_business_request 等判据
注:customer_service.py 同时承载 W29 的 trend_chart 与上述 W28 改动,
两者无法按文件切分,故同批提交。
2026-09-22 10:12:14 +08:00
..
2026-09-22 10:12:14 +08:00
2026-09-09 21:55:37 +08:00
2026-09-13 22:08:04 +08:00
2026-09-16 18:17:47 +08:00
2026-09-20 14:33:30 +08:00
2026-09-16 18:17:46 +08:00
2026-09-20 14:33:30 +08:00
2026-09-20 14:33:30 +08:00
2026-09-20 14:33:30 +08:00
2026-09-11 14:12:56 +08:00
2026-09-20 14:33:30 +08:00
2026-09-20 14:33:30 +08:00
2026-09-14 20:14:50 +08:00
2026-09-11 17:32:47 +08:00
2026-09-11 16:57:47 +08:00
2026-09-15 00:55:44 +08:00
2026-09-11 14:46:40 +08:00
2026-09-15 00:41:59 +08:00
2026-09-15 00:41:59 +08:00
2026-09-11 16:11:30 +08:00
2026-09-11 14:46:40 +08:00
2026-09-11 14:44:29 +08:00
2026-09-22 10:12:06 +08:00
2026-09-11 16:57:47 +08:00
2026-09-21 22:32:39 +08:00
2026-09-20 14:33:30 +08:00
2026-09-10 21:43:39 +08:00
2026-09-12 12:50:14 +08:00
2026-09-09 21:55:37 +08:00
2026-09-11 16:57:47 +08:00
2026-09-20 14:33:30 +08:00
2026-09-10 18:42:44 +08:00
2026-09-20 14:33:30 +08:00
2026-09-20 14:33:30 +08:00
2026-09-15 09:06:57 +08:00
2026-09-10 22:08:15 +08:00
2026-09-12 11:15:24 +08:00
2026-09-20 14:33:30 +08:00
2026-09-11 16:57:47 +08:00
2026-09-20 14:33:30 +08:00
2026-09-14 00:30:06 +08:00
2026-09-13 20:39:36 +08:00
2026-09-12 14:11:42 +08:00
2026-09-11 16:57:47 +08:00
2026-09-14 21:26:03 +08:00
2026-09-11 22:31:51 +08:00
2026-09-11 16:57:47 +08:00
2026-09-20 17:53:49 +08:00
2026-09-09 21:55:37 +08:00
2026-09-14 01:07:43 +08:00
2026-09-14 01:07:43 +08:00
2026-09-14 22:16:29 +08:00
2026-09-11 16:57:47 +08:00
2026-09-11 16:57:47 +08:00
2026-09-10 09:23:22 +08:00
2026-09-09 21:55:37 +08:00
2026-09-20 14:33:30 +08:00
2026-09-20 14:33:30 +08:00
2026-09-11 12:47:01 +08:00
2026-09-12 12:10:10 +08:00
2026-09-11 12:47:01 +08:00
2026-09-20 14:33:30 +08:00
2026-09-20 14:33:30 +08:00
2026-09-20 14:33:30 +08:00
2026-09-11 16:42:31 +08:00
2026-09-10 21:55:03 +08:00
2026-09-14 21:26:03 +08:00
2026-09-09 21:55:37 +08:00
2026-09-11 16:57:47 +08:00
2026-09-14 18:13:10 +08:00
2026-09-14 18:13:10 +08:00
2026-09-14 18:13:10 +08:00
2026-09-11 16:57:47 +08:00
2026-09-14 18:13:10 +08:00
2026-09-14 18:13:10 +08:00
2026-09-14 18:13:10 +08:00
2026-09-20 14:33:30 +08:00
2026-09-14 00:30:06 +08:00
2026-09-11 21:22:56 +08:00
2026-09-11 14:14:50 +08:00
2026-09-10 21:03:44 +08:00
2026-09-10 21:03:44 +08:00
2026-09-20 14:33:30 +08:00
2026-09-12 15:56:50 +08:00
2026-09-11 14:16:07 +08:00
2026-09-11 11:42:53 +08:00
2026-09-11 14:24:45 +08:00
2026-09-10 21:03:44 +08:00
2026-09-12 15:56:50 +08:00
2026-09-13 23:51:45 +08:00
2026-09-14 01:41:02 +08:00
2026-09-11 09:49:21 +08:00
2026-09-12 16:30:56 +08:00
2026-09-12 15:56:50 +08:00
2026-09-11 19:37:26 +08:00
2026-09-14 18:13:10 +08:00
2026-09-11 16:57:47 +08:00
2026-09-20 18:55:22 +08:00
2026-09-11 16:57:47 +08:00
2026-09-15 00:10:23 +08:00