目录

CLIProxyAPI 深度指南:把 Claude Code、Gemini CLI、Codex 和 Grok 接成统一 API

CLIProxyAPI 把 Claude Code、Gemini CLI、OpenAI Codex、Grok Build 这类原本依赖本地 OAuth 会话的订阅制 CLI,整理成程序可以稳定调用的统一 API。对外它表现成接口服务;对内还要处理协议翻译、身份代理、账号调度和运行态管理。

当前项目对外已经覆盖 Chat Completions、Responses、Gemini、Claude 等协议面,并且保留了 provider-specific 路由、管理 API、auth-files、多账号轮询和外部观测扩展。接口数量本身不难理解,更容易出问题的是身份、路由和运行态要一起接进工程系统。

只打算调用官方按 Token 计费的稳定 API,直接接官方接口通常更省事。本文讨论的是另一类场景:要复用这些订阅制能力,并把它们接进 Cursor、Cline、Amp、自写桌面应用或自动化服务,就得处理认证、路由和运行态这一层。本文以项目当前 README、中文手册、管理 API 文档和最新公开发行状态为准,重点放在它的定位、部署顺序和实际边界。

读完后你应该能做的三件事

  • 判断自己要的是官方 API,还是 CLIProxyAPI 这类“把订阅制 CLI 变成可编程接口”的执行访问层。
  • 分清统一 /v1、provider-specific 路由、auth-files、账号池和管理 API 各自负责什么。
  • 按正确顺序完成部署、认证、接入和观测,而不是一上来就先改客户端配置。

这篇文章适合哪三类读者

CLIProxyAPI 的信息量很容易把几种完全不同的需求搅在一起。先把读者路径拆开,后面的判断才不会串线。

读者类型你真正想解决的问题你最该关注的部分
客户端接入者已有 OpenAI 兼容客户端,想低成本接入 Claude Code、Gemini CLI、Codex 一类订阅能力统一接口、模型别名、provider-specific 路由
自托管运维者想把代理跑成长期服务,供自己或团队稳定复用config.yamlauth-files、管理 API、日志、账号池、外部统计
二次开发者想把这套能力嵌入自己的桌面应用、服务端或工具链sdk/cliproxy、热重载、认证与执行器注册逻辑

第三类读者最容易低估这套运行时:如果只把它当成 OpenAI 兼容网关,就会忽略掉嵌入式执行基础设施这一层。

先纠正几个最容易过期的认知

围绕 CLIProxyAPI 的旧文章不少,出错最多的地方通常不是概念,而是细节。以下几件事最好先纠正过来。

  • 当前管理 API 的默认基路径是 http://localhost:8317/v0/management。管理面不是“本地访问就默认放开”的设计,所有请求都需要管理密钥;只有在本地密码模式下,来自 127.0.0.1::1 的请求才可以用本地密码替代远程密钥。
  • remote-management.secret-key 为空且没有设置 MANAGEMENT_PASSWORD 时,整个 /v0/management 路由会直接返回 404。它不是一个永远存在、只是“你暂时没配好密码”的后台。
  • v6.10.0 起,CLIProxyAPI 和 CPAMC 不再内置 usage statistics。现在能拿到的是 usage-queue 和 Redis-compatible usage queue;想做持久化统计、成本估算或配额面板,要接外围工具。
  • Amp 的 provider-specific 路径确实让你能选择协议面,例如 messages、model-scoped generate、chat completions,但这不等于后端执行器已经唯一确定。只要 client-visible model name 复用,最终仍会回到 alias 和路由规则。
  • auth-files 不是边角配置。当前管理 API 会把它当作一等对象来管理,能列出、上传、下载、删除,并暴露 statusdisabledunavailablerecent_requestsauth_index 等运行态字段。备份和治理时,优先盯这些认证状态,不是客户端那几行 Base URL。

这些细节先对齐,后面谈部署、接入和观测时就不会踩旧教程留下的坑。

系统地图:从接口到运行态的 4 层结构

把 CLIProxyAPI 拆成 4 层来看,比直接盯着 /v1/chat/completions 更容易理解它实际在做什么。

负责什么你会碰到的对象最容易误判的点
入站协议层对外暴露统一接口和协议面Chat Completions、Responses、Gemini、Claude、Codex、Grok 兼容端点,以及 /api/provider/{provider}/...把它误认成“只有一个 OpenAI 风格入口”
路由与翻译层把模型别名和请求形状映射到具体后端model alias、provider route、OpenAI compatibility 配置以为换了 URL 就等于固定了后端
凭据与执行层管 OAuth、API key、账号池、执行器选择和流式返回Claude Code、Gemini CLI、Codex、Grok、AI Studio、auth-filesauth_index以为代理只是在 HTTP 层转发,不涉及身份与状态
控制平面管配置、日志、认证文件和运行态开关config.yaml/v0/management/*、本地密码、远程管理、外部 dashboard把管理面当作可有可无的附属功能

关键不在接口数量,而在执行上下文。普通反向代理主要关心 upstream 地址;CLIProxyAPI 还要决定请求该翻译成什么语义、该复用哪份认证状态、该落到哪个账号,以及结果该怎样回写成客户端能消费的协议面。

一条请求如何穿过这套系统

拿一个最常见的场景来说:你想让现成的 OpenAI 兼容客户端通过 CLIProxyAPI 调用 Codex 能力。

  1. 客户端把请求发到合并入口,例如 /v1/chat/completions,并带上你在代理里定义好的模型别名。
  2. 入站协议层先确认这次请求采用的是哪种协议面。如果你走的是 Amp 的 provider-specific 路径,这一步决定的就是 messages、model-scoped generate 还是 chat completions。
  3. 路由层根据模型别名、provider 配置和匹配规则,把请求定位到具体执行器,而不是只根据路径名做静态转发。
  4. 执行层检查当前是否已经存在可用认证状态。如果目标后端依赖 OAuth,会优先查运行时凭据;没有可用状态时,才需要补登录流程。
  5. 如果同一 provider 下配置了多个账号,账号池会在这一层决定本次请求到底由谁执行。轮询、故障切换和失效凭据跳过都发生在这里。
  6. 后端返回流式或非流式结果后,CLIProxyAPI 再把结果整理成客户端当前这一层协议面能消费的格式。
  7. 最终客户端看到的是一个统一 API 的返回,而不是背后那条“协议翻译 + 身份代理 + 账号调度”的执行链。

如果只把 CLIProxyAPI 当成一个便宜版 OpenAI 兼容网关,很多排障点会找错位置。对很多客户端来说,它表面上当然是统一接口;日常维护时要处理的,其实是背后这条“协议翻译 + 身份代理 + 账号调度”的执行链。

部署时真正该先配什么

很多人上来先找客户端教程,再去改 Base URL。这一步通常应该往后放。更稳的顺序是先把服务和状态面搭稳,再谈客户端。

1. 先决定运行形态

当前常见的 3 条路径没有变:直接用仓库提供的 docker-compose.ymlDockerfile、从 Release 下载二进制运行,或者从源码直接启动 cmd/server

源码方式的最小起步通常可以写成这样:

git clone https://github.com/router-for-me/CLIProxyAPI.git
cd CLIProxyAPI
cp config.example.yaml config.yaml
go run ./cmd/server --config ./config.yaml

如果你更习惯先编译再跑,也可以:

go build -o cli-proxy-api ./cmd/server
./cli-proxy-api --config ./config.yaml

这里最容易踩的坑不是命令本身,而是照抄早期端口示例。当前管理文档、示例配置和服务默认基路径都围绕 8317 展开,所以端口应以当前配置和仓库文档为准,而不是沿用旧教程里常见的 80808081

2. 先把状态面固定下来

CLIProxyAPI 的长期状态不在启动命令里,主要落在下面这些对象上:

  • config.yaml
  • 认证目录 auth-dir 及其内容
  • 模型别名、provider 路由和 OpenAI compatibility 配置
  • 管理密钥、本地密码、日志与 usage queue 配置

默认情况下,项目以文件为主要持久化方式;当前官方手册还单独提供了 Git、PostgreSQL 和对象存储路径。个人本机自用时,这些选项可以往后放;只要你准备跨机器迁移、多人维护或做远程部署,状态放在哪里、如何备份、如何恢复,就必须先定。

3. 先完成认证,再接客户端

部署顺序经常卡在这里。CLIProxyAPI 的 CLI 入口已经提供了 --claude-login--codex-device-login--xai-login--no-browser--oauth-callback-port 这类与 OAuth 直接相关的参数;如果你走管理面,文档也明确给出了 /anthropic-auth-url/codex-auth-url/gemini-cli-auth-url/get-auth-status 这一套登录与轮询接口。

例如,管理面发起 Codex 登录的最小调用就是:

curl -H 'Authorization: Bearer <MANAGEMENT_KEY>' \
  http://localhost:8317/v0/management/codex-auth-url

拿到返回的 urlstate 之后,再轮询状态端点:

curl -H 'Authorization: Bearer <MANAGEMENT_KEY>' \
  'http://localhost:8317/v0/management/get-auth-status?state=<STATE>'

实际部署时,通常先启动服务、完成认证、确认账号池里至少有一个可用凭据,再把 Cursor、Cline、Amp 或 OpenAI SDK 接进来。否则后面看到的很多报错,看上去像协议不兼容,实际只是代理内部还没有可用身份。

三条接入路径要分开看

CLIProxyAPI 的接入经验之所以容易混乱,是因为很多文章把完全不同的客户端都当成了同一类。

现成的 OpenAI 兼容客户端

对 Cursor、Cline、OpenAI SDK 一类工具,这条路改动最少。你要做的无非是把 Base URL 指向 CLIProxyAPI,提供代理服务自己的访问密钥,再把模型名换成代理里定义好的 alias。

更需要留意的是 alias 是否唯一,以及请求会不会被路由到你不希望的后端。只要一个模型名可能同时命中多个执行器,故障排查就会立刻变难。

需要保留 provider 语义的客户端

如果你接的是 Claude messages 风格或 Gemini model-scoped generate 风格接口,直接走 provider-specific 路径更清楚。Amp 的支持文档已经把这一点说得很明确:

  • /api/provider/{provider}/v1/messages 用于 messages-style 后端
  • /api/provider/{provider}/v1beta/models/... 用于 model-scoped generate
  • /api/provider/{provider}/v1/chat/completions 用于 chat-completions 风格后端

这组路径让客户端保留协议面语义,不必把所有请求都压到统一 /v1。但别把它理解成“URL 一换,后端就唯一固定”。执行器还是由模型别名和路由规则决定。

想把代理能力嵌进自己的程序

如果你的目标不是独立部署一个服务,而是把这层能力嵌到现有应用里,CLIProxyAPI 已经给出了更合适的路线。当前仓库里的 sdk/cliproxy 可以把路由、认证、热重载和执行器绑定作为库来使用,而不是只能外接一个本地进程。

这对桌面客户端和团队内部平台尤其重要。你不必在“自建一个额外服务”和“完全自己重写一套代理逻辑”之间二选一,可以直接复用它已经抽好的运行时层。

长期运维要盯住管理面、auth files 和账号池

要把 CLIProxyAPI 跑成长期服务,重点不只在兼容端点数量,还在于运行态是不是可管理。

当前管理 API 已经不只是能改几个布尔开关。它能原样拉取和回写 config.yaml,切换 debugrequest-loglogging-to-fileusage-statistics-enabled,读取 logsrequest-error-logsapi-key-usageusage-queue,还能把 auth-files 作为运行时凭据来列出、上传、下载和删除。

尤其是 auth-files 这一层,已经暴露出很多普通代理工具根本没有的运行态信息,例如:

  • 当前凭据是否 ready
  • 是否被禁用或临时不可用
  • 对应的 auth_index
  • 最近请求桶和成功失败计数
  • 是否只是运行时内存态凭据 runtime_only

运维时先盯凭据是否健康、账号池如何轮换、哪些认证状态要备份,以及哪些运行时信息足够支撑排障。客户端 URL 填错,通常反而是比较容易定位的问题。

CLIProxyAPI 的控制平面不能裸奔。管理 API 支持远程访问,但是否允许远程管理要靠 remote-management.allow-remote 明确开启;连续 5 次认证失败还会触发临时封禁。生产部署里,最好把它单独当成控制面来看,不要当成顺手点开看看配置的附属后台。

统计与观测现在怎么补

读过较早的文章,很容易默认 CLIProxyAPI 自带一套完整的用量统计后台。现在已经不是这样了。

项目当前的取舍很明确:代理本身更专注执行平面和管理平面,不再把持久化统计、成本估算和仪表盘全部塞进同一个二进制。官方 README 直接给出的方向是:

这更符合长期部署的分工。代理负责把 usage 数据通过 usage-queue 和 Redis-compatible queue 暴露出来,持久化和展示则交给外围项目按各自目标完成。

为什么可以把它当成基础设施看

只看一句“Wrap Gemini CLI, Antigravity, ChatGPT Codex, Claude Code, Grok Build as an API service”,很容易把 CLIProxyAPI 当成一个包装得很完整的代理 README。但从当前公开信息看,它已经不只是一个单点工具。

截至本文写作时,仓库公开页面显示它大约有 33.2k Stars、616 个 Releases、180 名贡献者。更值得注意的是,围绕它已经长出来三类生态:

这些生态说明,大家不只拿它做一次性中转,还在它上面继续做桌面包装、管理后台和兼容实现。CLI 会话、身份管理、账号池和多协议接口,已经被不少人当成一套可复用运行时来使用。

适合谁,不适合谁

下面几类需求,通常都适合认真看 CLIProxyAPI:

  • 你已经有现成的 OpenAI 兼容客户端,想低成本接入订阅制 AI CLI 能力。
  • 你在做桌面应用、IDE 插件或自动化服务,需要把 CLI 会话封装成统一 API。
  • 你需要多账号轮询、模型 alias、故障切换,而不是只要一个单账号中继。
  • 你希望把代理逻辑嵌入 Go 程序,而不是永远依赖外部独立进程。

只需要稳定、标准、按 Token 计费的官方 API,又不想处理 OAuth、认证材料、账号池和管理面的安全边界时,直接接官方 SDK 通常更简单。CLIProxyAPI 更适合处理“如何复用订阅制 CLI 运行时”这类问题;如果目标只是统一付费接口,这条路并不省事。

上线前最值得做的 5 个验收动作

真要把它跑成长期服务,至少先做完下面 5 件事:

  1. 确认服务能稳定启动,config.yaml、认证目录和日志目录都落在你预期的位置。
  2. 先打通一个 provider 的认证流程,确认不是“服务启动了,但账号根本不可用”。
  3. 用一个最小请求测一次合并入口,再测一次 provider-specific 路径,确认协议选择符合预期。
  4. 故意制造一个容易冲突的模型别名场景,验证你的 alias 和路由规则是不是足够明确。
  5. 打开日志、错误日志或外部 dashboard,确认排障时不只会看到一个模糊的 500

这 5 步都很基础,但能提前筛掉大多数“本地能跑、一上量就乱”的事故。

继续深挖时,先看这几份一手材料

准备真的落地时,不要先去搜二手教程,直接从当前一手材料开始:

直接看这些一手材料,主要是为了减少版本漂移。像默认端口、usage 统计能力、管理面认证方式、provider 路由别名这类细节,半年内就足以变一次。先读一手资料,能省掉大量对着旧文章排错的时间。

采用时的推荐顺序

采用时没必要一开始就把所有 provider 都接进来,按下面的节奏推进更稳:

  1. 先用一个你最熟悉、最容易验证的 provider 跑通完整链路。
  2. 再把模型 alias 和路由规则收紧,确保客户端不会误打到错误后端。
  3. 然后引入第二个账号或第二个 provider,验证轮询、故障切换和失败凭据跳过。
  4. 再补外部统计或管理面板,让观测能力跟上。
  5. 最后才考虑 SDK 内嵌、团队共享部署和更复杂的自动化接入。

按这个顺序推进,可以先确认瓶颈到底在协议、认证、账号池还是控制平面,而不是把四层复杂度一次性堆到系统里。

CLIProxyAPI 值得看的地方,不只是启动命令,而是它如何把一类原本不适合程序化消费的 AI CLI,会话化、可观测、可路由地接进真实工程系统。这个判断先立住,后面的配置字段、镜像、路径和工具接入就会顺很多。