Codex桥接Deepseek-V4以及协议转换
【摘要】
本文主要复现使用codex-bridge让Codex接入DeepSeek-V4的过程。并简单采样对比codex<==>codex-bridge<==>deepseek网络数据包的差异。
文中观点若有错误,欢迎道友斧正。
桥接方案参考原文链接:DeepSeek技术社区 Codex桌面版接入DeepSeek-V4
一、codex和codex-bridge安装
(1)假设已安装node和git;
(2)安装Codex CLI
npm install -g @openai/codex
(3)安装Codex桌面版
从 9eaK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6G2M7r3g2F1j5h3W2Q4x3V1k6U0L8$3c8W2P5q4)9J5c8Y4u0W2L8r3g2S2M7$3g2K6 下载最新版安装
可选其中的【codex-x86_64-pc-windows-msvc.exe】

(4)到deepseek官方注册购买创建 a3fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4@1k6X3!0J5L8g2)9J5k6h3c8W2k6i4m8K6k6h3g2C8i4K6u0W2j5$3!0E0i4K6u0r3j5i4m8A6i4K6g2X3K9$3g2&6M7H3`.`.

(5)安装codex-bridge
@rem 显示用户配置目录
echo %USERPROFILE%
@rem 进入用户配置目录
cd %USERPROFILE%
@rem 进入用户Codex配置目录
cd .codex
@rem 将codex-bridge 克隆到.codex配置目录
git clone a52K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6%4N6h3A6X3k6h3&6Y4y4K6p5J5i4K6u0V1N6h3W2Q4x3V1k6U0L8$3c8W2P5q4)9J5k6r3u0J5K9h3c8Y4k6g2)9J5k6h3N6A6N6q4)9J5y4X3&6T1M7%4m8Q4x3@1u0U0L8$3c8W2P5q4)9J5k6r3u0J5K9h3c8Y4k6b7`.`.
@进入 codex-bridge,复制 env.example 为 .env 进行环境配置
cd codex-bridge
copy env.example .env
【.env】文件主要做如下配置
(5.1)DEEPSEEK_API_KEY值来自deepseek官方真金白银订阅创建的key。
(5.2)PROXY_AUTH_KEY值随意,该key是提供给codex的,Codex的CLI或GUI登录时提供,也配置下面的auth.json文件中
# 这里实际通过python的 base64.b64encode(base64.b64encode(random.randbytes(48))) 仿照deepseek生成
PROXY_AUTH_KEY=cWw3SUU5dk5BMnowSXQxUlZTdlpZYzFkR3ZkSnloTldjUmw4ay9PTUkxTmF2MFh0dWNZdEZ4VlBSaTFHdFVnOA
DEEPSEEK_API_KEY=sk-4904fa7c042c1997241a2062b68
DEEPSEEK_MODELS=deepseek-v4-pro,deepseek-v4-flash,deepseek-reasoner
LOG_LEVEL=info # silent / error / warn / info (default) / debug
DEFAULT_PROVIDER=deepseek
PROXY_PORT=4001
【auth.json】在.codex目录创建此文,内容如下,其中的OPENAI_API_KEY就是上面配置的PROXY_AUTH_KEY
{
"auth_mode": "apikey",
"OPENAI_API_KEY": "cWw3SUU5dk5BMnowSXQxUlZTdlpZYzFkR3ZkSnloTldjUmw4ay9PTUkxTmF2MFh0dWNZdEZ4VlBSaTFHdFVnOA"
}【config.toml】编辑在.codex目录此文件,在头部追加下述内容,注意其中"7fdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0b7H3x3o6q4Q4x3V1k6$3x3g2)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4c8e0N6Q4z5f1q4Q4z5o6b7@1x3o6l9I4i4@1f1%4i4@1q4n7i4@1q4r3i4@1f1#2i4K6S2r3i4@1p5K6i4@1f1^5i4@1p5$3i4K6R3I4i4@1f1@1i4@1t1^5i4K6S2q4i4@1f1@1i4@1t1^5i4K6S2m8i4@1f1&6i4K6W2p5i4@1p5J5f1q4u0a6h3q4W2Q4y4h3k6b7e0#2u0f1i4K6y4p5y4o6l9H3x3g2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4q4!0n7z5q4)9^5x3q4!0q4z5q4)9^5y4#2!0n7y4q4!0q4x3#2)9^5x3q4)9^5x3R3`.`.
cli_auth_credentials_store = "file"
model = "deepseek-v4-pro"
model_provider = "local_proxy"
[model_providers.local_proxy]
name = "local_proxy"
base_url = "320K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0b7H3x3o6q4Q4x3V1k6$3x3g2)9J5y4Y4q4#2L8%4c8Q4x3@1t1`.
wire_api = "responses"
requires_openai_auth = true
二、启动与登录验证
(1)先启动轻量代理,
@rem 在.codex\codex-bridge目录运行
node --env-file=.env proxy.mjs
出现类似内容如下
[codex-bridge] Listening on http://localhost:4001
[codex-bridge] Default provider: deepseek
[codex-bridge] Deepseek: daaK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7r3W2Q4x3X3g2V1k6h3g2H3M7$3g2W2K9#2)9J5k6h3y4G2L8g2)9J5c8Y4j5I4i4K6t1$3L8X3u0K6M7q4)9K6b7W2)9%4b7#2)9J5y4X3&6T1M7%4m8Q4x3@1u0E0L8$3c8W2L8s2y4Q4x3@1c8V1k6h3g2H3M7$3g2W2K9#2)9J5k6s2j5@1i4K6u0V1M7s2u0G2i4K6u0o6i4K6t1$3L8X3u0K6M7q4)9K6b7X3c8W2k6i4m8K6k6h3g2C8i4K6u0V1N6U0c8Q4x3X3c8X3L8r3q4K6K9q4)9J5b7#2)9J5y4X3&6T1M7%4m8Q4x3@1u0V1k6h3g2H3M7$3g2W2K9#2)9J5k6s2u0W2j5i4y4G2L8X3g2J5
[codex-bridge] Mimo : DISABLED
[codex-bridge] OpenAI : DISABLED
[codex-bridge] GitHub : lazy (will run `gh auth token` on first api.github.com fetch)
[codex-bridge] Inbound : auth required (1 key loaded)
[codex-bridge] cQXd6DWS0X0MQGkQ… (64 chars) — any provider
(2)codex CLI初始化登录
其中的【cWw3SUU5dk5BMnowSXQxUlZTdlpZYzFkR3ZkSnloTldjUmw4ay9PTUkxTmF2MFh0dWNZdEZ4VlBSaTFHdFVnOA】为OPENAI_API_KEY==PROXY_AUTH_EKY
echo cWw3SUU5dk5BMnowSXQxUlZTdlpZYzFkR3ZkSnloTldjUmw4ay9PTUkxTmF2MFh0dWNZdEZ4VlBSaTFHdFVnOA | codex login --with-api-key
(3)验证
codex exec "You are a helpful assistant,say Hello World!" --skip-git-repo-check

