diff --git a/docs/EXECUTION_BOARD.md b/docs/EXECUTION_BOARD.md index 8ac2d38f..ae5ac2f0 100644 --- a/docs/EXECUTION_BOARD.md +++ b/docs/EXECUTION_BOARD.md @@ -85,6 +85,14 @@ - 当新填的 `supported_models` 已在现有 provider 或草稿里出现时,页面会直接提示“同模型已存在”,并优先建议复用已有 `provider_id`,避免因为“官方 / 中转”重复新增同一模型定义 - `GET /api/packs/{pack_id}/providers` 现已补充返回 `base_url / smoke_test_model / supported_models`,用于前端做模板参考和模型冲突提示 - 2026-05-28 继续把这条规则下沉到服务端:`POST /api/provider-drafts`、`PUT /api/provider-drafts/{draft_id}`、`POST /api/provider-drafts/{draft_id}/publish` 现在都会做 pack 级模型冲突校验;同模型若已被其他 provider / draft 占用,会直接返回 `409 provider_model_conflict` + - 2026-05-28 已新增独立实验 pack `packs/openai-cn-pack-route-lab/`,用于验证 “同一个 group 下挂多条 GPT 路线” 的方案 B 骨架: + - 当前实验 provider 为 `gpt-asxs-route-lab` 与 `gpt-codex2api-route-lab` + - 两者共用 `group_template.name=GPT Shared 路由实验` 与 `plan_template.name=GPT Shared 路由实验套餐` + - 两者使用不同 `channel_template.name`,并先以不同公开 alias 对外: + - `gpt-5.4-asxs` / `gpt-5.4-mini-asxs` + - `gpt-5.4-codex2api` / `gpt-5.4-mini-codex2api` + - 这轮只解决 “同组多线路” 的第一阶段验证,不代表当前系统已经支持 “同公开模型名双线路 + 显式 route policy” + - `codex2api` 当前先按 `https://www.codex2api.com/v1` 作为 API 根地址假设,若 preview/import 失败,需先校正真实 API base URL - 2026-05-26 已把“最终用户 -> 公网域名 -> OpenClaw”这一跳补进正式验证口径: - 公网根地址当前统一为 `https://sub.tksea.top` - OpenClaw 本地 `MiniMax` 运行时故障已定位为 `pi-ai/openai-node` 未继承系统 `HTTP(S)_PROXY`,不是 allowlist 或模型名大小写问题 diff --git a/docs/ROUTE_LAB_VALIDATION.md b/docs/ROUTE_LAB_VALIDATION.md new file mode 100644 index 00000000..eb607c28 --- /dev/null +++ b/docs/ROUTE_LAB_VALIDATION.md @@ -0,0 +1,70 @@ +# Route Lab Validation + +本文件记录 `asxs + codex2api` 同组双线路实验的最小验证路径。 + +## 目标 + +验证以下结论是否成立: + +1. 同一个 `group` 下可以挂两条不同 `base_url` 的 GPT 线路 +2. 两条线路可以通过不同 `channel` 和不同公开 alias 同时对外暴露 +3. 用户进入同一个 group 后,可以稳定看到并调用两条线路 + +## 实验 pack + +- pack 目录:`packs/openai-cn-pack-route-lab` +- provider A:`gpt-asxs-route-lab` +- provider B:`gpt-codex2api-route-lab` + +## 实验建模 + +```text +Group: GPT Shared 路由实验 + Channel: GPT Shared - asxs + Models: + - gpt-5.4-asxs -> gpt-5.4 + - gpt-5.4-mini-asxs -> gpt-5.4-mini + + Channel: GPT Shared - codex2api + Models: + - gpt-5.4-codex2api -> gpt-5.4 + - gpt-5.4-mini-codex2api -> gpt-5.4-mini +``` + +## 关键约束 + +- 两条 provider 的 `group_template.name` 必须完全一致 +- 两条 provider 的 `channel_template.name` 必须不同 +- 第一轮实验不要把两条线路都暴露成同一个公开模型名 +- `codex2api` 当前先按 `https://www.codex2api.com/v1` 作为假设 API 根地址;若 preview 失败,需要先校正 + +## 建议验证顺序 + +1. 静态检查 pack +2. 导入 `gpt-asxs-route-lab` +3. 记录 `group_id / channel_id / account_ids` +4. 导入 `gpt-codex2api-route-lab` +5. 再记录 `group_id / channel_id / account_ids` +6. 核对: + - 两次导入后的 `group_id` 应相同 + - `channel_id` 应不同 + - 两组 account 的 `base_url` 应分别落到 `asxs` 与 `codex2api` +7. 用同一个 group 下的用户 key 验证: + - `GET /v1/models` + - `POST /v1/chat/completions` + +## 成功标准 + +- 同一个 group 下同时存在两条独立 channel +- `gpt-5.4-asxs` 命中 `asxs` +- `gpt-5.4-codex2api` 命中 `codex2api` +- 关闭其中一条上游后,另一条 alias 仍能独立工作 + +## 第二轮暂不做 + +第二轮是把两条线路都暴露成同一个公开模型名,例如都叫 `gpt-5.4`。 + +这一步当前不建议直接做,因为: + +- 现有服务端有同模型冲突校验 +- 即使绕过校验,也还缺显式的 route policy,无法保证官方 / 中转的命中优先级和 fallback 语义 diff --git a/packs/openai-cn-pack-route-lab/README.md b/packs/openai-cn-pack-route-lab/README.md new file mode 100644 index 00000000..a22eaa14 --- /dev/null +++ b/packs/openai-cn-pack-route-lab/README.md @@ -0,0 +1,31 @@ +# openai-cn-pack-route-lab + +这是一个隔离的路由实验 pack,用于验证: + +- 同一个 `group` 下是否可以挂多条不同 `base_url` 的 GPT 线路 +- `asxs` 与 `codex2api` 两条线是否能在同组下稳定共存 +- 第一轮实验时,是否可以通过不同公开 alias 避免同名模型路由冲突 + +当前 pack 只包含两条实验 provider: + +- `gpt-asxs-route-lab` +- `gpt-codex2api-route-lab` + +它们的设计约束是: + +- 共用同一个 `group_template.name` +- 共用同一个 `plan_template.name` +- 使用不同的 `channel_template.name` +- 使用不同的公开模型 alias + +第一轮实验期望模型: + +- `gpt-5.4-asxs` +- `gpt-5.4-mini-asxs` +- `gpt-5.4-codex2api` +- `gpt-5.4-mini-codex2api` + +注意: + +- `codex2api` 当前先假设 OpenAI-compatible API 根地址为 `https://www.codex2api.com/v1` +- 如果导入前 preview 或导入后 `/v1/models` 返回 404,需要先把 provider manifest 里的 `base_url` 改成该服务真实 API 根地址,再重新校验 `checksums.txt` diff --git a/packs/openai-cn-pack-route-lab/checksums.txt b/packs/openai-cn-pack-route-lab/checksums.txt new file mode 100644 index 00000000..0015852b --- /dev/null +++ b/packs/openai-cn-pack-route-lab/checksums.txt @@ -0,0 +1,3 @@ +a531d0c8cf59e1c026b1d887209e1485020f1572a4cbf591b040f244b204e0ad pack.json +aeb0e999074fd6ea173e9d40a4b9147f4e0da1159554d76dd13675a5964d8b89 providers/gpt-asxs-route-lab.json +bc7c71d34609ff2e87720d1bfaa4aaf264de413d0a565cf66000658c43ea1cbb providers/gpt-codex2api-route-lab.json diff --git a/packs/openai-cn-pack-route-lab/pack.json b/packs/openai-cn-pack-route-lab/pack.json new file mode 100644 index 00000000..041c3015 --- /dev/null +++ b/packs/openai-cn-pack-route-lab/pack.json @@ -0,0 +1,10 @@ +{ + "pack_id": "openai-cn-pack-route-lab", + "version": "0.1.0", + "vendor": "YourTeam", + "target_host": "sub2api", + "min_host_version": "0.1.126", + "max_host_version": "0.2.x", + "providers_dir": "providers", + "checksum_file": "checksums.txt" +} diff --git a/packs/openai-cn-pack-route-lab/providers/gpt-asxs-route-lab.json b/packs/openai-cn-pack-route-lab/providers/gpt-asxs-route-lab.json new file mode 100644 index 00000000..b4a03d7c --- /dev/null +++ b/packs/openai-cn-pack-route-lab/providers/gpt-asxs-route-lab.json @@ -0,0 +1,31 @@ +{ + "provider_id": "gpt-asxs-route-lab", + "display_name": "GPT asxs 路由实验", + "base_url": "https://api.asxs.top/v1", + "platform": "openai", + "account_type": "apikey", + "default_models": ["gpt-5.4-asxs", "gpt-5.4-mini-asxs"], + "smoke_test_model": "gpt-5.4-asxs", + "group_template": { + "name": "GPT Shared 路由实验", + "rate_multiplier": 1.0 + }, + "channel_template": { + "name": "GPT Shared - asxs", + "model_mapping": { + "gpt-5.4-asxs": "gpt-5.4", + "gpt-5.4-mini-asxs": "gpt-5.4-mini" + } + }, + "plan_template": { + "name": "GPT Shared 路由实验套餐", + "price": 19.9, + "validity_days": 30, + "validity_unit": "day" + }, + "import": { + "supports_multi_key": true, + "supports_strict": true, + "supports_partial": true + } +} diff --git a/packs/openai-cn-pack-route-lab/providers/gpt-codex2api-route-lab.json b/packs/openai-cn-pack-route-lab/providers/gpt-codex2api-route-lab.json new file mode 100644 index 00000000..3a864013 --- /dev/null +++ b/packs/openai-cn-pack-route-lab/providers/gpt-codex2api-route-lab.json @@ -0,0 +1,31 @@ +{ + "provider_id": "gpt-codex2api-route-lab", + "display_name": "GPT codex2api 路由实验", + "base_url": "https://www.codex2api.com/v1", + "platform": "openai", + "account_type": "apikey", + "default_models": ["gpt-5.4-codex2api", "gpt-5.4-mini-codex2api"], + "smoke_test_model": "gpt-5.4-codex2api", + "group_template": { + "name": "GPT Shared 路由实验", + "rate_multiplier": 1.0 + }, + "channel_template": { + "name": "GPT Shared - codex2api", + "model_mapping": { + "gpt-5.4-codex2api": "gpt-5.4", + "gpt-5.4-mini-codex2api": "gpt-5.4-mini" + } + }, + "plan_template": { + "name": "GPT Shared 路由实验套餐", + "price": 19.9, + "validity_days": 30, + "validity_unit": "day" + }, + "import": { + "supports_multi_key": true, + "supports_strict": true, + "supports_partial": true + } +}