13 KiB
CLI 代理 API
English | 中文
一个为 CLI 提供 OpenAI/Gemini/Claude 兼容 API 接口的代理服务器。
现已支持通过 OAuth 登录接入 OpenAI Codex(GPT 系列)和 Claude Code。
可与本地或多账户方式配合,使用任何 OpenAI 兼容的客户端与 SDK。
现在,我们添加了第一个中国提供商:Qwen Code。
功能特性
- 为 CLI 模型提供 OpenAI/Gemini/Claude 兼容的 API 端点
- 新增 OpenAI Codex(GPT 系列)支持(OAuth 登录)
- 新增 Claude Code 支持(OAuth 登录)
- 新增 Qwen Code 支持(OAuth 登录)
- 支持流式与非流式响应
- 函数调用/工具支持
- 多模态输入(文本、图片)
- 多账户支持与轮询负载均衡(Gemini、OpenAI、Claude 与 Qwen)
- 简单的 CLI 身份验证流程(Gemini、OpenAI、Claude 与 Qwen)
- 支持 Gemini AIStudio API 密钥
- 支持 Gemini CLI 多账户轮询
- 支持 Claude Code 多账户轮询
- 支持 Qwen Code 多账户轮询
安装
前置要求
- Go 1.24 或更高版本
- 有权访问 Gemini CLI 模型的 Google 账户(可选)
- 有权访问 OpenAI Codex/GPT 的 OpenAI 账户(可选)
- 有权访问 Claude Code 的 Anthropic 账户(可选)
- 有权访问 Qwen Code 的 Qwen Chat 账户(可选)
从源码构建
-
克隆仓库:
git clone https://github.com/luispater/CLIProxyAPI.git cd CLIProxyAPI -
构建应用程序:
go build -o cli-proxy-api ./cmd/server
使用方法
身份验证
您可以分别为 Gemini、OpenAI 和 Claude 进行身份验证,三者可同时存在于同一个 auth-dir 中并参与负载均衡。
-
Gemini(Google):
./cli-proxy-api --login如果您是旧版 gemini code 用户,可能需要指定项目 ID:
./cli-proxy-api --login --project_id <your_project_id>本地 OAuth 回调端口为
8085。 -
OpenAI(Codex/GPT,OAuth):
./cli-proxy-api --codex-login选项:加上
--no-browser可打印登录地址而不自动打开浏览器。本地 OAuth 回调端口为1455。 -
Claude(Anthropic,OAuth):
./cli-proxy-api --claude-login选项:加上
--no-browser可打印登录地址而不自动打开浏览器。本地 OAuth 回调端口为54545。 -
Qwen(Qwen Chat,OAuth):
./cli-proxy-api --qwen-login选项:加上
--no-browser可打印登录地址而不自动打开浏览器。使用 Qwen Chat 的 OAuth 设备登录流程。
启动服务器
身份验证完成后,启动服务器:
./cli-proxy-api
默认情况下,服务器在端口 8317 上运行。
API 端点
列出模型
GET http://localhost:8317/v1/models
聊天补全
POST http://localhost:8317/v1/chat/completions
请求体示例:
{
"model": "gemini-2.5-pro",
"messages": [
{
"role": "user",
"content": "你好,你好吗?"
}
],
"stream": true
}
说明:
- 使用
gemini-*模型(如gemini-2.5-pro)走 Gemini,使用gpt-*模型(如gpt-5)走 OpenAI,使用claude-*模型(如claude-3-5-sonnet-20241022)走 Claude,使用qwen-*模型(如qwen3-coder-plus)走 Qwen,服务会自动路由到对应提供商。
Claude 消息(SSE 兼容)
POST http://localhost:8317/v1/messages
与 OpenAI 库一起使用
您可以通过将基础 URL 设置为本地服务器来将此代理与任何 OpenAI 兼容的库一起使用:
Python(使用 OpenAI 库)
from openai import OpenAI
client = OpenAI(
api_key="dummy", # 不使用但必需
base_url="http://localhost:8317/v1"
)
# Gemini 示例
gemini = client.chat.completions.create(
model="gemini-2.5-pro",
messages=[{"role": "user", "content": "你好,你好吗?"}]
)
# Codex/GPT 示例
gpt = client.chat.completions.create(
model="gpt-5",
messages=[{"role": "user", "content": "用一句话总结这个项目"}]
)
# Claude 示例(使用 messages 端点)
import requests
claude_response = requests.post(
"http://localhost:8317/v1/messages",
json={
"model": "claude-3-5-sonnet-20241022",
"messages": [{"role": "user", "content": "用一句话总结这个项目"}],
"max_tokens": 1000
}
)
print(gemini.choices[0].message.content)
print(gpt.choices[0].message.content)
print(claude_response.json())
JavaScript/TypeScript
import OpenAI from 'openai';
const openai = new OpenAI({
apiKey: 'dummy', // 不使用但必需
baseURL: 'http://localhost:8317/v1',
});
// Gemini
const gemini = await openai.chat.completions.create({
model: 'gemini-2.5-pro',
messages: [{ role: 'user', content: '你好,你好吗?' }],
});
// Codex/GPT
const gpt = await openai.chat.completions.create({
model: 'gpt-5',
messages: [{ role: 'user', content: '用一句话总结这个项目' }],
});
// Claude 示例(使用 messages 端点)
const claudeResponse = await fetch('http://localhost:8317/v1/messages', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
model: 'claude-3-5-sonnet-20241022',
messages: [{ role: 'user', content: '用一句话总结这个项目' }],
max_tokens: 1000
})
});
console.log(gemini.choices[0].message.content);
console.log(gpt.choices[0].message.content);
console.log(await claudeResponse.json());
支持的模型
- gemini-2.5-pro
- gemini-2.5-flash
- gpt-5
- claude-opus-4-1-20250805
- claude-opus-4-20250514
- claude-sonnet-4-20250514
- claude-3-7-sonnet-20250219
- claude-3-5-haiku-20241022
- qwen3-coder-plus
- qwen3-coder-flash
- Gemini 模型在需要时自动切换到对应的 preview 版本
配置
服务器默认使用位于项目根目录的 YAML 配置文件(config.yaml)。您可以使用 --config 标志指定不同的配置文件路径:
./cli-proxy-api --config /path/to/your/config.yaml
配置选项
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
port |
integer | 8317 | 服务器监听的端口号 |
auth-dir |
string | "~/.cli-proxy-api" | 存储身份验证令牌的目录。支持使用 ~ 表示主目录 |
proxy-url |
string | "" | 代理 URL,支持 socks5/http/https 协议,示例:socks5://user:pass@192.168.1.1:1080/ |
quota-exceeded |
object | {} | 处理配额超限的配置 |
quota-exceeded.switch-project |
boolean | true | 当配额超限时是否自动切换到另一个项目 |
quota-exceeded.switch-preview-model |
boolean | true | 当配额超限时是否自动切换到预览模型 |
debug |
boolean | false | 启用调试模式以进行详细日志记录 |
api-keys |
string[] | [] | 可用于验证请求的 API 密钥列表 |
generative-language-api-key |
string[] | [] | 生成式语言 API 密钥列表 |
claude-api-key |
object | {} | Claude API 密钥列表 |
claude-api-key.api-key |
string | "" | Claude API 密钥 |
claude-api-key.base-url |
string | "" | 自定义 Claude API 端点(如果你使用的是第三方 Claude API 端点) |
配置文件示例
# 服务器端口
port: 8317
# 身份验证目录(支持 ~ 表示主目录)
auth-dir: "~/.cli-proxy-api"
# 启用调试日志
debug: false
# 代理 URL,支持 socks5/http/https 协议,示例:socks5://user:pass@192.168.1.1:1080/
proxy-url: ""
# 配额超限行为
quota-exceeded:
switch-project: true # 当配额超限时是否自动切换到另一个项目
switch-preview-model: true # 当配额超限时是否自动切换到预览模型
# 用于本地身份验证的 API 密钥
api-keys:
- "your-api-key-1"
- "your-api-key-2"
# AIStduio Gemini API 的 API 密钥
generative-language-api-key:
- "AIzaSy...01"
- "AIzaSy...02"
- "AIzaSy...03"
- "AIzaSy...04"
# Claude API keys
claude-api-key:
- api-key: "sk-atSM..." # use the official claude API key, no need to set the base url
- api-key: "sk-atSM..."
base-url: "https://www.example.com" # use the custom claude API endpoint
身份验证目录
auth-dir 参数指定身份验证令牌的存储位置。当您运行登录命令时,应用程序将在此目录中创建包含 Google 账户身份验证令牌的 JSON 文件。多个账户可用于轮询。
API 密钥
api-keys 参数允许您定义可用于验证对代理服务器请求的 API 密钥列表。在向 API 发出请求时,您可以在 Authorization 标头中包含其中一个密钥:
Authorization: Bearer your-api-key-1
官方生成式语言 API
generative-language-api-key 参数允许您定义可用于验证对官方 AIStudio Gemini API 请求的 API 密钥列表。
热更新
服务会监听配置文件与 auth-dir 目录的变化并自动重新加载客户端与配置。您可以在运行中新增/移除 Gemini/OpenAI 的令牌 JSON 文件,无需重启服务。
Gemini CLI 多账户负载均衡
启动 CLI 代理 API 服务器,然后将 CODE_ASSIST_ENDPOINT 环境变量设置为 CLI 代理 API 服务器的 URL。
export CODE_ASSIST_ENDPOINT="http://127.0.0.1:8317"
服务器将中继 loadCodeAssist、onboardUser 和 countTokens 请求。并自动在多个账户之间轮询文本生成请求。
Note
此功能仅允许本地访问,因为找不到一个可以验证请求的方法。
所以只能强制只有127.0.0.1可以访问。
Claude Code 的使用方法
启动 CLI Proxy API 服务器, 设置如下系统环境变量 ANTHROPIC_BASE_URL, ANTHROPIC_AUTH_TOKEN, ANTHROPIC_MODEL, ANTHROPIC_SMALL_FAST_MODEL
使用 Gemini 模型:
export ANTHROPIC_BASE_URL=http://127.0.0.1:8317
export ANTHROPIC_AUTH_TOKEN=sk-dummy
export ANTHROPIC_MODEL=gemini-2.5-pro
export ANTHROPIC_SMALL_FAST_MODEL=gemini-2.5-flash
使用 OpenAI 模型:
export ANTHROPIC_BASE_URL=http://127.0.0.1:8317
export ANTHROPIC_AUTH_TOKEN=sk-dummy
export ANTHROPIC_MODEL=gpt-5
export ANTHROPIC_SMALL_FAST_MODEL=codex-mini-latest
使用 Claude 模型:
export ANTHROPIC_BASE_URL=http://127.0.0.1:8317
export ANTHROPIC_AUTH_TOKEN=sk-dummy
export ANTHROPIC_MODEL=claude-sonnet-4-20250514
export ANTHROPIC_SMALL_FAST_MODEL=claude-3-5-haiku-20241022
使用 Qwen 模型:
export ANTHROPIC_BASE_URL=http://127.0.0.1:8317
export ANTHROPIC_AUTH_TOKEN=sk-dummy
export ANTHROPIC_MODEL=qwen3-coder-plus
export ANTHROPIC_SMALL_FAST_MODEL=qwen3-coder-flash
使用 Docker 运行
运行以下命令进行登录(Gemini OAuth,端口 8085):
docker run --rm -p 8085:8085 -v /path/to/your/config.yaml:/CLIProxyAPI/config.yaml -v /path/to/your/auth-dir:/root/.cli-proxy-api eceasy/cli-proxy-api:latest /CLIProxyAPI/CLIProxyAPI --login
运行以下命令进行登录(OpenAI OAuth,端口 1455):
docker run --rm -p 1455:1455 -v /path/to/your/config.yaml:/CLIProxyAPI/config.yaml -v /path/to/your/auth-dir:/root/.cli-proxy-api eceasy/cli-proxy-api:latest /CLIProxyAPI/CLIProxyAPI --codex-login
运行以下命令进行登录(Claude OAuth,端口 54545):
docker run --rm -p 54545:54545 -v /path/to/your/config.yaml:/CLIProxyAPI/config.yaml -v /path/to/your/auth-dir:/root/.cli-proxy-api eceasy/cli-proxy-api:latest /CLIProxyAPI/CLIProxyAPI --claude-login
运行以下命令启动服务器:
docker run --rm -p 8317:8317 -v /path/to/your/config.yaml:/CLIProxyAPI/config.yaml -v /path/to/your/auth-dir:/root/.cli-proxy-api eceasy/cli-proxy-api:latest
贡献
欢迎贡献!请随时提交 Pull Request。
- Fork 仓库
- 创建您的功能分支(
git checkout -b feature/amazing-feature) - 提交您的更改(
git commit -m 'Add some amazing feature') - 推送到分支(
git push origin feature/amazing-feature) - 打开 Pull Request
许可证
此项目根据 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件。