利用litellm作为协议翻译网关,将Codex的ResponsesAPI请求转换为智谱GLM支持的ChatCompletions协议,并手动修复litellm两个已知bug(过滤client_metadata等参数及非function类型工具),从而成功实现跨平台、跨协议的跨界调用,确保了兼容性与功能完整性,使得Codex应用能够无缝调用智谱GLM模型。
Codex+智谱GLM完整跑通教程(全网唯一测试通过)
时间:2026-05-30
浏览:586
文章目录
近期,Codex这一话题再度引发业内关注。据相关团队反馈,该工具在节省Token方面表现突出,GPT-5.2-Codex编码模型的使用体验也较为流畅。然而,国内开发者面临一个现实困境:Codex目前仅支持连接OpenAI自家模型。
我们团队长期使用Claude Code,同时持有智谱GLM的Coding套餐。是否可以将GLM模型直接接入Codex使用?答案是肯定的,但无法实现"直连"——中间必须增加一层协议转换。
许多开发者的第一反应是使用CC Switch,毕竟该工具专为模型切换场景设计。但实践证明,CC Switch对Claude Code有效,对Codex却无法正常工作。
CC Switch:功能边界解析
CC Switch作为一款AI编码工具配置管理软件,主要功能包括管理API Key、Base URL、MCP Server、系统提示词等。它支持一键切换Claude Code、Codex、Gemini CLI的provider,操作确实便捷。
对于Claude Code而言,CC Switch完全够用。由于GLM提供了Anthropic兼容接口(/api/anthropic),只需将ANTHROPIC_BASE_URL指向对应地址,Claude Code即可直接连接GLM,运行无碍。
但Codex的情况不同——它强制要求使用OpenAI的Responses API协议(POST /v1/responses),而GLM仅支持Chat Completions协议(POST /v4/chat/completions)。
CC Switch可以修改URL,但无法转换协议。将Codex的Base URL指向GLM后,Codex发送Responses API请求,GLM将返回404错误。协议层面的不兼容,导致工具无法发挥作用。
解决方案:litellm协议转换
既然Codex使用Responses API,而GLM无法识别,可以在中间部署一个协议转换层:
Codex Desktop → litellm(协议转换)→ 智谱 GLM
litellm是一款开源大模型网关,其核心优势在于支持多种API协议互转。自某个版本起,它已支持Responses API到Chat Completions的桥接模式,这正是所需功能。
安装与配置litellm
安装过程简便,通过pip即可完成:
pip install litellm确认版本不低于1.66.3(低于该版本不支持Responses API桥接):
python3 -c "import importlib.metadata; print(importlib.metadata.version('litellm'))"
输出类似:1.83.11此外,需要准备好智谱API Key。需特别注意,智谱提供两个接口地址,切勿混淆:
- 标准接口:
open.bigmodel.cn/api/paas/v4 - Coding接口:
open.bigmodel.cn/api/coding/…
如果购买的是coding-plan套餐,必须使用Coding接口地址;标准套餐则使用标准接口。接口选择错误,后续所有配置将无效。
配置litellm
创建配置文件~/.claude/litellm-config.yaml:
model_list:
# 为 Codex 配置的条目
- model_name: glm-5.1
litellm_params:
model: custom_openai/glm-5.1
api_base: https://open.bigmodel.cn/api/coding/paas/v4
api_key: 你的智谱API-Key配置完成后启动litellm:
nohup litellm --config ~/.claude/litellm-config.yaml --port 4000 > /tmp/litellm.log 2>&1 &验证启动状态:
curl -s http://127.0.0.1:4000/health | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'healthy: {d[\"healthy_count\"]}')"
# 输出:healthy: 1测试Responses API桥接是否正常:
curl -s -X POST http://127.0.0.1:4000/responses \
-H "Content-Type: application/json" \
-H "Authorization: Bearer 你的API-Key" \
-d '{"model":"glm-5.1","input":"你好","stream":false}'返回包含output字段的JSON,说明协议转换成功。接下来配置Codex Desktop。
配置Codex
Codex的配置文件位于~/.codex/config.toml,编辑如下:
model_provider = "custom"
model = "glm-5.1"
model_reasoning_effort = "high"
disable_response_storage = true
[model_providers]
[model_providers.custom]
name = "custom"
wire_api = "responses"
requires_openai_auth = true
base_url = "http://127.0.0.1:4000"需注意以下关键点:
model设置为glm-5.1,需与litellm配置中的model_name保持一致。wire_api保持"responses",告知Codex仍使用Responses API(litellm负责协议转换)。base_url指向本地litellm地址http://127.0.0.1:4000。
然后编辑认证文件~/.codex/auth.json:
{
"OPENAI_API_KEY": "你的智谱API-Key"
}完全退出Codex Desktop后重新打开,在新对话中发送消息测试。若litellm配置正确,Codex应能收到GLM的回复——但大概率会遇到两个报错,需按以下步骤处理。
修复litellm的两个已知问题(必需操作)
litellm的Responses API桥接模式存在两个已知问题,官方尚未修复,若不手动修改将无法正常运行。
首先找到litellm安装路径:
python3 -c "import litellm; print(litellm.__path__[0])"
# 类似:/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/litellm需修改的文件为responses/litellm_completion_transformation/handler.py。
问题一:client_metadata未过滤
报错信息:AsyncCompletions.create() got an unexpected keyword argument 'client_metadata'
原因是Codex发送的请求中包含client_metadata字段(Codex自身使用的元数据),litellm在协议转换时未过滤该字段,直接传递给了底层OpenAI客户端,导致客户端无法识别而报错。
打开handler.py,找到异步方法async_response_api_handler中的以下代码段:
acompletion_args = {}
acompletion_args.update(kwargs)
acompletion_args.update(litellm_completion_request)
litellm_completion_response: Union[在await litellm.acompletion之前插入过滤代码:
acompletion_args = {}
acompletion_args.update(kwargs)
acompletion_args.update(litellm_completion_request)
# --- Patch: 过滤Responses API专有参数 ---
for _k in ["client_metadata", "max_output_tokens", "previous_response_id"]:
acompletion_args.pop(_k, None)
litellm_completion_response: Union[同步方法response_api_handler中存在相同代码,同样进行修改(将acompletion_args替换为completion_args)。
问题二:非function类型工具未过滤
Codex发送的工具列表中包含web_search、code_interpreter、file_search等OpenAI专有工具类型,而GLM仅支持function类型。litellm同样未进行过滤处理。
在上一步的参数过滤代码之后,紧跟添加工具过滤:
# --- Patch: 过滤非function类型工具 ---
_tools = acompletion_args.get("tools")
if _tools and isinstance(_tools, list):
acompletion_args["tools"] = [t for t in _tools if t.get("type") == "function"]
litellm_completion_response: Union[同步方法同理,将acompletion_args替换为completion_args。
修改完成后重启litellm:
kill $(lsof -i :4000 -t)
nohup litellm --config ~/.claude/litellm-config.yaml --port 4000 > /tmp/litellm.log 2>&1 &然后打开Codex Desktop发送消息,正常情况下连接应已成功建立。
总结
以下是最终链路和相关配置汇总:
Codex Desktop (Responses API) → litellm (:4000) → 智谱 GLM (Chat Completions)
涉及的主要配置文件:
~/.claude/litellm-config.yaml— litellm网关配置(模型、API地址、Key)~/.codex/config.toml— Codex配置(模型、协议、网关地址)~/.codex/auth.json— Codex API Key~/.zshrc— Claude Code环境变量(GLM直连配置)- litellm
handler.py— 源码修改(两个问题修复)
核心逻辑可概括为:协议不兼容时,增加转换层。
CC Switch属于配置管理工具,而非协议转换工具。Claude Code与GLM协议本身兼容,因此无需转换;Codex与GLM协议不兼容,必须依靠litellm在中间进行协议转换。明确这两者的区别,配置过程将更加顺畅。
总之,如需使用国内模型,而对方未提供/v1/responses API协议,可参照此方案实施。最后需要指出,近期Codex关注度再次提升,其在节省Token方面的表现确实出色,输出质量也保持稳定,尤其适合不偏好Claude Code命令行模式的用户群体。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。