副标题:打破网络与配置壁垒——从协议兼容原理到 macOS / Windows 全链路落地指南

阅读约定:文中的接入域名、模型 ID 与用量口径均以 Nonelinear 官方文档(https://docs.nonelinear.com.cn/) 与控制台实时信息为准。本文重点在于“怎么配、为什么这么配、配错了怎么查”,示例中的 sk-*** 与域名请替换为你自己在控制台申请的实际值。


一、开篇:当你兴致勃勃打开 Codex,却卡在了网络与配置上

过去一年,Codex 已经从“一个命令行玩具”成长为不少工程师日常编码的一部分:它能读仓库、改文件、跑测试、开 PR。但当团队真正想把它纳入工作流时,问题往往不在模型能力,而在三个很具体的工程细节上:

  • 网络波动:跨境访问可能受链路波动影响,多轮 Agent 任务中途失败时,上下文需要重新处理。
  • 账务与配额需要提前规划:团队使用时需要清晰的用量记录、子 Key 与项目分组,避免额度管理粗放。
  • 配置门槛高:Codex CLI 的 config.toml、模型供应商段、wire_api 字段,对第一次接触的人来说很容易配成 .../v1/v1/responses 这类“看起来没错但一直报 400”的状态。

国内 API 中转站正是针对这三点的工程化方案:它在协议层保持与上游一致的 OpenAI 兼容接口,在网络层提供国内可直连的接入点,在账务层提供用量与配额管理。本文以 Nonelinear 为例,从底层原理出发,把 Codex CLI、IDE 插件、后端服务 三条链路一次性配通,并给出生产环境最常踩的坑与修复命令。


二、中转站如何提升接入稳定性?——协议层与路由层的工程逻辑

很多人对“中转”的第一印象是“不就是个反向代理吗”。实际上一个能在生产环境跑住的中转站,核心竞争力集中在下面三点。

2.1 协议兼容:一套 /v1 端点,客户端零改造

中转站对外暴露的是与 OpenAI 官方完全同构的 REST 接口:

  • POST /v1/chat/completions(Chat Completions)
  • POST /v1/responses(Responses API,Codex CLI 默认使用)
  • GET /v1/models

这意味着:任何支持自定义 Base URL 的客户端,只需要改一个地址 + 换一把 Key,业务代码、SDK、重试逻辑、流式解析全部不用动。这是它能在 Codex、Cline、Roo Code、Continue、LangChain 等生态里“即插即用”的根本原因。

2.2 接入层优化:就近解析 + 多活节点 + 失败熔断

中转站在国内部署多地域接入节点,通过 DNS 就近解析把请求落到延迟最低的节点,再在内部完成回源。对开发者而言,体感上的变化是:

  • 首 Token 延迟(TTFT) 波动更可控;
  • Agent 长任务的连续性提升,减少因中途断流导致的上下文重放;
  • 上游抖动时由中转层做重试与熔断,客户端拿到的是稳定的 200,而不是一堆 429 / ECONNRESET。

2.3 账务与可观测性:用量记录 + 统一管理

中转站在账务侧通常提供:

  • 按量用量记录,明细可在控制台查看;
  • 子 Key / 项目分组,便于给不同团队成员或 CI 环境分别配额;
  • 用量看板与配额告警,避免某个 Agent 死循环把额度跑爆。

对技术负责人来说,这三点合起来才是真正的价值:协议兼容解决“改得少”,网络优化解决“跑得稳”,账务统一解决“管得住”。


三、手把手配置:三类场景把中转站接进 Codex

下面按 Codex CLI → IDE 插件 → 后端服务 的顺序推进。建议先完成 3.1 并跑通 curl 探活,再往下走。

3.0 前置准备:拿到 Base URL 与 API Key

登录 Nonelinear 控制台,创建一把 API Key,并记下两样东西:

变量 含义 示例
BASE_URL 接口基地址(必须带 /v1) https://api.nonelinear.com.cn/v1
API_KEY 你的中转站密钥 sk-xxxxxxxxxxxxxxxx

先用最小请求做一次连通性探活,这一步不通,后面全是白搭。示例模型 ID 请替换为控制台当前可用值;以下以 gpt-5-codex 为例:

# 探活:返回 200 + JSON 即为通
curl -sS -X POST "${BASE_URL}/chat/completions" \
  -H "Authorization: Bearer ${API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5-codex",
    "messages": [{ "role": "user", "content": "ping" }]
  }' | head -c 500

如果返回 401,检查 Key;返回 404,大概率是 Base URL 少了或多了 /v1。


3.1 场景一:Codex CLI(最推荐,也是本文主战场)

第一步:安装 Codex CLI

# 需要 Node.js 18+ 
npm install -g @openai/codex

# 验证
codex --version

第二步:写入配置文件

Codex CLI 的配置文件位于:

  • macOS / Linux:~/.codex/config.toml
  • Windows:%USERPROFILE%\.codex\config.toml

创建或编辑该文件,加入自定义模型供应商段:

# ~/.codex/config.toml
# ---- 全局默认模型 ----
model           = "gpt-5-codex"      # 替换为中转站支持的模型 ID
model_provider  = "nonelinear"       # 指向下方自定义供应商
model_reasoning_effort = "medium"    # low / medium / high
approval_policy = "on-request"       # 危险操作需确认,生产环境建议保留

# ---- 自定义中转供应商 ----
[model_providers.nonelinear]
name     = "Nonelinear 中转"
# ⚠️ 关键:以 /v1 结尾,但不要写成 /v1/v1
base_url = "https://api.nonelinear.com.cn/v1"
# Key 不写死在这里,通过环境变量注入,避免明文落盘
env_key  = "NONELINEAR_API_KEY"
# Codex 默认走 Responses API;若中转不支持该端点,改为 "chat"
wire_api = "responses"

三个必须理解的字段:

  • base_url:Codex 会自动在其后拼接 /responses 或 /chat/completions,你只负责提供到 /v1 为止。
  • env_key:告诉 Codex 去读哪个环境变量取 Key,比把密钥写进配置文件安全得多。
  • wire_api:决定走 Responses 还是 Chat Completions。这一项配错,是最常见的 400 来源。

第三步:配置环境变量(含跨平台差异)

macOS / Linux(zsh / bash)

# 追加到 ~/.zshrc(bash 用户改为 ~/.bashrc)
cat >> ~/.zshrc <<'EOF'
export NONELINEAR_API_KEY="sk-你的中转站密钥"
# 可选:绕过全局代理,让中转流量走直连
export NO_PROXY="nonelinear.com.cn,127.0.0.1,localhost"
EOF

# 立即生效
source ~/.zshrc

# 验证(应打印出你的 Key)
echo $NONELINEAR_API_KEY

Windows PowerShell

# 写入用户级环境变量(持久化)
setx NONELINEAR_API_KEY "sk-你的中转站密钥"
setx NO_PROXY "nonelinear.com.cn,127.0.0.1,localhost"

# ⚠️ setx 只对【新开】的终端生效,必须重开 PowerShell 再验证
$env:NONELINEAR_API_KEY

Windows CMD

setx NONELINEAR_API_KEY "sk-你的中转站密钥"

第四步:验证 Codex 是否真正走通中转

# 交互模式:进入后直接提问
codex

# 非交互模式:适合脚本与 CI 冒烟测试
codex exec "用一句话说明快速排序的平均时间复杂度"

如果 Codex 能正常出结果,说明 base_url + env_key + wire_api + model 四件套全部匹配。

第五步(可选):按项目隔离配置

在项目根目录放一份 .codex/config.toml,可覆盖全局配置中的 model 字段,实现“不同仓库用不同模型”的灰度策略。


3.2 场景二:VS Code 侧的 IDE 插件

VS Code 生态里对接中转的逻辑其实是同一套:Base URL + API Key + 模型 ID。以各类支持 OpenAI Compatible 的 Codex / 编码助手插件为例,核心配置项如下(具体键名以你所装插件版本的文档为准):

// .vscode/settings.json
{
  "codex.provider": "openai-compatible",
  "codex.baseUrl": "https://api.nonelinear.com.cn/v1",
  "codex.modelId": "gpt-5-codex",
  "codex.apiKeyEnvVar": "NONELINEAR_API_KEY"
}

如果你用的是 Cline / Roo Code 这类插件,配置方式等价:

// .vscode/settings.json
{
  "cline.apiProvider": "openai",
  "cline.openAiBaseUrl": "https://api.nonelinear.com.cn/v1",
  "cline.openAiModelId": "gpt-5-codex",
  "cline.openAiApiKey": "${env:NONELINEAR_API_KEY}"
}

⚠️ IDE 场景的坑:从 Finder / Dock / 开始菜单启动的 VS Code 不会继承你在 .zshrc 里 export 的环境变量。此时要么在插件里通过环境变量注入 Key,要么从已加载环境变量的终端里执行 code 启动 VS Code。若插件不支持环境变量占位,请仅在本地配置中填写,并注意不要提交到仓库。


3.3 场景三:后端服务代码接入

当你想在自研服务里复用同一把 Key,SDK 层面只需要改 base_url。

项目环境变量文件

# .env  —— 记得把它写进 .gitignore !
NONELINEAR_API_KEY=sk-xxxxxxxxxxxxxxxx
NONELINEAR_BASE_URL=https://api.nonelinear.com.cn/v1
# .gitignore
.env
.env.*
!.env.example

Python(openai>=1.x)

# app/llm_client.py
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["NONELINEAR_API_KEY"],
    base_url=os.environ["NONELINEAR_BASE_URL"],  # 必须以 /v1 结尾
    timeout=60.0,          # 长文本建议显式放大超时
    max_retries=2,         # SDK 内置指数退避重试
)

resp = client.chat.completions.create(
    model="gpt-5-codex",
    messages=[{"role": "user", "content": "ping"}],
)
print(resp.choices[0].message.content)

