大模型中转站

接入文档

本站同时提供 OpenAI 协议与 Anthropic 协议两套接口,对外是 两个互不混淆的地址:用 OpenAI 的客户端填前者,用 Anthropic 的客户端填后者。 两种协议共用同一个 API Key,也共用同一套计费与模型定价。

💡
OpenAI 协议 Base URL:http://localhost:8787/openai/v1
Anthropic 协议 Base URL:http://localhost:8787/anthropic/v1
API Key 请在 控制台 → API Key 中创建。
协议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/* 两种协议依旧都收,老代码无需改动。

快速开始

三步即可跑通:

  1. 注册账号并登录控制台;
  2. 在「API Key」页面创建一个密钥(明文只显示一次,请立即保存);
  3. 把下面的 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 协议)

POST/openai/v1/chat/completions
参数类型必填说明
modelstring是模型名称,见「模型价格」页
messagesarray是对话消息数组,格式同 OpenAI
streamboolean否是否流式返回,默认 false
temperature 等–否其余参数原样转发给上游,不做修改

Anthropic Messages(Anthropic 协议)

POST/anthropic/v1/messages

结构与 Anthropic 官方的 Messages API 完全一致,支持流式、系统提示词(system)、 多模态图片与工具调用(tools / tool_use / tool_result)。

参数类型必填说明
modelstring是模型名称,见「模型价格」页
max_tokensinteger是Anthropic 协议要求必填
messagesarray是[{"role":"user","content":"你好"}]
systemstring / array否系统提示词
streamboolean否是否流式返回,默认 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 协议)

POST/openai/v1/embeddings
{
  "model": "text-embedding-3-small",
  "input": ["要向量化的文本"]
}

常见客户端配置

客户端协议配置位置填写内容
Claude CodeAnthropic环境变量ANTHROPIC_BASE_URL=…/anthropic、ANTHROPIC_API_KEY=sk-...
Anthropic 官方 SDKAnthropicAnthropic(base_url=..., api_key=...)base_url 填 …/anthropic/v1
Cherry StudioOpenAI设置 → 模型服务 → OpenAIAPI 地址填 …/openai/v1,密钥填 sk-...
NextChat / ChatGPT-Next-WebOpenAI设置 → 自定义接口接口地址 …/openai/v1,API Key sk-...
DifyOpenAI模型供应商 → OpenAI-API-compatibleAPI Base …/openai/v1
LangChainOpenAIChatOpenAI(base_url=..., api_key=...)base_url 填 …/openai/v1
One API / New APIOpenAI渠道 → 类型 OpenAI代理地址 …/openai/v1
沉浸式翻译OpenAI翻译服务 → OpenAI自定义 API 地址 …/openai/v1

其中 BASE 即本站地址,例如 http://localhost:8787。

错误码

HTTPcode说明
401missing_api_key未携带 API Key
401invalid_api_keyAPI Key 无效
402insufficient_balance账户余额不足,请充值
403key_disabled该 Key 已被禁用
403key_expired该 Key 已过期
403key_quota_exceeded该 Key 额度已用尽
403user_banned账号被封禁
429rate_limit_exceeded超出每分钟请求数限制
502all_channels_failed所有上游渠道均调用失败
503no_available_channel该模型暂无可用渠道

错误响应体与 OpenAI 一致:

{ "error": { "message": "余额不足(当前 0.000000),请先充值",
             "type": "insufficient_quota", "code": "insufficient_balance" } }

计费说明

每次调用按实际用量计费,规则如下:

  1. 根据模型名匹配定价表,得到基础价;
  2. 叠加所有命中的计费规则倍率(连乘);
  3. 最终费用 = ceil(基础价 × Π倍率),整数运算、无浮点误差。

费用在响应完成后结算,可在「调用日志」中逐笔核对(含输入/输出 token、生效倍率、耗时与状态)。 流式请求会向上游索取真实 usage,确保计量准确。

⚠️
并发请求可能导致余额短暂透支;当余额低于管理员设置的阈值时,后续请求会返回 402。