From 45b0ff689175703743f3effaeb042e65e0c976ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Tue, 20 Oct 2026 16:37:03 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20site-import=20spec=20=E5=A4=8D=E5=AE=A1?= =?UTF-8?q?=E5=BB=BA=E8=AE=AE=E5=9B=9B=E9=A1=B9=EF=BC=88=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E8=A6=86=E7=9B=96/=E6=97=B6=E9=97=B4=E5=8F=A3=E5=BE=84/max=5Ft?= =?UTF-8?q?okens=20=E7=9B=AE=E6=A0=87=E5=80=BC/=E9=9D=9E=20HTML=20?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E6=98=A0=E5=B0=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Code --- .../superpowers/specs/2026-10-20-site-import-design.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/superpowers/specs/2026-10-20-site-import-design.md b/docs/superpowers/specs/2026-10-20-site-import-design.md index 20222c6..e20e5ef 100644 --- a/docs/superpowers/specs/2026-10-20-site-import-design.md +++ b/docs/superpowers/specs/2026-10-20-site-import-design.md @@ -9,7 +9,7 @@ 新租户接入目前靠人工:管理员给 Claude 官网 URL,人工抓取分析后手工生成全套行业化配置(两次实操约 30-40 分钟/租户)。本功能把该流程产品化:**给 URL → 服务端抓取 → AI 生成草稿包 → 管理员审核页确认/修改 → 保存进租户配置(热生效)**,使租户接入自助化。 -成功判据:一个新建的空租户,管理员(超管或租户管理员)输入官网 URL,3 分钟内拿到可审核的完整草稿包,审核保存后 AI 客服即以该行业身份正确应答(对照 televicsic/yotaienergys 的实际配置质量)。 +成功判据:一个新建的空租户,管理员(超管或租户管理员)输入官网 URL,**典型路径约 3 分钟**(抓取正常 + AI 两段顺利;最坏重试链路 7 分钟见 §3.3)拿到可审核的完整草稿包,审核保存后 AI 客服即以该行业身份正确应答(对照 televicsic/yotaienergys 的实际配置质量)。 ## 2. 方案总览 @@ -40,7 +40,7 @@ ### 3.2 生成器 `generator.py` - **行为骨架模板**(实施时从 jiancai `system.md` 抽取通用纪律制成):语言规则/职能边界/红线/磨价应对/联系方式策略/对话推进/上下文追踪等段落为固定文本;行业占位符:`{{身份描述}}`、`{{产品线总述}}`、{{规格追问路径}}、`{{好差示例组}}`、`{{推荐建议}}` 等(占位符清单一并定义在模板文件中)。**红线/联系方式策略零 AI 参与。** -- **AI 调用**(走平台 resolver 的 AI 配置——租户 ai 组→平台设置→env;**超时 120s 经 `asyncio.wait_for` 包裹(wait_for 是放弃非取消,to_thread 卸载的调用不中断——记档)、max_tokens 需 GLMProvider 小扩展(参数透传)且实施时核查配置模型的上限**(resolver 默认 glm-4-flash 的旧接口 max_tokens 封顶 4095——传 8K 会报错;实施首步实测当前配置模型可接受的 max_tokens,取 min(目标, 模型上限),记入实施记档)**;**两次调用): +- **AI 调用**(走平台 resolver 的 AI 配置——租户 ai 组→平台设置→env;**超时 120s 经 `asyncio.wait_for` 包裹(wait_for 是放弃非取消,to_thread 卸载的调用不中断——记档)、max_tokens **目标 8192**(需 GLMProvider 小扩展参数透传)且实施时核查配置模型的上限**(resolver 默认 glm-4-flash 的旧接口 max_tokens 封顶 4095——传 8K 会报错;实施首步实测当前配置模型可接受的 max_tokens,取 min(目标, 模型上限),记入实施记档)**;**两次调用): - **调用 1「行业分析」**:输入=各页清洗文本(截断后总量 ≤24K 字符)→ 输出=结构化 JSON:公司概况/产品线(名称+要点)/规格公开与否(bool+依据)/应用领域/联系方式/目标客户/行业关键词/西语尾巴产品词(es tail 用)。 - **调用 2「内容生成」**:输入=调用 1 的 JSON + 占位符清单 + **few-shot 范例**(落位 `app/platform/site_import/fewshot/` 包内数据文件,从生产两租户 yotaienergys/televicsic 的实际配置摘录——身份段/追问路径/好差示例对/事实卡骨架/提取器字段/评估器示例各取范式,总量 ≤6K tokens;**数据治理注记**:摘录内容为提示词/品牌文案非密钥,属用户自有内容入库本仓——客户自有产品的公开话术,风险接受,记档)→ 输出=各占位符内容 + **品牌文案四件**(JSON 键值):`brand_title`(公司名/品牌名+Support 形态)、`welcome`(一句开放式提问,范式照 few-shot)、`topics`(3-5 个产品线短标签)、`placeholder`(输入框占位一句)。品牌四件与占位符同源生成——否则草稿包品牌字段无生成路径(评审抓漏)。 - **生成物语言写死中文**(示例对为英文),与既有提示词体系一致——提示词中明确指令,抓取文本为西语/英语不改变产出语言。 @@ -99,7 +99,7 @@ |---|---| | URL 打不开/404/超时 | failed:「网站打不开或响应太慢——检查 URL」 | | SPA 空壳 | failed:「该网站需要浏览器渲染,暂不支持——请手动配置」 | -| 内容不足(清洗后总文本 <1K 字符,或调用 1 输出产品线为空) | failed:「网站内容不足以生成配置,请在配置中心手动配置」 | +| 内容不足(清洗后总文本 <1K 字符,或调用 1 输出产品线为空,或入口页非 text/html 导致零页) | failed:「网站内容不足以生成配置,请在配置中心手动配置」 | | AI 限流/超时 | failed 带原因;`retry=generate` 只重生成不重抓 | | 内网/非法地址 | POST 即拒(400「仅支持公网网站地址」),连接层二次兜底 | | 生成数字违例 | 剔除 + warnings 注记 | @@ -108,9 +108,9 @@ ## 7. 测试策略 - **抓取器**:SSRF 拒绝矩阵(私网段/端口/逐跳重定向/rebinding 连接层钩子被调用);页数/深度/大小/超时上限;清洗与抽取(本地固定 HTML fixture:WP 形态/内联色/外链 CSS/logo/wa.me/mailto/模板残留样本);SPA 空壳判定。 -- **生成器**:AI provider 注入 fake(固定 JSON/内容)测管线;数字归一化校验器(全半角/单位/波浪号);行业分支选择;占位符填充完整性(模板零残留);生成物语言断言;模板残留剔除。 +- **生成器**:AI provider 注入 fake(固定 JSON/内容)测管线;数字归一化校验器(全半角/单位/波浪号);行业分支选择;占位符填充完整性(模板零残留);生成物语言断言;模板残留剔除;**空占位符出厂兜底分支;品牌四件生成(fake 返回含 brand_title/welcome/topics/placeholder);墙尾巴按池形态分派(出厂单句→替换 / 多句→追加)。** - **任务**:状态机流转、并发上限 409、30 分钟过期惰性清理、retry=generate 不重抓。 -- **API**:两角色 200/未认证 401/停用租户 403/进行中 409/跨租户越权(租户管理员打别的租户 → 403(_tenant_guard 依赖先于处理器,含不存在 slug——勿误写 404))。 +- **API**:两角色 200/未认证 401/停用租户 403/进行中 409/**频控 429(每租户 3 次/15 分钟,新建与 retry 同计)**/GET 过期 404(终态语义)/跨租户越权(租户管理员打别的租户 → 403(_tenant_guard 依赖先于处理器,含不存在 slug——勿误写 404))。 - **前端**:草稿包→表单、保存序列、warnings 分级纯函数 vitest。 - 基线:**计划开工前实跑确认当前基线数**(shared-domain 合入后演进,勿沿用旧数);新增只增不减。