跳转至

OpenAI Codex CLI接入智谱GLM实战:CCX协议转换+5大问题修复指南

原文地址: https://88box.top 生成时间: 2026-05-21 01:00:44


OpenAI Codex CLI 接入国产大模型以智谱 GLM 为例 完整实战教程:CCX 协议转换 + 5 个踩坑修复+Mac环境 - hey99 知识搜索引擎

精选文章

OpenAI Codex CLI 接入国产大模型以智谱 GLM 为例 完整实战教程:CCX 协议转换 + 5 个踩坑修复+Mac环境

OpenAI Codex CLI 只认 Responses 协议,国产大模型(GLM为例)只给 Chat Completions 接口——两头对不上。本文记录如何用网关打通这条链路,实现 Codex CLI 对接智谱 GLM-5.1 Coding Plan,含 CCX 部署、通道配置、Codex 参数调优,以及 Responses 协议转换、modelMapping 映射、base_url 路径拼接等 5 个实际问题的排查与修复。

更新于 2026-05-20 16:57

OpenAI Codex CLI 只认 Responses 协议,国产大模型(GLM为例)只给 Chat Completions 接口——两头对不上。本文记录如何用

CCX

网关打通这条链路,实现 Codex CLI 对接智谱 GLM-5.1 Coding Plan,含 CCX 部署、通道配置、Codex 参数调优,以及 Responses 协议转换、modelMapping 映射、base_url 路径拼接等 5 个实际问题的排查与修复。

为什么需要协议转换

Codex CLI 原生使用 OpenAI 的

Responses API

协议。而智谱、DeepSeek、通义千问等国产大模型的 Coding Plan 接口,普遍基于

Chat Completions

规范(目前国内的厂家我看下里只有火山家和阿里云家的ai是启用responses协议的。使用其他家只支持chat的模型想要接入codex必须借助一个中间件)。协议层不匹配,直连走不通——中间需要一个翻译层(一个中转站)。

方案选型上,CCX 是一个 Go 编写的单二进制 API 网关,支持 Responses / Chat Completions / Gemini 等多协议互转,自带 Web 管理面板、多 Key 轮换和故障熔断。相比自己写转发脚本,功能完整度更高,维护成本也更低。

整体数据流

Codex CLI ──[Responses, model: gpt-5.5]──▶ CCX :3000 ──[协议转换 + 模型映射]──▶ 智谱 API

完整链路拆解:

Codex 以 Responses 格式发送请求,模型名写

gpt-5.5

(Codex 内置元数据表中认可的名称)

CCX 接收后,通过

serviceType: openai

将 Responses 转为 Chat Completions 格式

modelMapping

gpt-5.5

重写为

glm-5.1

CCX 使用面板中配置的真实 API Key 转发至智谱

智谱的响应经 CCX 还原为 Responses 格式返回给 Codex

环境要求

依赖

最低版本

说明

macOS

Apple Silicon (arm64)

CCX 提供 darwin-arm64 二进制

Node.js

≥ 22

Codex CLI 运行时

curl

系统自带

用于验证和健康检查

一、部署 CCX

1.1 下载与安装

CCX 目前没有进入 Homebrew 等包管理器,直接从 GitHub Releases 获取二进制:

创建运行目录

mkdir

-p

~/.ccx/

{

logs,.config

}

下载 darwin-arm64 二进制(约 27MB)

curl

-L

--retry

3

-o

~/.ccx/ccx

\

"https://github.com/BenedictKing/ccx/releases/download/v2.6.97/ccx-darwin-arm64"

赋予执行权限

chmod

+x ~/.ccx/ccx

验证

~/.ccx/ccx

--version

期望输出:ccx version 2.6.97

⚠️ 如果下载后文件大小异常(只有几 KB),检查是否有残留的 curl 进程占用了目标文件:

lsof ~/.ccx/ccx

定位后 kill 掉再重新下载。

1.2 环境变量

创建

~/.ccx/.env

PORT=3000

ENV=production

ENABLE_WEB_UI=true

PROXY_ACCESS_KEY=<你的代理密钥>

ADMIN_ACCESS_KEY=<你的管理密钥>

APP_UI_LANGUAGE=zh-CN

LOG_LEVEL=info

REQUEST_TIMEOUT=120000

两个密钥的用途:

变量

作用

谁在用

PROXY_ACCESS_KEY

代理访问密钥

Codex CLI 通过 Bearer Token 发送

ADMIN_ACCESS_KEY

管理面板登录密码

浏览器打开 CCX 面板时输入

⚠️

.env

含敏感凭据,确保

~/.ccx/

目录不会被同步到公开仓库。

1.3 配置开机自启

通过 macOS LaunchAgent 实现 CCX 开机自启 + 崩溃自动重启:

<!

DOCTYPE

plist

PUBLIC

