将智谱 GLM Coding Plan API 转换为 OpenAI Codex 兼容格式。
通过 litellm 代理层,让 Codex CLI 直接调用 GLM 系列模型(glm-4.7 / glm-5 / glm-5.1 / glm-5.2)。
Codex CLI ──► [Codex Proxy :9002] ──► litellm ──► 智谱 GLM API
│
└─► filter_tools (仅保留 function 类型 tool)
codex-proxy/
├── src/codex_proxy/ # 源码
│ ├── __init__.py # 包初始化
│ ├── __main__.py # 模块入口 (python -m codex_proxy)
│ ├── server.py # 主服务:配置加载 → litellm 启动
│ ├── config.py # 配置管理(文件 + 环境变量)
│ └── tool_filter.py # Monkey-patch:过滤 GLM 不支持的 tool 类型
├── config/
│ └── providers.example.yaml # 配置模板(复制后编辑)
├── install.sh # systemd 一键安装脚本
├── pyproject.toml # Python 项目元数据
├── requirements.txt # 依赖清单
├── .env.example # 环境变量模板
└── README.md
# 复制配置模板
cp config/providers.example.yaml config/providers.yaml
# 编辑配置,填入你的 API Key
nano config/providers.yaml或通过环境变量配置(见 .env.example):
export CODEX_PROXY_API_KEY=your-key-here# 方式一:直接安装依赖后运行
pip install -r requirements.txt
python -m codex_proxy
# 方式二:一键安装为 systemd 服务
sudo bash install.sh编辑 ~/.codex/config.toml:
model = "glm-5.2"
model_provider = "codex-proxy"
[model_providers.codex-proxy]
name = "codex-proxy"
base_url = "http://127.0.0.1:9002/v1"
experimental_bearer_token = "any-key"
requires_openai_auth = false
wire_api = "responses"curl http://127.0.0.1:9002/health所有配置均可通过 providers.yaml 或环境变量设置,环境变量优先级更高。
| 配置项 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
| api_base | CODEX_PROXY_API_BASE |
https://open.bigmodel.cn/api/coding/paas/v4 |
上游 API 地址 |
| api_key | CODEX_PROXY_API_KEY |
— | API 密钥(必填) |
| models | CODEX_PROXY_MODELS |
glm-4.7,glm-5,glm-5.1,glm-5.2 |
模型列表 |
| host | CODEX_PROXY_HOST |
127.0.0.1 |
监听地址 |
| port | CODEX_PROXY_PORT |
9002 |
监听端口 |
sudo systemctl start codex-proxy # 启动
sudo systemctl stop codex-proxy # 停止
sudo systemctl restart codex-proxy # 重启
sudo systemctl status codex-proxy # 状态
sudo journalctl -u codex-proxy -f # 日志Codex CLI 通过 /v1/responses 接口发送请求时会附带多种 tool 类型(function、web_search、code_interpreter 等),但 GLM API 目前仅支持 function 类型。
litellm 的 responses handler 直接调用内部 completion 函数,绕过了常规 callback 钩子。因此通过 monkey-patch 在调用入口处拦截,清理不支持的 tool 类型。
litellm 的 orjson pin(==3.10.15)在 Python 3.14 上无可编译 wheel。安装策略是先 --no-deps 装 litellm,再手动装其余依赖。详见 requirements.txt。