fix(desktop): one-shot Responses 请求体不再发送空 tools 下的 tool_choice - #2689
fix(desktop): one-shot Responses 请求体不再发送空 tools 下的 tool_choice#2689TravisCao wants to merge 2 commits into
Conversation
api.x.ai 对「tools 为空 + tool_choice」直接 400(invalid-argument: "A tool_choice was set on the request but no tools were specified"), 导致 xAI 会话的 Auto-review 评审 100% 失败,3 次重试后弹 AUTO_REVIEW_UNAVAILABLE,全部动作退回手动确认。 one-shot 请求从不声明 tools,删除硬编码的 tool_choice:'auto' 即可; 与 anthropic-responses-bridge translate-request 的既有约定对齐 (bridge 只在有 function tools 时才下发 tool_choice)。 两个上游端点均已实测(2026-08-13): - api.x.ai/v1/responses(grok-4.6):原 body 400,去掉 tool_choice 后 200 - chatgpt.com/backend-api/codex/responses(gpt-5.6-sol):去掉后仍 200 fix makecindy#2684 Signed-off-by: Travis Cao <edwardjordan172@gmail.com>
|
| Filename | Overview |
|---|---|
| apps/desktop/src/main/utility-model/oneShotCandidates.ts | 无工具的 one-shot Responses 请求不再发送不兼容的 tool_choice,并与现有 bridge 约定保持一致。 |
| apps/desktop/src/main/utility-model/tests/oneShotCandidates.test.ts | xAI 回归测试现在明确验证序列化请求体不含 tool_choice。 |
Reviews (1): Last reviewed commit: "fix(desktop): one-shot Responses 请求体不再发送..." | Re-trigger Greptile
|
首次向本仓库提交, Greptile 已给 5/5,无 inline 意见。请有权限的同事批准这批 workflow;CI 过后再走 CODEOWNERS review。 |
|
@TravisCao 👋 这个 PR 目前与 请在本地 merge 最新的 |
…es-tool-choice Signed-off-by: Travis Cao <edwardjordan172@gmail.com>
|
No reviewable files after applying ignore patterns. |
@MagicLizi 已经 merge 了~ |
|
Closing: net diff is empty after conflict resolution; the fix already landed in #2799. |
这次改了什么
摘要
fix #2684。one-shot Responses 请求体(
requestProviderHttpText,wireresponses)删除硬编码的tool_choice: 'auto'。one-shot 请求从不声明 tools,而 api.x.ai 对「空 tools + tool_choice」返回 HTTP 400 invalid-argument("A tool_choice was set on the request but no tools were specified"),导致 xAI 会话的 Auto-review 评审 100% 失败、3 次重试耗尽后弹AUTO_REVIEW_UNAVAILABLE,所有需评审动作退回手动确认。anthropic-responses-bridge/translate-request.ts的既有约定对齐:bridge 只在有 function tools 时才下发tool_choice/parallel_tool_calls(主对话因此不受影响);one-shot 自拼 body 漏掉了这条约定。tools: []与parallel_tool_calls: false:两上游实测均接受,最小化对现网 openai 分支请求形状的扰动。tool_choice。变更类型
fix缺陷修复feat新功能refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
apps/desktop/src/main/utility-model/oneShotCandidates.ts请求体单字段移除 +__tests__/oneShotCandidates.test.ts回归断言UI 变化
不涉及。
怎么验证的
自动验证
手工验证
用本人订阅凭证对两个真实上游做了字段级隔离重放(2026-08-13,macOS arm64):
api.x.ai/v1/responses(grok-4.6,SuperGrok OAuth):tools:[]单独tools:[]+parallel_tool_calls:falsetools:[]+tool_choice:"auto"tool_choice后的完整 bodychatgpt.com/backend-api/codex/responses(gpt-5.6-sol,ChatGPT OAuth):移除tool_choice后的 body HTTP 200,openai 分支不受影响。未执行的验证
风险
风险分类
影响与回滚
responses的 one-shot 请求体少发一个tool_choice字段——内置 openai(实测不受影响)、内置 xai(修复对象)、声明 responses 协议的自定义供应商(标准 Responses 语义下该字段在空 tools 时本就非法,移除只会降低被拒风险);主对话 bridge 路径字节不变。提交前检查
git commit -s,见 DCO)