fix(#187): bailian-token-plan preset apiFormat responses → openai_chat#188
Merged
Conversation
百炼 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
This was referenced May 17, 2026
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
crates/registry/src/presets_data.json:236的bailian-token-plan.apiFormat从"responses"改成"openai_chat",解 issue 百炼 Token Plan preset apiFormat 错配为 responses 导致连接失败 #187 "百炼 Token Plan 连接失败"fetch_provider_models_impl加 host 检测分支,token-plan host 走静态硬编码模型清单(借鉴 QwenLM/qwen-code),绕过该套餐 gateway 不支持 list models endpoint 的问题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 套餐失败。深挖发现:
*.maas.aliyuncs.com) 在 unknown path 全返401 InvalidApiKey(routing 在 auth 之后,真假 endpoint 看不出来)QwenLM/qwen-codepackages/cli/src/auth/providers/alibaba/tokenPlan.ts里TOKEN_PLAN_MODELS数组直接写死(Apache-2.0)aliyun/iac-codedashscope_provider.py:13同样静态注册dashscope.aliyuncs.com/compatible-mode/v1/models用户实测可用,不在此范围修法:
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_planpasscargo test --bin codex-app-transfer fetch_provider_models_bailian_token_plan_returns_static_list_no_httppassOut of scope (派生 followup,不在本 PR)
docs/followup/26-plugins-mcp-protocol-binding-ui-hint.mdsetAuthMethod('chatgpt')触发 AuthContext 重 mount,需先关autoUnlockCodexPlugins复测验证。详docs/followup/27-codex-desktop-double-splash-on-plugin-unlock.mdRefs #187