From 9aad4187b545320e39188b65cf0652e4f54bea17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Thu, 8 Oct 2026 10:31:26 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20spec=E5=AE=A1=E6=9F=A5=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=E2=80=94=E2=80=94=E6=8E=A8=E9=80=81=5F=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E8=BF=87=E6=BB=A4/=E4=B8=A4=E6=8F=90=E9=86=92?= =?UTF-8?q?=E4=B8=B2=E8=A1=8C=E4=BC=98=E5=85=88=E7=BA=A7/=E7=94=B5?= =?UTF-8?q?=E8=AF=9D=E5=BD=92=E6=B3=9B=E8=AF=8D/=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=8F=A5=E8=BF=87=E5=A2=99=E6=96=AD=E8=A8=80/correction?= =?UTF-8?q?=E9=A2=84=E7=AE=97=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- CLAUDE.md | 6 ++-- ...08-dual-contact-and-country-code-design.md | 33 ++++++++++++++++--- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index e57436e..b3acf73 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,5 +1,5 @@ # CLAUDE.md - +“/; HESUPIPE 管道建材 AI 客服(hesupipe.com,河南和硕集团)。 FastAPI + SQLite + 智谱 GLM,嵌入外贸官网,做"AI 需求了解 + 留资获客 + 邮件/UniService CRM 推送",AI 不回答价格/交期/MOQ 等实质问题,一律引导留资转客户经理。 @@ -27,7 +27,7 @@ CRM 推送",AI 不回答价格/交期/MOQ 等实质问题,一律引导留资 |---|---|---| | 行业与提示词 | 4 个提示词全部建材化:`system.md`(管道外贸人设+MOQ/交期/样品/认证红线)、`company_facts.md`(HESUPIPE 事实卡)、`extractor.md`(意向品类/规格要求/标准要求/采购数量等字段)、`evaluator.md`(管道采购意向分级) | 汽车(Hesu Auto)语义 | | boundary_filter 多语言墙 | 墙按建材市场扩充:`€`/`£`+数字、西葡俄阿价格词(precio/costo/custo/preço/цена/стоимость/سعر/أسعار/ثمن,含复数与阿语定冠词 ال 连写形态)+天数词(días/дней/أيام 等);迂回话术池 EN/ZH/**ES**;规格防误杀(DN/PN/SDR/PE100/SCH/ISO4427/20ft 不拦) | 只中英 + `$` + 零号码墙 | -| 线索键前缀 | `PUSH_EXTERNAL_KEY_PREFIX=ai-kefu-jc`(与汽车项目线索空间隔离,**勿改回 ai-kefu**) | `ai-kefu` | ++| 线索键前缀 | `PUSH_EXTERNAL_KEY_PREFIX=ai-kefu-jc`(与汽车*--*项目线索空间隔离,**勿改回 ai-kefu**) | `ai-kefu` | | 端口 | 8017 | 8016 | | Docker 容器名 | `hs-ai-kefu` | (上游原名不同) | | 品牌 | HESUPIPE,品牌蓝 `#066fc0`(theme.js 与 widget.js 中的主题派生单元整块同步,`tests/test_theme_static.py` 强制一致) | HESU,橙色 | @@ -66,7 +66,7 @@ uvicorn app.main:app --host 0.0.0.0 --port 8017 PYTHONUTF8=1 python scripts/mock_uniservice.py # 监听 9099,X-Api-Key: test-key-123 # 生产部署(服务器上) -bash deploy.sh # docker compose 构建并启动,健康检查 127.0.0.1:8017/health +bash deploy.sh # docker compose 构建并启动,健康检查 7654/health ``` - 聊天演示页 `/`,管理后台 `/admin`,健康检查 `/health`。 diff --git a/docs/superpowers/specs/2026-10-08-dual-contact-and-country-code-design.md b/docs/superpowers/specs/2026-10-08-dual-contact-and-country-code-design.md index 9ec081a..dfdb611 100644 --- a/docs/superpowers/specs/2026-10-08-dual-contact-and-country-code-design.md +++ b/docs/superpowers/specs/2026-10-08-dual-contact-and-country-code-design.md @@ -67,9 +67,25 @@ ### 4.3 一次性计数(防死缠/spam,防漏洞 1/3) -- raw_info 内部状态键(`_` 前缀,不进推送画像):`_email_asked`、`_cc_asked` +- raw_info 内部状态键:`_email_asked`、`_cc_asked` - 注入提醒的同时落计数;条件判断先查计数——**每个提醒每会话最多注入一次** -- 计数由 reminder 注入路径写入(与现有 `_` 前缀内部状态管理同构) +- ⚠️ **推送过滤(spec 审查发现的必需项)**:`lead_push_service._build_payload` + 的 `profile_out = dict(raw_info)` 是整体拷贝且**不过滤 `_` 前缀**(渲染侧 + 两处有过滤,推送端没有)——必须同步加 + `{k: v for k, v in raw_info.items() if not str(k).startswith("_")}` 级过滤, + 并补推送 payload 断言,否则 `_email_asked` 等内部状态泄进生产 CRM +- ⚠️ **计数写回的实现约束**:`_build_context_reminder` 是 staticmethod 且收到 + 的是内存副本——调用方须在流式开始前显式写回 `profile.raw_info` 并提交 + (轮末 extractor 合并起点是 `dict(profile.raw_info or {})`,提前写入可存活) + +### 4.3b 提醒优先级(两提醒同轮并发时的串行规则,spec 审查补充) + +主场景恰恰是并发:客户常"留裸号且无邮箱"。**一次只注入一个,顺序固定**: + +1. **国家代码确认优先**(先把手上的号码补全闭环) +2. 邮箱轻补仅在以下任一条件满足后才允许注入:号码已带国家代码前缀、 + `_cc_asked` 已消耗(问过一次,无论客户是否配合) +3. 即两个提醒由计数与优先级共同串行化——AI 任何一轮只追问一件事 ### 4.4 再索要墙精确化(boundary_filter.py asks_contact) @@ -77,8 +93,10 @@ (None = 原行为全丢,兼容无参调用) - 渠道分辨:精确渠道词(whatsapp / e-mail / 邮箱 / 微信…)命中 → 仅当 该渠道**已在 confirmed_channels** 才丢;不在手则放行 -- **泛渠道词(number / phone / contact / 联系方式 / 号码)保守处理**: +- **泛渠道词(number / phone / contact / 电话 / 联系方式 / 号码)保守处理**: 客户已有任何号码渠道在手 → 照丢(宁丢勿放,防重复索要惹恼客户) +- **精确词与泛词同句共存**(如 "leave your number or email"):任一命中 + 判丢即丢(保守方向) - 中文/英文模式同规则 - conversation.py 调用点传入 confirmed 渠道集合(该状态已在前移区算好) @@ -86,6 +104,8 @@ - 邮箱后到会触发一封"更正/补充邮件"(客户经理先后收 WhatsApp 版、补邮箱版) —— 信息更全,属预期 +- 客户重发完整号走现有"改号覆盖"机制 → 会消耗一次 correction 邮件/推送 + (与邮箱后到共享每会话 3 封上限,正常预算内) - 客户拒绝补国家代码:号码按现状照常 confirmed,线索照发(软引导不设卡) ## 5. 不动清单 @@ -106,7 +126,12 @@ 国家代码追问句;`_cc_asked` 后 → 不含 3. **prompt 静态断言**:system.md 含 "with the country code" / 邮箱轻补模板句 / 好差示例新增组 -4. 全量 pytest 绿(现有再索要墙断言按新语义同步更新) +4. **新模板句过墙回归断言**(spec 审查补充):两个新模板句(国家代码追问句、 + 邮箱轻补句)在对应渠道已确认场景下会被 asks_contact 判丢、在缺失渠道场景 + 放行——防止后续改模板措辞时无意撞墙或穿透 +5. **推送 payload 断言**:`_email_asked`/`_cc_asked` 不得出现在 _build_payload + 产物中(`_` 前缀过滤生效) +6. 全量 pytest 绿(现有再索要墙断言按新语义同步更新) 5. **真实 LLM 验收**(生产冒烟后补):①客户给裸号 `0501234567` → AI 礼貌请其 重发完整号(仅一次);②客户留 WhatsApp → AI 轻补邮箱一次;③只留邮箱的 客户 → 不被纠缠要 WhatsApp(分步双要以 WhatsApp 起手,邮箱-only 客户