Anthropic Messages API
通过 UniGateway 调用 Anthropic Messages API,使用 Claude 的原生扩展能力。
前置条件
- 已获取 UniGateway API Key,保存在环境变量
UNIGATEWAY_API_KEY中 - 已通过
GET /v1/models确认目标 Claude 模型在当前账号中可用
概述
- 端点:
POST /v1/messages - Base URL:
https://api.unigateway.ai/v1 - 请求头:
Authorization: Bearer <YOUR_UNIGATEWAY_API_KEY>Content-Type: application/jsonanthropic-version: 2023-06-01
UniGateway 在 POST /v1/messages 上代理 Anthropic Messages 协议。以下 Claude 特有扩展能力通过该接口可用:
thinking扩展推理块cache_control提示缓存- 细粒度的
stop_reason - PDF / 图像 / 引用 / 工具调用
请求
基本请求
curl https://api.unigateway.ai/v1/messages \
-H "Authorization: Bearer $UNIGATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "用一段话解释量子计算。"}
]
}'
参数
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model | string | 是 | 使用 GET /v1/models 返回的精确模型 ID |
messages | array | 是 | 消息数组,每条消息包含 role 和 content |
max_tokens | number | 是 | 最大输出 token 数 |
system | string / array | 否 | 系统提示;数组形式支持 cache_control |
tools | array | 否 | 可用工具列表 |
tool_choice | object / string | 否 | auto、any、none 或指定工具 |
thinking | object | 否 | 扩展推理配置 |
temperature | number | 否 | 输出随机性,范围 0–1 |
top_p | number | 否 | 核采样 |
top_k | number | 否 | Top-K 采样 |
stop_sequences | array | 否 | 停止字符串数组 |
stream | boolean | 否 | 是否启用 SSE 流式输出 |
metadata | object | 否 | 自定义元数据 |
Messages 格式
单条文本消息:
{
"role": "user",
"content": "用一段话解释量子计算。"
}
多模态 content 使用数组:
{
"role": "user",
"content": [
{"type": "text", "text": "描述这张图片。"},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}
]
}
支持的 content source 类型:
| 类型 | 说明 |
|---|---|
base64 | base64 编码数据,需指定 media_type |
url | 公开可访问的图片 URL |
PDF 通过 document 类型传入:
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": "JVBERi0xLjQK..."
}
}
扩展推理(Thinking)
启用 Claude 的扩展推理:
{
"model": "claude-sonnet-4-6",
"max_tokens": 4096,
"thinking": {
"type": "enabled",
"budget_tokens": 2048
},
"messages": [
{"role": "user", "content": "证明 sqrt(2) 是无理数。"}
]
}
| 字段 | 类型 | 说明 |
|---|---|---|
type | string | enabled 或 adaptive |
budget_tokens | number | 为推理过程分配的 token 预算 |
启用 thinking 后,响应中包含 thinking content block。max_tokens 必须大于 budget_tokens。
提示缓存(Prompt Caching)
在消息或工具定义上添加 cache_control 以减少重复输入成本:
{
"role": "user",
"content": [
{
"type": "text",
"text": "长文档或系统提示内容...",
"cache_control": {"type": "ephemeral"}
}
]
}
cache_control.type 当前仅支持 ephemeral。命中缓存会在响应 usage 中显示 cache_read_input_tokens 和 cache_creation_input_tokens。
工具调用
定义工具:
{
"tools": [
{
"name": "get_weather",
"description": "获取某地当前天气",
"input_schema": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称"
}
},
"required": ["location"]
}
}
]
}
工具选择策略:
{
"tool_choice": {"type": "auto"}
}
| 策略 | 说明 |
|---|---|
auto | 模型自行决定是否调用工具 |
any | 模型必须调用至少一个工具 |
none | 禁止调用工具 |
tool | 指定调用某一工具(需传 name) |
返回工具结果时,在 messages 中添加 role: user 的 tool_result 块:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01T1x1fJ34qAmk2tNTrN7Up6",
"content": "22°C, 晴"
}
]
}
响应
{
"id": "msg_01XgYfV9UTi2PJN",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4-6",
"content": [
{
"type": "text",
"text": "量子计算利用叠加态..."
}
],
"stop_reason": "end_turn",
"usage": {
"input_tokens": 14,
"output_tokens": 128
}
}
响应字段
| 字段 | 说明 |
|---|---|
id | 消息 ID |
type | 固定为 message |
role | 固定为 assistant |
content | content block 数组(text、thinking、tool_use) |
stop_reason | end_turn、max_tokens、stop_sequence、tool_use |
usage.input_tokens | 输入消耗的 token 数 |
usage.output_tokens | 模型生成的 token 数 |
流式输出
设置 stream: true 开启 SSE:
curl https://api.unigateway.ai/v1/messages \
-H "Authorization: Bearer $UNIGATEWAY_API_KEY" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "你好"}],
"stream": true
}'
SSE 事件类型包括 message_start、content_block_start、content_block_delta、content_block_stop、message_delta、message_stop。
错误处理
| 状态码 | 原因 | 处理方式 |
|---|---|---|
400 | 请求参数错误 | 检查 JSON 结构和参数类型 |
401 | API Key 无效或缺失 | 检查 Authorization 请求头 |
404 | 模型 ID 不存在 | 重新确认 GET /v1/models |
429 | 触发限流 | 增加退避并重试 |
529 | 模型过载 | 指数退避重试 |