"-//Apple//DTD PLIST 1.0//EN"

"http://www.apple.com/DTDs/PropertyList-1.0.dtd"

<

plist

version

=

"

1.0

"

<

dict

<

key

Label

</

key

<

string

com.ccx.proxy

</

string

<

key

ProgramArguments

</

key

<

array

<

string

$HOME/.ccx/ccx

</

string

</

array

<

key

WorkingDirectory

</

key

<

string

$HOME/.ccx

</

string

<

key

EnvironmentVariables

</

key

<

dict

<

key

PORT

</

key

<

string

3000

</

string

<

key

ENV

</

key

<

string

production

</

string

<

key

ENABLE_WEB_UI

</

key

<

string

true

</

string

<

key

PROXY_ACCESS_KEY

</

key

<

string

<

你的代理密钥

</

string

<

key

ADMIN_ACCESS_KEY

</

key

<

string

<

你的管理密钥

</

string

<

key

APP_UI_LANGUAGE

</

key

<

string

zh-CN

</

string

<

key

LOG_LEVEL

</

key

<

string

info

</

string

</

dict

<

key

RunAtLoad

</

key

<

true

/>

<

key

KeepAlive

</

key

<

true

/>

<

key

StandardOutPath

</

key

<

string

$HOME/.ccx/logs/stdout.log

</

string

<

key

StandardErrorPath

</

key

<

string

$HOME/.ccx/logs/stderr.log

</

string

</

dict

</

plist

注册并启动

launchctl load ~/Library/LaunchAgents/com.ccx.proxy.plist

验证服务就绪

curl

-s

http://127.0.0.1:3000/health

|

python3

-m

json.tool

期望:{"status":"ok","version":"2.6.97",...}

二、配置 CCX 上游通道(核心步骤)

浏览器打开 http://localhost:3000 ,用

ADMIN_ACCESS_KEY

登录管理面板。这一步是整个配置的关键——

必须把通道添加到正确的协议分类下

2.1 先搞清楚协议分类

CCX 按协议类型将上游通道隔离到不同分组中:

协议分类

适用客户端

Messages

Claude Code

Responses

Codex CLI

本文目标

Gemini

Gemini CLI

Chat

通用 OpenAI 兼容工具

Images

图片生成

关键点

:Codex 发出的

/v1/responses

请求只会从 Responses 分组中选渠道。放错分组是第一个坑的根源,后文会详细说。

2.2 添加 Responses 通道

在面板的

Responses

标签页下添加通道,参数如下:

字段

推荐值

说明

Base URL

<你的大模型请求路径>

对应大模型厂家的API请求专用端点

API Key

<你的大模型API Key>

bigmodel.cn

控制台获取

Service Type

openai

⚠️ 最关键的选项!控制协议转换行为

Model Mapping

见下方 JSON

Codex 模型名 → 智谱模型名

reasoningParamStyle

thinking

将 Codex 的 reasoning effort 映射为 thinking 参数

codexToolCompat

true

透传 Codex 工具调用相关参数

stripCodexClientTools

true

剥离 Codex 私有 tools 字段,避免上游报错

Model Mapping 配置:

{

"gpt-5.5"

:

"glm-5.1"

,

"gpt-5.4"

:

"glm-5-turbo"

,

"gpt-5.2-codex"

:

"glm-5-turbo"

,

"gpt-5.2"

:

"glm-4.7"

}

为什么要做映射?因为 Codex 内置了一份模型元数据表,只认

gpt-*

/

o*

/

claude-*

这类名称。直接填

glm-5.1

会命中未知模型分支,触发 fallback 甚至后续处理异常。映射层实现了两端解耦——Codex 用自己认识的

gpt-5.5

,实际模型由 CCX 在转发时替换。

三、配置 Codex CLI

3.1 config.toml

这一步可以通过CC-switch来配置,不仅有图形化界面更加方便配置而且还能配置其他工具比如Claude code还有open claw等,详情可以去了解CC-switch。

编辑

~/.codex/config.toml

model_provider = "zhipu"

model = "gpt-5.5"

model_reasoning_effort = "xhigh"

[model_providers.zhipu]

name = "GLM Coding Plan (via CCX)"

base_url = "http://127.0.0.1:3000/v1" # ⚠️ 必须带 /v1 后缀(详见踩坑 #5)

env_key = "ZHIPU_API_KEY"

wire_api = "responses"

requires_openai_auth = true

request_max_retries = 4

stream_max_retries = 10

stream_idle_timeout_ms = 300000

[projects."<你的工作目录>"]

trust_level = "trusted"

关键字段说明:

字段

作用

base_url

http://127.0.0.1:3000/v1

CCX 地址,

必须含

/v1

env_key

ZHIPU_API_KEY

Codex 从这个环境变量读取认证值

requires_openai_auth

true

Authorization: Bearer

