Files
ai-kefu-admin/seed_profiles
浅念 9ad02a778f fix: 终审修复——墙执行侧接租户管道(端到端回归锁)+seed补email组+措辞与死依赖清理
C-1(必须修): 墙的执行侧没接租户管道——runtime.compiled_wall 全库只有
AIService 的 $DEFLECTION_POOL 一处消费,conversation.py 执行侧全走模块级
DEFAULT_WALL(jiancai 出厂),auto 租户会话实际跑的是 jc 墙。修复:
- manager 构造时 self._wall = runtime.compiled_wall(与 AIService 同源);
- 6 处过滤调用(violates_boundary/no_contact_value/asks_contact 的句内
  与 pending 尾巴两路)、CC 墙模板/替换句、no_contact 收尾选择、
  pivot/deflection、兜底句、contact_ask 触发日志判定全部传 wall=self._wall;
- _build_context_reminder/_contact_completion_note/_cc_confirm_note/
  _cc_script/_cc_wall_template/_lang_note_for 加 wall=None 尾参
  (None = 模块级默认墙,旧测试直调语义不变;流式侧 _contact_completion_note
  双胞调用同传 wall,写回与注入不漂移);
- 模块级 DEFAULT_WALL 视图常量(BOUNDARY_TRIGGER_RE/_CC_*/_EMAIL_NOTE_* 等)
  保留——boundary_filter 出厂默认与旧测试锚定,boundary_filter 模块级
  DEFAULT_WALL 照旧,conversation 会话流内一律租户墙;
- 端到端回归锁 tests/test_wall_execution_tenant.py(两租户真 runtime +
  脚本化假 AI): jc 独有 [€£] pattern 句在 jiancai 拦截替换(收尾=jc
  pivots 池)/auto 放行逐字流出;同一邮箱违规句两租户各自精确收到自己
  no_contact["web"](12 hours vs replies fast!);contact_ask 提醒注入
  各自墙文案互不渗漏。已验证模拟旧 DEFAULT_WALL 行为时三测全败。

I-1: 两租户 seed 补 email 组(以 brand_values.json 实际值为准:
auto=notify_email 环境值,jiancai=品牌邮箱——其 notify_email 记录是
notify@example.com 占位): auto {sender_name: XYH, notify_emails:
[18339827479@163.com]}, jiancai {sender_name: HESUPIPE, notify_emails:
[hesu@hesuu.com]};seed 存裸名,From 头渲染时外层再包【】。补测
test_seed_tenants_ship_email_group: env NOTIFY_EMAIL patch 成异值证明
seed 槽胜出。

M-1/M-2: README/CLAUDE.md "platform.db 热加载"改为"文件级 registry_reload
热加载(Phase 2 升级为 platform.db)";requirements.txt 删 alembic
(全库零引用,grep 实证唯一命中即该行)。

M-3/M-4(挂账): CLAUDE.md Phase 2 清理单补两项——/health 分级健康
(Phase 4 部署批次)、PromptProvider.from_dir FileNotFoundError 带路径上下文。

全量回归: 463 passed(459 基线 + 4 新增),根目录与 tests/ 子目录同数。

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

seed_profiles —— 出厂租户档案

每个子目录是一个租户的出厂档案(Phase 1 的配置来源;Phase 2 换 platform.db 后作为"新建租户"的模板与"重置出厂"的基准)。

目录结构

seed_profiles/<slug>/
├── tenant.json        # 站点 + 品牌 + 引擎配置(本文件是租户装配入口)
├── wall.json          # 安全墙词表/话术(Task 4 由老项目 AST 提取生成)
├── prompts/           # 提示词 4 件套 md(Task 6 拷入)
│   ├── system.md / company_facts.md / extractor.md / evaluator.md
└── brand_values.json  # 品牌值机器提取草稿(人工归一参考,运行时不读)

tenant.json 要点

  • slug 不可变:客户端存储 key(邀请卡状态、会话令牌)全部以 slug 命名,改动 = 重置所有客户页面记忆;site slug 同理。slug 字段必须与目录名一致(加载期校验)。
  • 站点模型:域名挂在站点上,站点属于租户。每租户至少一个站点。站点两种接入方式(jiancai 的两个站点即示范):
    • 绑域名:main 站 "domains": ["chat2.agent.hnxinyouhe.com", ...],按请求 Host 自动识别(大小写/端口会先归一);
    • 空域名 + data-site:es 站 "domains": [],与 main 共用挂件域名,嵌入代码以 data-site="es" 参数选择站点。
  • site.brand 是覆盖层:缺省项继承 config.brand(深合并),只覆盖门面(标题/欢迎语等);AI 脑子与线索管道留在租户级。
  • wall 不写在 tenant.json 里:加载器会把同目录 wall.json 隐式并入 config["wall"](原始词表,供后台编辑/回滚),编译产物挂 runtime 的 compiled_wall 供引擎消费——词表数据源只有 wall.json 一份。
  • config 内不含 prompts:提示词由目录内 prompts/*.md 提供(Task 6);system.md 必须包含 $DEFLECTION_POOL 占位符——组装时注入 wall.json 的 deflections 话术池(缺失 = 话术池静默不注入;test_prompt_provider 以 glob 遍历守护全部租户)。
  • 加载期显性失败(不流入运行期):无效 JSON、slug 与目录名不一致、零站点、wall 编译错误、域名跨站点/跨租户重复绑定。

纪律

  • 改动本目录后必须跑全量 pytest(出厂配置影响面大,见 CLAUDE.md)。
  • brand_values.json 是 Task 4 的机器提取草稿(conflict=true 处需人工归一),tenant.json 的品牌值应与其保持一致;它本身不被运行时读取。