下面是一份从零开始的完整教程,按 Windows + Codex Desktop + OpenRouter BYOK + DeepSeek V4 Pro 来写。


OpenRouter BYOK 调用 DeepSeek V4 Pro,并接入 Codex Desktop

0. 整体关系

最终链路是:

Codex Desktop
  ↓ 使用 OPENROUTER_API_KEY
OpenRouter
  ↓ BYOK 中绑定的 DeepSeek API key
DeepSeek V4 Pro

这里有两个 key:

DeepSeek API key:放到 OpenRouter BYOK 里
OpenRouter API key:放到 Windows 用户环境变量里,给 Codex Desktop 使用

DeepSeek 官方的 OpenAI 格式 API base URL 是 https://api.deepseek.com,模型包括 deepseek-v4-flashdeepseek-v4-pro。DeepSeek 文档也说明它兼容 OpenAI / Anthropic API 格式。(DeepSeek API Docs)

OpenRouter 的 BYOK 会把你的 provider key 加密保存,并在请求路由到对应 provider 时使用;BYOK 每月前 100 万次请求免平台费,超过后按同模型/provider 在 OpenRouter 正常成本的 5% 收取。(OpenRouter)


1. 开通 DeepSeek 账号并创建 API key

1.1 注册 / 登录 DeepSeek Platform

进入 DeepSeek Platform,注册或登录账号。

登录后检查两件事:

账户是否能使用 API
账户是否有余额 / 充值方式

DeepSeek 会按输入和输出 token 计费,官方定价页说明计费单位是每 100 万 tokens。(DeepSeek API Docs)

1.2 创建 DeepSeek API key

在 DeepSeek Platform 里找到 API keys 页面,新建一个 key。

建议命名为:

openrouter-byok-codex

复制 key 后先放到临时安全位置,比如密码管理器。不要写进代码文件、Git 仓库、截图或聊天记录。


2. 开通 OpenRouter 账号

2.1 注册 / 登录 OpenRouter

打开 OpenRouter,注册或登录。

2.2 创建 OpenRouter API key

进入 OpenRouter 的 API Keys 页面,新建一个 API key。OpenRouter 文档说明 API key 一般以 sk-or-... 开头。(OpenRouter)

建议命名:

codex-desktop-windows

这个 key 后面会写入 Windows 用户环境变量:

OPENROUTER_API_KEY

3. 在 OpenRouter 中加入 DeepSeek BYOK

进入 OpenRouter 的 Workspace BYOK 设置。

添加 provider key 时选择:

Provider: DeepSeek
Key: 你的 DeepSeek API key

添加成功后,确认这些状态:

DeepSeek 显示 1 key
key 在 Prioritized 区域
Always use for this provider 已开启

OpenRouter BYOK 有两个 key 区域:Prioritized 会优先使用,Fallback 只在 OpenRouter endpoint 之后尝试;Always use for this provider 可以阻止请求回退到 OpenRouter 共享 endpoint,保证该 provider 只走你的 key。(OpenRouter)


4. OpenRouter Privacy / Provider 设置

进入 OpenRouter 的 Privacy 设置页,按下面检查。

4.1 数据策略

建议设置:

Paid endpoints that may train on request data: 打开
Zero Data Retention: 不要强制开启

原因是 OpenRouter 的 data_collection 可以限制是否允许使用可能保存数据的 provider;allow 表示允许使用可能非临时保存或训练的数据 endpoint,deny 表示只使用不收集数据的 provider。(OpenRouter)

ZDR 也是一个路由条件。OpenRouter 文档说明,开启 ZDR 后,请求只会路由到支持 Zero Data Retention 的 endpoint;如果账户级 ZDR 开启,请求级参数不能关闭它。(OpenRouter)

所以这里不要一开始就强制 ZDR,否则 DeepSeek BYOK 可能因为数据策略不匹配而找不到 endpoint。

4.2 Allowed / Ignored Providers

建议:

Allowed Providers: 留空,或只包含 DeepSeek
Ignored Providers: 不要包含 DeepSeek

如果你的目标是 Codex Desktop 只走 DeepSeek BYOK,更稳的设置是:

Allowed Providers: DeepSeek
Ignored Providers: 空

OpenRouter 支持账户级 Allowed Providers,并说明它会应用到所有 API 请求和 chatroom messages。(OpenRouter)

