Codex-DeepSeek Adapter(CDA):企业网内实现Codex调用DeepSeek大模型

作者:阿色(Codex 辅助编写) | 2026-05-22

目录


前言

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 能理解的格式返回。

协议转换:Responses API → Chat Completions API

这是适配器最核心的工作。

Codex 的 Responses API(输入)

Codex 使用 OpenAI 的 Responses API 格式,其主要特点是:

  • instructions 字段:存放系统提示词(System Prompt)
  • input 字段:对话历史,可以是字符串或消息数组
  • 消息类型丰富:包含 message(角色分为 developer/user/assistant)、function_call(函数调用请求)、function_call_output(函数调用结果)
  • tools 字段:定义可用的工具/函数
  • stream 字段:支持 SSE 流式输出
  • DeepSeek 的 Chat Completions API(输出)

    DeepSeek 使用标准的 OpenAI Chat Completions API 格式:

  • messages 数组:包含 role(system/user/assistant/tool)和 content
  • tool_calls:在 assistant 消息中携带
  • tools:工具定义
  • 流式支持:同样支持 SSE
  • 转换逻辑

    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 模型名并替换。如果找不到映射,则透传原始模型名。

    工具调用(Tool Calling / Function Calling)

    这是适配器中最复杂的部分。Codex 作为一个 AI 编程工具,严重依赖工具调用来执行代码、操作文件系统。适配器需要完整支持这一流程:

  • Codex 发送请求,携带 tools 定义和 tool_choice 参数
  • 适配器将这些工具定义转换为 DeepSeek Chat Completions 格式
  • DeepSeek 返回包含 tool_calls 的响应
  • 适配器将 tool_calls 转换为 Responses API 的 function_call 格式
  • Codex 执行工具后,将结果以 function_call_output 形式发回
  • 适配器将其转换为 tool 角色的消息继续对话
  • 当检测到请求包含工具时,适配器会自动禁用流式响应(因为 tool calling 需要在完整响应中解析),等 DeepSeek 返回完整结果后再根据 Codex 的请求决定以流式还是非流式格式返回。

    流式响应(Streaming)

    对于不需要工具调用的普通对话,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 通信。

    模型列表 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 不存在,自动进入交互式配置向导
  • 运行时加载:从 JSON 文件读取 API Key、URL、代理和模型映射
  • 强制重新配置:通过 --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"
    }

    管理脚本(start.ps1)

    PowerShell 管理脚本 start.ps1 提供了用户友好的菜单界面,封装了适配器的完整生命周期管理:

  • 智能端口检测:使用 netstat 检测端口 15727 是否被占用,自动识别占用进程
  • 优雅停止:先尝试 Stop-Process,失败则用 taskkill /F,确保端口释放
  • 静默启动:以隐藏窗口模式启动 Python 适配器进程,并轮询检测服务是否就绪
  • 配置向导:交互式引导用户填写 API Key、URL、代理和模型映射
  • 状态查看:实时显示适配器运行状态和当前配置详情
  • 脚本采用了分层的颜色编码输出(绿/蓝/黄/灰),让状态信息一目了然。

    第二部分:安装使用说明

    第一步:安装 Codex CLI

    1. 安装 Node.js

    如果尚未安装 Node.js,请从 官网下载 选择 LTS 长期稳定版。下载后双击安装包,一路默认安装即可。

    安装完成后,打开 PowerShell,验证安装:

    node -v
    npm -v

    输出版本号即表示安装成功。

    2. 切换国内 npm 镜像(内网/国内必设)

    npm config set registry https://registry.npmmirror.com

    3. 全局安装 Codex CLI

    npm install -g @openai/codex

    4. 验证安装

    codex --version

    显示版本号即表示安装完成。

    5. 修改 Codex 配置文件

    找到 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。

    6. 启动 Codex

    codex

    启动后,你将会看到大模型已被设置为 deepseek。首次启动还需要进行沙箱(SandBox)设置,按照一般配置操作即可。

    注意:此时适配器尚未启动。如果直接与 Codex 对话,无法得到回答。只有正确配置 DeepSeek 并启动适配器后,Codex 才能正常工作。

    7. 在 VS Code 中安装插件(可选)

    Codex CLI 正常工作后,可以在 VS Code 中搜索安装 "Codex – OpenAI's coding agent" 插件,获得 IDE 集成体验。

    第二步:使用适配器(CDA)

    下载适配器

    Codex DeepSeek Adapter 适配器下载网址:https://www.holomind.com.cn/codex/CDA.zip

    文件说明

    将下载的 CDA 文件解压后,你会得到以下三个文件:

    文件用途 `start.ps1`适配器管理脚本(主入口) `adapter.py`适配器核心程序 `adapter-config.json`配置文件(配置后自动生成)

    启动适配器

    右键点击 start.ps1,选择"以管理员身份运行"

  • 首次运行:会自动进入配置向导
  • 已配置过:直接进入功能菜单
  • 配置向导说明

    首次运行或选择重新配置时,需要依次填写:

  • DeepSeek API Key — 你的 DeepSeek API 密钥(支持粘贴)
  • API URL — 默认为 https://api.deepseek.com/v1/chat/completions,可按需改为中转地址
  • HTTP 代理 — 可选,企业网内需要通过代理访问外部网络时填写
  • HTTPS 代理 — 可选
  • 模型映射 — Codex 看到的模型名与 DeepSeek 实际模型名的对应关系
  • 配置完成后可选择 重新启动 使配置生效。

    菜单操作

    启动后,可以通过菜单执行以下操作:

  • [1] 直接重启适配器 — 使用现有 DeepSeek 配置重启
  • [2] 重新配置 DeepSeek — 重新设置 API Key / 代理 / 模型
  • [3] 查看当前适配器状态和 DeepSeek 配置 — 查看运行状态与配置详情
  • [4] 终止适配器运行 — 停止适配器
  • [Q] 退出本程序 — 退出菜单程序(不终止或重启适配器)
  • 注意事项

  • 必须以管理员身份运行 PowerShell 和 start.ps1,否则端口监听可能失败
  • 适配器在后台静默运行,不会弹出额外窗口
  • 关闭 start.ps1 程序窗口不影响适配器运行
  • 如需停止或重新设置适配器,再次运行 start.ps1 即可
  • 配置文件中的 API Key 以明文存储,请注意文件权限保护
  • 结束语

    开发这个适配器的过程,让我对"做正确的事"有了更深的理解。

    最开始,我也尝试过部署 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

    项目地址: https://github.com/arthurqwang/Codex-DeepSeek-Adapter

    直接下载适配器: Codex DeepSeek Adapter