以下内容为ai排查,不保证完全正确
摘要
当 Codex 通过 CC Switch 使用 commandcode-proxy 时,tool_search 会被代理单向重命名为 search_tools。由于响应方向没有恢复原名,Codex 收到的是普通工具调用 function_call: search_tools,而不是内部的 tool_search_call,最终报错:
unsupported call: search_tools
因此 multi_agent_v1 无法加载,spawn_agent、wait_agent、close_agent 等子代理工具全部不可用。
环境
commandcode-proxy:master
远端版本:cce214d1db9d15c36ea1b59c1b0fb996834d323a
Codex CLI:0.148.0-alpha.9
Codex Desktop:26.810.52044
Codex wire_api:responses
CC Switch provider API Format:openai_chat
代理链路:Codex → CC Switch → commandcode-proxy → Command Code
复现模型:deepseek/deepseek-v4.1-flash
复现步骤
启动 commandcode-proxy。
将 Codex 的 base_url 指向 CC Switch 的本地代理。
在 Codex 中发起需要动态工具搜索的请求,例如:
请创建一个子代理,只回复 OK。
观察 Codex 会话事件。
实际行为
代理向 Codex 返回:
{
"type": "function_call",
"name": "search_tools",
"arguments": "{"query":"subagent spawn tools"}"
}
随后工具执行结果为:
unsupported call: search_tools
会话中没有 tool_search_call,也不会出现 multi_agent_v1 或 spawn_agent。
预期行为
Codex 应该收到 tool_search,并将其转换为内部动态工具搜索事件。
加载 multi_agent_v1 后,应依次观察到:
tool_search_call
tool_search_output
multi_agent_v1
spawn_agent
根本原因
proxy.mjs#L686-L692 中存在单向别名:
const TOOL_NAME_ALIASES = {
bash_output: 'shell_output',
task_output: 'shell_output',
tool_search: 'search_tools',
read_multiple_files: 'read_file',
};
function toWireToolName(name) {
return TOOL_NAME_ALIASES[name] || name;
}
该别名会在 proxy.mjs#L662 应用于上游工具声明,但响应转换直接透传上游的 event.toolName,没有执行反向映射:
Chat 流式
Chat 非流式
Anthropic 流式
Anthropic 非流式
Responses 流式
Responses 非流式
结果是:
客户端 tool_search
→ 代理上游 search_tools
→ 模型返回 search_tools
→ 代理原样返回 search_tools
→ Codex 无法识别并报 unsupported call
建议修复
建议不要简单删除该别名,因为 tool_search -> search_tools 可能用于兼容 Command Code CLI 或其他客户端。
推荐实现请求级、可逆的工具名映射:
保留上游所需的 search_tools 别名。
为每个请求建立反向映射,例如 search_tools -> tool_search。
将反向映射应用到所有流式和非流式响应转换路径。
出站时同时映射工具声明、tool_choice、历史 tool_calls 和 tool-result 名称。
仅在请求确实声明了 tool_search 时启用反向映射,避免误伤用户自定义的 search_tools 工具。
不能简单对完整别名表执行全局反转,因为 bash_output 和 task_output 都映射到 shell_output,反转会产生歧义。
验收标准
Codex 请求动态工具搜索时产生 tool_search_call。
tool_search_output 成功包含 multi_agent_v1。
spawn_agent 可以成功创建子代理。
Chat Completions、Anthropic Messages、Responses API 均能正确处理。
上述协议的流式与非流式模式均有测试覆盖。
bash_output、task_output、read_multiple_files 的现有别名行为不回归。
临时规避方案
删除 tool_search: 'search_tools' 这一条别名并重启代理后,Codex 可以恢复正常,子代理已实测可用。
该方案适合只服务 Codex 的部署,但没有保留代理原本的上游兼容行为,因此长期修复仍建议使用可逆映射。
以下内容为ai排查,不保证完全正确
摘要
当 Codex 通过 CC Switch 使用 commandcode-proxy 时,
tool_search会被代理单向重命名为search_tools。由于响应方向没有恢复原名,Codex 收到的是普通工具调用function_call: search_tools,而不是内部的tool_search_call,最终报错:因此 multi_agent_v1 无法加载,spawn_agent、wait_agent、close_agent 等子代理工具全部不可用。
环境
commandcode-proxy:master
远端版本:cce214d1db9d15c36ea1b59c1b0fb996834d323a
Codex CLI:0.148.0-alpha.9
Codex Desktop:26.810.52044
Codex wire_api:responses
CC Switch provider API Format:openai_chat
代理链路:Codex → CC Switch → commandcode-proxy → Command Code
复现模型:deepseek/deepseek-v4.1-flash
复现步骤
启动 commandcode-proxy。
将 Codex 的 base_url 指向 CC Switch 的本地代理。
在 Codex 中发起需要动态工具搜索的请求,例如:
请创建一个子代理,只回复 OK。
观察 Codex 会话事件。
实际行为
代理向 Codex 返回:
{
"type": "function_call",
"name": "search_tools",
"arguments": "{"query":"subagent spawn tools"}"
}
随后工具执行结果为:
unsupported call: search_tools
会话中没有 tool_search_call,也不会出现 multi_agent_v1 或 spawn_agent。
预期行为
Codex 应该收到 tool_search,并将其转换为内部动态工具搜索事件。
加载 multi_agent_v1 后,应依次观察到:
tool_search_call
tool_search_output
multi_agent_v1
spawn_agent
根本原因
proxy.mjs#L686-L692 中存在单向别名:
const TOOL_NAME_ALIASES = {
bash_output: 'shell_output',
task_output: 'shell_output',
tool_search: 'search_tools',
read_multiple_files: 'read_file',
};
function toWireToolName(name) {
return TOOL_NAME_ALIASES[name] || name;
}
该别名会在 proxy.mjs#L662 应用于上游工具声明,但响应转换直接透传上游的 event.toolName,没有执行反向映射:
Chat 流式
Chat 非流式
Anthropic 流式
Anthropic 非流式
Responses 流式
Responses 非流式
结果是:
客户端 tool_search
→ 代理上游 search_tools
→ 模型返回 search_tools
→ 代理原样返回 search_tools
→ Codex 无法识别并报 unsupported call
建议修复
建议不要简单删除该别名,因为 tool_search -> search_tools 可能用于兼容 Command Code CLI 或其他客户端。
推荐实现请求级、可逆的工具名映射:
保留上游所需的 search_tools 别名。
为每个请求建立反向映射,例如 search_tools -> tool_search。
将反向映射应用到所有流式和非流式响应转换路径。
出站时同时映射工具声明、tool_choice、历史 tool_calls 和 tool-result 名称。
仅在请求确实声明了 tool_search 时启用反向映射,避免误伤用户自定义的 search_tools 工具。
不能简单对完整别名表执行全局反转,因为 bash_output 和 task_output 都映射到 shell_output,反转会产生歧义。
验收标准
Codex 请求动态工具搜索时产生 tool_search_call。
tool_search_output 成功包含 multi_agent_v1。
spawn_agent 可以成功创建子代理。
Chat Completions、Anthropic Messages、Responses API 均能正确处理。
上述协议的流式与非流式模式均有测试覆盖。
bash_output、task_output、read_multiple_files 的现有别名行为不回归。
临时规避方案
删除 tool_search: 'search_tools' 这一条别名并重启代理后,Codex 可以恢复正常,子代理已实测可用。
该方案适合只服务 Codex 的部署,但没有保留代理原本的上游兼容行为,因此长期修复仍建议使用可逆映射。