原生 Claude API

POST /v1/messages

Anthropic Claude Messages API 格式的请求,使用 JSON 请求体创建消息。请求必须包含 anthropic-version,并使用 Authorization Bearer Token 或 x-api-key 其中一种方式认证;可用字段和具体能力取决于目标模型及上游渠道.

请求参数

请求头

Authorization [可选]

使用网关 API Key 的 Bearer Token 认证。与 x-api-key 二选一

格式:Authorization: Bearer sk-xxxxxx

x-api-key [可选]

Anthropic 兼容认证请求头。使用此请求头时,可以不发送 Authorization

格式:x-api-key: sk-ant-xxxxxx

anthropic-version

Anthropic API 版本,必填。当前示例使用 2023-06-01

格式:anthropic-version: 2023-06-01

下表列出网关当前支持的请求字段;字段是否生效仍取决于目标模型和上游渠道。

请求体

顶层字段(13 个)
参数类型默认值说明是否必填
modelstring—目标模型 ID。请使用当前账号可用的模型。是
messagesarray—按时间顺序排列的对话消息。每条消息包含 role 和 content。是
systemstring / array—系统提示词或系统内容块。否
max_tokensinteger—本次响应允许生成的最大 token 数,最小值为 1。是
temperaturenumber—采样温度,范围为 0 到 1。否
top_pnumber—核采样参数。通常只调整 temperature 或 top_p 其中一个。否
top_kinteger—限制每一步采样时考虑的候选 token 数量。否
streamboolean—是否使用 SSE 流式返回;未设置时默认非流式(false)。否
stop_sequencesarray<string>—命中任一停止序列后结束生成。否
toolsarray—声明 Claude 可以调用的工具。否
tool_choiceobject—控制工具选择策略:auto、any 或指定 tool。否
thinkingobject—配置扩展思考;是否支持取决于目标模型。否
metadataobject—请求元数据。当前 schema 列出 user_id 字段。否

消息与内容块

messages 中每项的 role 为 user 或 assistant。content 可以是字符串,也可以是内容块数组。

消息与内容块字段
内容块类型主要字段用途
texttext文本输入或输出。
imagesource图像输入,支持 Base64 或 URL。
tool_useid、name、inputClaude 发起工具调用时返回。
tool_resulttool_use_id、content客户端执行工具后回传结果。

文本消息示例:

{
  "role": "user",
  "content": "介绍一下 prompt caching。"
}

多内容块消息示例:

{
  "role": "user",
  "content": [
    { "type": "text", "text": "描述这张图片。" },
    {
      "type": "image",
      "source": {
        "type": "url",
        "url": "https://example.com/image.png"
      }
    }
  ]
}

Base64 图像将 source.type 设为 base64,并同时提供 media_type 与 Base64 编码的 data:

{
  "type": "image",
  "source": {
    "type": "base64",
    "media_type": "image/png",
    "data": "iVBORw0KGgoAAAANSUhEUg..."
  }
}

工具调用

工具定义至少包含 name 和 input_schema,可选 description。input_schema 使用 JSON Schema 描述工具参数。

{
  "tools": [
    {
      "name": "get_weather",
      "description": "查询指定城市的天气",
      "input_schema": {
        "type": "object",
        "properties": {
          "city": { "type": "string", "description": "城市名称" }
        },
        "required": ["city"]
      }
    }
  ],
  "tool_choice": { "type": "auto" }
}

Claude 返回 stop_reason: "tool_use" 时,遍历 content 找到 tool_use 块,在客户端执行对应工具。下一轮请求应保留完整的 assistant 内容,并追加 tool_result:

{
  "role": "user",
  "content": [
    {
      "type": "tool_result",
      "tool_use_id": "toolu_01ABC",
      "content": "晴,25°C"
    }
  ]
}

tool_choice.type 可设为:

  • auto:由 Claude 决定是否调用工具。
  • any:要求 Claude 调用任一工具。
  • tool:通过 name 指定工具。

扩展思考

根据目标模型支持情况,可以使用 thinking 配置扩展思考:

{
  "thinking": {
    "type": "enabled",
    "budget_tokens": 4096
  }
}

关闭扩展思考:

{
  "thinking": {
    "type": "disabled"
  }
}

budget_tokens 必须小于 max_tokens,并且扩展思考需要目标模型支持。启用扩展思考后,不要同时发送模型不支持的采样参数。

请求体示例

查看 JSON 请求体示例
{
  "model": "gpt-5.6-sol",
  "system": "你是一个简洁、准确的助手。",
  "messages": [
    { "role": "user", "content": "用三句话介绍 Claude Messages API。" }
  ],
  "max_tokens": 256,
  "temperature": 0.7,
  "stream": false
}

请求示例代码

curl -X POST "https://10000router.com/v1/messages" \
  -H "Authorization: Bearer $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "gpt-5.6-sol",
    "max_tokens": 256,
    "messages": [
      {"role": "user", "content": "用三句话介绍 Claude Messages API。"}
    ]
  }'
const payload = {
  model: "gpt-5.6-sol",
  max_tokens: 256,
  messages: [
    { role: "user", content: "用三句话介绍 Claude Messages API。" }
  ]
};

const response = await fetch("https://10000router.com/v1/messages", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + process.env.ANTHROPIC_API_KEY,
    "anthropic-version": "2023-06-01",
  },
  body: JSON.stringify(payload)
});

