Files
sub2api-cn-relay-manager/docs/2026-06-04-HOST_PROTOCOL_MATRIX_SCRIPT_CONTRACT.md
phamnazage-jpg 492f33a129
Some checks failed
CI / Build & Test (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Release (push) Has been cancelled
feat(vnext): complete vNext.1 release gate — default chain admission, idempotent init, user key skeleton
- 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
2026-06-05 11:07:50 +08:00

5.2 KiB
Raw Blame History

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

这些已在审核报告中明确,但尚未进入脚本实现:

  1. curl 没有 --connect-timeout--max-time、重试策略和网络错误分类
  2. 没有标准化 body error code
  3. 没有区分 upstream / host / user-key 三层探测
  4. artifact 没有统一脱敏、保留周期和敏感字段规则
  5. 失败时脚本整体退出,不保留已完成的 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.txtresponse_headers.txtresponse_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}
    ...

验收条件

脚本必须通过以下测试:

  1. DRY_RUN=1 bash ./scripts/acceptance/verify_host_protocol_matrix.sh 成功
  2. 部分失败不回滚之前 target
  3. --connect-timeout--max-time
  4. artifact 目录不含明文 secret
  5. summary 使用标准化 error enum
  6. exit 1 因单个 target 失败导致

未来生产化方向

  • p95 latency 记录
  • 增量探测(仅测上次失败/新增的 target
  • 与 SLO pipeline 集成
  • 失败分类告警

与本轮范围关系

脚本生产化属于 vNext.1 实现范围的一部分,但当前只完成设计契约。审核通过后开始实现剩余改进。