Node.js / TypeScript(openai v4)

// src/llm.ts
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.NONELINEAR_API_KEY!,
  baseURL: process.env.NONELINEAR_BASE_URL!, // 必须以 /v1 结尾
  timeout: 60_000,
  maxRetries: 2,
});

const r = await client.chat.completions.create({
  model: "gpt-5-codex",
  messages: [{ role: "user", content: "ping" }],
});
console.log(r.choices[0].message.content);

四、生产环境避坑指南:7 个常见问题

坑 1:/v1 重复拼接,一直 404

Codex 会在 base_url 后自动追加 /responses。若你写成 https://api.nonelinear.com.cn/v1/v1,最终请求就会变成 /v1/v1/responses。

# 快速定位:直接打端点看返回
curl -i -sS -o /dev/null -w "%{http_code}\n" \
  -X POST "${BASE_URL}/responses" \
  -H "Authorization: Bearer ${API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-5-codex","input":"ping"}'

404 → 路径错;400 unsupported_endpoint → 改成 wire_api = "chat"。

坑 2:GUI 应用读不到 shell 环境变量

macOS 上从 Dock 启动的 VS Code / Codex 不加载 ~/.zshrc。两种修法:

# 方案 A:把变量提到 ~/.zprofile(登录 shell 加载)
echo 'export NONELINEAR_API_KEY="sk-***"' >> ~/.zprofile

# 方案 B:从终端启动
code .

Windows 上 setx 后必须重开终端,当前会话不会刷新。

坑 3:全局代理劫持国内中转流量

HTTPS_PROXY 在 .zshrc 里常驻的机器,容易把中转站流量也绕到境外代理,延迟反而更高。

# macOS / Linux
export NO_PROXY="nonelinear.com.cn,127.0.0.1,localhost"
# Windows PowerShell
$env:NO_PROXY = "nonelinear.com.cn,127.0.0.1,localhost"

坑 4:密钥硬编码进仓库

一旦 git push,改都改不回来。补救与预防:

# 检查历史泄露
git log -p -S "sk-" -- . | head -50

# 立刻在控制台吊销该 Key,重新签发
# 代码侧统一改为 os.environ / process.env 读取

坑 5:配置文件权限过宽

# macOS / Linux:仅本人可读写
chmod 600 ~/.codex/config.toml
ls -l ~/.codex/config.toml   # 应显示 -rw-------
# Windows:移除继承权限,只授权当前用户
icacls "$env:USERPROFILE\.codex\config.toml" /inheritance:r `
  /grant:r "$env:USERNAME:(R,W)"

坑 6:会话缓存与临时目录越积越大

Codex 的会话记录、npm 缓存长期不清可能占用较多磁盘空间。

# 查看占用
du -sh ~/.codex/* 2>/dev/null | sort -h | tail

# 清理 npm 缓存(安全)
npm cache clean --force

# 清理过期会话(谨慎,会丢历史上下文)
find ~/.codex/sessions -type f -mtime +30 -delete

坑 7:企业网络 TLS 拦截导致握手失败

公司代理做了 SSL 中间人时,Node 会报 UNABLE_TO_VERIFY_LEAF_SIGNATURE。把企业根证书挂上:

# macOS / Linux
export NODE_EXTRA_CA_CERTS="/path/to/corp-root-ca.crt"
# Windows
$env:NODE_EXTRA_CA_CERTS = "C:\certs\corp-root-ca.crt"

五、角色化选型建议与总结

① 个人极客 / 独立开发者

直接用 Codex CLI + 中转站 是最短路径。建议:先做最小连通性验证并跑通链路,approval_policy 保持 on-request,防止 Agent 误删文件;把 Key 只放在 shell profile 里,不写进任何 config.toml。

② 中小型研发团队(5~50 人)

核心诉求是可管可控。建议:给每位成员或每个 CI 环境签发独立子 Key,便于按人/按项目做配额与用量归因;把 NONELINEAR_API_KEY 与 NONELINEAR_BASE_URL 注入到 CI 的 Secrets 中,仓库内的 .codex/config.toml 只保留模型与协议相关字段,永不提交密钥。

③ 企业级架构师

关注点从“能不能用”升级为“能不能审计、能不能兜底”。建议:在中转站前再包一层内部网关,统一出口 IP、统一日志脱敏、统一限流;同时准备多供应商故障转移策略(主用中转站 + 备用直连或多家中转);对 Key 做定期轮换,并把用量看板接入现有资源管理与审计体系。


写在最后:中转站本身不是魔法,它解决的是 协议、网络、账务 三件具体的工程事。只要把本文的四个关键字段(base_url、env_key、wire_api、model)对齐,再避开那七个坑,Codex 在你机器上就是一条稳定、可管理、可观测的生产力管线。

👉 快速开始:请前往官方文档 https://docs.nonelinear.com.cn/ 获取最新的接入地址、模型列表与用量与配额说明。