if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
payload := strings.NewReader(`{
  "model": "gpt-5.6-sol",
  "max_tokens": 256,
  "messages": [
    {"role": "user", "content": "用三句话介绍 Claude Messages API。"}
  ]
}`)
req, err := http.NewRequest("POST", "https://10000router.com/v1/messages", payload)
if err != nil {
  log.Fatal(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("ANTHROPIC_API_KEY"))
req.Header.Set("anthropic-version", "2023-06-01")
res, err := http.DefaultClient.Do(req)
if err != nil {
  log.Fatal(err)
}
defer res.Body.Close()
if res.StatusCode >= 400 {
  log.Fatal(res.Status)
}
io.Copy(os.Stdout, res.Body)
import os
import requests

payload = {
    "model": "gpt-5.6-sol",
    "max_tokens": 256,
    "messages": [
        {"role": "user", "content": "用三句话介绍 Claude Messages API。"}
    ],
}

response = requests.post(
    "https://10000router.com/v1/messages",
    headers={
        "Authorization": "Bearer " + os.environ["ANTHROPIC_API_KEY"],
        "anthropic-version": "2023-06-01",
    },
    json=payload,
)
response.raise_for_status()
print(response.json())
var client = java.net.http.HttpClient.newHttpClient();
var payload = "{"
    + "\"model\":\"gpt-5.6-sol\","
    + "\"max_tokens\":256,"
    + "\"messages\":[{\"role\":\"user\","
    + "\"content\":\"用三句话介绍 Claude Messages API。\"}]}";
var request = java.net.http.HttpRequest.newBuilder()
    .uri(java.net.URI.create("https://10000router.com/v1/messages"))
    .header("Authorization", "Bearer " + System.getenv("ANTHROPIC_API_KEY"))
    .header("anthropic-version", "2023-06-01")
    .POST(java.net.http.HttpRequest.BodyPublishers.ofString(payload))
    .build();
var response = client.send(
    request,
    java.net.http.HttpResponse.BodyHandlers.ofString()
);
if (response.statusCode() >= 400) {
    throw new IllegalStateException(response.body());
}
System.out.println(response.body());
using System.Net.Http.Json;

using var client = new HttpClient();
client.DefaultRequestHeaders.TryAddWithoutValidation(
    "Authorization",
    "Bearer " + Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY")
);
client.DefaultRequestHeaders.Add("anthropic-version", "2023-06-01");

var payload = new
{
    model = "gpt-5.6-sol",
    max_tokens = 256,
    messages = new[]
    {
        new { role = "user", content = "用三句话介绍 Claude Messages API。" }
    }
};

var response = await client.PostAsJsonAsync(
    "https://10000router.com/v1/messages",
    payload
);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());

返回响应

响应示例

成功请求返回 type: "message" 的消息对象。文本内容位于 content 数组中的 text 内容块;不要假定 content[0] 永远是文本块,使用工具或扩展思考时可能包含其他类型。

{
  "id": "msg_01ABC123",
  "type": "message",
  "role": "assistant",
  "model": "gpt-5.6-sol",
  "content": [
    {
      "type": "text",
      "text": "Claude Messages API 用统一消息结构完成多轮对话。"
    }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 18,
    "output_tokens": 16
  }
}
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "messages: Field required"
  }
}
{
  "type": "error",
  "error": {
    "type": "rate_limit_error",
    "message": "Request rate limit exceeded"
  }
}

非流式响应(200)

成功响应字段如下:

{
  "id": "msg_01ABC123",
  "type": "message",
  "role": "assistant",
  "model": "gpt-5.6-sol",
  "content": [
    {
      "type": "text",
      "text": "Claude Messages API 用统一消息结构完成多轮对话。"
    }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 18,
    "output_tokens": 16
  }
}

响应字段

顶层字段(7 个)
字段类型说明
idstring本次消息的唯一标识。
typestring响应对象类型,通常为 message。
rolestring响应角色,通常为 assistant。
contentarray响应内容块数组,文本位于 content[].text。
modelstring实际生成响应的模型 ID。
stop_reasonstring生成结束原因:end_turn、max_tokens、stop_sequence 或 tool_use。
usageobject本次请求的输入和输出 token 用量。
content[] 内容块
字段类型说明
typestring内容块类型,例如 text 或 tool_use。
textstringtype 为 text 时的文本内容。
idstringtool_use 内容块的调用 ID。
namestringtool_use 内容块调用的工具名称。
inputobject传给工具的参数对象。
usage
字段类型说明
input_tokensinteger输入 token 数。
output_tokensinteger输出 token 数。
cache_creation_input_tokensinteger创建提示缓存时的输入 token 数;上游未返回时可能不存在。
cache_read_input_tokensinteger从提示缓存读取的输入 token 数;上游未返回时可能不存在。

流式响应

将 stream 设为 true 后,响应类型为 text/event-stream。Claude 使用多个 SSE 事件传递一条消息,客户端应按事件顺序拼接 content_block_delta 中的文本增量。

event: message_start
data: {"type":"message_start","message":{"id":"msg_01ABC123","type":"message","role":"assistant","content":[],"model":"gpt-5.6-sol","stop_reason":null}}

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":"Claude Messages"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" API"}}

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":16}}

event: message_stop
data: {"type":"message_stop"}
  • message_start:消息开始,包含消息 ID 和模型信息。
  • content_block_delta:内容增量。文本增量位于 delta.text。
  • message_delta:消息结束前的状态和用量更新。
  • message_stop:事件流结束。

工具调用、扩展思考和上游能力可能产生其他事件。客户端应根据 event 或 data.type 分支处理,并安全忽略无法识别的事件;不要把完整 JSON 事件直接拼接成文本。

错误响应

常见状态码包括 400(请求参数错误)、401(认证失败)、429(请求频率限制)和 5xx(上游服务错误)。错误示例见上方状态码标签,响应保持 Anthropic 错误对象结构。

使用 x-api-key 时缺少 anthropic-version,或请求体缺少 model、messages、max_tokens,通常会收到 400。模型不可用、参数不兼容时,也应优先检查模型列表和目标模型能力。

results matching ""

    No results matching ""