这点很重要,因为 Codex 的 config.toml 可以配置 OpenRouter 作为 provider,但不适合指望它给每次请求稳定塞入 OpenRouter 的 provider.only 请求体参数。强制 provider 更适合在 OpenRouter 账户侧设置。


5. 用 PowerShell 验证 BYOK 是否跑通

先在当前 PowerShell 临时设置 OpenRouter key:

$env:OPENROUTER_API_KEY="sk-or-你的OpenRouterKey"

然后执行:

$headers = @{
  "Authorization" = "Bearer $env:OPENROUTER_API_KEY"
  "Content-Type" = "application/json"
  "X-OpenRouter-Experimental-Metadata" = "enabled"
}

$body = @{
  model = "deepseek/deepseek-v4-pro"
  messages = @(
    @{ role = "user"; content = "Reply with exactly: OK" }
  )
  max_tokens = 80
  include_reasoning = $false
  provider = @{
    only = @("deepseek")
    allow_fallbacks = $false
    data_collection = "allow"
  }
} | ConvertTo-Json -Depth 20

Invoke-RestMethod `
  -Uri "https://openrouter.ai/api/v1/chat/completions" `
  -Method Post `
  -Headers $headers `
  -Body $body

这里几个字段的作用:

"provider": {
  "only": ["deepseek"],
  "allow_fallbacks": false,
  "data_collection": "allow"
}

OpenRouter 文档说明,provider.only 可以只允许指定 provider,allow_fallbacks 可以关闭备用 provider,data_collection 可以控制是否允许使用可能保存数据的 provider。(OpenRouter)

成功时重点看:

"provider": "DeepSeek"

以及:

"usage": {
  "is_byok": true
}

OpenRouter 在 2026-04-27 的更新中说明,API 响应的 usage 对象现在包含 costis_byokcost_details。(OpenRouter)

X-OpenRouter-Experimental-Metadata 只适合调试。OpenRouter 文档明确说 router metadata 是实验功能,字段可能变化,不应当当成稳定接口。(OpenRouter)


6. 在 Windows 中设置 OpenRouter 环境变量

Codex Desktop 从开始菜单启动时,不会继承你某个 PowerShell 窗口里的临时变量。所以要设置成 Windows 用户级环境变量。

用 PowerShell 执行:

[Environment]::SetEnvironmentVariable(
  "OPENROUTER_API_KEY",
  "sk-or-你的OpenRouterKey",
  "User"
)

检查:

[Environment]::GetEnvironmentVariable("OPENROUTER_API_KEY", "User")

然后完全退出 Codex Desktop,再重新打开。


7. Codex Desktop 的配置文件位置

Windows 下用户级配置文件放在:

%USERPROFILE%\.codex\config.toml

Codex 官方文档说明,用户级配置在 ~/.codex/config.toml,也可以在项目中放 .codex/config.toml;项目配置只会在信任项目后读取。(OpenAI Developers)

Codex app 的 agent 会继承 CLI / IDE extension 的同一套配置;常见设置可以在 app 里调,进阶设置改 config.toml。(OpenAI Developers)

Codex 自定义 provider 配置里,model_provider 指向 model_providers 中的 provider id;env_key 用来指定环境变量名;wire_api 当前只有 responses 这一个支持值,不写时默认也是 responses。(OpenAI Developers)


8. 手动创建 Codex 配置

先创建目录:

mkdir "$env:USERPROFILE\.codex" -Force
notepad "$env:USERPROFILE\.codex\config.toml"

写入:

profile = "deepseek-v4-pro"

[profiles.deepseek-v4-pro]
model_provider = "openrouter"
model = "deepseek/deepseek-v4-pro"
model_reasoning_effort = "high"
approval_policy = "on-request"
sandbox_mode = "workspace-write"

[profiles.gpt55-high]
model_provider = "openai"
model = "gpt-5.5"
model_reasoning_effort = "high"
approval_policy = "on-request"
sandbox_mode = "workspace-write"

[model_providers.openrouter]
name = "OpenRouter"
base_url = "https://openrouter.ai/api/v1"
env_key = "OPENROUTER_API_KEY"
wire_api = "responses"

[windows]
sandbox = "elevated"

OpenRouter 官方给 Codex CLI 的配置也是使用 model_provider = "openrouter"base_url = "https://openrouter.ai/api/v1"env_key = "OPENROUTER_API_KEY" 这一套。(OpenRouter)

