Skip to content

fix(#187): bailian-token-plan preset apiFormat responses → openai_chat#188

Merged
Cmochance merged 7 commits into
mainfrom
fix/bailian-token-plan-preset
May 17, 2026
Merged

fix(#187): bailian-token-plan preset apiFormat responses → openai_chat#188
Cmochance merged 7 commits into
mainfrom
fix/bailian-token-plan-preset

Conversation

@Cmochance
Copy link
Copy Markdown
Owner

@Cmochance Cmochance commented May 17, 2026

Summary

  • crates/registry/src/presets_data.json:236bailian-token-plan.apiFormat"responses" 改成 "openai_chat",解 issue 百炼 Token Plan preset apiFormat 错配为 responses 导致连接失败 #187 "百炼 Token Plan 连接失败"
  • 补充修复 (e4c5668):fetch_provider_models_impl 加 host 检测分支,token-plan host 走静态硬编码模型清单(借鉴 QwenLM/qwen-code),绕过该套餐 gateway 不支持 list models endpoint 的问题
  • 加 3 个回归测试(preset apiFormat / token-plan host 检测 / 静态列表内容)
  • README 致谢 QwenLM/qwen-code 中英两版
  • 同次调研派生 2 条 followup (docs/followup/26, /27)

Why

A. Chat completions 连接修复(原 PR 主体)

百炼 Token Plan baseUrl 是 https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 —— /compatible-mode/v1 是阿里云 OpenAI 兼容入口,只支持 Chat Completions 协议,docsUrl 明示不带 /v1/responses

旧值 "responses" 触发路由 (crates/adapters/src/registry.rs:105-109) 命中 ResponsesPassthroughAdapter,做字节级透传 (crates/adapters/src/passthrough.rs:50-68),把 Codex Responses 协议 body 原样发上游 → 必返 404 / invalid request → 用户报"连接失败"。

新值 "openai_chat" 命中 ResponsesAdapter,做 Responses → Chat 协议转换,符合上游能力。

对照参考:同文件 presets_data.json:204 的普通 bailian 预设(走同一类 /compatible-mode/v1 入口)apiFormat 已正确配为 "openai_chat",token-plan 这条疑似从普通版抄来时误改了字段。

B. 获取模型按钮修复(补充 commit e4c5668)

用户改 apiFormat 后实测连接通,但"获取模型"按钮在 token-plan 套餐失败。深挖发现:

修法:fetch_provider_models_impl 加 host 检测分支(跟 gemini_cli_oauth 现有 short-circuit 同模式),token-plan host short-circuit 返 4 条静态列表,普通 bailian 不命中继续走 HTTP probe。

Test plan

  • cargo test -p codex-app-transfer-registry presets:: 7/7 pass(含 bailian_token_plan_preset_uses_openai_chat_format)
  • cargo test --bin codex-app-transfer provider_is_bailian_token_plan pass
  • cargo test --bin codex-app-transfer fetch_provider_models_bailian_token_plan_returns_static_list_no_http pass
  • CI 全绿
  • @Cmochance 真机 token plan apikey 验:连接通 + 点"获取模型"出 4 条列表

Out of scope (派生 followup,不在本 PR)

Refs #187

Cmochance added 7 commits May 17, 2026 17:31
百炼 Token Plan 上游 (/compatible-mode/v1) 实际只支持 OpenAI Chat
Completions 兼容,不支持 /v1/responses。当前错配为 responses 后路由
命中 ResponsesPassthroughAdapter 字节级直传,导致请求必返 404/invalid
→ 用户报"连接失败"。

修复后路由命中 ResponsesAdapter,做 Responses → Chat 协议转换,符合
上游能力。加回归测试 bailian_token_plan_preset_uses_openai_chat_format
防再次错配。

调研同步派生两条 followup:
- #26 Plugins / MCP 跟"协议转发"绑定的设计性 gap (UI / README 提示)
- #27 打开 Plugins 后 Codex Desktop 二次 splash 根因诊断 (疑 setAuthMethod
  触发 AuthContext 重 mount)

Refs #187
CI cargo fmt --check 拒了我新加的测试里 baseUrl 一行(超出 100 列)。
rustfmt 自动拆成两行。
…ormat

xtask gen-fixtures 把 tests/replay/fixtures/registry/builtin_presets.json
里 bailian-token-plan.apiFormat 跟 presets_data.json 对齐 (responses →
openai_chat)。rust_embedded_presets_match_committed_fixture 本地通过。
百炼 Token Plan 套餐 (token-plan.cn-beijing.maas.aliyuncs.com) 的网关
auth 优先于 routing,任何 path (含 /compatible-mode/v1/models / 任意
不存在路径) 都返 401 InvalidApiKey,无法 unauthenticated probe 区分
endpoint 存在性。

阿里官方 Qwen CLI 自己就走静态硬编码不调 list models —— 见
QwenLM/qwen-code packages/cli/src/auth/providers/alibaba/tokenPlan.ts
里 TOKEN_PLAN_MODELS 数组 (Apache-2.0)。aliyun/iac-code
src/iac_code/providers/dashscope_provider.py 同样静态注册。

修法:fetch_provider_models_impl 加 host 检测分支,token plan host
short-circuit 返跟 Qwen CLI 一致的 4 条静态列表
(qwen3.6-plus / deepseek-v3.2 / glm-5 / MiniMax-M2.5)。普通百炼
(dashscope.aliyuncs.com) 实测 /models endpoint 可用,不命中本分支,
继续走通用 HTTP probe。

加 2 个回归测试 + README 致谢 QwenLM/qwen-code 中英两版。

Refs #187
百炼 Token Plan 跟 #188 一起端到端验证后,所有内置 preset 都已经过
端到端测试。原 "Kimi / DeepSeek / MiMo 已验证, 其他兼容适配" 二分法
banner 不再准确,移除:
- frontend/index.html: 删 #providerUnverifiedBanner div
- frontend/js/i18n.js: 删 providersAdd.unverifiedNotice (中英两版)
- frontend/js/app.js: 删 isVerifiedProviderId / setUnverifiedBanner
  两个 helper + reset/preset-fill/edit 3 处 call site

Refs #187
README 致谢段只放一句话概览,详细借鉴信息原本散落在代码注释里。
新增根目录 ACKNOWLEDGEMENTS.md 作为上游借鉴的 catalog:每个上游
1 个 entry,必含 Link / 借鉴形式 / 借鉴清单(带本项目对应 file:line),
可选 License / 本项目差异 / 同步策略。

10 条 entry 覆盖现 README 致谢段全部上游:
- farion1231/cc-switch (产品形态启发)
- lonr-6/cc-desktop-switch (fork 演化基础 + updateUrl 迁移)
- BerriAI/litellm (协议双向转换 1:1 镜像)
- tauri-apps/tauri (架构基座)
- Piebald-AI/claude-code-system-prompts (autocompact prompt 蓝本)
- 7as0nch/mimo2codex (SSE 状态机 1:1 复刻)
- router-for-me/CLIProxyAPI (OAuth wire 对齐 + 模型注册参考)
- chenyme/grok2api (反向工程产物借鉴 + statsig 算法)
- galaxywk223/codex-plugin-unlocker (Plugins 解锁算法整体借鉴,MIT)
- QwenLM/qwen-code (Token Plan 模型清单硬编码,Apache-2.0)

README.md / README.en.md 致谢段顶部加 pointer 链到本文档。
后续新增上游时按 schema 加 entry,与 README 一行概览同步。

Refs #187
按用户反馈调整:文档不是 README 摘要,要尽可能详细,作为 catalog 方便
"定位 / 索引 / 更新" 3 类任务。

新增/扩充字段(在用户给的"借鉴形式 + 借鉴内容"基础上):
- License(合规硬要求,1:1 复刻类必填)
- 首次借鉴 PR / 时间(追溯何时入库 + 决策 baseline)
- 本项目差异 / 扩展(future 维护者关键 — 避免上游同步覆盖本地改造)
- 同步策略(上游变更怎么 detect + sync,可操作指引)
- TOS / 法律注意(条件性 — grok2api 等灰色区强制)
- 关联 PR / followup / issue(交叉索引)
- 代码层引用 quote(本项目代码注释原文 evidence)

顶部新增:
- "如何使用本文档" 3 个 use case(定位 / 索引 / 更新)入口
- Entry Schema 表(字段必填 / 可选 + 用途说明)
- 借鉴形式术语表扩充到 10 种 tag + License 处置策略

10 个 entry 全部按新 schema 重写,字段填准已知信息;
不知道的字段(如部分项目首次借鉴 PR#)标注为 "v1.x 起继承" 等可追溯
描述,留维护者按 git log/blame 后续补全。

Refs #187
@Cmochance Cmochance merged commit 673a951 into main May 17, 2026
4 checks passed
@Cmochance Cmochance deleted the fix/bailian-token-plan-preset branch May 17, 2026 10:23
Cmochance added a commit that referenced this pull request May 17, 2026
Bump src-tauri/Cargo.toml + src-tauri/tauri.conf.json + Cargo.lock 到
2.1.10,准备 release。

本版主要修复(已 merge):
- #185 fix(#184): 默认开启 plugin unlock 解锁 + 移除 silent fallback +
  共享 daemon 单例(防 frontend status 看到 OnceCell 残留为 Disconnected)
- #179 chore: autocompact threshold 75% → 80%(256K 上下文留 ~51K buffer
  覆盖典型单 turn 增量,让 PreTurn 几乎总赢)
- #188 fix(#187): 阿里云百炼 Token Plan 端到端 — preset apiFormat
  responses → openai_chat 修连接;Token Plan host 不暴露 list models
  endpoint,fetch_provider_models_impl 加 host short-circuit 返硬编码
  4 条(借鉴 QwenLM/qwen-code TOKEN_PLAN_MODELS,Apache-2.0);banner
  removal(所有上游已端到端验证);新建根目录 ACKNOWLEDGEMENTS.md
  上游借鉴 catalog(9 字段 schema,267 行)

Test plan:
- [x] python3 scripts/check_release_version.py 2.1.10 通过
- [x] cargo update -p codex-app-transfer (Cargo.lock 已同步)
- [ ] CI 全绿
- [ ] merge 后 workflow_dispatch release pipeline → draft release
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant