接入文档
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": "..."}}。
错误码
| HTTP | OpenAI code | Anthropic type | 含义 |
|---|---|---|---|
| 400 | invalid_request | invalid_request_error | 请求体不合法(如 messages 为空) |
| 401 | invalid_api_key | authentication_error | Key 缺失 / 无效 |
| 403 | subscription_unavailable | permission_error | 订阅过期、Pool 被关闭或额度用尽 |
| 404 | model_not_found | not_found_error | 模型不在该 Pool 的开放列表里 |
| 429 | rpm / tpm | rate_limit_error | 超出速率限制,按 Retry-After 重试 |
| 502 | upstream_error | api_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 加本次请求的预估值判定,因此单次调用可能略微超过上限后才会被拦住。
- 并发位从请求开始占用,到响应输出完毕(流式为整条流结束)释放,中途失败也会释放。