DeepSeek V4 Pro 在 OpenRouter 的模型 id 是:

deepseek/deepseek-v4-pro

OpenRouter 模型页显示 DeepSeek V4 Pro 支持 1M context,适合复杂推理、代码和长任务;它也支持 highxhigh reasoning efforts。(OpenRouter)

GPT-5.5 在 Codex 中的模型名是:

gpt-5.5

OpenAI Codex 模型页也给出 codex -m gpt-5.5 的用法,并说明 GPT-5.5 是 Codex 推荐模型之一。(OpenAI Developers)


9. 启动 Codex Desktop 并测试

打开 Codex Desktop,选择一个项目,开一个新的本地线程。

先发一个只读任务:

读取当前项目结构,概括主要目录和技术栈。不要修改文件。

然后看两件事:

是否能正常响应
OpenRouter Logs / Activity 里是否出现 DeepSeek V4 Pro 请求

如果你要确认是否 BYOK,可以先用第 5 节 PowerShell 测试。Codex Desktop 本身未必会把 usage.is_byok 直接显示给你,所以 OpenRouter 后台日志更可靠。


10. Windows 桌面一键切换脚本

下面给两个 .cmd 文件。它们的作用是:

写入 %USERPROFILE%\.codex\config.toml
自动备份旧 config.toml
一个切到 DeepSeek V4 Pro
一个切到 GPT-5.5 high

注意:这两个脚本会覆盖现有 config.toml。如果你已经在 config.toml 里配置了 MCP、插件、项目规则、特殊权限,先备份或手动合并。脚本会自动备份一份旧文件,但最好你自己也保存一份。


脚本 1:切到 DeepSeek V4 Pro

在桌面新建文件:

Codex-切到-DeepSeek-V4-Pro.cmd

填入:

@echo off
setlocal

set "CODEX_DIR=%USERPROFILE%\.codex"
set "CONFIG=%CODEX_DIR%\config.toml"

if not exist "%CODEX_DIR%" mkdir "%CODEX_DIR%"

for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd-HHmmss"') do set TS=%%i

if exist "%CONFIG%" (
  copy /Y "%CONFIG%" "%CONFIG%.bak-%TS%" >nul
)

(
echo profile = "deepseek-v4-pro"
echo.
echo [profiles.deepseek-v4-pro]
echo model_provider = "openrouter"
echo model = "deepseek/deepseek-v4-pro"
echo model_reasoning_effort = "high"
echo approval_policy = "on-request"
echo sandbox_mode = "workspace-write"
echo.
echo [profiles.gpt55-high]
echo model_provider = "openai"
echo model = "gpt-5.5"
echo model_reasoning_effort = "high"
echo approval_policy = "on-request"
echo sandbox_mode = "workspace-write"
echo.
echo [model_providers.openrouter]
echo name = "OpenRouter"
echo base_url = "https://openrouter.ai/api/v1"
echo env_key = "OPENROUTER_API_KEY"
echo wire_api = "responses"
echo.
echo [windows]
echo sandbox = "elevated"
) > "%CONFIG%"

echo.
echo 已切换到 DeepSeek V4 Pro via OpenRouter BYOK。
echo 配置文件:%CONFIG%
echo 旧配置已备份为:%CONFIG%.bak-%TS%
echo.
echo 请完全退出 Codex Desktop,然后重新打开;或者至少新开一个 Codex 本地线程。
echo.
pause

脚本 2:切回 GPT-5.5 high

在桌面新建文件:

Codex-切回-GPT-5.5-High.cmd

填入:

@echo off
setlocal

set "CODEX_DIR=%USERPROFILE%\.codex"
set "CONFIG=%CODEX_DIR%\config.toml"

if not exist "%CODEX_DIR%" mkdir "%CODEX_DIR%"

for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyyMMdd-HHmmss"') do set TS=%%i

if exist "%CONFIG%" (
  copy /Y "%CONFIG%" "%CONFIG%.bak-%TS%" >nul
)

