浅念 568c116839 fix: 验收P1P2——轮末新建态免计免消费(回显首轮语义)+P3西语ECHO/ASK模板
P1(换国"报国→再回显→确认"结构性不可达) + P2(extractor 裸号轮误
affirm 跳过确认流)同根因修复: "轮前新建态"的轮语义——回显/追问首次
发出轮,客户本轮还没机会回应确认句,轮末既不消耗 attempts 也不消费
cc_reply。实现: _cc_round_end 增 first_ask 判据(本轮墙确有触发 × 状态
未标记 asked),首问轮只落 asked 标记直通;attempts 从等待回应轮起计。
判据用 asked 标记而非轮前快照比对——统一覆盖轮前新建与轮末补建两条
建态路径的首个墙轮(补建态当轮无墙,首问顺延下轮,否则 P1 结构性残留)。

P3(西语回显轮是英文): 新增 _CC_ECHO_ES/_CC_ASK_ES/_CC_WALL_ES,
_cc_script/_cc_wall_template/_cc_confirm_note 语言分流扩 ES(_cc_lang_of,
与 _lang_pool 同款西语特征粗匹配);no_ip 墙裁决锚补 "código de país"
西语同词(服从句不再被误替换);e164 digits 裁决锚语言无关不受影响。

修复后时序(常规 cap=2): 回显轮(免计0)→等待回应轮起计1→2落定,
落定较修复前多一轮,客户回应机会不变;no_ip cap=1: 首问轮免计,
报国/不理睬一轮后落定。

测试 308→315: 新增7(换国三轮流/首问轮免消费/补建路径首问免计/西语
ECHO墙/西语reminder/西语no_ip ASK/西语服从句放行);迁移9项受
"新建态免计"影响的既有断言(attempts 起点变化/落定轮次顺延)。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-08 20:49:13 +08:00

HESUPIPE 建材 AI 客服

为 HESUPIPE(hesupipe.com,河南和硕集团管道建材出口业务)打造的官网 AI 客服系统。 服务全球 B2B 管道采购买家:AI 了解需求(品类/规格/数量/用途/目标国家)→ 引导留资 → 线索经邮件 + UniService CRM 推送交人工客户经理跟进。

AI 只做"需求了解 + 留资":价格、交期、MOQ、样品费、质保年限等实质问题一律不正面回答, 多语言输出墙(中/英/西/葡/俄/阿 + €/£ 货币符号)兜底拦截,引导留资转客户经理。

本项目复制自同集团汽车业务 AI 客服(ai-kefu,~85% 代码同源)并建材化定制。 血缘与同步规则见 CLAUDE.md;设计文档见 docs/superpowers/specs/2026-09-29-building-materials-ai-kefu-design.md。

技术栈

  • 后端:Python / FastAPI + SQLAlchemy(async) + SQLite(data/hesupipe_ai_kefu.db)
  • LLM:智谱 GLM(默认 glm-4-flash,zhipuai SDK,流式输出)
  • 前端:原生 JS 挂件(static/widget.js,Shadow DOM 隔离,可嵌入任意官网)+ WebSocket 流式对话
  • 线索出口:SMTP 邮件(aiosmtplib)+ UniService CRM HTTP 推送(httpx,带重试矩阵)
  • 部署:Docker + docker compose + OpenResty 反代

本地启动

pip install -r requirements.txt

cp .env.example .env
# 编辑 .env,至少填入:
#   ZHIPU_API_KEY=...          智谱 API Key(必需)
#   其余 SMTP / 推送配置可先留占位

uvicorn app.main:app --host 0.0.0.0 --port 8017

测试

pip install -r requirements-dev.txt
pytest
  • 230 项全绿是合并门槛(LLM 全 mock,验证代码正确性)。
  • 真实 LLM 验收(守边界/语言跟随/留资链路/推送联调)用 scripts/mock_uniservice.py 配合真实智谱 Key 进行,清单与最近一次验收结果见 docs/test-checklist.md。

部署(生产)

# 服务器上(.env 已按生产配置就绪)
bash deploy.sh

deploy.sh = docker compose 停旧 → 构建 → 启动(容器名 hs-ai-kefu,宿主端口 8017)→ 健康检查。外层用 OpenResty 反代到公网(配置见 openresty.conf,后端路径 hesupipe_ai_kefu),WebSocket(/ws/chat)与 HTTP 同端口。

上线切换检查单(开发 → 生产,一次性完成)

  • 事实卡业务侧审核(设计文档 §4.2 必经关卡):懂管道产品的人逐条过目 app/prompts/company_facts.md——AI 说的每句公司情况都来自这张卡
  • 清验收测试数据:删除或归档 data/hesupipe_ai_kefu.db (含验收期的 15 个测试会话与推送日志,直接上生产会污染后台视图)
  • .env 中 PUSH_ENABLED=true(开发期为 false,防测试线索推爆生产 CRM)
  • PUSH_API_URL / PUSH_API_KEY 换成真实 UniService 地址与 Key (PUSH_EXTERNAL_KEY_PREFIX=ai-kefu-jc 保持不变,与汽车项目线索隔离)
  • NOTIFY_EMAIL 换成管道业务客户经理邮箱(非测试邮箱)
  • SMTP 配置为真实发件账号(已在生产服务器就绪)
  • 绑定生产域名(如 ai.hesupipe.com)并配好 HTTPS 证书
  • 官网按 docs/embed-guide.md 嵌入挂件
  • 上线后第一周跑 scripts/breach_rate.py 观测漏放/误杀(设计文档 §9.3)

管理后台

入口 /admin(登录走 /api/admin/login)。三视图:

  • 会话列表:全部对话、消息数、意向分级、联系方式、邮件已发标记
  • 会话详情:完整对话记录 + 客户画像 chips(意向品类/规格要求/标准要求/采购数量/ 用途/目标国家/联系方式)
  • 推送日志:lead / correction 推送记录与状态(含重试轨迹)

挂件嵌入官网

挂件由本服务 /static/widget.js 提供,一行 <script> 即可嵌入官网(WordPress 或任意 建站系统)。嵌入代码、配置项(位置/主题色/WhatsApp/邮箱/自动邀请等)、三种 WordPress 粘贴方式与上线检查单,见 docs/embed-guide.md。

主题色默认已是 HESUPIPE 品牌蓝 #066fc0,可用 data-color 覆盖,整套配色自动派生。

目录速览

app/
  prompts/          4 个提示词(system/company_facts/extractor/evaluator)——建材化核心
  services/         会话管理、boundary_filter 多语言墙、留资管道、推送、邮件
  api/              WebSocket + REST 路由、admin 路由
static/             widget.js(官网挂件)、chat.html、admin.html、js/theme.js
scripts/            mock_uniservice.py(联调)、breach_rate.py(上线观测)
docs/               changelog 归档、test-checklist.md、embed-guide.md、设计文档
tests/              230 项 pytest(LLM 全 mock)
S
Description
建材ai 客服
Readme 2.2 MiB
Languages
Python 81.7%
JavaScript 9.3%
HTML 7.1%
CSS 1.6%
Shell 0.2%