e34378257f
- PromptProvider(app/engine/services/ai_service.py): 租户提示词四件套 from_dir 加载;build_system 把 system.md 的 $DEFLECTION_POOL 占位符替换为 wall.json deflections 话术池(按语言分组一行,EN/ZH/ES)再拼事实卡; extractor/evaluator 的 $existing_info/$messages/$profile/$recent_messages 替换逻辑自 AIService 原样搬入(行为等价);删模块级 import 时读文件的 PROMPTS_DIR 与四个常量,保留 DEFAULT_PROVIDER(jiancai 出厂,__file__ 锚定) - 两租户 system.md「三类请求的处理」第2条的迂回话术枚举 → $DEFLECTION_POOL 占位符(保留段落说明文字),话术只存 wall.json 一份,改一处两边同步变 - TenantRuntime 加 prompts 字段(加载期 from_dir(seed_dir/prompts)); ConversationManager 的 runtime 转必填(keyword-only),默认 AIService 用 runtime.prompts + compiled_wall.deflections 组装 - app/engine/prompts/ 删除(grep 无代码消费方,jiancai 出厂由 seed_profiles/jiancai/prompts 承接);test_company_facts/ test_system_prompt_dual_contact 的 cwd 相对路径改 Path(__file__) 锚定, test_extractor_evaluator_prompts 断言对象改 DEFAULT_PROVIDER(语义等价) - 新增 tests/test_prompt_provider.py(14 用例): 加载/注入/格式/占位符防漂移/ extractor-evaluator 组装/registry 接线/runtime 必填/池线过两墙 Co-Authored-By: Claude Code <noreply@anthropic.com>
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)。- 加载期显性失败(不流入运行期):无效 JSON、slug 与目录名不一致、零站点、wall 编译错误、域名跨站点/跨租户重复绑定。
纪律
- 改动本目录后必须跑全量 pytest(出厂配置影响面大,见 CLAUDE.md)。
brand_values.json是 Task 4 的机器提取草稿(conflict=true处需人工归一),tenant.json的品牌值应与其保持一致;它本身不被运行时读取。