概览
{{NAME}} 是一个组织内部的 API 中转与分发平台。你无需直连各家大模型厂商,只要把请求发到本平台,平台会完成鉴权、限流、配额校验与转发,并统一记录用量与日志。
base_url 改成 {{BASE}}/v1,把 api_key 改成平台下发的 sk-hub-... 即可,其余调用方式与 OpenAI 完全一致。
| 项目 | 值 |
|---|---|
| 接口地址(Base URL) | {{BASE}}/v1 |
| 鉴权方式 | Authorization: Bearer sk-hub-... |
| 协议 | HTTP/HTTPS,兼容 OpenAI Chat Completions |
| 管理面板 | {{DASHBOARD}} |
POST /v1/chat/completions;若你的平台配置了其它路径(如 /v1/embeddings),替换路径即可。
快速开始
三步即可完成第一次调用:
1. 获取 API Key
登录管理面板 {{DASHBOARD}},进入「API Key」页面创建。创建后密钥 仅展示一次,请立即保存。
2. 配置客户端
把 Base URL 指向 {{BASE}}/v1,密钥填入你的 sk-hub-...。任何兼容 OpenAI 的 SDK / 工具都可直接使用。
3. 发起请求
curl {{BASE}}/v1/chat/completions \
-H "Authorization: Bearer sk-hub-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "你好"}]
}'
接入信息
| 项 | 说明 |
|---|---|
| Base URL | {{BASE}}/v1 |
| 完整示例 | POST {{BASE}}/v1/chat/completions |
| 请求头 | Authorization: Bearer <API Key> |
| 备用请求头 | x-api-key: <API Key> |
| Content-Type | application/json |
sk-hub- 开头(区别于任意第三方厂商的密钥)。请在请求中只使用平台下发的密钥,不要使用厂商原始密钥。
认证方式
平台支持两种等价的鉴权头,任选其一即可:
方式一:标准 Bearer(推荐)
Authorization: Bearer sk-hub-xxxxxxxxxxxxxxxx
方式二:x-api-key 头
x-api-key: sk-hub-xxxxxxxxxxxxxxxx
调用示例
cURL
curl {{BASE}}/v1/chat/completions \
-H "Authorization: Bearer sk-hub-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{"role": "system", "content": "你是一个乐于助人的助手"},
{"role": "user", "content": "用一句话介绍你自己"}
],
"temperature": 0.7
}'
Python(OpenAI 官方 SDK)
from openai import OpenAI
client = OpenAI(
base_url="{{BASE}}/v1",
api_key="sk-hub-你的密钥",
)
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
Node.js
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "{{BASE}}/v1",
apiKey: "sk-hub-你的密钥",
});
const resp = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "你好" }],
});
console.log(resp.choices[0].message.content);
流式(Python)
from openai import OpenAI
client = OpenAI(base_url="{{BASE}}/v1", api_key="sk-hub-你的密钥")
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "写一首短诗"}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
请求参数
请求体与 OpenAI Chat Completions 保持一致,平台原样透传给你的上游供应商。常用字段:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 模型名。平台会按此字段匹配「模型路由」(见下节),未命中时透传给上游。 |
| messages | array | 是 | 对话消息列表,元素含 role 与 content。 |
| stream | boolean | 否 | 为 true 时以 SSE 流式返回。 |
| temperature | number | 否 | 采样温度,透传上游。 |
| max_tokens | integer | 否 | 回复最大 token 数,透传上游。 |
stream_options.include_usage=true 以获取真实用量;你的客户端无需额外设置。
流式响应
当请求体包含 "stream": true 时,平台以 text/event-stream 返回 SSE,逐块透传上游内容:
data: {"id":"chatcmpl-...","choices":[{"delta":{"content":"你"}}]}
data: {"id":"chatcmpl-...","choices":[{"delta":{"content":"好"}}]}
data: [DONE]
proxy_buffering off;),否则流式输出会被攒批,失去逐字效果。
模型路由
平台支持管理员配置「模型路由」:把某个请求模型名转发到指定供应商的指定模型。你只需按平台约定的模型名调用,实际由哪个供应商处理由管理员配置决定。
gpt-4o → 由 DeepSeek 供应商的 deepseek-chat 处理。此时你仍按如下方式调用:
{ "model": "gpt-4o", "messages": [{"role": "user", "content": "你好"}] }
平台会自动改写为上游模型名并转发,你的代码无需任何改动。若模型名未被任何路由命中,则按默认路由规则透传给对应供应商。
model 匹配本组织的模型路由;
若未命中本组织的模型路由,则使用本组织内最早创建且启用中的供应商(组织默认供应商),此时不会改写模型名。
本组织没有任何可用供应商时返回 40300。超级管理员不受此限制,可使用全部供应商(含全局)。
配置字段填写指南(管理员)
本节说明管理面板中「供应商」「路由配置」「模型路由」三个表单里每个输入框应该填什么。普通调用方无需关心,由管理员配置一次即可。
model 匹配 模型路由 → 最后按调用方身份做组织归属校验:
超级管理员可使用任意供应商;组织用户只能使用 organization 与本组织一致的供应商,否则回退到本组织默认供应商,本组织无可用供应商时报 40300。
最终访问的地址 = 供应商 Base URL + 上游路径(直接拼接)。
一、供应商(「供应商」页)
代表一家上游厂商的连接信息,是整个平台转发的基础。
| 输入框 | 字段 | 必填 | 填写说明 |
|---|---|---|---|
| 标识 | provider_name | 是(仅新增时) | 唯一英文标识,小写字母 / 数字 / 下划线,如 xiaomi_mimo。创建后不可修改。 |
| 显示名称 | display_name | 是 | 界面上展示的名字,如 小米 MiMo,可随意填写。 |
| Base URL | base_url | 是 | 上游接口前缀,只写到版本号为止(如 https://api.deepseek.com/v1),不要带 /chat/completions 这类具体接口路径,结尾不要加 /。 |
| 上游 API Key | api_key | 新增必填;编辑留空=不改 | 厂商控制台申请的原始密钥。不要带 Bearer 前缀,不要有空格或换行(平台转发时会自动加 Bearer)。 |
| 状态 | status | 编辑时 | 启用 可被转发;禁用 后该供应商不会被选中。 |
| 限速 RPM | rate_limit_rpm | 否(0 = 不限) | 该供应商每分钟最大请求数,由代理层实时生效。 |
| 限速 TPM | rate_limit_tpm | 否(0 = 不限) | 该供应商每分钟最大 token 数。 |
| 可用模型 | models | 否 | 逗号分隔的模型名清单,如 mimo-v2.6-pro,mimo-v2.6-flash。仅用于展示与「模型路由」下拉候选,不参与路由匹配。 |
| 备注 | notes | 否 | 自定义说明。 |
| 归属组织 | organization | 否 | 供应商归属的组织;留空表示全局(不限组织)。已归属某组织的用户只能使用归属本组织的供应商,因此为某组织配置供应商时必须填该组织名。 |
按量计费 / Token Plan。选择后会自动切换该套餐对应的 Base URL 并写入限速。注意部分厂商两套地址不同——例如小米 MiMo:按量计费为 https://api.xiaomimimo.com/v1,Token Plan 为 https://token-plan-cn.xiaomimimo.com/v1,密钥必须与所选套餐匹配,否则上游会返回 401。
二、路由配置(「路由模型」页)
把「对外平台路径」映射到「某供应商的某个上游路径」。
| 输入框 | 字段 | 必填 | 填写说明 |
|---|---|---|---|
| 平台路径 | route_path | 是 | 对外暴露的路径,如 /v1/chat/completions;支持结尾通配 /v1/chat/*。同一平台路径全局唯一——它代表该路径的「默认去向」。 |
| 供应商 | provider_id | 是 | 该路径的默认供应商。未命中任何「模型路由」的请求都走这里。组织用户例外:会按组织隔离规则改用本组织的供应商。 |
| 上游路径 | upstream_path | 是 | 拼在供应商 Base URL 之后的真实接口路径,如 /chat/completions。配了通配路由时,这里要写成同样带 /* 的形式。 |
| 方法 | method | 是 | GET / POST / PUT / DELETE / PATCH / *(不限)。Chat Completions 用 POST。 |
| 模型名 | model_name | 否 | 仅供日志与统计展示使用,不会改写请求里的 model。要做模型改写请用「模型路由」。 |
| 单价 | cost_per_1k_tokens | 否 | 每千 token 单价(元),用于成本统计。 |
| 标签 | tags | 否 | 逗号分隔,仅用于分类筛选。 |
| 启用 | enabled | 是 | 禁用后该路由不参与匹配,请求会返回 40400。 |
gpt-4o 走 OpenAI、mimo-* 走小米),不要新建同路径的路由:先在此处配好一条默认路由,再到「供应商 → 模型路由配置」按模型名添加映射。
三、模型路由(「供应商」页底部「模型路由配置」)
把「请求模型名」覆盖路由到另一家供应商,并改写为上游支持的模型名。
| 输入框 | 字段 | 必填 | 填写说明 |
|---|---|---|---|
| 请求模型 | source_model | 是 | 用户请求体里 model 的值,如 gpt-4o;支持结尾 * 通配,如 gpt-*、mimo-*。 |
| 目标供应商 | provider_id | 是 | 命中后实际转发到的供应商(须已启用)。 |
| 目标模型 | target_model | 是 | 转发给上游时改写成的模型名,必须是目标供应商真实支持的模型,如 deepseek-chat、mimo-v2.6-flash。 |
| 状态 | enabled | 编辑时 | 禁用后该映射不生效,请求回落到默认路由。 |
| 备注 | notes | 否 | 自定义说明,如「临时降级用」。 |
| 归属组织 | organization | 否 | 该模型路由归属的组织;留空表示全局。组织用户只会命中本组织的模型路由(全局模型路由对其不生效),且目标供应商也须同属本组织并启用。 |
gpt-4o 优先于 gpt-*);② 同为通配时前缀更长者优先;
③ 同一模型同时存在「本组织」与「全局」映射时,本组织的优先。普通管理员只能看到并维护本组织的供应商与模型路由。
组织隔离:非超管调用方只会命中「本组织 + 目标供应商同属本组织且启用」的模型路由;未命中则用本组织默认供应商,本组织无可用供应商时报
40300。
完整示例:接入小米 MiMo,并让 mimo-* 走它
| 步骤 | 位置 | 填写值 |
|---|---|---|
| 1 | 供应商 | 标识 xiaomi_mimo;Base URL https://token-plan-cn.xiaomimimo.com/v1(Token Plan)或 https://api.xiaomimimo.com/v1(按量计费);上游 API Key 填小米密钥;可用模型 mimo-v2.6-pro,mimo-v2.6-flash |
| 2 | 路由配置 | 平台路径 /v1/chat/completions;供应商 小米 MiMo;上游路径 /chat/completions;方法 POST |
| 3 | 模型路由 | 请求模型 mimo-*;目标供应商 小米 MiMo;目标模型 mimo-v2.6-flash |
配好后,调用方使用 model: "mimo-v2.6-pro" 或 "mimo-v2.6-flash" 均会被路由到小米 MiMo,最终地址为 https://token-plan-cn.xiaomimimo.com/v1/chat/completions。
遵理)。只填供应商、不填模型路由时,该组织的用户仍能使用该供应商(走本组织默认供应商兜底),但不会触发模型名改写。
错误码
失败时返回 JSON,结构与 OpenAI 兼容:
{
"error": {
"code": 40100,
"message": "API Key 无效"
}
}
| code | HTTP | 含义 | 处理建议 |
|---|---|---|---|
| 40000 | 400 | 请求参数错误 | 检查请求体格式与必填字段 |
| 40100 | 401 | 未认证 / Key 无效、被禁用或过期 | 确认使用 sk-hub- 密钥且未过期 |
| 40300 | 403 | 无权限访问 / 本组织暂无可用的上游供应商 | 联系管理员开通权限,或为本组织配置启用中的供应商 |
| 40400 | 404 | 没有匹配的路由规则 | 核对请求路径是否已在平台配置 |
| 40900 | 409 | 资源冲突 | 更换唯一标识后重试 |
| 42900 | 429 | 触发限流 | 按响应头 Retry-After 退避重试 |
| 50000 | 500 | 平台内部错误 | 稍后重试,持续失败请联系管理员 |
| 50200 | 502 | 上游供应商不可用 | 稍后重试 |
| 50400 | 504 | 上游请求超时 | 稍后重试或缩短请求内容 |
限流与配额
平台有两层限制,均由管理员配置:
| 类型 | 维度 | 超限返回 |
|---|---|---|
| 速率限制(RPM) | 按 API Key、按供应商 | 42900,响应含 Retry-After |
| 用量配额 | 按月 Token / 请求数 | 业务错误提示(配额不足) |
Retry-After 秒数后重试,并配合指数退避,避免持续打满限流。
常见问题
Q:能用任何 OpenAI SDK 吗?
可以。只要支持自定义 base_url 与 api_key 即可,本平台保持 OpenAI 兼容。
Q:为什么会返回 40400「没有匹配的路由规则」?
说明请求路径未被平台定义为路由。请确认路径(如 /v1/chat/completions)已在管理面板「路由模型」页中配置,或联系管理员添加。
Q:管理员新增路由时提示「该平台路径已存在」,但我想让同一路径走不同厂商?
这是设计使然:同一平台路径只能有一条路由(它是该路径的默认去向)。要让同一路径下不同模型走不同供应商,请保留这条默认路由,改在「供应商 → 模型路由配置」中按模型名添加映射(见 配置字段填写指南)。
Q:为什么会返回 40300「本组织暂无可用的上游供应商」?
平台按组织隔离路由,组织用户只会使用本组织的供应商。出现该提示说明本组织尚未配置启用中的供应商(或供应商的「归属组织」与本组织不一致)。请联系管理员在本组织下新增并启用供应商;超级管理员不受此限制。
Q:为什么我的请求没有走我组织配置的供应商?
请检查两点:① 该供应商的 organization 是否与你所在组织一致且处于启用状态;② 若你要按模型名改写并指定供应商,对应「模型路由」的归属组织也须是本组织(全局模型路由对组织用户不生效)。本组织内存在多个可用供应商时,未命中模型路由的请求会走最早创建且启用中的那个。
Q:模型名应该填什么?
填写平台约定或管理员告知的模型名即可。若配置了模型路由,平台会自动改写到你实际使用的那家模型。
Q:密钥只显示一次,忘了怎么办?
出于安全考虑,平台不保存明文密钥。请在管理面板重新创建一个,并禁用旧的。
Q:如何查看我的用量?
登录管理面板,在「用量统计」与「请求日志」中查看调用明细与 token 消耗。
域名适配与扩展
本页为可移植文档:当平台部署到新域名时,只需修改页面顶部的一处配置即可全量替换。
修改方式
用文本编辑器打开本文件,找到顶部的 SITE 配置块:
const SITE = {
base: "https://ai.muvocal.com", // 网关对外域名(含协议,不要以 / 结尾)
name: "API Gateway Hub", // 平台名称
dashboard: "https://ai.muvocal.com" // 管理面板地址
};
把 base 改为新域名(例如 https://api.example.com)后保存,页面内所有示例(Base URL、cURL、SDK 代码)会自动同步更新。
SITE.base 不同),或由后端在返回页面时按请求 Host 动态替换。
当前文档默认域名为 {{BASE}}。