开发者文档
快速开始
Plenum Cloud 提供 OpenAI 兼容接口。已有 OpenAI SDK 的项目只需改 base_url 和 API Key 两行即可迁移。
1. 注册账户并在控制台「API Keys」创建密钥(明文仅显示一次)。2. 把 base_url 指向 Plenum。3. 照常调用。
接口
| 端点 | 说明 |
|---|---|
POST /v1/chat/completions | 对话补全,支持 stream。请求与响应结构与 OpenAI 一致;流式响应为 SSE,最后一个数据块携带 usage。 |
GET /v1/models | 当前可路由的模型列表。 |
image_url | 图片输入。仍然调 /v1/chat/completions,把消息的 content 写成数组:{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,…"}} 加 {"type":"text","text":"…"}。图片由模型折成输入 token,按输入价计费,没有单独的图片价;单次请求体不超过 8MB。能看图的模型:qwen3.8-max、qwen3.7-plus、qwen3.8-flash、kimi-k2.6、kimi-k2.7-code、deepseek-flash。其它模型不会报错,但看不到图片。 |
enable_search: true | 联网搜索(通义千问 qwen3.8-max / qwen3.7-plus / qwen3.8-flash)。仍然调 /v1/chat/completions,请求体加 enable_search: true:需要实时信息时模型自己联网搜索,不需要时不搜;加 search_options: {forced_search: true} 则每次强制搜索。计费 = token 费(搜到的网页内容计入输入 token)+ 实际搜索次数 × 搜索费;usage.x_tools.search.count 是本次的搜索次数,日志里同步显示。搜索策略固定为 turbo,search_options 的其它字段会被忽略;其它模型带这个参数会被忽略。兼容接口不返回来源链接。 |
POST /v1/images/generations | 文生图。请求体同 OpenAI:model、prompt、n(≤4)、size、response_format(url | b64_json);响应 data[] 里是 url 或 b64_json。按张计费的模型(通义 qwen-image)每张一个价,不区分尺寸档;OpenAI 的 gpt-image 系列按其回报的 token 计费。只支持文生图,不接受参考图。 |
POST /v1/images/edits | 图改图。请求同 OpenAI:multipart/form-data,字段 image(或 image[],1–3 张参考图,单张 ≤7MB,合计 ≤8MB)、prompt、model、可选 n(≤4)、size、response_format。响应同文生图,usage 里多一个 input_images。通义 qwen-image-3.0:参考图按张另计(大陆站 ¥0.022 / 张,海外站 $0.004 / 张)+ 出图按张;OpenAI gpt-image-2:参考图折成输入 token 计费。不支持 mask。 |
POST /v1/audio/transcriptions | 语音识别(语音转文字)。请求同 OpenAI:multipart/form-data,字段 file(音频文件,文件名需带扩展名:wav、mp3、m4a、webm、ogg 等,≤7MB、≤5 分钟)、model(qwen3-asr-flash)、可选 language(如 zh、en;不确定或中英混说时不要传)、可选 response_format(json | text)。响应 {text, usage},usage.seconds 是计费秒数。按音频时长计费,不足 1 秒按 1 秒。 |
GET /healthz | 公开健康检查,返回 ok。状态页据此探测。 |
鉴权
所有 /v1 请求使用 Authorization: Bearer <API Key>。密钥以 pln- 开头,吊销即时生效。
流式响应
设置 stream: true 即可。网关会自动注入 stream_options.include_usage,确保最后一个 SSE 块带有 usage——这是计量的依据,无需你手动设置。
计量与 usage 字段
每次请求按四类 token 分别计量、分别计价。它们出现在响应的 usage 对象里:
| 字段 | 含义 |
|---|---|
usage.prompt_tokens | 输入 token 总数(含缓存命中部分) |
usage.prompt_tokens_details.cached_tokens | 其中命中前缀缓存的输入 token,按显著更低的单价计费 |
usage.completion_tokens | 输出 token |
usage.completion_tokens_details.reasoning_tokens | 推理模型的思维链 token(若模型返回) |
控制台「用量」与「账单」按同一口径展示,并可按模型、按密钥下钻;账单以平台计量为准。
前缀缓存
命中前缀缓存的输入 token 边际成本远低于未命中,我们把这部分让利体现在单价里。Agent 场景(长系统提示词、工具定义、多轮历史)天然高命中,前提是前缀字节级稳定:
| 做法 | 原因 |
|---|---|
| 系统提示词与工具定义放在 messages 最前面,且内容固定 | 缓存按前缀匹配,任何前置变动都会让后续全部失效 |
| 动态内容(时间戳、用户名、检索结果)放到对话末尾 | 保住公共前缀 |
| 多轮对话追加消息而不是重写历史 | 前几轮的 KV 可直接复用 |
命中率可在控制台按密钥观测。
限流与配额
每把 API Key 有独立的每分钟请求上限(令牌桶,允许短突发)和可选的月度 token 配额。超限返回 429,body 中 error.code 区分原因;建议客户端按指数退避重试。专属端点的限额以合同为准。
错误码
错误响应为 OpenAI 风格:{ "error": { "code", "message" } }。
| HTTP | code | 说明 |
|---|---|---|
| 400 | bad_request | 请求体不是合法 JSON 或缺少必要字段 |
| 401 | invalid_api_key | 密钥无效或已吊销 |
| 429 | rate_limit_exceeded | 超过每分钟请求上限,稍后重试 |
| 429 | insufficient_quota | 本月 token 配额已用完 |
| 502 | upstream_error | 所有候选上游均不可用(已自动重试与故障转移后) |
| 502 | dedicated_unavailable | 专属端点绑定的节点不可用;专属流量不会回退到公共池 |
4xx 错误不会重试;连接失败、5xx 与上游 429 会在候选上游间自动转移。
专属端点
专属端点是独占的推理容量:你的请求只路由到为你绑定的节点,不与其他客户共享,也不受公共池限流影响;按「容量 × 时间」计费,与实际 token 用量无关。
| 步骤 | 说明 |
|---|---|
| 1 | 控制台「专属实例」提交申请:模型、GPU 类型、数量 |
| 2 | 运营团队评估并绑定节点、确认机时报价;申请状态从 pending 变为 running,计费开始 |
| 3 | 之后你用同一把 API Key 调用该模型,请求自动固定到专属节点 |
| 4 | 在控制台释放实例即停止计费;账单按月切片显示专属容量费用 |
算力接入
有闲置 GPU 的团队可以把集群挂到平台出租。要求:节点提供 OpenAI 兼容的流式 chat completions 端点(vLLM / SGLang 等均可),可从公网或专线访问。
| 步骤 | 说明 |
|---|---|
| 1 | 控制台「算力接入」登记节点:名称、端点地址、访问凭据、可跑模型、机时报价 |
| 2 | 平台以真实推理请求周期性探测节点(不是 /healthz),记录首字延迟、吞吐与失败率 |
| 3 | 人工审核通过后节点进入调度;流量按实测表现分配,连续失败会被暂时摘除 |
| 4 | 每次经你节点处理的请求逐条计量,控制台可见请求数与 token 数;按月结算 |
控制台 API
控制台使用的管理接口位于 /admin/v1,以登录会话 token 鉴权(Authorization: Bearer <session>),与 API Key 分离。可用于自动化查询用量与账单:
| 端点 | 说明 |
|---|---|
POST /admin/v1/auth/login | 邮箱 + 密码换取会话 token(有效 7 天;修改密码会吊销其他设备的会话) |
GET /admin/v1/me | 当前账户状态(pending / active / rejected)、邮箱是否已验证、额度与余额。账户须为 active 且邮箱已验证才能使用其余接口;调用模型需余额大于 0 |
GET /admin/v1/keys · POST · DELETE /{id} | 密钥列表 / 创建 / 吊销 |
GET /admin/v1/usage · /usage/series | 用量汇总与时间序列(按模型、按密钥) |
GET /admin/v1/billing | 账单:按量项目 + 专属容量月切片 |
GET /admin/v1/logs | 请求日志(仅本账户密钥) |
GET /admin/v1/nodes · /instances | 算力节点与专属实例 |
POST /admin/v1/auth/verify · /auth/verify/resend | 邮箱验证:消费邮件里的一次性链接;重新发送验证邮件(60 秒冷却) |
GET · POST /admin/v1/topups | 充值订单:微信扫码(支付成功即时入账)或对公转账(财务确认后入账) |
GET /admin/v1/earnings · POST /admin/v1/payouts | 供应商收益(按节点×月)与提现申请 |
POST /admin/v1/chat?key=<id> | 控制台「对话」使用:以你名下的一把 API Key 计量,请求体与 /v1/chat/completions 相同。key 参数可省:省略时计量到最早创建、仍有效的那把(新账户自带一把名为 default 的 Key) |
POST /admin/v1/audio?key=<id> | 同上,语音识别;请求体与 /v1/audio/transcriptions 相同。Playground 的语音输入走这里 |
POST /admin/v1/images?key=<id> | 同上,文生图;请求体与 /v1/images/generations 相同 |
POST /admin/v1/images/edits?key=<id> | 同上,图改图;请求体与 /v1/images/edits 相同 |