(
echo profile = "gpt55-high"
echo.
echo [profiles.deepseek-v4-pro]
echo model_provider = "openrouter"
echo model = "deepseek/deepseek-v4-pro"
echo model_reasoning_effort = "high"
echo approval_policy = "on-request"
echo sandbox_mode = "workspace-write"
echo.
echo [profiles.gpt55-high]
echo model_provider = "openai"
echo model = "gpt-5.5"
echo model_reasoning_effort = "high"
echo approval_policy = "on-request"
echo sandbox_mode = "workspace-write"
echo.
echo [model_providers.openrouter]
echo name = "OpenRouter"
echo base_url = "https://openrouter.ai/api/v1"
echo env_key = "OPENROUTER_API_KEY"
echo wire_api = "responses"
echo.
echo [windows]
echo sandbox = "elevated"
) > "%CONFIG%"

echo.
echo 已切回 GPT-5.5 high。
echo 配置文件:%CONFIG%
echo 旧配置已备份为:%CONFIG%.bak-%TS%
echo.
echo 请完全退出 Codex Desktop,然后重新打开;或者至少新开一个 Codex 本地线程。
echo.
pause

11. 两个脚本怎么用

第一次使用前,只需要做一次:

[Environment]::SetEnvironmentVariable(
  "OPENROUTER_API_KEY",
  "sk-or-你的OpenRouterKey",
  "User"
)

之后:

双击 Codex-切到-DeepSeek-V4-Pro.cmd
重启 Codex Desktop

或者:

双击 Codex-切回-GPT-5.5-High.cmd
重启 Codex Desktop

脚本会保留两个 profile,只是改变第一行:

profile = "deepseek-v4-pro"

或:

profile = "gpt55-high"

Codex 文档说明可以在 config.toml 顶层设置 profile = "...",让 Codex 默认加载指定 profile。(OpenAI Developers)


12. 常见错误

12.1 No endpoints available matching your guardrail restrictions and data policy

优先检查:

OpenRouter Privacy 里是否禁止了 paid endpoints
是否强制开启 ZDR
Allowed Providers 是否没有 DeepSeek
Ignored Providers 是否包含 DeepSeek
Guardrail 是否限制了 provider / model
BYOK key 的 API key filter 是否排除了当前 OpenRouter key

这个错误本质上是 OpenRouter 路由条件太严格,找不到符合条件的 endpoint。

12.2 is_byok = false

通常是:

DeepSeek key 没放到 BYOK
BYOK key 不在 Prioritized
Always use 没开
请求没有限制 provider
OpenRouter 使用了共享 endpoint 或其他 provider

在 Codex Desktop 里,建议在 OpenRouter 账户级设置中把 Allowed Providers 限制为 DeepSeek,并开启 BYOK key 的 Always use。

12.3 Codex Desktop 还是走 GPT-5.5

检查:

%USERPROFILE%\.codex\config.toml 是否真的被脚本改了
第一行 profile 是否是 "deepseek-v4-pro"
Codex Desktop 是否完全退出后重新打开
项目里是否有 .codex/config.toml 覆盖了用户级配置

Codex 配置有优先级:CLI 参数、profile、项目配置、用户配置依次生效。(OpenAI Developers)

12.4 401 或认证失败

检查:

OPENROUTER_API_KEY 是否是 OpenRouter key,不是 DeepSeek key
是否设置到了 User 环境变量
Codex Desktop 是否在设置环境变量之后重启
OpenRouter key 是否被删除、禁用或设了限制

12.5 DeepSeek provider 报限流

这通常说明 OpenRouter 已经在用你的 DeepSeek BYOK key,但 DeepSeek 侧余额、额度或速率限制不够。

检查:

DeepSeek 账户余额
DeepSeek API key 是否有效
DeepSeek 后台是否有错误日志
OpenRouter BYOK key 是否仍然有效

13. 推荐的最终设置

个人使用 Codex Desktop,我建议这样:

OpenRouter Privacy:
- Paid endpoints that may train on request data: 开
- ZDR: 不强制
- Allowed Providers: DeepSeek
- Ignored Providers: 空

OpenRouter BYOK:
- DeepSeek key: Prioritized
- Always use: 开

Windows:
- OPENROUTER_API_KEY 设置为用户级环境变量

Codex:
- 用 profile 切换
- DeepSeek profile: deepseek/deepseek-v4-pro + high
- OpenAI profile: gpt-5.5 + high

这样做的好处是:Codex Desktop 配置简单,OpenRouter 侧负责保证 DeepSeek BYOK,切换模型只需要双击脚本改 profile