完善 function_call_output 续链校验与引用匹配 续链场景强制 store=true,过滤 input 时避免副作用 补充续链判断与过滤相关单元测试 测试: go test ./...
11 KiB
Sub2API
在线体验
体验地址:https://v2.pincc.ai/
演示账号(共享演示环境;自建部署不会自动创建该账号):
| 邮箱 | 密码 |
|---|---|
| admin@sub2api.com | admin123 |
项目概述
Sub2API 是一个 AI API 网关平台,用于分发和管理 AI 产品订阅(如 Claude Code $200/月)的 API 配额。用户通过平台生成的 API Key 调用上游 AI 服务,平台负责鉴权、计费、负载均衡和请求转发。
核心功能
- 多账号管理 - 支持多种上游账号类型(OAuth、API Key)
- API Key 分发 - 为用户生成和管理 API Key
- 精确计费 - Token 级别的用量追踪和成本计算
- 智能调度 - 智能账号选择,支持粘性会话
- 并发控制 - 用户级和账号级并发限制
- 速率限制 - 可配置的请求和 Token 速率限制
- 管理后台 - Web 界面进行监控和管理
技术栈
| 组件 | 技术 |
|---|---|
| 后端 | Go 1.25.5, Gin, Ent |
| 前端 | Vue 3.4+, Vite 5+, TailwindCSS |
| 数据库 | PostgreSQL 15+ |
| 缓存/队列 | Redis 7+ |
文档
- 依赖安全:
docs/dependency-security.md
OpenAI Responses 兼容注意事项
- 当请求包含
function_call_output时,需要携带previous_response_id,或在input中包含带call_id的tool_call/function_call,或带非空id且与function_call_output.call_id匹配的item_reference。 - 若依赖上游历史记录,网关会强制
store=true并需要复用previous_response_id,以避免出现 “No tool call found for function call output” 错误。
部署方式
方式一:脚本安装(推荐)
一键安装脚本,自动从 GitHub Releases 下载预编译的二进制文件。
前置条件
- Linux 服务器(amd64 或 arm64)
- PostgreSQL 15+(已安装并运行)
- Redis 7+(已安装并运行)
- Root 权限
安装步骤
curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash
脚本会自动:
- 检测系统架构
- 下载最新版本
- 安装二进制文件到
/opt/sub2api - 创建 systemd 服务
- 配置系统用户和权限
安装后配置
# 1. 启动服务
sudo systemctl start sub2api
# 2. 设置开机自启
sudo systemctl enable sub2api
# 3. 在浏览器中打开设置向导
# http://你的服务器IP:8080
设置向导将引导你完成:
- 数据库配置
- Redis 配置
- 管理员账号创建
升级
可以直接在 管理后台 左上角点击 检测更新 按钮进行在线升级。
网页升级功能支持:
- 自动检测新版本
- 一键下载并应用更新
- 支持回滚
常用命令
# 查看状态
sudo systemctl status sub2api
# 查看日志
sudo journalctl -u sub2api -f
# 重启服务
sudo systemctl restart sub2api
# 卸载
curl -sSL https://raw.githubusercontent.com/Wei-Shaw/sub2api/main/deploy/install.sh | sudo bash -s -- uninstall -y
方式二:Docker Compose
使用 Docker Compose 部署,包含 PostgreSQL 和 Redis 容器。
前置条件
- Docker 20.10+
- Docker Compose v2+
安装步骤
# 1. 克隆仓库
git clone https://github.com/Wei-Shaw/sub2api.git
cd sub2api
# 2. 进入 deploy 目录
cd deploy
# 3. 复制环境配置文件
cp .env.example .env
# 4. 编辑配置(设置密码等)
nano .env
.env 必须配置项:
# PostgreSQL 密码(必须修改!)
POSTGRES_PASSWORD=your_secure_password_here
# 可选:管理员账号
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=your_admin_password
# 可选:自定义端口
SERVER_PORT=8080
# 可选:安全配置
# 启用 URL 白名单验证(false 则跳过白名单检查,仅做基本格式校验)
SECURITY_URL_ALLOWLIST_ENABLED=false
# 关闭白名单时,是否允许 http:// URL(默认 false,只允许 https://)
# ⚠️ 警告:允许 HTTP 会暴露 API 密钥(明文传输)
# 仅建议在以下场景使用:
# - 开发/测试环境
# - 内部可信网络
# - 本地测试服务器(http://localhost)
# 生产环境:保持 false 或仅使用 HTTPS URL
SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=false
# 是否允许私有 IP 地址用于上游/定价/CRS(内网部署时使用)
SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS=false
# 5. 启动所有服务
docker-compose up -d
# 6. 查看状态
docker-compose ps
# 7. 查看日志
docker-compose logs -f sub2api
访问
在浏览器中打开 http://你的服务器IP:8080
升级
# 拉取最新镜像并重建容器
docker-compose pull
docker-compose up -d
常用命令
# 停止所有服务
docker-compose down
# 重启
docker-compose restart
# 查看所有日志
docker-compose logs -f
方式三:源码编译
从源码编译安装,适合开发或定制需求。
前置条件
- Go 1.21+
- Node.js 18+
- PostgreSQL 15+
- Redis 7+
编译步骤
# 1. 克隆仓库
git clone https://github.com/Wei-Shaw/sub2api.git
cd sub2api
# 2. 安装 pnpm(如果还没有安装)
npm install -g pnpm
# 3. 编译前端
cd frontend
pnpm install
pnpm run build
# 构建产物输出到 ../backend/internal/web/dist/
# 4. 编译后端(嵌入前端)
cd ../backend
go build -tags embed -o sub2api ./cmd/server
# 5. 创建配置文件
cp ../deploy/config.example.yaml ./config.yaml
# 6. 编辑配置
nano config.yaml
注意:
-tags embed参数会将前端嵌入到二进制文件中。不使用此参数编译的程序将不包含前端界面。
config.yaml 关键配置:
server:
host: "0.0.0.0"
port: 8080
mode: "release"
database:
host: "localhost"
port: 5432
user: "postgres"
password: "your_password"
dbname: "sub2api"
redis:
host: "localhost"
port: 6379
password: ""
jwt:
secret: "change-this-to-a-secure-random-string"
expire_hour: 24
default:
user_concurrency: 5
user_balance: 0
api_key_prefix: "sk-"
rate_multiplier: 1.0
config.yaml 还支持以下安全相关配置:
cors.allowed_origins配置 CORS 白名单security.url_allowlist配置上游/价格数据/CRS 主机白名单security.url_allowlist.enabled可关闭 URL 校验(慎用)security.url_allowlist.allow_insecure_http关闭校验时允许 HTTP URLsecurity.url_allowlist.allow_private_hosts允许私有/本地 IP 地址security.response_headers.enabled可启用可配置响应头过滤(关闭时使用默认白名单)security.csp配置 Content-Security-Policybilling.circuit_breaker计费异常时 fail-closedserver.trusted_proxies启用可信代理解析 X-Forwarded-Forturnstile.required在 release 模式强制启用 Turnstile
⚠️ 安全警告:HTTP URL 配置
当 security.url_allowlist.enabled=false 时,系统默认执行最小 URL 校验,拒绝 HTTP URL,仅允许 HTTPS。要允许 HTTP URL(例如用于开发或内网测试),必须显式设置:
security:
url_allowlist:
enabled: false # 禁用白名单检查
allow_insecure_http: true # 允许 HTTP URL(⚠️ 不安全)
或通过环境变量:
SECURITY_URL_ALLOWLIST_ENABLED=false
SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=true
允许 HTTP 的风险:
- API 密钥和数据以明文传输(可被截获)
- 易受中间人攻击 (MITM)
- 不适合生产环境
适用场景:
- ✅ 开发/测试环境的本地服务器(http://localhost)
- ✅ 内网可信端点
- ✅ 获取 HTTPS 前测试账号连通性
- ❌ 生产环境(仅使用 HTTPS)
未设置此项时的错误示例:
Invalid base URL: invalid url scheme: http
如关闭 URL 校验或响应头过滤,请加强网络层防护:
- 出站访问白名单限制上游域名/IP
- 阻断私网/回环/链路本地地址
- 强制仅允许 TLS 出站
- 在反向代理层移除敏感响应头
# 6. 运行应用
./sub2api
开发模式
# 后端(支持热重载)
cd backend
go run ./cmd/server
# 前端(支持热重载)
cd frontend
pnpm run dev
代码生成
修改 backend/ent/schema 后,需要重新生成 Ent + Wire:
cd backend
go generate ./ent
go generate ./cmd/server
简易模式
简易模式适合个人开发者或内部团队快速使用,不依赖完整 SaaS 功能。
- 启用方式:设置环境变量
RUN_MODE=simple - 功能差异:隐藏 SaaS 相关功能,跳过计费流程
- 安全注意事项:生产环境需同时设置
SIMPLE_MODE_CONFIRM=true才允许启动
Antigravity 使用说明
Sub2API 支持 Antigravity 账户,授权后可通过专用端点访问 Claude 和 Gemini 模型。
专用端点
| 端点 | 模型 |
|---|---|
/antigravity/v1/messages |
Claude 模型 |
/antigravity/v1beta/ |
Gemini 模型 |
Claude Code 配置示例
export ANTHROPIC_BASE_URL="http://localhost:8080/antigravity"
export ANTHROPIC_AUTH_TOKEN="sk-xxx"
混合调度模式
Antigravity 账户支持可选的混合调度功能。开启后,通用端点 /v1/messages 和 /v1beta/ 也会调度该账户。
⚠️ 注意:Anthropic Claude 和 Antigravity Claude 不能在同一上下文中混合使用,请通过分组功能做好隔离。
已知问题
在 Claude Code 中,无法自动退出Plan Mode。(正常使用原生Claude Api时,Plan 完成后,Claude Code会弹出弹出选项让用户同意或拒绝Plan。) 解决办法:shift + Tab,手动退出Plan mode,然后输入内容 告诉 Claude Code 同意或拒绝 Plan
项目结构
sub2api/
├── backend/ # Go 后端服务
│ ├── cmd/server/ # 应用入口
│ ├── internal/ # 内部模块
│ │ ├── config/ # 配置管理
│ │ ├── model/ # 数据模型
│ │ ├── service/ # 业务逻辑
│ │ ├── handler/ # HTTP 处理器
│ │ └── gateway/ # API 网关核心
│ └── resources/ # 静态资源
│
├── frontend/ # Vue 3 前端
│ └── src/
│ ├── api/ # API 调用
│ ├── stores/ # 状态管理
│ ├── views/ # 页面组件
│ └── components/ # 通用组件
│
└── deploy/ # 部署文件
├── docker-compose.yml # Docker Compose 配置
├── .env.example # Docker Compose 环境变量
├── config.example.yaml # 二进制部署完整配置文件
└── install.sh # 一键安装脚本
许可证
MIT License
如果觉得有用,请给个 Star 支持一下!