原生 Claude API
/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 个)
| 参数 | 类型 | 默认值 | 说明 | 是否必填 |
|---|---|---|---|---|
model | string | — | 目标模型 ID。请使用当前账号可用的模型。 | 是 |
messages | array | — | 按时间顺序排列的对话消息。每条消息包含 role 和 content。 | 是 |
system | string / array | — | 系统提示词或系统内容块。 | 否 |
max_tokens | integer | — | 本次响应允许生成的最大 token 数,最小值为 1。 | 是 |
temperature | number | — | 采样温度,范围为 0 到 1。 | 否 |
top_p | number | — | 核采样参数。通常只调整 temperature 或 top_p 其中一个。 | 否 |
top_k | integer | — | 限制每一步采样时考虑的候选 token 数量。 | 否 |
stream | boolean | — | 是否使用 SSE 流式返回;未设置时默认非流式(false)。 | 否 |
stop_sequences | array<string> | — | 命中任一停止序列后结束生成。 | 否 |
tools | array | — | 声明 Claude 可以调用的工具。 | 否 |
tool_choice | object | — | 控制工具选择策略:auto、any 或指定 tool。 | 否 |
thinking | object | — | 配置扩展思考;是否支持取决于目标模型。 | 否 |
metadata | object | — | 请求元数据。当前 schema 列出 user_id 字段。 | 否 |
消息与内容块
messages 中每项的 role 为 user 或 assistant。content 可以是字符串,也可以是内容块数组。
消息与内容块字段
| 内容块类型 | 主要字段 | 用途 |
|---|---|---|
text | text | 文本输入或输出。 |
image | source | 图像输入,支持 Base64 或 URL。 |
tool_use | id、name、input | Claude 发起工具调用时返回。 |
tool_result | tool_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 个)
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 本次消息的唯一标识。 |
type | string | 响应对象类型,通常为 message。 |
role | string | 响应角色,通常为 assistant。 |
content | array | 响应内容块数组,文本位于 content[].text。 |
model | string | 实际生成响应的模型 ID。 |
stop_reason | string | 生成结束原因:end_turn、max_tokens、stop_sequence 或 tool_use。 |
usage | object | 本次请求的输入和输出 token 用量。 |
content[] 内容块
| 字段 | 类型 | 说明 |
|---|---|---|
type | string | 内容块类型,例如 text 或 tool_use。 |
text | string | type 为 text 时的文本内容。 |
id | string | tool_use 内容块的调用 ID。 |
name | string | tool_use 内容块调用的工具名称。 |
input | object | 传给工具的参数对象。 |
usage
| 字段 | 类型 | 说明 |
|---|---|---|
input_tokens | integer | 输入 token 数。 |
output_tokens | integer | 输出 token 数。 |
cache_creation_input_tokens | integer | 创建提示缓存时的输入 token 数;上游未返回时可能不存在。 |
cache_read_input_tokens | integer | 从提示缓存读取的输入 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。模型不可用、参数不兼容时,也应优先检查模型列表和目标模型能力。