小鸣中转站 API 文档
多上游 OpenAI 兼容中转服务,聚合百炼(通义千问 + 万相绘图)、MiniMax、火山方舟(豆包),带 token 鉴权、限流、计费配额与完整管理后台。
Base URL:
https://aigcbox.com.cn/relay/v1 · 管理后台:https://aigcbox.com.cn/relay · 健康检查:GET /relay/healthz
快速开始
0. 拿一个 token
向管理员申请,或登录管理后台创建。token 形如 sk-xm-xxxx...
1. 列出可用模型
curl https://aigcbox.com.cn/relay/v1/models \
-H "Authorization: Bearer sk-xm-你的密钥"
2. 文本对话
curl https://aigcbox.com.cn/relay/v1/chat/completions \
-H "Authorization: Bearer sk-xm-你的密钥" \
-H "Content-Type: application/json" \
-d '{"model":"qwen-plus","messages":[{"role":"user","content":"你好"}]}'
3. 流式输出
curl https://aigcbox.com.cn/relay/v1/chat/completions \
-H "Authorization: Bearer sk-xm-你的密钥" \
-H "Content-Type: application/json" \
-d '{"model":"qwen-plus","stream":true,"messages":[{"role":"user","content":"写一首诗"}]}'
4. 图片生成
curl https://aigcbox.com.cn/relay/v1/images/generations \
-H "Authorization: Bearer sk-xm-你的密钥" \
-H "Content-Type: application/json" \
-d '{"model":"wanx2.1-t2i-turbo","prompt":"一只戴墨镜的柴犬","size":"1024x1024","n":1}'
图片生成是异步的,返回约需 3~120 秒(万相后台任务轮询)。
认证
用户端(调用 API)
Authorization: Bearer sk-xm-你的密钥
管理端(后台管理)
x-admin-token: 你的管理密钥
或通过 query 参数:?token=你的管理密钥。
可用模型
文本 / 对话
| 模型 | 上游 | 说明 |
|---|---|---|
qwen3-coder-plus | 百炼 | 通义千问 Coder,代码能力强 |
qwen-plus | 百炼 | 通义千问 Plus,性价比高 |
qwen-max | 百炼 | 通义千问 Max,最强 |
MiniMax-M2 | MiniMax | MiniMax M2 |
MiniMax-M1 | MiniMax | MiniMax M1 |
doubao-seed-1-6-250615 | 火山方舟 | 豆包 Seed 1.6 |
doubao-seed-1-6-flash-250615 | 火山方舟 | 豆包 Seed 1.6 Flash(快/便宜) |
图片
| 模型 | 上游 | 说明 |
|---|---|---|
wanx2.1-t2i-turbo | 百炼 | 万相文生图 Turbo |
wanx2.1-t2i-plus | 百炼 | 万相文生图 Plus |
API 参考
GET /relay/v1/models
列出可用模型。需 Bearer token。
{"object":"list","data":[
{"id":"qwen-plus","object":"model","created":0,"owned_by":"xiaoming-relay"},
{"id":"wanx2.1-t2i-turbo","object":"model","created":0,"owned_by":"xiaoming-relay-image"}
]}
GET /relay/healthz
健康检查,无需鉴权。
{"ok":true,"ts":"2026-09-07T22:46:14","uptime":"28.7s","models":7,"image_models":2}
POST /relay/v1/chat/completions
OpenAI 兼容的对话补全。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名 |
messages | array | 是 | 对话消息 |
stream | bool | 否 | 是否流式 |
temperature | number | 否 | 采样温度 |
max_tokens | number | 否 | 最大输出 token |
非流式响应:标准 OpenAI chat.completion 结构。流式响应:text/event-stream,标准 OpenAI SSE 格式。
POST /relay/v1/responses
Responses API(OpenAI 新协议),Codex CLI 0.147+ 专用。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名 |
input | string/array | 是 | 输入文本或消息列表 |
instructions | string | 否 | 系统指令 |
stream | bool | 否 | 流式 |
tools | array | 否 | 工具定义(function calling) |
temperature | number | 否 | 采样温度 |
max_output_tokens | number | 否 | 最大输出 |
中转内部把 Responses 请求翻译为
chat.completions 调上游,再翻译回 Responses 格式返回。store / previous_response_id 不支持。POST /relay/v1/images/generations
文生图(万相)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 否 | 默认 wanx2.1-t2i-turbo |
prompt | string | 是 | 图片描述,最长 800 字符 |
size | string | 否 | 默认 1024x1024 |
n | number | 否 | 生成张数,1~4,默认 1 |
{"created":1234567890,"data":[{"url":"https://...","revised_prompt":null}]}
管理后台
独立 Web 入口:https://aigcbox.com.cn/relay,登录后五个页面:概览 / Token 管理 / 用量统计 / 扣费流水 / API 文档。
管理 API(供脚本调用)
以下接口需 x-admin-token header。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /relay/admin/tokens | 列出所有 token |
| POST | /relay/admin/tokens | 创建 token |
| POST | /relay/admin/tokens/{id}/recharge | 充值 |
| POST | /relay/admin/tokens/{id}/update | 编辑 |
| POST | /relay/admin/tokens/{id}/toggle | 禁用/启用 |
| POST | /relay/admin/tokens/{id}/delete | 删除 |
| GET | /relay/admin/stats | 统计(tokens + 今日 + 7 天) |
| GET | /relay/admin/billing | 扣费流水 |
创建 token
curl -X POST https://aigcbox.com.cn/relay/admin/tokens \
-H "x-admin-token: 你的管理密钥" \
-H "Content-Type: application/json" \
-d '{"name":"my-token","note":"给 XX 项目用","grp":"default","rpm":60,
"billing":0,"balance":0,"quota_tokens":0,"expires_in_days":30}'
响应(完整 token 只返回这一次):
{"token":"sk-xm-...","name":"my-token","rpm":60,"billing":0,"balance":0,"quota_tokens":0}
| 字段 | 说明 |
|---|---|
name | 名称,必填,唯一标识 |
note | 备注 |
grp | 分组,默认 default |
rpm | 每分钟请求上限 |
billing | 0=免费,1=计费 |
balance | 余额(元) |
quota_tokens | token 总配额,0=不限 |
expires_in_days | 有效期(天),0=永久 |
计费与配额
定价(每 1K tokens,元)
| 模型 | 输入 | 输出 |
|---|---|---|
qwen3-coder-plus | 0.004 | 0.016 |
qwen-plus | 0.0008 | 0.002 |
qwen-max | 0.02 | 0.06 |
MiniMax-M2 | 0.002 | 0.008 |
MiniMax-M1 | 0.004 | 0.016 |
doubao-seed-1-6-250615 | 0.001 | 0.004 |
doubao-seed-1-6-flash-250615 | 0.0003 | 0.0012 |
图片(按张,元)
| 模型 | 单价 |
|---|---|
wanx2.1-t2i-turbo | 0.12 |
wanx2.1-t2i-plus | 0.20 |
规则
billing=0(免费):不扣费、不限余额。billing=1(计费):按上述价格扣余额;余额 ≤ 0 返回402;配额耗尽返回402。- 每次请求结束才计费(拿到真实 usage 后),流式/非流式一致。
- 限流:每 token 独立 RPM,超限返回
429。
错误码
| 状态码 | 含义 |
|---|---|
400 | 模型不支持 / JSON 无效 |
401 | token 无效 / 已撤销 / 已过期 |
402 | 余额不足 / 配额耗尽(计费 token) |
403 | 管理密钥无效 |
413 | 请求体过大(>256KB) |
422 | prompt 必填(图片) |
429 | 限流(超出 RPM) |
502 | 上游错误 |
504 | 图片生成超时 |
客户端接入
Codex CLI
base_url: https://aigcbox.com.cn/relay/v1
api_key: sk-xm-你的密钥
model: qwen3-coder-plus # 或 doubao-seed-1-6-250615
Codex 0.147+ 走 /v1/responses,中转已兼容该协议。
Python(OpenAI SDK)
from openai import OpenAI
client = OpenAI(
base_url="https://aigcbox.com.cn/relay/v1",
api_key="sk-xm-你的密钥",
)
resp = client.chat.completions.create(
model="qwen-plus",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
Node.js
const resp = await fetch("https://aigcbox.com.cn/relay/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer sk-xm-你的密钥",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "qwen-plus",
messages: [{ role: "user", content: "你好" }],
}),
});
WorkBuddy
base_url: https://aigcbox.com.cn/relay/v1
api_key: sk-xm-你的密钥
本地开发
cd xiaoming-relay
pip install -r requirements.txt
RELAY_SKIP_DB=1 RELAY_ADMIN_TOKEN=local-admin RELAY_PORT=8892 python server.py
访问:http://127.0.0.1:8892/relay
环境变量
| 变量 | 说明 |
|---|---|
RELAY_DB_HOST/PORT/USER/PASSWORD/NAME | 数据库连接 |
RELAY_BAILIAN_KEY | 百炼密钥 |
RELAY_MINIMAX_KEY | MiniMax 密钥 |
RELAY_ARK_KEY | 火山方舟密钥 |
RELAY_ADMIN_TOKEN | 管理密钥 |
RELAY_ALERT_WEBHOOK | 告警 webhook(可选) |
RELAY_LOW_BALANCE | 余额告警阈值(默认 5 元) |
RELAY_SKIP_DB | 1=内存模式(本地开发) |
RELAY_PORT | 端口(默认 8892) |
生产部署
/home/ubuntu/relay/
├── server.py # 中转站主程序
├── relay_secrets.py # 独立密钥(gitignore)
├── webroot/relay.html # 独立管理入口
├── webroot/relay-docs.html # 本文档页
├── ecosystem.config.js # pm2 配置
└── requirements.txt
# pm2 启动
pm2 start ecosystem.config.js
pm2 save
# nginx 反代(/relay/ → 127.0.0.1:8892/relay/)
location /relay/ {
proxy_pass http://127.0.0.1:8892/relay/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
proxy_read_timeout 300s;
proxy_buffering off;
}
启动时自动执行数据库迁移(幂等):新建缺失的表和字段,不删数据。
数据库结构
relay_tokens
| 字段 | 类型 | 说明 |
|---|---|---|
id | int PK | 自增主键 |
token_hash | varchar(64) UNIQUE | SHA-256(token),不存明文 |
name | varchar(64) | 名称 |
note | varchar(255) | 备注 |
grp | varchar(32) | 分组 |
rpm | int | 每分钟限流 |
balance | decimal(12,4) | 余额(元) |
billing | tinyint | 0=免费,1=计费 |
quota_tokens | bigint | token 总配额,0=不限 |
used_tokens | bigint | 已用 tokens |
disabled | tinyint | 0=启用,1=禁用 |
expires_at | datetime | 过期时间,NULL=永久 |
created_at | datetime | 创建时间 |
relay_logs
| 字段 | 类型 | 说明 |
|---|---|---|
id | bigint PK | 自增主键 |
ts | datetime | 时间 |
token_name | varchar(64) | 所属 token |
model | varchar(64) | 模型 |
prompt_tokens | int | 输入 tokens |
completion_tokens | int | 输出 tokens |
cost | decimal(12,6) | 本次费用(元) |
ip | varchar(64) | 来源 IP |
安全说明
- 上游真实密钥(百炼 / MiniMax / 火山方舟)只在服务器
relay_secrets.py,绝不通过中转下发。 - 用户拿到的只是
sk-xm-前缀的鉴权 token(数据库只存哈希)。 relay_secrets.py已加入.gitignore,切勿提交到任何仓库。- 建议定期轮换管理密钥
ADMIN_TOKEN。