接入文档

DoleAPI 提供与 OpenAI 完全兼容的 /v1/chat/completions 接口。 任何支持自定义 Base URL 的客户端 / SDK 都能直接使用。

快速开始

1. 用 LinuxDO 登录 → 在 Pool 广场 选一个 Pool 订阅 → 在 我的订阅 复制 Key。

2. 把 Base URL 填成下面这个地址,Key 填进 api_key:

https://your-domain/v1

3. 直接调用:

curl https://your-domain/v1/chat/completions \
  -H "Authorization: Bearer sk-dole-xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-4o-mini",
    "messages": [{"role": "user", "content": "你好"}]
  }'

Python(openai SDK)

from openai import OpenAI

client = OpenAI(
    base_url="https://your-domain/v1",
    api_key="sk-dole-xxxxxxxxxxxxxxxxxxxx",
)
resp = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "用一句话介绍你自己"}],
)
print(resp.choices[0].message.content)

认证与 Key

  • Key 形如 sk-dole-…,每个 Pool 一个,互不通用。
  • 请求放在 Authorization: Bearer <key>,也支持 X-API-Key 头。
  • Key 绑定订阅人,请勿分享;管理员可在后台删除订阅使 Key 立即失效。
  • 登录站点的会话 Token 不能用于调用接口,混用会返回 401。

对话接口

POST /v1/chat/completions,请求体与 OpenAI 一致,常用字段:

字段说明
model必填,取值见 Pool 详情页的「可用模型」
messages必填,支持 system / user / assistant / tool 角色与多模态 content 数组
stream是否流式返回(SSE)
tools / tool_choice函数调用,原样转发给上游并原样返回模型给出的工具调用
temperature / top_p / max_tokens / stop 等原样透传

返回结构与 OpenAI 相同(id、model、choices、usage), 其中 id 与 model 由本站重写,usage 为上游真实用量。

流式输出

设置 "stream": true 即返回标准 SSE:

curl -N https://your-domain/v1/chat/completions \
  -H "Authorization: Bearer sk-dole-xxxx" \
  -H "Content-Type: application/json" \
  -d '{"model":"gpt-4o-mini","stream":true,
       "messages":[{"role":"user","content":"从 1 数到 5"}]}'

流式返回的每个 chunk 都是标准 chat.completion.chunk,以 data: [DONE] 结束; 长回复中间可能出现心跳空行,属于正常现象。

工具调用

请求里带上 tools 即可,网关不会改写工具定义与调用结果:

{
  "model": "gpt-4o-mini",
  "messages": [{"role": "user", "content": "北京今天天气如何?"}],
  "tools": [{
    "type": "function",
    "function": {
      "name": "get_weather",
      "description": "查询城市天气",
      "parameters": {"type": "object",
                     "properties": {"city": {"type": "string"}},
                     "required": ["city"]}
    }
  }]
}

模型决定调用时,返回 finish_reason: "tool_calls" 与 message.tool_calls; 你把执行结果以 role: "tool" 的消息追加回 messages 继续请求即可。

思考链

上游返回的思考链会在 delta.reasoning_content(部分上游为 reasoning)里原样透传, 非流式则在 message.reasoning_content。客户端不支持时忽略该字段即可。

模型列表

curl https://your-domain/v1/models \
  -H "Authorization: Bearer sk-dole-xxxx"

带 Key 时只返回该 Pool 开放的模型;不带 Key 返回全站模型目录。

Anthropic 接口

同一个 Key 也能直接调用 Anthropic Messages 协议,路径为 /v1/messages。 网关会自动在两种协议之间转换:上游是 Anthropic 就转过去,是 OpenAI 就转回来,客户端无需关心。

curl https://your-domain/v1/messages \
  -H "x-api-key: sk-dole-xxxxxxxx" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-5",
    "max_tokens": 1024,
    "system": "你是一个简洁的助手",
    "messages": [{"role": "user", "content": "你好"}]
  }'

鉴权既支持 x-api-key(Anthropic 习惯),也支持 Authorization: Bearer <key>。

支持的字段

字段说明
model / messages / system与官方一致;max_tokens 省略时由网关补默认值
tools / tool_choice函数调用,两种协议间自动转换
thinking开启思考时,上游思考链以 thinking 内容块返回
stream返回标准 Anthropic SSE 事件(message_start / content_block_delta / message_delta / message_stop)
temperature / top_p / stop_sequences / metadata原样透传

错误同样按 Anthropic 格式返回: {"type": "error", "error": {"type": "...", "message": "..."}}。

错误码

HTTPOpenAI codeAnthropic type含义
400invalid_requestinvalid_request_error请求体不合法(如 messages 为空)
401invalid_api_keyauthentication_errorKey 缺失 / 无效
403subscription_unavailablepermission_error订阅过期、Pool 被关闭或额度用尽
404model_not_foundnot_found_error模型不在该 Pool 的开放列表里
429rpm / tpmrate_limit_error超出速率限制,按 Retry-After 重试
502upstream_errorapi_error上游异常(细节不对外暴露,会记在服务端日志)

所有错误都来自网关自身的错误目录: 上游的状态码、错误体、域名、Key、模型名一律不会出现在响应里,只会写进服务端日志与管理端的上游线路统计。

用量与额度

  • 每次调用按上游返回的 usage.total_tokens 计费;上游不返回时按字符估算。
  • 每个 Pool 会统计请求数与成功率(上游正常返回即成功),可在 Pool 详情页查看。
  • 用量同时累计到「你的订阅」和「该 Pool 的总额度」;Pool 达到上限后自动停用,所有 Key 立即不可用。
  • 订阅到期或 Pool 关闭同样会让 Key 失效,错误提示里会说明原因。
  • 在 个人中心 里可以查看订阅、Key、用量明细与订单记录。

速率与并发限制

  • 每个 Pool 可设置整体上限(该 Pool 所有用户合计)与单用户上限:每分钟请求数(RPM)、每分钟 token 数(TPM), 以及**同时进行中的请求数**(并发)。
  • 限值在 Pool 详情 与个人中心可见;超限返回 429, 错误里的 code 为 rpm / tpm / concurrency。
  • TPM 按最近 60 秒内已消耗的 token 加本次请求的预估值判定,因此单次调用可能略微超过上限后才会被拦住。
  • 并发位从请求开始占用,到响应输出完毕(流式为整条流结束)释放,中途失败也会释放。