接入文档
本站同时提供 OpenAI 协议与 Anthropic 协议两套接口,对外是 两个互不混淆的地址:用 OpenAI 的客户端填前者,用 Anthropic 的客户端填后者。 两种协议共用同一个 API Key,也共用同一套计费与模型定价。
http://localhost:8787/openai/v1http://localhost:8787/anthropic/v1| 协议 | Base URL | 端点 | 适用客户端 |
|---|---|---|---|
| OpenAI | …/openai/v1 |
/chat/completions、/completions、/embeddings、/models |
OpenAI 官方 SDK、LangChain、Dify、Cherry Studio、NextChat、沉浸式翻译… |
| Anthropic | …/anthropic/v1 |
/messages、/messages/count_tokens、/models |
Anthropic 官方 SDK、Claude Code、任何 Anthropic 兼容客户端 |
两个地址是隔离的:把 Anthropic 请求发到 OpenAI 地址(或反过来)会返回
404 protocol_mismatch,错误信息里会直接告诉你正确的地址。
根路径 …/v1/* 两种协议依旧都收,老代码无需改动。
快速开始
三步即可跑通:
- 注册账号并登录控制台;
- 在「API Key」页面创建一个密钥(明文只显示一次,请立即保存);
- 把下面的
base_url与api_key填进你的代码或客户端。
OpenAI 协议 · cURL
curl http://localhost:8787/openai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $RELAY_API_KEY" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "你好,请自我介绍一下"}]
}'
OpenAI 协议 · Python(openai 官方 SDK)
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8787/openai/v1",
api_key="sk-你的密钥",
)
resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
print("本次用量:", resp.usage)
OpenAI 协议 · Node.js
import OpenAI from 'openai';
const client = new OpenAI({
baseURL: 'http://localhost:8787/openai/v1',
apiKey: process.env.RELAY_API_KEY,
});
const stream = await client.chat.completions.create({
model: 'gpt-4o-mini',
messages: [{ role: 'user', content: '写一首关于秋天的诗' }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? '');
}
Anthropic 协议 · cURL
curl http://localhost:8787/anthropic/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: $RELAY_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "你好,请自我介绍一下"}]
}'
Anthropic 协议 · Python(anthropic 官方 SDK)
from anthropic import Anthropic
client = Anthropic(
base_url="http://localhost:8787/anthropic/v1",
api_key="sk-你的密钥",
)
msg = client.messages.create(
model="claude-sonnet-4",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
)
print(msg.content[0].text)
print("本次用量:", msg.usage)
Anthropic 协议 · Claude Code
export ANTHROPIC_BASE_URL="http://localhost:8787/anthropic"
export ANTHROPIC_API_KEY="sk-你的密钥"
claude
注意 Claude Code 的 ANTHROPIC_BASE_URL 不带 /v1,
SDK 会自己拼 /v1/messages。
鉴权
在请求头中携带 Bearer Token:
Authorization: Bearer sk-xxxxxxxxxxxxxxxxxxxxxxxx
也兼容 X-Api-Key 请求头。Key 可在控制台创建、禁用、设置额度上限与每分钟请求数(RPM)限制。
对话补全(OpenAI 协议)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名称,见「模型价格」页 |
messages | array | 是 | 对话消息数组,格式同 OpenAI |
stream | boolean | 否 | 是否流式返回,默认 false |
temperature 等 | – | 否 | 其余参数原样转发给上游,不做修改 |
Anthropic Messages(Anthropic 协议)
结构与 Anthropic 官方的 Messages API 完全一致,支持流式、系统提示词(system)、
多模态图片与工具调用(tools / tool_use / tool_result)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 模型名称,见「模型价格」页 |
max_tokens | integer | 是 | Anthropic 协议要求必填 |
messages | array | 是 | [{"role":"user","content":"你好"}] |
system | string / array | 否 | 系统提示词 |
stream | boolean | 否 | 是否流式返回,默认 false |
鉴权用 x-api-key(也接受 Authorization: Bearer),并需要
anthropic-version 请求头(Anthropic SDK 会自动带上)。
返回结构:
{
"id": "msg_...",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4",
"content": [{ "type": "text", "text": "你好,我是……" }],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": { "input_tokens": 12, "output_tokens": 34 }
}
流式返回的是 Anthropic 标准事件序列
(message_start → content_block_start → content_block_delta →
content_block_stop → message_delta → message_stop)。
另有 POST /anthropic/v1/messages/count_tokens 用于估算输入 token,返回
{"input_tokens": N},不消耗余额。
流式响应
两种协议都支持流式。设置 "stream": true 后返回标准 SSE 流,逐块透传上游内容,首字延迟不受中转影响。
OpenAI 协议(/openai/v1/chat/completions):
data: {"id":"...","object":"chat.completion.chunk","choices":[{"delta":{"content":"你"},"index":0}]}
data: {"id":"...","object":"chat.completion.chunk","choices":[{"delta":{"content":"好"},"index":0}]}
data: [DONE]
Anthropic 协议(/anthropic/v1/messages):
event: message_start
data: {"type":"message_start","message":{"id":"msg_...","role":"assistant","content":[],"usage":{"input_tokens":12,"output_tokens":1}}}
event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"你"}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":34}}
event: message_stop
data: {"type":"message_stop"}
本站会在转发时自动向上游索取 usage 以进行精确计费,并
自动隐藏该附加分片,因此客户端拿到的数据流与直连官方完全一致。
模型列表
OpenAI 协议 GET /openai/v1/models:
{
"object": "list",
"data": [
{ "id": "gpt-4o-mini", "object": "model", "created": 1730000000, "owned_by": "大模型中转站" }
]
}
Anthropic 协议 GET /anthropic/v1/models(结构不同):
{
"data": [
{ "type": "model", "id": "claude-sonnet-4", "display_name": "Claude Sonnet 4", "created_at": "2026-01-01T00:00:00.000Z" }
],
"has_more": false,
"first_id": "claude-sonnet-4",
"last_id": "claude-sonnet-4"
}
两个接口返回的都是调用名(发请求时 model 字段要填的值)。
前台价格页上显示的是「展示名」,两者可能不同,具体见 控制台 → 模型价格。
向量嵌入(仅 OpenAI 协议)
{
"model": "text-embedding-3-small",
"input": ["要向量化的文本"]
}
常见客户端配置
| 客户端 | 协议 | 配置位置 | 填写内容 |
|---|---|---|---|
| Claude Code | Anthropic | 环境变量 | ANTHROPIC_BASE_URL=…/anthropic、ANTHROPIC_API_KEY=sk-... |
| Anthropic 官方 SDK | Anthropic | Anthropic(base_url=..., api_key=...) | base_url 填 …/anthropic/v1 |
| Cherry Studio | OpenAI | 设置 → 模型服务 → OpenAI | API 地址填 …/openai/v1,密钥填 sk-... |
| NextChat / ChatGPT-Next-Web | OpenAI | 设置 → 自定义接口 | 接口地址 …/openai/v1,API Key sk-... |
| Dify | OpenAI | 模型供应商 → OpenAI-API-compatible | API Base …/openai/v1 |
| LangChain | OpenAI | ChatOpenAI(base_url=..., api_key=...) | base_url 填 …/openai/v1 |
| One API / New API | OpenAI | 渠道 → 类型 OpenAI | 代理地址 …/openai/v1 |
| 沉浸式翻译 | OpenAI | 翻译服务 → OpenAI | 自定义 API 地址 …/openai/v1 |
其中 BASE 即本站地址,例如 http://localhost:8787。
错误码
| HTTP | code | 说明 |
|---|---|---|
| 401 | missing_api_key | 未携带 API Key |
| 401 | invalid_api_key | API Key 无效 |
| 402 | insufficient_balance | 账户余额不足,请充值 |
| 403 | key_disabled | 该 Key 已被禁用 |
| 403 | key_expired | 该 Key 已过期 |
| 403 | key_quota_exceeded | 该 Key 额度已用尽 |
| 403 | user_banned | 账号被封禁 |
| 429 | rate_limit_exceeded | 超出每分钟请求数限制 |
| 502 | all_channels_failed | 所有上游渠道均调用失败 |
| 503 | no_available_channel | 该模型暂无可用渠道 |
错误响应体与 OpenAI 一致:
{ "error": { "message": "余额不足(当前 0.000000),请先充值",
"type": "insufficient_quota", "code": "insufficient_balance" } }
计费说明
每次调用按实际用量计费,规则如下:
- 根据模型名匹配定价表,得到基础价;
- 叠加所有命中的计费规则倍率(连乘);
- 最终费用 =
ceil(基础价 × Π倍率),整数运算、无浮点误差。
费用在响应完成后结算,可在「调用日志」中逐笔核对(含输入/输出 token、生效倍率、耗时与状态)。
流式请求会向上游索取真实 usage,确保计量准确。