- DEFAULT_CHAIN_ADMISSION.md: reviewed and approved, real artifact refs added - DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md: reviewed and approved - scripts/setup_default_data.sh: idempotent init with --dry-run/--apply/artifact - scripts/test/test_default_data.sh: 4 test cases all pass - scripts/acceptance/verify_user_key_self_service.sh: Phase 0 skeleton - .gitignore: add generated artifact directories
5.2 KiB
5.2 KiB
Host Protocol Matrix Script Contract
日期:2026-06-04 状态:待审核 适用版本:vNext.1
目的
定义 scripts/acceptance/verify_host_protocol_matrix.sh 的契约、强制约束与后续生产化路径,确保协议矩阵脚本的输出可被重复信任,不会因为参数模式、超时、错误分类或脱敏不足而误判。
当前状态
verify_host_protocol_matrix.sh 已支持的功能:
- 通过
PROTOCOL_MATRIX_TARGETS_JSON传入探测目标 - 探测
/v1/models、/v1/chat/completions、/v1/responses三个端点 - 支持
DRY_RUN模式,跳过真实网络调用 - 生成
artifacts/host-capability/<timestamp>/protocol-matrix-summary.json - 每 target 输出独立子目录,保留 headers 和 body
- support level 分类:supported-direct / supported-with-plugin-adapter / unsupported-by-host / upstream-unhealthy
--help参数
当前缺口(来自审核报告 P0-5):
这些已在审核报告中明确,但尚未进入脚本实现:
- curl 没有
--connect-timeout、--max-time、重试策略和网络错误分类 - 没有标准化 body error code
- 没有区分 upstream / host / user-key 三层探测
- artifact 没有统一脱敏、保留周期和敏感字段规则
- 失败时脚本整体退出,不保留已完成的 provider 结果
三层探测结构
1. upstream probe
直接请求供应商上游。
参数:
base_url为供应商官方地址api_key为普通 upstream key
输出:
- 上游是否可直连
- 上游协议层兼容性
- 参考 latency
2. host probe
经 sub2api 宿主入口探测。
参数:
base_url为宿主地址api_key为宿主可识别的上游 key / channel key
输出:
- 宿主协议转换层状态
- host 是否通过了 chat / responses
- 与 upstream 的差异
3. user-key probe
使用最终用户 key 测试完整链路。
参数:
base_url为宿主对外公开地址api_key为最终用户 key
输出:
- 用户能否成功走完
chat/completions - 给出 200 或明确失败分类
规则:
- 三层探测使用同一个
PROTOCOL_MATRIX_TARGETS_JSON结构 - 目标定义中加入
probe_layer: "upstream" | "host" | "user-key" - 默认模式:upstream;需要额外参数允许 host / user-key 运行
强制参数
超时与重试
- 每个请求必须设置
--connect-timeout 10 - 每个请求必须设置
--max-time 30 - 重试策略:失败时重试 1 次,间隔 2 秒
- 两次重试仍失败 → 归类为
network_timeout,不视为成功
错误分类 enum
body error code 至少识别:
| 分类 | 匹配规则 | 说明 |
|---|---|---|
| chat_ok | HTTP 200, body 有效 | 正常成功 |
| models_only | only models 200, chat/responses not 200 | 仅 models 可达 |
| responses_unsupported | chat 200, responses not 200 | Host/upstream 不支持 Responses |
| rate_limited | HTTP 429 | 上游/宿主限流 |
| region_blocked | HTTP 403, body region | 区域限制 |
| cloudflare_blocked | body: "1010" 或 "cloudflare" | Cloudflare CDN 拦截 |
| auth_failed | HTTP 401, 403, body: "auth" / "invalid" | 认证失败 |
| network_timeout | curl exit code 28 | 连接/超时 |
| host_protocol_mismatch | chat body 格式与预期不一致 | 宿主协议转换错误 |
| user_key_binding_failed | user-key 路径 body 显示分组/绑定错误 | 权限/groups 问题 |
部分失败输出
- 脚本不得在第一个失败的 target 整体退出
- 已完成的 target 仍然保留 artifact
- failure target 在 summary 中标记
status: failed,并记录错误分类 - 最终 exit code = 0(即使部分 target 失败),除非有脚本内部错误
Artifact 保留要求
- 所有 probe 包含
request_headers.txt、response_headers.txt、response_body.json - secrets 必须在输出前脱敏:
Authorization: Bearer *** - artifact 保留周期:至少 7 天
- artifact 目录结构:
artifacts/host-capability/<timestamp>/
protocol-matrix-summary.json
targets/
01-<provider_id>/
01-models.{headers.txt,body.json}
02-chat.{headers.txt,body.json}
03-responses.{headers.txt,body.json}
...
验收条件
脚本必须通过以下测试:
DRY_RUN=1 bash ./scripts/acceptance/verify_host_protocol_matrix.sh成功- 部分失败不回滚之前 target
- 含
--connect-timeout和--max-time - artifact 目录不含明文 secret
- summary 使用标准化 error enum
- 无
exit 1因单个 target 失败导致
未来生产化方向
- p95 latency 记录
- 增量探测(仅测上次失败/新增的 target)
- 与 SLO pipeline 集成
- 失败分类告警
与本轮范围关系
脚本生产化属于 vNext.1 实现范围的一部分,但当前只完成设计契约。审核通过后开始实现剩余改进。