不只是 API 代理:CliGate 怎么把 Claude Code、Codex CLI 和 Gemini CLI 收到一个本地网关?
摘要
很多团队开始同时使用 Claude Code、Codex CLI、Gemini CLI、OpenClaw 这类 AI 编程工具后,会遇到一个很现实的问题:每个工具都有自己的协议、配置文件、凭证来源和模型命名方式。工具越多,配置越散;账户、API Key、本地模型和日志也越难统一管理。
CliGate 的思路不是再做一个远端中转服务,而是在本机启动一个 localhost:8081 的本地 AI gateway:上游可以是 ChatGPT / Claude 账户池、各类 provider API Key,也可以是本地运行时;下游则统一接住 Claude Code、Codex CLI、Gemini CLI、OpenClaw、Web Chat 和渠道会话。
这篇文章不写安装流水账,而是结合项目源码和文档,拆一下 CliGate 里比较有意思的几个工程点:协议转换、应用识别、凭证路由、能力感知降级,以及为什么它和普通 API proxy 的侧重点不太一样。
问题不是“能不能代理”,而是“能不能稳定地接住多个客户端”
单个 OpenAI-compatible 代理并不复杂:客户端打到 /v1/chat/completions,服务端转发到上游,再把响应返回即可。
但 AI 编程 CLI 的问题更碎:
- Claude Code 和 OpenClaw 常走 Anthropic Messages:
POST /v1/messages - Codex CLI 会走 OpenAI Responses 或它自己的内部接口:
POST /v1/responses、POST /backend-api/codex/responses - Gemini CLI 使用 Gemini API 风格:
POST /v1beta/models/* - 不同客户端对 tool call、流式事件、图片输入、文件输入、reasoning/thinking 的表达都不一样
- 账户池、API Key 池和本地模型都可能是可用上游,但可支持能力不同
CliGate 的 README_CN 和 docs/ARCHITECTURE.md 里把定位说得比较直接:它是一个本地控制平面,而不是单一路由转发器。对应到代码里,主要入口分布在:
src/routes/messages-route.js:Anthropic Messages 协议的入口src/routes/responses-route.js:OpenAI Responses 协议的入口src/routes/gemini-route.js:Gemini 协议的入口
这些路由不是简单地透传,而是各自做一次“协议标准化”,再把请求扔给统一的 router 层。
用 CliGate 把 DeepSeek 同时接入 Claude Code 和 Codex CLI
很多人一开始接 AI 编程工具时,都是一个工具配一套模型入口:Claude Code 配 Anthropic,Codex CLI 配 OpenAI,Gemini CLI 再单独配 Gemini。这个方式能用,但工具一多,配置、路由、日志和成本统计都会变得分散。
如果你想让 DeepSeek 同时服务 Claude Code 和 Codex CLI,更好的做法不是分别去改两个工具的底层适配,而是在本机放一个统一的 AI gateway。
CliGate 解决的就是这个问题。
它默认运行在本地 localhost,把 Claude Code、Codex CLI、Gemini CLI、OpenClaw 等工具接到同一个控制平面里。DeepSeek 作为一个 provider 添加到 CliGate 后,Claude Code 和 Codex CLI 都可以通过 CliGate 访问它。
整体思路
最终结构是这样:
Claude Code ─┐
├─> CliGate 本地网关 ─> DeepSeek
Codex CLI ──┘
Claude Code 走 Anthropic Messages 风格请求,Codex CLI 走 OpenAI Responses / Chat Completions 风格请求。CliGate 在中间做协议适配、凭证选择、模型映射和日志记录。
这样带来的好处是:
- DeepSeek Key 只需要在 CliGate 里管理;
- Claude Code 和 Codex CLI 都指向同一个本地入口;
- 后续可以在 Dashboard 里统一查看请求日志和用量;
- 如果以后要换 provider,也主要改 CliGate 的路由,而不是逐个改工具。
Codex CLI + 国产模型:一个零侵入的 AI 网关实践
OpenAI 的 Codex CLI 是一个强大的终端 AI 助手,但它默认只能使用 OpenAI 的模型。本文介绍如何通过自建 AI Gateway,让 Codex CLI 无需修改任何代码即可使用 DeepSeek、通义千问、Kimi、智谱 GLM 等国产大模型,并完整保留推理过程展示、工具调用、网络搜索等高级功能。
背景:为什么需要一个网关?
Codex CLI 是 OpenAI 推出的命令行 AI 编程助手,类似于 Claude Code,但它基于 OpenAI 的 Responses API 协议与模型通信。国产大模型普遍兼容的是 Chat Completions API,两者在请求格式、响应结构、流式事件、工具调用约定上存在显著差异。
让 Codex 直接调用国产模型?不行——协议不兼容。Fork Codex 改代码?维护成本太高。
最优雅的方案是中间加一层网关:Codex 以为自己在跟 OpenAI 通信,国产模型以为自己在服务一个普通的 Chat Completions 客户端。网关负责协议的双向翻译。
零侵入接入:只需两个环境变量
这是整个方案最优雅的地方——不需要 fork Codex,不需要改一行代码,只需要设置两个环境变量:
把 Codex 的请求指向本地网关
export OPENAI_BASE_URL=http://localhost:3000
用网关的 API Key 替代 OpenAI 的 Key
export OPENAI_API_KEY=gateway-your-api-key
正常启动 Codex
codex
Codex CLI 会把所有 /v1/responses 请求发到本地网关,网关翻译后转发给国产模型,再把响应翻译回 Responses API 格式返回。整个过程对 Codex 完全透明。
核心架构:协议翻译层
请求方向:Responses API → Chat Completions API
当 Codex CLI 发出一个 Responses 请求时,CliGate 会解析其中的消息列表、工具定义、温度、top_p 等参数,转换成 Chat Completions 格式,再转发给对应的 provider。
响应方向:Chat Completions API → Responses API
国产模型返回的普通流式或非流式响应,会被 CliGate 重新包装成 Responses 格式,包括:
- 流式 delta 事件的转换
- tool_calls 的格式映射
- reasoning_content 的提取与回传
这样,Codex CLI 就能完整地看到思考过程、工具调用和最终答案。
Codex CLI 接到了自定义模型网关,踩了几个坑
最近在折腾 Codex CLI,遇到一个很常见的需求:不一定想让它只走默认接口,而是希望接到自己的 OpenAI-compatible API 网关里。
原因可能有很多,比如:
- 团队想统一管理 API Key
- 想统一看调用记录和消耗
- 想在不同模型之间切换
- 想把 Codex CLI、Cherry Studio、Claude Code 这类工具的配置收拢起来
这里记录一次实际配置过程。示例里用的是 LLMEX,因为它刚好有 Codex CLI 的配置文档和脚本。如果你用的是其他兼容接口,核心思路也差不多:base URL、API Key、模型名这三项要对上。
Codex CLI 接入自定义 API,大致分成 5 步:
- 安装 Node.js
- 安装 Codex CLI
- 准备一个兼容 OpenAI API 格式的服务
- 配置 API 地址和 Key
- 进入项目目录测试一次请求
1. 安装 Node.js
Codex CLI 需要 Node.js 环境。
先检查一下本机有没有安装:
node --version
npm --version
如果没有输出版本号,就需要先安装 Node.js。
macOS 用户可以用官网安装包,也可以用 Homebrew。Windows 用户我更建议用 WSL2,后续命令行体验会顺很多。
2. 安装 Codex CLI
Node.js 和 npm 正常后,安装 Codex CLI:
npm install -g @openai/codex
安装完成后检查版本:
codex --version
如果这里报权限问题,通常是 npm 全局目录权限导致的。可以先查一下 npm 的全局安装目录,或者改成当前用户目录。这个问题和 Codex 本身关系不大,很多 npm 全局工具都会遇到。
3. 准备自定义 API 网关
这里需要的是一个 OpenAI-compatible API 服务,也就是支持 /v1/chat/completions 或 /v1/responses 的网关。CliGate 正是为此设计的。
凭证路由与能力感知降级
CliGate 区别于普通代理的另一个核心能力,是凭证路由和能力感知降级。
在 src/router/credential-router.js 中,CliGate 会根据请求中的模型名、客户端类型、当前负载情况,从多个 provider 凭证池里选出最合适的 Key。
同时,在 src/middleware/capability-middleware.js 里,它会检测上游模型是否支持 tool call、vision、reasoning 等能力。如果不支持,就自动降级为普通文本模式,避免返回错误。
这种设计让团队可以把 Claude Code、Codex CLI、Gemini CLI 全部指向同一个本地地址,而不用担心某个模型突然不支持某个功能导致工具崩溃。
结语
CliGate 的价值不在于“又多了一个代理”,而在于它把原本分散在各个 CLI 工具里的协议、凭证、日志和路由逻辑,收拢到一个本地的、可观测的控制平面里。对于同时使用多款 AI 编程工具的团队来说,这可能是目前最轻量、也最实用的统一方案。