二豆 API 文档 2026.07

NEW API COMPATIBLE GATEWAY

二豆 API 接入文档

面向开发者的公开接口说明。文本模型遵循常见的 OpenAI 兼容协议,图片模型使用本站异步任务协议。可用模型、权限和价格以账户当前配置为准。

API Base URL https://api.erdou.xyz/v1
公开文档边界:本文只说明客户端调用方式,不包含任何内部渠道地址、供应商密钥、路由规则、成本换算或服务器配置。
没有找到匹配内容,请尝试模型、图片、401、流式等关键词。

认证与地址

所有公开模型请求都必须携带本站令牌。令牌可在控制台的令牌管理页面创建,请只在服务端保存和使用。

基础地址https://api.erdou.xyz/v1
认证方式Authorization: Bearer
数据格式除文件接口外均为 JSON

请求头

HTTP
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
不要泄露令牌:不要把真实令牌写进网页前端、Git 仓库、公开截图或聊天记录。示例中的 YOUR_API_KEY 必须由运行环境变量替换。

获取可用模型

模型目录会随账户分组和渠道状态变化。不要长期硬编码从其他账户复制的模型列表,调用前应以当前令牌返回的结果为准。

GET/v1/models需要 Bearer 令牌
cURL
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

Shell
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

Python
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

Node.js
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

适用于常规对话、结构化提示词及支持该能力的工具调用模型。

POST/v1/chat/completionsOpenAI 兼容
字段类型要求说明
modelstring必填使用 /v1/models 返回的聊天模型 ID。
messagesarray必填消息数组,常用角色为 systemuserassistant
streamboolean可选设为 true 时返回 SSE 数据流。
temperaturenumber可选是否支持及取值范围由模型决定。
max_tokensinteger可选限制最大输出量。不要传入异常大的数值。
toolsarray可选仅在目标模型支持工具调用时使用。
请求体
{
  "model": "YOUR_CHAT_MODEL",
  "messages": [
    {"role": "system", "content": "你是一个简洁的中文助手。"},
    {"role": "user", "content": "用三点说明 HTTPS 的作用。"}
  ],
  "stream": false
}
模型能力不同:不要默认所有模型都支持视觉输入、工具调用、JSON Schema 或相同参数。遇到参数错误时,先删除可选字段,用最小请求验证。

Responses

面向支持 Responses 协议的模型。使用 input 提交输入;是否支持工具、图片输入和推理参数仍取决于具体模型。

POST/v1/responsesResponses 兼容
cURL
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
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
  }'
超时设置:流式连接的读取超时应明显长于普通 HTTP 请求。不要因为暂时没有新 token 就自动发送第二次计费请求。

其他兼容接口

以下路由由网关提供,但实际可用性取决于当前令牌下是否存在支持对应能力的模型。

方法路径用途注意
POST/v1/embeddings向量嵌入需要嵌入模型。
POST/v1/audio/transcriptions语音转写通常使用 multipart 文件上传。
POST/v1/audio/translations语音翻译需要支持的音频模型。
POST/v1/audio/speech文本转语音响应通常是音频二进制。
POST/v1/rerank文档重排序请求格式取决于模型兼容协议。
POST/v1/messagesMessages 兼容接口仅用于支持该协议的模型。

未在当前账户模型列表中展示相应能力时,不要仅凭路由存在就认为可以调用。

异步生图概览

本站生图模型采用异步任务:提交后立即返回任务 ID,生成、归档和结算在后台完成。客户端必须查询任务状态,不能期待提交接口直接返回图片。

不要使用聊天游乐场测试生图:New API 游乐场调用的是 /pg/chat/completions,图片渠道只接收 /v1/images/generations。在聊天游乐场选择生图模型会得到“无可用渠道”,这不代表模型 Key 失效。
  1. 选择公开模型 ID使用当前令牌请求 /v1/models,选择图片模型。
  2. 提交生成任务调用 POST /v1/images/generations,保存返回的 task_id
  3. 轮询任务状态每 3 至 5 秒调用一次任务查询接口;查询 GET 可以重试。
  4. 读取归档结果状态为 completed 后使用响应里的本站结果 URL 下载图片。
pending

任务已接收,等待上游处理。

processing

正在生成、下载或归档。

completed

任务完成,可读取结果。

failed

