From 026eb056ceb42917834975866dbff9ba76538681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Mon, 12 Oct 2026 14:28:12 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20spec=20=E8=AF=84=E5=AE=A1=E6=84=8F?= =?UTF-8?q?=E8=A7=81=E8=90=BD=E6=A1=A3=EF=BC=88brand=20=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E6=90=BA=E5=B8=A6=20tenant=20slug=E3=80=81=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E5=8B=98=E8=AF=AF=E3=80=81Redis=20=E6=AD=BB?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=98=BE=E5=BC=8F=E4=B8=A2=E5=BC=83=E3=80=81?= =?UTF-8?q?admin=20=E5=9F=9F=E5=90=8D=E5=8D=A0=E4=BD=8D=E6=B3=A8=E8=AE=B0?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- .../specs/2026-10-12-unified-kefu-platform-design.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/superpowers/specs/2026-10-12-unified-kefu-platform-design.md b/docs/superpowers/specs/2026-10-12-unified-kefu-platform-design.md index 3f01b10..338c7ab 100644 --- a/docs/superpowers/specs/2026-10-12-unified-kefu-platform-design.md +++ b/docs/superpowers/specs/2026-10-12-unified-kefu-platform-design.md @@ -147,7 +147,7 @@ class TenantRegistry: | 文件 | 现状 | 改造后 | |---|---|---| -| config.py | 全局 Settings 读 .env | 拆 ProcessSettings(.env:平台库路径/端口/超管初始密码)+ TenantConfig(platform.db) | +| config.py | 全局 Settings 读 .env | 拆 ProcessSettings(.env:平台库路径/端口/超管初始密码)+ TenantConfig(platform.db);顺带丢弃 Redis 死配置(REDIS_URL/REDIS_PASSWORD) | | ai_service.py | import 时读 4 提示词 | PromptProvider 挂 TenantRuntime;组装 = system.md + company_facts.md + `$DEFLECTION_POOL` 注入 + 当轮 context reminder | | conversation.py(约 1250 行) | 3 组模块级正则 + 逐字话术 | 正则/话术从 config.wall 编译;Manager 每租户实例化;**只做依赖注入,不重写结构** | | boundary_filter.py | 正则话术焊死 | 纯函数化:接收已编译词表,机制与数据分离 | @@ -171,8 +171,8 @@ class TenantRegistry: ### 6.3 前端 -1. widget.js:启动时 `fetch /api/public/brand`(Host 已识别租户,免鉴权返回品牌 JSON)→ 与 data-* 合并(data-* 优先);失败时 data-*/中性默认兜底;no-cache。 -2. 客户端 key 全部租户化:`cc-widget-host-`、`widget_invite_dismissed__`、chat 页 localStorage 会话 key 同理——同页双挂件根治。 +1. widget.js:启动时 `fetch /api/public/brand`(Host 已识别租户,免鉴权返回品牌 JSON,**响应携带 tenant slug**)→ 与 data-* 合并(data-* 优先);失败时 data-*/中性默认兜底;no-cache。 +2. 客户端 key 全部租户化(`` 取 brand 响应里的 tenant slug):`cc-widget-host-`、`widget_invite_dismissed__`、chat 页 localStorage 会话 key 同理——同页双挂件根治。 3. widget.js 与 chat.html 保持零构建原生 JS(嵌入官网资产必须轻量零依赖);主题派生单元机制不变,默认值来自品牌配置。 ### 6.4 目标目录结构 @@ -248,7 +248,7 @@ all-kefu/ ``` chat.agent.hnxinyouhe.com ─┐ chat2.agent.hnxinyouhe.com ─┼→ 1Panel 各站点反代 → 127.0.0.1:8018 → all-kefu 容器 -admin.xxx.com(新) ─┘ +admin.xxx.com(新,具体值部署前由需求方确定)─┘ ``` - 一个容器一个 upstream;compose 固定 `name: all-kefu`(互删根因根治——只剩一个 compose 项目);WS 升级头单套(426 教训);`/static/widget.js` no-cache(缓存教训);`--workers 1`。 @@ -258,7 +258,7 @@ admin.xxx.com(新) ─┘ ## 10. 测试策略 -1. **机制测试全保留**:jc 的 230 项 + 上游独有测试,移植到统一 conftest——租户夹具(临时 platform.db + auto/jc 两个种子租户 + 各自租户库),断言基本不动;LLM 全 mock 原则不变。 +1. **机制测试全保留**:jc 的全部机制测试(约 320 个用例,实测计数;jc 文档旧称 230 项)+ 上游独有测试,移植到统一 conftest——租户夹具(临时 platform.db + auto/jc 两个种子租户 + 各自租户库),断言基本不动;LLM 全 mock 原则不变。 2. **多租户专项(改造的回归安全网)**:Host 路由(A 域名进 A、未知 Host 404);跨租户数据隔离(A 的 admin/API 摸不到 B 数据);配置热切换(保存新提示词→下一条消息生效;改词表→墙行为即时变);前缀唯一约束;快照深合并默认值;试金石判定;widget 客户端 key 租户前缀(静态断言);停用租户行为。 3. **真实 LLM 验收**:真实智谱 Key + scripts/mock_uniservice.py 联调流程照旧(沿用 test-checklist 体系)。