Files

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 的品牌值应与其保持一致;它本身不被运行时读取。