NEW API COMPATIBLE GATEWAY
二豆 API 接入文档
面向开发者的公开接口说明。文本模型遵循常见的 OpenAI 兼容协议,图片模型使用本站异步任务协议。可用模型、权限和价格以账户当前配置为准。
https://api.erdou.xyz/v1
认证与地址
所有公开模型请求都必须携带本站令牌。令牌可在控制台的令牌管理页面创建,请只在服务端保存和使用。
https://api.erdou.xyz/v1Authorization: Bearer请求头
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
YOUR_API_KEY 必须由运行环境变量替换。
获取可用模型
模型目录会随账户分组和渠道状态变化。不要长期硬编码从其他账户复制的模型列表,调用前应以当前令牌返回的结果为准。
/v1/models需要 Bearer 令牌curl https://api.erdou.xyz/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
{
"object": "list",
"data": [
{
"id": "YOUR_MODEL_ID",
"object": "model",
"owned_by": "system"
}
]
}
模型名称必须完全匹配返回的 id,包括大小写、连字符和后缀。模型可见不代表所有接口都适用,例如生图模型不能发送到聊天接口。
快速开始
先用最小非流式请求验证地址、令牌、模型和分组。成功后再加入流式输出、工具调用或业务重试。
cURL
curl https://api.erdou.xyz/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "YOUR_CHAT_MODEL",
"messages": [
{"role": "user", "content": "你好,请只回复:连接成功"}
]
}'
Python SDK
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ERDOU_API_KEY"],
base_url="https://api.erdou.xyz/v1",
)
response = client.chat.completions.create(
model="YOUR_CHAT_MODEL",
messages=[{"role": "user", "content": "你好,请只回复:连接成功"}],
)
print(response.choices[0].message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.ERDOU_API_KEY,
baseURL: "https://api.erdou.xyz/v1",
});
const response = await client.chat.completions.create({
model: "YOUR_CHAT_MODEL",
messages: [{ role: "user", content: "你好,请只回复:连接成功" }],
});
console.log(response.choices[0].message.content);
Chat Completions
适用于常规对话、结构化提示词及支持该能力的工具调用模型。
/v1/chat/completionsOpenAI 兼容| 字段 | 类型 | 要求 | 说明 |
|---|---|---|---|
model | string | 必填 | 使用 /v1/models 返回的聊天模型 ID。 |
messages | array | 必填 | 消息数组,常用角色为 system、user、assistant。 |
stream | boolean | 可选 | 设为 true 时返回 SSE 数据流。 |
temperature | number | 可选 | 是否支持及取值范围由模型决定。 |
max_tokens | integer | 可选 | 限制最大输出量。不要传入异常大的数值。 |
tools | array | 可选 | 仅在目标模型支持工具调用时使用。 |
{
"model": "YOUR_CHAT_MODEL",
"messages": [
{"role": "system", "content": "你是一个简洁的中文助手。"},
{"role": "user", "content": "用三点说明 HTTPS 的作用。"}
],
"stream": false
}
Responses
面向支持 Responses 协议的模型。使用 input 提交输入;是否支持工具、图片输入和推理参数仍取决于具体模型。
/v1/responsesResponses 兼容curl https://api.erdou.xyz/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "YOUR_RESPONSES_MODEL",
"input": "解释幂等请求的作用"
}'
如果目标模型只支持 Chat Completions,请改用 /v1/chat/completions。接口协议不能只靠模型名称猜测。
流式输出
在请求中加入 "stream": true。客户端应逐行消费 SSE 事件,直到收到结束标记或连接关闭。
curl -N https://api.erdou.xyz/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "YOUR_CHAT_MODEL",
"messages": [{"role": "user", "content": "写一句欢迎语"}],
"stream": true
}'
其他兼容接口
以下路由由网关提供,但实际可用性取决于当前令牌下是否存在支持对应能力的模型。
| 方法 | 路径 | 用途 | 注意 |
|---|---|---|---|
| POST | /v1/embeddings | 向量嵌入 | 需要嵌入模型。 |
| POST | /v1/audio/transcriptions | 语音转写 | 通常使用 multipart 文件上传。 |
| POST | /v1/audio/translations | 语音翻译 | 需要支持的音频模型。 |
| POST | /v1/audio/speech | 文本转语音 | 响应通常是音频二进制。 |
| POST | /v1/rerank | 文档重排序 | 请求格式取决于模型兼容协议。 |
| POST | /v1/messages | Messages 兼容接口 | 仅用于支持该协议的模型。 |
未在当前账户模型列表中展示相应能力时,不要仅凭路由存在就认为可以调用。
异步生图概览
本站生图模型采用异步任务:提交后立即返回任务 ID,生成、归档和结算在后台完成。客户端必须查询任务状态,不能期待提交接口直接返回图片。
/pg/chat/completions,图片渠道只接收 /v1/images/generations。在聊天游乐场选择生图模型会得到“无可用渠道”,这不代表模型 Key 失效。
- 选择公开模型 ID使用当前令牌请求
/v1/models,选择图片模型。 - 提交生成任务调用
POST /v1/images/generations,保存返回的task_id。 - 轮询任务状态每 3 至 5 秒调用一次任务查询接口;查询 GET 可以重试。
- 读取归档结果状态为
completed后使用响应里的本站结果 URL 下载图片。
pending任务已接收,等待上游处理。
processing正在生成、下载或归档。
completed任务完成,可读取结果。
failed任务失败,查看 error。
提交生图任务
/v1/images/generations成功返回 HTTP 202| 字段 | 类型 | 要求 | 说明 |
|---|---|---|---|
model | string | 必填 | 图片模型的公开 ID,严格区分字符和大小写。 |
prompt | string | 必填 | 图片描述,建议明确主体、场景、构图和风格。 |
n | integer | 可选 | 生成数量,默认 1;模型可能有更严格上限。 |
resolution | string | 可选 | 例如 1K、2K;以目标模型支持范围为准。 |
aspect_ratio | string | 可选 | 例如 1:1、16:9、9:16。 |
size | string | 可选 | 兼容尺寸字段。像素尺寸必须使用小写字母 x。 |
quality | string | 可选 | 仅部分模型支持;不要默认所有值都有效。 |
reference_images | string[] | 可选 | 公网 HTTPS 参考图 URL 数组。 |
provider_options | object | 高级 | 只传文档明确支持的公开扩展字段,不要传内部路由参数。 |
最小请求
curl https://api.erdou.xyz/v1/images/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: image-demo-001" \
-d '{
"model": "YOUR_IMAGE_MODEL",
"prompt": "一只白色陶瓷杯,干净的摄影棚背景,柔和自然光",
"n": 1,
"resolution": "1K",
"aspect_ratio": "1:1"
}'
HTTP 202 响应
{
"id": "task_PUBLIC_TASK_ID",
"object": "image_generation.task",
"created_at": 1760000000,
"status": "pending",
"model": "YOUR_IMAGE_MODEL",
"progress": "10%",
"data": []
}
id 并继续查询,不能把空的 data 当作生成失败。
查询任务与下载结果
/v1/images/tasks/{task_id}建议间隔 3 至 5 秒curl https://api.erdou.xyz/v1/images/tasks/task_PUBLIC_TASK_ID \
-H "Authorization: Bearer YOUR_API_KEY"
完成响应
{
"id": "task_PUBLIC_TASK_ID",
"object": "image_generation.task",
"created_at": 1760000000,
"completed_at": 1760000042,
"status": "completed",
"model": "YOUR_IMAGE_MODEL",
"progress": "100%",
"data": [
{
"index": 0,
"url": "https://api.erdou.xyz/v1/images/tasks/task_PUBLIC_TASK_ID/results/0",
"mime_type": "image/png",
"width": 1024,
"height": 1024
}
]
}
JavaScript 轮询示例
const baseURL = "https://api.erdou.xyz/v1";
const headers = { Authorization: `Bearer ${process.env.ERDOU_API_KEY}` };
async function waitForImage(taskId) {
for (let attempt = 0; attempt < 120; attempt += 1) {
const response = await fetch(`${baseURL}/images/tasks/${taskId}`, { headers });
if (!response.ok) throw new Error(`Task query failed: ${response.status}`);
const task = await response.json();
if (task.status === "completed") return task;
if (task.status === "failed") {
throw new Error(task.error?.message || "Image generation failed");
}
await new Promise((resolve) => setTimeout(resolve, 5000));
}
throw new Error("Task polling timed out; keep the task ID and query later");
}
下载归档图片
curl "https://api.erdou.xyz/v1/images/tasks/task_PUBLIC_TASK_ID/results/0" \
-H "Authorization: Bearer YOUR_API_KEY" \
--output result.png
结果 URL 指向本站归档接口。调用时仍应携带原令牌,不要依赖或保存任何上游临时地址。
参考图与模型参数
首期参考图只接受公网 HTTPS URL。服务端会拒绝本地文件路径、HTTP 明文地址、私网地址及无法公开访问的链接。
{
"model": "YOUR_IMAGE_MODEL",
"prompt": "保持主体构图,将背景改成雨后的城市街道",
"reference_images": [
"https://your-public-domain.example/reference.png"
],
"n": 1,
"resolution": "1K",
"aspect_ratio": "16:9"
}
| 输入 | 是否接受 | 说明 |
|---|---|---|
| 公网 HTTPS 图片 URL | 接受 | 必须能被服务端直接访问。 |
| HTTP 明文 URL | 拒绝 | 请使用有效 HTTPS 地址。 |
localhost 或私网 IP | 拒绝 | 服务端无法安全读取用户本地资源。 |
| Base64 / Data URL | 拒绝 | 当前异步生图入口不接收 Base64 参考图。 |
| 本地文件路径 | 拒绝 | 先上传到自己控制的 HTTPS 存储。 |
invalid_request 时,先只保留 model、prompt 和 n: 1。
幂等与重试
生图提交是付费操作。客户端必须区分“查询失败”和“提交结果未知”,避免因网络超时重复生成、重复扣费。
| 场景 | 是否自动重试 | 正确处理 |
|---|---|---|
| 任务查询 GET 超时 | 可以 | 退避后继续查询同一 task_id。 |
| 查询返回 429 / 5xx | 可以 | 等待后重试 GET,不要重新提交。 |
| 付费 POST 返回明确 4xx | 不要 | 修正参数、模型或权限后生成新的幂等键。 |
| 付费 POST 网络超时 | 不要盲目重试 | 使用相同幂等键查询或重放完全相同的请求。 |
| 相同幂等键但请求体变化 | 禁止 | 系统可能返回 409;新请求必须使用新键。 |
推荐幂等键
Idempotency-Key: order-20260728-000001-image-1
幂等键也可通过 X-Idempotency-Key、client_request_id 或 request_id 提供。推荐使用请求头,并为每个业务动作生成稳定且唯一的值。
计费与额度
文本模型通常按输入和输出用量计费;异步图片模型可能按模型、分辨率、画幅、数量或实际任务成本计费。控制台显示“动态计费”时,不应把它理解成固定 Token 单价。
- 实际可调用模型和价格受令牌分组影响。
- 异步生图会在提交前进行额度检查和预扣,完成后再结算。
- 明确失败的任务按系统结算规则处理;不要通过重复提交验证退款。
- 请求数量、分辨率和质量越高,通常费用越高。
- 客户端不得传入内部渠道、供应商线路或成本参数。
错误处理
错误响应通常包含 error.message 和 error.code。排障时记录 HTTP 状态码、请求时间、公开模型 ID 和 request ID,不要提交完整令牌。
{
"error": {
"message": "model is required",
"code": "invalid_request"
}
}
| 状态 | 常见原因 | 处理建议 |
|---|---|---|
400 | 参数错误、接口类型错误、模型与端点不匹配 | 用最小请求重试;生图不要走聊天游乐场。 |
401 | 未提供令牌、令牌无效或已过期 | 检查 Bearer 格式,重新创建令牌。 |
402 | 余额或可用额度不足 | 检查账户余额、订阅和令牌额度。 |
403 | 分组、模型或功能权限不足 | 确认当前令牌可见模型和所属分组。 |
404 | 模型或任务不存在 | 核对模型 ID、任务 ID及调用账户。 |
409 | 幂等键冲突或任务状态冲突 | 保持相同键对应相同请求;不同请求使用新键。 |
429 | 请求频率过高 | 指数退避,并降低并发。 |
500 | 网关内部异常 | 记录 request ID,稍后查询原任务,避免重复付费 POST。 |
502 / 503 | 模型服务暂时不可用 | 聊天请求可按业务策略重试;付费生图先保留幂等键和任务信息。 |
“无可用渠道”检查顺序
- 确认调用端点与模型类型一致:聊天模型走聊天接口,生图模型走图片接口。
- 重新请求
/v1/models,确认当前令牌仍能看到该模型。 - 核对模型 ID的大小写、连字符和后缀。
- 检查令牌分组、余额、并发限制和服务公告。
安全建议
- 在服务端环境变量或密钥管理服务中保存 API Key。
- 不要在浏览器前端、移动端安装包或公开代码中写死长期令牌。
- 为不同应用创建不同令牌,并设置合理额度、分组和过期时间。
- 日志中只保留 request ID和令牌末尾少量字符,不记录完整 Authorization 头。
- 参考图应使用自己控制的短期 HTTPS 地址,并避免包含个人敏感信息。
- 令牌疑似泄露时立即禁用或删除,再创建新令牌。
常见问题
Base URL 要不要再加 /v1?
SDK 的 base_url 或 baseURL 填 https://api.erdou.xyz/v1。如果代码里手动拼接完整路径,则不要重复得到 /v1/v1。
为什么生图模型在游乐场报“无可用渠道”?
聊天游乐场发送的是聊天请求,不是图片任务。请使用 POST /v1/images/generations。
提交生图后为什么没有立即返回图片?
图片接口是异步任务。HTTP 202 后保存任务 ID,再查询 /v1/images/tasks/{task_id}。
任务显示 processing,可以重新提交吗?
不要。继续查询原任务。如果长时间没有变化,保留任务 ID和 request ID联系支持;盲目重新提交可能产生第二次费用。
可以把本地图片路径作为参考图吗?
不可以。当前异步生图只接受公网 HTTPS URL,不接受本地路径、Base64 或私网地址。
如何确认模型名称?
使用实际业务令牌调用 GET /v1/models,复制返回的完整模型 ID,不要自行改名或猜测后缀。