docs(skill): model-auto-config端点/路径职责约定重写——端点可互换(主机根+region+timeout,protocol标签废止),profile.path=完整相对路径(含版本段),endpoint_ids空=全部端点;记录2026-09-12测试机数据迁移(自校验14/14)与已废止旧机制清单

This commit is contained in:
yumoqing 2026-09-12 13:03:30 +08:00
parent d0eb95d436
commit d8ba6f210f

View File

@ -15,8 +15,9 @@ tools: [fetch_model_doc, extract_llm_api_spec, apply_llm_config, apply_model_pri
1. **抓取**`fetch_model_doc(url)` → 纯文本(末尾自动带 [出处URL] 行)。失败/内容不足如实说明,不凭记忆编。
2. **提取**`extract_llm_api_spec(doc_text)` → 结构化规格。**成功后规格自动锚定到本会话缓存**
(会话级隔离,返回里有 `__anchored__` 提示)。重点核对:
- `endpoints[].base_url / region`domestic 国内 / international 国际)
- `protocol`:能走 `/chat/completions` 的一律 `openai_compat`;提交+轮询的填 `dashscope_async`
- `endpoints[].base_url / region`domestic 国内 / international 国际)——
base_url 只填**主机根**scheme+域名),路径段归 chat_path/步骤 path见「端点/路径职责约定」)
- `protocol`:能走 chat/completions 语义的一律 `openai_compat`;提交+轮询的填 `dashscope_async`(协议只决定模板形态,不再参与端点选择)
- `models[].capability`:必须在能力字典内(见硬规则)
- `models[].sync_mode`:提交后需轮询的填 async
- `pricing.items[]`:每条带 factor/unit_price/unit/dimensions/doc_quote文档原文定价句
@ -119,32 +120,46 @@ schema 是 Bricks 动态表单的渲染契约,违规字段会被前端**静默
- 模板渲染失败**不要**手工拼模板内容找用户确认方案——修正规格(补 request_example重新
extract→apply 即可,全链幂等;旧坏模板会被自动弃用重建
## 端点协议感知2026-09-05 404 实测教训
## 端点/路径职责约定2026-09-12 重构:端点可互换,废止协议感知
**症状**dashscope_async 原生模型 test_model_call 报「异步任务提交失败 HTTP 404」
但模板渲染正常。
**核心原则(用户定夺)**
1. **模型和端点不能强绑定**:供应商有多个端点时,每个端点都必须支持所有模型。
端点是纯连接点 = 主机根scheme+域名)+ region + timeout多端点只为冗余/区域/多 key。
2. **模型中不能把端点写进 path**profile.path 是从主机根起的**完整相对路径**
(含版本段),运行时 url = 端点主机根 + path。禁止 path 写全 URL、禁止端点
base_url 带路径段。
**根因链**(三个环,缺一环都不 404
1. 供应商同时挂两类端点:`compatible-mode/v1`openai_compat 对话用)与
`api/v1`(原生异步生成用),路径前缀不同、**不可互换**
2. 账号「选用端点」只绑了 compatible-mode → 原生模型运行时被拼到
`compatible-mode/v1/services/aigc/...` → 404
3. 查询模板 path 带了 `/api/v1` 前缀,与端点 base_url 重复拼接 → 双前缀 404
**新约定下的正确形态**(以阿里云百炼为例):
- 端点:`https://dashscope.aliyuncs.com`单主机根timeout 取该主机全部接口
形态的最大值,异步视频需 ≥120
- t2t/m2t profile.path`/compatible-mode/v1/chat/completions`
- 异步生成提交 path`/api/v1/services/aigc/video-generation/video-synthesis`
- 异步查询 path`/api/v1/tasks/{task_id}`(单花括号占位符)
- 账号 endpoint_ids**空 = 选用全部端点**(语义即"任意端点皆可"
**机制修复**(已内置,无需人工):
- 端点落库带 `protocol` 标签;裸域 base_url无路径段自动拦截不入目录
- `_pick_candidate` 协议感知:模型模板 protocol 与端点标签匹配才可用;
有匹配端点时**只选匹配项**(不匹配/未标注的都排除)
- apply 自检:活跃账号未绑本协议端点 → 自动补绑并报 `account_notes`
- 运行时 `_join_url` 拼接去重path 带 base_url 已有前缀时不重复拼
- 提交模板按精确命名(`{protocol}-{cap}-自动配置-{指纹}`)查找,查询/下载步骤模板
命名形态不同,天然不会误选为提交模板(历史版本靠 LIKE 排除,已升级为指纹命名)
**已废止的旧机制**2026-09-05 协议感知,勿再照做):
- ~~端点带 protocol 标签 + `_pick_candidate` 协议过滤~~ → 已删(它正是 t2t 间歇
404 根因:模型无 profile → 过滤跳过 → 被轮询到 api/v1 原生端点拼
/chat/completions 404
- ~~裸域 base_url 拦截~~ → 反转主机根才是合法形态apply/normalize_endpoints
会把带路径段的输入确定性剥成主机根同主机去重、timeout 取 max
- ~~账号"协议补绑"自检~~ → 已删(端点等价后无补绑场景)
- ~~path 剥 base_url 前缀归一~~ → 反转:保留完整相对路径(`_norm_relative_path`
只剥 scheme+host
**给内部 agent 的规则**
- base_url 必须取文档示例 URL 除接口路径外的**完整前缀**(含 /api/v1 等路径段),
裸域必 404提取提示词已强调若仍提成裸域用 overrides.base_url 纠正
- 报 404 先看 apply 返回的 `account_notes`(账号绑定问题)与端点标签
(供应商端点问题),不要重跑模板——模板渲染崩与端点 404 是两类病
- 提取规格的 base_url 只填主机根chat_path/各步骤 path 填完整相对路径(含版本段)。
提取提示词已按新约定改写apply 有确定性归一兜底,但规格本身要按新约定给。
- 报 404 先核对 profile.path 是否完整(缺版本段)与端点是否主机根,不要重跑模板。
- 同主机不同协议形态compatible-mode 与 api/v1**不再拆成多个端点**——同一主机根
端点 + 不同 profile.path 即可。
**数据迁移记录2026-09-12 测试机)**7 供应商端点收敛主机根(智谱全角逗号
脏数据一并修复16 个 active profile path 补全前缀/全 URL 改相对;跨供应商共用
profile 冲突cHoLup m2t 被阿里+MiniMax 共用但版本段不同)按"克隆源模板只改
path"拆分为独立 profile空 profile 的 t2t/m2t 模型新建标准 openai_compat
profile账号 endpoint_ids 清空。迁移脚本带自校验host+新path==旧数据下能跑通的
目标 URL14/14 active 模型 OK 才写库),备份在测试机 backups/。
## 定价2026-09-05 新模式:一模型一方案,无 model 维度,无 filters