格式发送

wire_api

"responses"

使用 Responses 协议格式

3.2 搞清楚认证链路

这里容易踩坑——

ZHIPU_API_KEY

的值到底该填什么?

Codex CCX 智谱

│ │ │

├─ 读 ZHIPU_API_KEY ├─ 校验 Bearer Token ├─ 用面板中存储的 Key 认证

│ = "CCX代理密钥" │ = PROXY_ACCESS_KEY │

│ │ │

└─ Authorization: Bearer <代理密钥> ──▶ ──▶ Authorization: Bearer <真实智谱Key> ──▶

结论:

Codex 只需要知道怎么向 CCX 证明身份

,真正连接智谱的凭证由 CCX 面板单独管理。所以

ZHIPU_API_KEY

填的是

CCX 的

PROXY_ACCESS_KEY

,不是智谱原始 Key。

3.3 配置 Shell 环境变量

写入 ~/.zprofile(推荐,zsh 登录时自动加载)

export

ZHIPU_API_KEY

=

""

写入后执行

source ~/.zprofile

或新开终端生效。

四、验证全链路

按顺序执行三个测试:

① CCX 健康检查

curl

-s

http://127.0.0.1:3000/health

期望:{"status":"ok","version":"2.6.97",...}

② 端到端非流式测试

curl

-s

-X

POST http://127.0.0.1:3000/v1/responses

\

-H

"Authorization: Bearer <代理密钥>"

\

-H

"Content-Type: application/json"

\

-d

'{"model":"gpt-5.5","input":"say hi"}'

③ 端到端流式测试

curl

-s

-N

-X

POST http://127.0.0.1:3000/v1/responses

\

-H

"Authorization: Bearer <代理密钥>"

\

-H

"Content-Type: application/json"

\

-d

'{"model":"gpt-5.5","input":"say hi","stream":true}'

非流式测试正常返回时,注意看响应中的

model

字段——从

gpt-5.5

变成了

glm-5.1

,说明 modelMapping 已生效:

{

"id"

:

"resp_xxx"

,

"model"

:

"glm-5.1"

,

"output"

:

[

{

"type"

:

"reasoning"

,

"summary"

:

[

...

]

,

"status"

:

"completed"

}

,

{

"type"

:

"message"

,

"role"

:

"assistant"

,

"content"

:

[

{

"type"

:

"output_text"

,

"text"

:

"..."

}

]

}

]

,

"status"

:

"completed"

,

"usage"

:

{

...

}

}

三个测试都通过后,直接终端输入

codex

开始对话。

五、踩坑实录

以下按实际排查顺序记录遇到的 5 个问题。每个都遵循

现象 → 根因 → 修复

的排查思路。

坑 #1:渠道放错了分组 →

NO_RESPONSES_UPSTREAM

现象

:CCX 返回

"未配置任何 Responses 渠道"

,Codex 无法发起请求。

根因

:初次配置时把智谱上游通道添加到了

Messages

分组。但 Codex 发出的

/v1/responses

请求只从 Responses 分组中选渠道——分组不对,自然是空集。

修复

:在 Web 面板的

Responses

标签页下重新添加通道,删除 Messages 分组中的错误条目。

教训

:动手前先确认目标客户端用的什么协议,再去选对应的 Tab。

坑 #2:serviceType 选错了 → 404 Not Found

现象

All upstream channels are currently unavailable

,CCX 日志显示请求打到了

https://open.bigmodel.cn/api/coding/paas/v4/responses

并返回 404。

根因

serviceType

控制的是 CCX

对上游

的行为,直接决定了实际请求的端点:

serviceType

CCX 行为

实际请求端点

responses

原样透传

Responses payload

POST /v4/responses

❌ 智谱没有这个接口

openai

自动转译

为 Chat Completions

POST /v4/chat/completions

修复

:把 serviceType 改为

openai

教训

:国产模型 API 几乎都基于 Chat Completions 规范,尚未跟进 Responses 新协议。接入时 serviceType 统一选

openai

坑 #3:模型名写错了 → metadata warning

现象

Model metadata for 'GLM-5.1' not found. Defaulting to fallback metadata.

根因

:Codex 内置了一份模型元数据表(上下文窗口大小、token 限制等),只覆盖

gpt-*

/

o*

/

claude-*

等已知名称。config.toml 里直接写

model = "GLM-5.1"

会命中未知分支,触发 fallback。

修复

:Codex 侧用

model = "gpt-5.5"

(它认识的名称),CCX 侧通过 modelMapping 翻译为

glm-5.1

。两端解耦,各管各的。

坑 #4:环境变量没设 → 启动崩溃

现象

Missing environment variable: 'ZHIPU_API_KEY'.

,Codex 启动即退出。

根因

:config.toml 中声明了

env_key = "ZHIPU_API_KEY"