(4)Codex GUI登录
选【使用其他方式登录】,然后输出上面配置的OPENAI_API_KEY,即【cWw3SUU5dk5BMnowSXQxUlZTdlpZYzFkR3ZkSnloTldjUmw4ay9PTUkxTmF2MFh0dWNZdEZ4VlBSaTFHdFVnOA】即可登录



三、网络数据采样对比
(1)这里通过charles设置反向代理,将本机4002端口转向4001端口,
将上面codex的config.toml配饰的【"dbdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0b7H3x3o6q4Q4x3V1k6$3x3g2)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4c8e0y4Q4z5o6m8Q4z5e0q4Q4c8e0c8Q4b7V1k6Q4b7f1g2Q4c8e0k6Q4z5e0c8Q4b7U0W2Q4c8e0c8Q4b7U0S2Q4b7V1q4Q4c8e0y4Q4z5o6m8Q4z5e0m8Q4x3U0k6I4N6h3!0@1i4K6y4n7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0b7H3x3o6u0Q4x3V1k6$3x3g2)9J5y4Y4q4#2L8%4c8Q4x3@1u0Q4c8e0y4Q4z5o6m8Q4z5e0q4Q4c8f1k6Q4b7V1y4Q4z5p5x3`.
即codex的请求会先经过4002端口进入charles,然后charles提交给node启动的轻量代理,即可采样到codex<==>codex-bridge的数据包

(2)这里同时通过charles为node的轻量代理提供代理

(3)修改codex-bridge目录的proxy.mjs
在开头最后一个import之后添加下述代码
import { ProxyAgent, setGlobalDispatcher } from "undici";
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
const PROXY_URL = process.env.HTTPS_PROXY || process.env.HTTP_PROXY || "socks5://127.0.0.1:889";
if (PROXY_URL) {
setGlobalDispatcher(new ProxyAgent(PROXY_URL));
console.log(`[codex-bridge] Proxy enabled: ${PROXY_URL}`);
}同时选择在codex-bridge目录的命令行时,安装undici包到codex-bridge中
@rem 进入 codex-bridge目录
npm install undici
(4)我们重新运行前面codex CLI或 GUI的测试用例
codex exec "You are a helpful assistant,say Hello World!" --skip-git-repo-check
(5)codex与codex-bridge的交互包如下

(6)codex-bridge与deepseek的交互包如下

四、换模型
原文中通过/model 换模型是不实际的
Codex 发出: model="gpt-5.4"
↓ 路由: gpt- 前缀 → openai → 无key → 回落 deepseek
↓ 替换: "gpt-5.4" ∉ DEEPSEEK_MODELS → chatReq.model = "deepseek-v4-pro"
↓ 上游: 发给 DeepSeek 的是 model="deepseek-v4-pro"
↓ 回包: 返回给 Codex 的 response.model 仍是 "gpt-5.4"
const requested = normalizeModelId(chatReq.model);
const isProviderModel = cfg.models.some((m) => normalizeModelId(m) === requested);
chatReq.model = isProviderModel ? chatReq.model : cfg.defaultModel;
其默认都是第一个,一般在【.env】文件中,直接修改模型顺序,可以修改
DEEPSEEK_MODELS=deepseek-v4-pro,deepseek-v4-flash,deepseek-reasoner
最后于 1小时前
被tritium编辑
,原因: