CLIProxyAPI(六):结合 new-api 打造多用户 API 网关

本文是 CLIProxyAPI 系列教程第六篇,聚焦于如何将 CLIProxyAPI 接入 new-api,打造支持多用户管理的企业级 API 网关。

系列目录

  1. (一)入门——把 CLI 订阅变成标准 API
  2. (二)多账号轮询与配额策略
  3. (三)接入主流 AI 编程工具
  4. (四)生产部署——Nginx、TLS 与安全加固
  5. (五)Antigravity——用 Google 订阅解锁 Claude Opus 4.8
  6. (六)结合 new-api 打造多用户 API 网关(本文)
  7. (七)自动化运维——配额监控与告警
  8. (八)cpa_keeper 与 cpa_cost——用量追踪与成本分析工具
# CLIProxyAPI + new-api 多用户网关 ## 应用场景 ### 团队共享订阅 ### 个人多设备统一管理 ### 配额分配与用量审计 ## 整体架构 ### 客户端层 #### 成员 API Key (new-api 令牌) ### 网关层 #### new-api:认证 / 计费 / 限流 ### 代理层 #### CLIProxyAPI:OAuth 轮询 / 模型路由 ### 上游层 #### Claude Code / Gemini CLI 订阅 ## 部署 new-api ### 二进制直接运行(推荐) ### Docker Compose ### 数据库 SQLite / MySQL ### 初始化管理员账号 ## 渠道配置 ### 类型:OpenAI 兼容 ### 代理地址:http://cliproxyapi:8317/v1 ### 密钥:CLIProxyAPI api-keys ### 模型映射 ## 令牌管理 ### 创建令牌 ### 设置额度上限 ### 分发给成员 ## 统一对外暴露 ### Nginx 反向代理 ### Caddy 反向代理 ## 进阶:多实例渠道 ### 不同地区实例 ### 不同账号池 ### 负载均衡策略

团队里有多个人想用 Claude,但订阅账号只有几个,怎么合理分配?最直接的办法是在 CLIProxyAPI 前面再架一层 new-api:它负责认证、计费、限流,CLIProxyAPI 负责 OAuth 轮询和模型路由,两者组合之后你就有了一套完整的多用户 AI API 网关。

应用场景

团队共享订阅:公司有 5 个 Claude Max 账号,10 个工程师要用。把账号都导入 CLIProxyAPI,再用 new-api 给每个工程师发一个独立令牌,设定各自的 Token 月度上限,互不干扰,管理员可以随时查用量。

个人多设备统一管理:自己有 Mac、Linux 服务器、手机(Termux)等多个环境,每个地方都配一遍 CLIProxyAPI 太麻烦。统一跑一套 new-api + CLIProxyAPI,其他设备填 new-api 的令牌即可。

用量审计:new-api 详细记录每个令牌、每次请求的 Token 消耗,方便核算成本或向团队成员收费。

整体架构

flowchart LR A1["工程师 A\n令牌 sk-xxx"] --> B["new-api :3000\n认证 · 计费 · 限流"] A2["工程师 B\n令牌 sk-yyy"] --> B A3["个人设备\n令牌 sk-zzz"] --> B B -->|api-key| C["CLIProxyAPI :8317\nOAuth 轮询 · 模型路由"] C --> D1["Claude Code\n账号 1 / 2"] C --> D2["Gemini CLI\n账号"]

关键点:成员只接触 new-api 的令牌,永远看不到 CLIProxyAPI 的 api-key,也看不到上游 OAuth 凭证。

安装 new-api

方式 A:二进制直接运行(推荐,无需 Docker)

从 GitHub Releases 下载对应平台的二进制文件:

mkdir -p ~/new-api && cd ~/new-api

# 下载最新版(以 Linux amd64 为例)
wget https://github.com/Calcium-Ion/new-api/releases/latest/download/new-api-linux-amd64 -O new-api
chmod +x new-api

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/new-api.service > /dev/null <<EOF
[Unit]
Description=New API Service
After=network.target

[Service]
User=$USER
WorkingDirectory=$HOME/new-api
ExecStart=$HOME/new-api/new-api --port 3000 --log-dir $HOME/new-api/logs
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now new-api

方式 B:Docker Compose

services:
  new-api:
    image: calciumion/new-api:latest
    container_name: new-api
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./data:/data
      - ./logs:/app/logs
    environment:
      - TZ=Asia/Shanghai
docker compose up -d

首次登录

浏览器打开 http://127.0.0.1:3000,用默认账号登录:

  • 用户名:root
  • 密码:123456

立刻去「个人设置」修改用户名和密码,避免使用默认凭证。

在 new-api 中添加 CLIProxyAPI 渠道

进入 new-api 管理后台,点击左侧「渠道」→「添加渠道」。

字段 填写值 说明
类型 OpenAI new-api 用 OpenAI 兼容协议对接
名称 CLIProxyAPI-主 便于区分,自定义
代理 http://127.0.0.1:8317/v1 二进制部署填本地地址;Docker 同网络时用容器名 http://cliproxyapi:8317/v1
密钥 CLIProxyAPI 配置的 api-key 多个 key 换行分隔
模型 见下方 手动填写或导入

模型列表(按需勾选,与 CLIProxyAPI /v1/models 实际返回对齐):

claude-opus-4-8
claude-opus-4-7
claude-opus-4-6
claude-sonnet-4-6
claude-sonnet-4-5-20250929
claude-haiku-4-5-20251001
gemini-3.5-flash
gemini-3-flash
gemini-3.1-flash-lite
gemini-2.5-flash
gemini-2.5-flash-lite

模型映射(可选):如果你想给成员提供短别名,在「模型映射」里填(格式:来源名:实际模型):

claude-sonnet:claude-sonnet-4-6
claude-opus:claude-opus-4-8
claude-haiku:claude-haiku-4-5-20251001
gemini-flash:gemini-3.5-flash

填完后点「测试」,返回成功即可保存。

渠道健康检查

new-api 支持定时对渠道发测试请求,自动禁用不健康的渠道。在「渠道」列表页,找到刚添加的渠道,开启「自动禁用」开关,检测间隔建议设为 5 分钟。

flowchart LR Client["客户端"] --> NW["new-api :3000\n验证令牌 / 计费"] NW --> CPA["CLIProxyAPI :8317\nOAuth 轮询 / 路由"] CPA --> UP["上游订阅\nClaude / Gemini"]

在 new-api 中创建令牌

「令牌」是分发给团队成员的访问凭证,每个成员一个(或多个)。

进入「令牌」→「添加令牌」:

字段 建议配置
名称 工程师姓名或用途,如 alice-dev
额度 按 Token 计,例如 500000(50 万 Token/月)
过期时间 按需设置,团队内部可不过期
模型限制 可限制只能用特定模型,留空则继承渠道配置
IP 限制 办公网段,可选

创建后复制生成的 sk- 开头令牌,发给对应成员。成员拿到令牌后这样用:

# 配置环境变量(以 Cursor / 命令行脚本为例)
export OPENAI_API_BASE="http://your-server:3000/v1"
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxx"

# 直接调用
curl http://your-server:3000/v1/chat/completions \
  -H "Authorization: Bearer sk-xxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-6",
    "messages": [{"role": "user", "content": "你好"}]
  }'
flowchart LR M["成员\nsk- 令牌"] --> NW["new-api :3000\n验证 / 扣额度"] NW --> CPA["CLIProxyAPI :8317\nOAuth 账号轮询"] CPA --> CL["Claude Code\nOAuth 账号池"] CPA --> GM["Gemini CLI\nOAuth 账号池"]

使用量统计与限额配置

new-api 的「日志」页面记录每一次请求,字段包括:令牌名、模型、请求 Token、响应 Token、耗时、渠道。

查看某成员用量:在日志页面按令牌名过滤,导出 CSV 即可出账单。

设置全局限速:「设置 → 通用设置」里可以配置单用户 QPM(每分钟请求数)上限,防止个别成员占用过多资源。

余额预警:令牌剩余额度低于阈值时,new-api 会在管理后台标红,可结合 Webhook 通知到钉钉 / Slack。

# Webhook 通知示例(在 new-api 设置里填 Webhook URL)
# new-api 会 POST 以下格式的 JSON
{
  "type": "quota_warning",
  "token_name": "alice-dev",
  "remaining_quota": 10000,
  "timestamp": 1749135600
}

反向代理统一对外暴露

本地跑 new-api 只能内网访问,对外暴露需要一层反向代理并加 HTTPS。

Nginx 方案

server {
    listen 443 ssl http2;
    server_name api.example.com;

    ssl_certificate     /etc/ssl/api.example.com.crt;
    ssl_certificate_key /etc/ssl/api.example.com.key;

    # 安全头
    add_header Strict-Transport-Security "max-age=31536000" always;
    add_header X-Content-Type-Options nosniff always;

    location / {
        proxy_pass         http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;

        # 流式响应(SSE)必须关闭缓冲
        proxy_buffering    off;
        proxy_cache        off;
        proxy_read_timeout 300s;
    }
}

# HTTP 跳转 HTTPS
server {
    listen 80;
    server_name api.example.com;
    return 301 https://$host$request_uri;
}

Caddy 方案(自动 HTTPS,更简洁)

api.example.com {
    reverse_proxy 127.0.0.1:3000 {
        flush_interval -1   # 关闭缓冲,保证流式输出正常
        header_up X-Real-IP {remote_host}
    }
}

Caddy 会自动申请并续期 Let's Encrypt 证书,无需额外配置。

实际使用效果验证

部署完成后,用一个测试令牌验证整条链路:

# 1. 普通请求
curl https://airouter.k330.com/v1/chat/completions \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-6",
    "messages": [{"role": "user", "content": "用一句话介绍你自己"}],
    "max_tokens": 100
  }'

# 2. 流式请求
curl https://airouter.k330.com/v1/chat/completions \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  --no-buffer \
  -d '{
    "model": "claude-opus-4-8",
    "messages": [{"role": "user", "content": "数到10"}],
    "stream": true
  }'

正常情况下:

  • 普通请求 → new-api 日志出现一条记录,Token 消耗正确
  • 流式请求 → 逐字符输出,无长时间卡顿
  • 超额令牌 → new-api 返回 429 而非请求到 CLIProxyAPI

进阶:多个 CLIProxyAPI 实例作为渠道

当团队规模进一步扩大,或需要接入不同地区的订阅时,可以在 new-api 中添加多个渠道,每个渠道对应一套 CLIProxyAPI 实例。

场景示例

渠道名 CLIProxyAPI 地址 账号池 适用场景
CLIProxy-US http://us-proxy:8317/v1 美区 Claude Max × 3 低延迟美区用户
CLIProxy-HK http://hk-proxy:8317/v1 港区账号 × 2 亚太用户
CLIProxy-Gemini http://gemini-proxy:8317/v1 Google One 账号 × 3 Gemini 模型专用

new-api 渠道优先级与负载均衡

new-api 对同一模型有多个渠道时,支持以下策略(在渠道「权重」字段设置):

优先级模式:权重高的渠道优先;失败自动 fallback 到下一个
随机模式:按权重比例随机分配,实现负载均衡

配置示例:把 US 和 HK 两个渠道都加上 claude-sonnet-4-6 模型,US 权重设 70,HK 权重设 30,则 70% 的请求走美区,30% 走港区,任意一个挂了自动切换。

Docker Compose 多实例模板

services:
  new-api:
    image: calciumion/new-api:latest
    container_name: new-api
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - ./data:/data
    networks:
      - ai-gateway

  cliproxy-us:
    image: ghcr.io/cliproxyapi/cliproxyapi:latest
    container_name: cliproxy-us
    restart: unless-stopped
    volumes:
      - ./config-us:/app/config
    networks:
      - ai-gateway

  cliproxy-hk:
    image: ghcr.io/cliproxyapi/cliproxyapi:latest
    container_name: cliproxy-hk
    restart: unless-stopped
    volumes:
      - ./config-hk:/app/config
    networks:
      - ai-gateway

networks:
  ai-gateway:
    driver: bridge

两个 CLIProxyAPI 容器分别挂载不同的配置目录(不同账号池),在 new-api 里分别填写:

  • http://cliproxy-us:8317/v1
  • http://cliproxy-hk:8317/v1

注意事项

  1. 模型名一致:两个渠道如果都提供 claude-sonnet-4-6,new-api 才能做负载均衡;名字不一致会被视为不同模型。
  2. 健康检查:多渠道时强烈建议开启自动禁用,避免某个 CLIProxyAPI 实例的账号全部触发限流后请求仍然被路由过去。
  3. 日志区分:new-api 日志的「渠道」列会显示是哪个渠道响应的,方便排查问题。

系列导航

实操清单

  • new-api 二进制部署并运行(systemd 服务,:3000)
  • Caddy 反代已配置(https://airouter.k330.com → localhost:3000,flush_interval -1)
  • 管理员账号已修改(用户名 sdmike,非默认 root/123456)
  • CLIProxyAPI 渠道已添加(类型 OpenAI,代理 http://localhost:8317/v1
  • 渠道模型已配置(claude-opus-4-8 / 4-7 / 4-6、sonnet-4-6 / 4-5、haiku-4-5、gemini-3.5-flash 等 11 个)
  • 渠道测试通过(响应 1243ms)
  • DeepSeek 渠道已添加(deepseek-v4-flash / deepseek-v4-pro)
  • 访问令牌已创建(「不止词元claude」无限额度、default)
  • 成员账号已创建(pearl 普通用户)
  • 完整链路已验证(7 次请求成功,used_quota 有记录)
  • 为渠道开启自动禁用健康检测(auto_ban=1,CLIProxyAPI 和 deepseek 渠道均已启用)
  • 验证流式输出:curl https://airouter.k330.com/v1/chat/completions ... "stream": true 逐块返回 SSE,无缓冲
  • 在「日志」页确认每次请求的 Token 消耗记录正常(prompt/completion token 字段有值)