任务失败,查看 error

提交生图任务

POST/v1/images/generations成功返回 HTTP 202
字段类型要求说明
modelstring必填图片模型的公开 ID,严格区分字符和大小写。
promptstring必填图片描述,建议明确主体、场景、构图和风格。
ninteger可选生成数量,默认 1;模型可能有更严格上限。
resolutionstring可选例如 1K2K;以目标模型支持范围为准。
aspect_ratiostring可选例如 1:116:99:16
sizestring可选兼容尺寸字段。像素尺寸必须使用小写字母 x
qualitystring可选仅部分模型支持;不要默认所有值都有效。
reference_imagesstring[]可选公网 HTTPS 参考图 URL 数组。
provider_optionsobject高级只传文档明确支持的公开扩展字段,不要传内部路由参数。

最小请求

cURL
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 响应

JSON
{
  "id": "task_PUBLIC_TASK_ID",
  "object": "image_generation.task",
  "created_at": 1760000000,
  "status": "pending",
  "model": "YOUR_IMAGE_MODEL",
  "progress": "10%",
  "data": []
}
HTTP 202 不是图片已完成:它只表示任务已安全接收。必须保存 id 并继续查询,不能把空的 data 当作生成失败。

查询任务与下载结果

GET/v1/images/tasks/{task_id}建议间隔 3 至 5 秒
cURL
curl https://api.erdou.xyz/v1/images/tasks/task_PUBLIC_TASK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

完成响应

JSON
{
  "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 轮询示例

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
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 时,先只保留 modelpromptn: 1

幂等与重试

生图提交是付费操作。客户端必须区分“查询失败”和“提交结果未知”,避免因网络超时重复生成、重复扣费。

场景是否自动重试正确处理
任务查询 GET 超时可以退避后继续查询同一 task_id
查询返回 429 / 5xx可以等待后重试 GET,不要重新提交。
付费 POST 返回明确 4xx不要修正参数、模型或权限后生成新的幂等键。
付费 POST 网络超时不要盲目重试使用相同幂等键查询或重放完全相同的请求。
相同幂等键但请求体变化禁止系统可能返回 409;新请求必须使用新键。

推荐幂等键

HTTP
Idempotency-Key: order-20260728-000001-image-1

幂等键也可通过 X-Idempotency-Keyclient_request_idrequest_id 提供。推荐使用请求头,并为每个业务动作生成稳定且唯一的值。

计费与额度

文本模型通常按输入和输出用量计费;异步图片模型可能按模型、分辨率、画幅、数量或实际任务成本计费。控制台显示“动态计费”时,不应把它理解成固定 Token 单价。

  • 实际可调用模型和价格受令牌分组影响。
  • 异步生图会在提交前进行额度检查和预扣,完成后再结算。
  • 明确失败的任务按系统结算规则处理;不要通过重复提交验证退款。
  • 请求数量、分辨率和质量越高,通常费用越高。
  • 客户端不得传入内部渠道、供应商线路或成本参数。
以控制台为准:模型目录和计费展示会更新。上线业务前,应使用自己的测试令牌完成小额验收,并设置账户预算和请求上限。

错误处理

错误响应通常包含 error.messageerror.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模型服务暂时不可用聊天请求可按业务策略重试;付费生图先保留幂等键和任务信息。

“无可用渠道”检查顺序

  1. 确认调用端点与模型类型一致:聊天模型走聊天接口,生图模型走图片接口。
  2. 重新请求 /v1/models,确认当前令牌仍能看到该模型。
  3. 核对模型 ID的大小写、连字符和后缀。
  4. 检查令牌分组、余额、并发限制和服务公告。

安全建议

  • 在服务端环境变量或密钥管理服务中保存 API Key。
  • 不要在浏览器前端、移动端安装包或公开代码中写死长期令牌。
  • 为不同应用创建不同令牌,并设置合理额度、分组和过期时间。
  • 日志中只保留 request ID和令牌末尾少量字符,不记录完整 Authorization 头。
  • 参考图应使用自己控制的短期 HTTPS 地址,并避免包含个人敏感信息。
  • 令牌疑似泄露时立即禁用或删除,再创建新令牌。

常见问题

Base URL 要不要再加 /v1

SDK 的 base_urlbaseURLhttps://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,不要自行改名或猜测后缀。