2025年底,OpenAI 发布了 Codex CLI——一款革命性的 AI 编程工具,它能直接在你的终端中理解代码、执行命令、操作文件,被认为是"AI 软件工程师"的雏形。然而,在中国大陆的企业网络环境中,Codex 的推广遇到了一个尴尬的问题:Codex 默认只支持调用 OpenAI 的模型 API,而 OpenAI 的服务在境内无法直接访问。
与此同时,DeepSeek 大模型异军突起。它以卓越的推理能力、极低的 API 成本和开放的商业许可,迅速成为国内开发者的首选。DeepSeek 不仅在多项基准测试中与国际顶尖模型分庭抗礼,其亲民的定价策略更让"AI 辅助编程"从少数人的奢侈品变成了人人都用得起的工具。
一个是功能强大的 AI 编程助手,一个是低调、亲民、有实力的大语言模型——它们本该是天作之合,却被一道无形的墙隔开了。
市面上并非没有解决方案。CC-Switch 是一个知名的模型路由工具,可以在多种 AI 模型之间切换。但在实际的企业网部署中,CC-Switch 面临着诸多挑战:配置复杂、需要额外的依赖环境、在企业严格的网络安全策略下难以灵活部署,且对 Codex 最新版本所采用的 Responses API 支持不够完善。
正是在这样的背景下,我决定自己动手,编写一个轻量级的适配器——Codex-DeepSeek Adapter(CDA)。它的目标非常明确:在满足企业网络安全要求的前提下,让 Codex CLI 能够无缝调用 DeepSeek 大模型。
这个适配器的设计哲学是"做减法"——它不做任何花哨的功能,只是忠实地扮演一个"翻译官"的角色。Codex 说 Responses API 的语言,DeepSeek 说 Chat Completions API 的语言,CDA 就在中间实时翻译转换。一个本地运行的轻量 HTTP 服务,三两配置文件,一个管理脚本——用最小的代价解决了最大的问题。
最重要的是,这一切都在本地完成。API Key 保存在你自己的机器上,请求通过你配置的网络路径转发,不经过任何第三方中转服务器。省钱(DeepSeek 的 API 价格远低于 OpenAI),快速(直连或通过企业代理),安全(完全在你自己的网络环境中运行)。
本文将详细介绍 CDA 的实现原理、安装配置方法,并分享我在开发过程中的一些思考与感悟。
CDA 的整体架构可以用一句话概括:在本地启动一个 HTTP 代理服务器,将 Codex 的 Responses API 请求转换为 DeepSeek 的 Chat Completions API 请求。
┌─────────────┐ Responses API ┌─────────────────┐ Chat Completions API ┌──────────────┐
│ │ ─────────────────► │ │ ────────────────────────► │ │
│ Codex CLI │ localhost:15727 │ CDA Adapter │ api.deepseek.com │ DeepSeek │
│ │ ◄───────────────── │ (adapter.py) │ ◄──────────────────────── │ API Server │
└─────────────┘ Responses API └─────────────────┘ Chat Completions API └──────────────┘
Codex CLI 被配置为将模型请求发送到 http://127.0.0.1:15727/v1,CDA 监听该端口,接收请求后调用 DeepSeek 的 API,再将结果转换回 Codex 能理解的格式返回。
这是适配器最核心的工作。
Codex 使用 OpenAI 的 Responses API 格式,其主要特点是:
instructions 字段:存放系统提示词(System Prompt)input 字段:对话历史,可以是字符串或消息数组message(角色分为 developer/user/assistant)、function_call(函数调用请求)、function_call_output(函数调用结果)tools 字段:定义可用的工具/函数stream 字段:支持 SSE 流式输出DeepSeek 使用标准的 OpenAI Chat Completions API 格式:
messages 数组:包含 role(system/user/assistant/tool)和 contenttool_calls:在 assistant 消息中携带tools:工具定义adapter.py 中的 _convert_input_to_messages() 方法负责将 Codex 的输入转换为 DeepSeek 的消息格式:
# 将 Codex 的 instructions 映射为 system 消息
instructions = body.get("instructions", "")
if instructions:
messages.append({"role": "system", "content": instructions})
# 遍历 input 数组,逐条转换
for item in input_array:
if item_type == "function_call":
# 转换为 assistant 消息中的 tool_calls
messages.append({"role": "assistant", "tool_calls": [...]})
elif item_type == "function_call_output":
# 转换为 tool 角色的消息
messages.append({"role": "tool", "content": output})
elif role == "developer":
messages.append({"role": "system", "content": text})
else:
messages.append({"role": role, "content": text})
Codex 配置中指定的是 Codex 侧的模型名(如 deepseek-v4-pro),而 DeepSeek 实际运行的模型名可能不同。CDA 提供了一个灵活的模型映射表 MODEL_MAP,让用户可以自由映射:
{
"MODEL_MAP": {
"deepseek-v4-pro": "deepseek-v4-pro",
"deepseek-v4-flash": "deepseek-v4-flash"
}
}
当 Codex 发送请求指定模型 deepseek-v4-pro 时,适配器会从映射表中查找对应的 DeepSeek 模型名并替换。如果找不到映射,则透传原始模型名。
这是适配器中最复杂的部分。Codex 作为一个 AI 编程工具,严重依赖工具调用来执行代码、操作文件系统。适配器需要完整支持这一流程:
tools 定义和 tool_choice 参数tool_calls 的响应function_call 格式function_call_output 形式发回tool 角色的消息继续对话当检测到请求包含工具时,适配器会自动禁用流式响应(因为 tool calling 需要在完整响应中解析),等 DeepSeek 返回完整结果后再根据 Codex 的请求决定以流式还是非流式格式返回。
对于不需要工具调用的普通对话,CDA 支持 SSE(Server-Sent Events)流式输出。适配器从 DeepSeek 接收流式数据,解析每个 chunk 中的 delta.content,然后构造 Responses API 格式的 SSE 事件序列:
data: {"type": "response.created", ...}
data: {"type": "response.output_item.added", ...}
data: {"type": "response.content_part.added", ...}
data: {"type": "response.output_text.delta", "delta": "Hello"}
data: {"type": "response.output_text.delta", "delta": " World"}
data: {"type": "response.output_text.done", ...}
data: {"type": "response.content_part.done", ...}
data: {"type": "response.output_item.done", ...}
data: {"type": "response.completed", ...}
data: [DONE]
企业网络环境通常有严格的防火墙策略,直接访问外部 API 往往不可行。CDA 的配置支持 HTTP/HTTPS 代理:
proxies = {
"http": "http://proxy.company.com:8080",
"https": "http://proxy.company.com:8080",
}
resp = requests.post(
_runtime["api_url"],
headers=headers,
json=chat_body,
proxies=_runtime["proxies"], # 通过企业代理发送请求
timeout=120,
)
这意味着即使用户的电脑无法直接访问互联网,只要配置了企业代理地址,CDA 就能通过代理通道与 DeepSeek API 通信。
Codex 启动时会查询可用的模型列表。CDA 在 GET /v1/models 端点返回基于 MODEL_MAP 动态生成的模型信息,包括上下文窗口(131K tokens)、最大输出 tokens、是否支持工具和视觉等能力声明:
if self.path == "/v1/models":
models = []
for model_id in _runtime["model_map"]:
models.append({
"id": model_id,
"object": "model",
"owned_by": "deepseek",
"capabilities": {
"context_window": 131072,
"max_output_tokens": 8192,
"supports_tools": True,
"supports_vision": False,
},
})
self._send_json(200, {"object": "list", "data": models})
CDA 的配置系统设计为三步走:
adapter-config.json 不存在,自动进入交互式配置向导--reconfigure 参数或管理脚本菜单重新配置配置文件 adapter-config.json 示例如下:
{
"DEEPSEEK_API_KEY": "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"DEEPSEEK_API_URL": "https://api.deepseek.com/v1/chat/completions",
"PROXY": null,
"MODEL_MAP": {
"deepseek-v4-pro": "deepseek-v4-pro",
"deepseek-v4-flash": "deepseek-v4-flash"
},
"_last_modified": "2026-05-21 14:30:08"
}
PowerShell 管理脚本 start.ps1 提供了用户友好的菜单界面,封装了适配器的完整生命周期管理:
netstat 检测端口 15727 是否被占用,自动识别占用进程Stop-Process,失败则用 taskkill /F,确保端口释放脚本采用了分层的颜色编码输出(绿/蓝/黄/灰),让状态信息一目了然。
如果尚未安装 Node.js,请从 官网下载 选择 LTS 长期稳定版。下载后双击安装包,一路默认安装即可。
安装完成后,打开 PowerShell,验证安装:
node -v
npm -v
输出版本号即表示安装成功。
npm config set registry https://registry.npmmirror.com
npm install -g @openai/codex
codex --version
显示版本号即表示安装完成。
找到 Codex 的配置文件 config.toml(通常在 C:\Users\<用户名>\.codex 目录下),用文本编辑器打开,添加以下内容:
model = "deepseek-v4-pro"
model_provider = "deepseek"
disable_response_storage = true
[model_providers.deepseek]
name = "DeepSeek"
base_url = "http://127.0.0.1:15727/v1"
env_key = "OPENAI_API_KEY"
wire_api = "responses"
配置完成后保存文件,重启 Codex 使配置生效。
特别注意:此处的
base_url指向的是本地适配器的地址http://127.0.0.1:15727/v1,而不是 DeepSeek 的官方 API 地址。适配器会负责将请求转发到 DeepSeek。
codex
启动后,你将会看到大模型已被设置为 deepseek。首次启动还需要进行沙箱(SandBox)设置,按照一般配置操作即可。
注意:此时适配器尚未启动。如果直接与 Codex 对话,无法得到回答。只有正确配置 DeepSeek 并启动适配器后,Codex 才能正常工作。
Codex CLI 正常工作后,可以在 VS Code 中搜索安装 "Codex – OpenAI's coding agent" 插件,获得 IDE 集成体验。
Codex DeepSeek Adapter 适配器下载网址:https://www.holomind.com.cn/codex/CDA.zip
将下载的 CDA 文件解压后,你会得到以下三个文件:
右键点击 start.ps1,选择"以管理员身份运行"。
首次运行或选择重新配置时,需要依次填写:
https://api.deepseek.com/v1/chat/completions,可按需改为中转地址配置完成后可选择 重新启动 使配置生效。
启动后,可以通过菜单执行以下操作:
start.ps1,否则端口监听可能失败start.ps1 程序窗口不影响适配器运行start.ps1 即可开发这个适配器的过程,让我对"做正确的事"有了更深的理解。
最开始,我也尝试过部署 CC-Switch,但发现它太重了——为了一个简单的模型路由功能,需要配置一大堆依赖和环境参数。在企业网的安全策略下,每一步配置都举步维艰。于是我决定"自己做一个小而美的工具"。
做"减法"是一种智慧。 适配器不做任何多余的事情,只专注于协议转换这一件事。这种极简的设计带来了极高的可靠性——从第一个版本开始,它就稳定运行至今。
开放生态的力量令人敬畏。 Codex 和 DeepSeek 本属于不同的技术体系,但通过标准的 API 接口,一个小小的适配器就能将它们无缝连接。这就是开放生态的魅力——不需要任何一方的配合,开发者就能用自己的方式让工具协同工作。
AI 开发工具正在重塑软件开发的方式。 当我用 Claude Code(底层也是 DeepSeek 模型)来给 Codex 写这个适配器本身的代码时,有一种奇妙的"自指"感。AI 辅助我写了让 AI 更好地辅助我的工具——这大概就是技术让人兴奋的地方。
值得一提的是,这篇文章是用 Codex 编写的,它还编写了部分代码。。从代码到文档,CDA 证明了在合规、安全、经济的条件下,国内开发者完全可以利用全球最先进的 AI 编程工具提升开发效率。
作者: 阿色(Codex 辅助编写)
大系统观官网: https://www.holomind.com.cn
GitHub: https://github.com/arthurqwang
直接下载适配器: Codex DeepSeek Adapter