,但 shell 环境中没有 export 这个变量。

修复

:在

~/.zprofile

中添加

export ZHIPU_API_KEY=""

,然后

source ~/.zprofile

注意:这个值是 CCX 的代理密钥,不是智谱 Key(参见 3.2 节认证链路图)。

坑 #5:base_url 少写了 /v1 → 流式断连 ⭐

现象

stream disconnected before completion: stream closed before response.completed

这是整个配置过程中最隐蔽的坑——curl 测试全通过,但 Codex 实际对话时流式连接反复中断。

排查特征(典型的「假阳性」):

测试方式

结果

curl 非流式请求

✅ 正常

curl 流式请求 (-N)

✅ 正常

Codex 实际对话

❌ 流断连

最终定位到

base_url

的路径拼接问题:

❌ 缺少 /v1,Codex 内部拼接产生异常路径

base_url = "http://127.0.0.1:3000"

✅ 显式带 /v1 后缀

base_url = "http://127.0.0.1:3000/v1"

加上

/v1

后流式连接立即恢复。查看 CCX 日志可以看到:不带

/v1

时请求落到了

/responses

而非

/v1/responses

,CCX 没匹配到路由就返回了空响应。

教训

:curl 通过但客户端 SDK 异常时,优先排查实际的 URL 拼接结果。显式写全路径前缀能规避这类框架级行为导致的隐晦故障。

六、最终配置速查

CCX

.env

PORT=3000

ENV=production

ENABLE_WEB_UI=true

PROXY_ACCESS_KEY=<代理密钥>

ADMIN_ACCESS_KEY=<管理密钥>

APP_UI_LANGUAGE=zh-CN

REQUEST_TIMEOUT=120000

CCX Responses 通道(Web 面板配置)

参数

分类标签页

Responses

Base URL

https://open.bigmodel.cn/api/coding/paas/v4

Service Type

openai

Model Mapping

{"gpt-5.5":"glm-5.1","gpt-5.4":"glm-5-turbo","gpt-5.2-codex":"glm-5-turbo","gpt-5.2":"glm-4.7"}

reasoningParamStyle

thinking

codexToolCompat

true

stripCodexClientTools

true

Codex

config.toml

model = "gpt-5.5"

base_url = "http://127.0.0.1:3000/v1" # 显式 /v1 后缀

env_key = "ZHIPU_API_KEY" # 值 = CCX 代理密钥

wire_api = "responses" # Responses 协议

requires_openai_auth = true # Bearer 认证

错误速查表

错误信息

根因

修复

NO_RESPONSES_UPSTREAM

渠道放错了分组

移至

Responses

标签页

All upstream unavailable

(404)

serviceType=responses

改为

openai

Model metadata not found

模型名不在 Codex 元数据表

gpt-5.x

  • modelMapping

Missing env variable

shell 未 export 变量

~/.zprofile

中添加 export

stream disconnected

base_url

缺少

/v1

补上

/v1

后缀

Invalid access key

Bearer token 与 CCX 密钥不匹配

核对

PROXY_ACCESS_KEY

文件布局总览

~/.ccx/

├── ccx # 二进制主程序

├── .env # 端口 / 密码 / 语言配置

├── .config/

│ └── config.json # 运行时配置(Web 面板写入)

└── logs/

├── stdout.log

└── stderr.log

~/Library/LaunchAgents/

└── com.ccx.proxy.plist # 开机自启 + KeepAlive

~/.codex/

└── config.toml # Codex 主配置

~/.zprofile # Shell 环境变量(ZHIPU_API_KEY)

小结

整套方案的核心思路可以归纳为一句话:

Responses 分组 + openai 类型 + gpt-5.x 映射 + base_url 带 /v1 = 全链路打通

四个关键设计决策:

协议适配

:CCX 的

serviceType: openai

完成 Responses → Chat Completions 的自动转换

模型解耦

:Codex 侧用内置名称

gpt-5.5

,CCX 侧通过 modelMapping 翻译为

glm-5.1

认证分离

:Codex 只持有 CCX 代理密钥,真实智谱 Key 由 CCX 面板独立管理

路径规范

base_url

显式包含

/v1

前缀,保证流式连接稳定

这套方案的思路是通用的——换 DeepSeek、通义千问、Kimi 等任何兼容 Chat Completions 的模型,只需改 CCX 上游通道的 Base URL 和 Model Mapping 即可,Codex 侧完全不用动。

相关项目

CCX:

https://github.com/BenedictKing/ccx

CC Switch:

https://github.com/nicepkg/cc-switch

本文基于 CCX v2.6.97 / macOS Apple Silicon / CC-switch / 智谱 GLM / Codex CLI 验证通过

查看原文


🏷 标签: 国产大模型接入, OpenAI协议转换, CCX网关, GLM-5.1, macOS开发环境