文本生成(Anthropic Messages 协议)
接口概述
使用 Anthropic Messages 格式进行纯文本对话生成。该协议与 OpenAI Chat Completions 有几处关键差异,接入前请留意:
- 系统提示词走顶层
system参数,不是messages数组里的system角色。 max_tokens是必填参数,每个请求都要显式指定。- 开启思考模式时,响应里会多出
thinking类型的内容块;取正文时按content[].type过滤即可。
接口地址
POST https://ai.jw-info.com/v1/messages
请求头
| 请求头 | 是否必填 | 说明 |
|---|---|---|
| Content-Type | 是 | application/json |
| x-api-key | 是 | {API_KEY}(本协议原生认证头) |
| anthropic-version | 否(推荐) | API 版本号,如 2023-06-01;携带它可保证行为稳定 |
本平台同时接受
Authorization: Bearer {API_KEY}——与x-api-key是同一把密钥的两种传法,不需要建两套密钥。
请求参数
请求体(JSON):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
| model | string | 是 | - | 模型名称,见下方「可用模型」与模型广场 |
| messages | array | 是 | - | 对话消息列表,按时间顺序排列 |
| system | string / array | 否 | null | 系统提示词,定义 AI 的角色和行为;支持纯文本字符串或内容块数组 |
| max_tokens | integer | 是 | - | 生成的最大 token 数(必填) |
| temperature | float | 否 | 1.0 | 采样温度,范围 [0, 1];越接近 0 输出越确定 |
| top_p | float | 否 | null | 核采样,范围 [0, 1] |
| top_k | integer | 否 | null | 只保留概率最高的 top_k 个 token 参与采样 |
| stream | boolean | 否 | false | 是否启用流式输出(SSE) |
| stop_sequences | array | 否 | null | 停止词列表,遇到任一停止词即停止生成 |
| tools | array | 否 | null | 可用的工具/函数定义列表 |
| tool_choice | object | 否 | {"type": "auto"} | 工具选择策略 |
| thinking | object | 否 | null | 思考模式配置,如 {"type": "enabled", "budget_tokens": 1024} |
messages 结构
| 字段 | 类型 | 说明 |
|---|---|---|
| role | string | 消息角色:user / assistant |
| content | string / array | 消息内容,可以是纯文本字符串,也可以是内容块数组 |
| role | 说明 |
|---|---|
| user | 用户输入消息 |
| assistant | AI 历史回复消息,用于多轮对话 |
本协议没有
system角色:系统提示词一律通过顶层system传入。
请求示例
示例 1:简单对话
{
"model": "deepseek-v3.2",
"max_tokens": 1024,
"messages": [
{ "role": "user", "content": "你好,请用一句话介绍你自己" }
]
}
示例 2:带系统提示词的多轮对话
{
"model": "qwen3.7-max",
"system": "你是一个专业的 Python 编程助手,回答问题时请提供代码示例。",
"max_tokens": 2048,
"messages": [
{ "role": "user", "content": "如何在 Python 中读取 JSON 文件?" },
{ "role": "assistant", "content": "可以使用内置的 json 模块……" },
{ "role": "user", "content": "如果要写入 JSON 文件呢?" }
]
}
示例 3:开启思考模式
{
"model": "deepseek-v4-pro",
"system": "你是一个严谨的数学助手",
"max_tokens": 4096,
"thinking": { "type": "enabled", "budget_tokens": 1024 },
"messages": [
{ "role": "user", "content": "请证明根号 2 是无理数" }
]
}
思考模式需要模型本身支持;开启后响应里会有
thinking内容块,正文仍在text内容块里。
示例 4:流式输出
{
"model": "deepseek-v3.2",
"max_tokens": 512,
"messages": [
{ "role": "user", "content": "写一首关于秋天的五言诗" }
],
"stream": true
}
响应参数
非流式响应:
| 参数名 | 类型 | 说明 |
|---|---|---|
| id | string | 本次请求的唯一标识符 |
| type | string | 固定值 message |
| role | string | 固定值 assistant |
| model | string | 实际使用的模型名称 |
| content | array | 内容块数组 |
| content[].type | string | 内容类型:text(正文)/ thinking(思考过程)/ tool_use(工具调用) |
| content[].text | string | type 为 text 时的文本内容 |
| content[].thinking | string | type 为 thinking 时的思考内容(同块还带 signature 字段) |
| stop_reason | string | 停止原因:end_turn(正常结束)/ max_tokens(达到长度限制)/ stop_sequence(遇到停止词)/ tool_use(触发工具调用) |
| stop_sequence | string | 触发停止的停止词(仅 stop_reason 为 stop_sequence 时出现) |
| usage.input_tokens | integer | 输入消耗的 token 数 |
| usage.output_tokens | integer | 输出消耗的 token 数 |
| usage.cache_read_input_tokens | integer | 命中缓存的输入 token 数(计费按缓存价) |
流式响应事件(SSE)
请求体带 "stream": true 时按 SSE 返回,事件类型如下:
| 事件类型 | 说明 |
|---|---|
| message_start | 消息开始,含初始元数据(id、model、role) |
| content_block_start | 内容块开始,指示块类型(text / thinking / tool_use) |
| content_block_delta | 内容块增量,delta.text 为文本增量 |
| content_block_stop | 内容块结束 |
| message_delta | 消息增量,含 stop_reason 与最终 usage(input_tokens / output_tokens) |
| message_stop | 消息结束,流结束标记 |
message_start里的usage可能是空对象,最终用量以message_delta为准。
响应示例
非流式响应
{
"id": "msg_01AbCdEfGhIjKlMnOp",
"type": "message",
"role": "assistant",
"model": "deepseek-v3.2",
"content": [
{ "type": "text", "text": "你好!我是 DeepSeek,很高兴为你服务。" }
],
"stop_reason": "end_turn",
"usage": { "input_tokens": 15, "output_tokens": 22 }
}
开启思考模式的响应
{
"id": "msg_01XyZAbCdEfGhIjKl",
"type": "message",
"role": "assistant",
"model": "deepseek-v4-pro",
"content": [
{
"type": "thinking",
"thinking": "要证明根号 2 是无理数,我准备采用反证法……",
"signature": "abc123..."
},
{
"type": "text",
"text": "证明:假设 √2 是有理数……"
}
],
"stop_reason": "end_turn",
"usage": { "input_tokens": 25, "output_tokens": 512 }
}
流式响应(节选)
event: message_start
data: {"type":"message_start","message":{"id":"msg_01AbCdEf","type":"message","role":"assistant","model":"deepseek-v3.2","content":[],"usage":{}}}
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","stop_sequence":null},"usage":{"input_tokens":15,"output_tokens":5}}
event: message_stop
data: {"type":"message_stop"}
错误响应
统一返回 {"detail": "说明文字"}:
| HTTP | 常见情况 |
|---|---|
| 400 | 请求体格式错误或参数无效(例如漏传必填的 max_tokens) |
| 401 | API Key 无效、缺失或已禁用 |
| 402 | 账户余额不足 |
| 404 | 模型未上架或已停用 |
| 502 | 请求被模型拒绝,正文里带上模型给出的原始说明,其形状为 {"error": {"message": "...", "type": "invalid_request_error", "param": "...", "code": "..."}}(param 指出出错字段) |
完整状态码与排查建议见「错误码」页。
代码示例
cURL(非流式)
curl https://ai.jw-info.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: sk-你的密钥" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "deepseek-v3.2",
"max_tokens": 1024,
"system": "你是一个友好的助手",
"messages": [
{ "role": "user", "content": "你好,请介绍一下你自己" }
]
}'
cURL(流式)
curl https://ai.jw-info.com/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: sk-你的密钥" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "deepseek-v3.2",
"max_tokens": 512,
"stream": true,
"messages": [
{ "role": "user", "content": "讲一个笑话" }
]
}'
Python(非流式)
import requests
resp = requests.post(
"https://ai.jw-info.com/v1/messages",
headers={
"Content-Type": "application/json",
"x-api-key": "sk-你的密钥",
"anthropic-version": "2023-06-01",
},
json={
"model": "deepseek-v3.2",
"max_tokens": 1024,
"system": "你是一个友好的助手",
"messages": [{"role": "user", "content": "你好,请介绍一下你自己"}],
},
)
data = resp.json()
if resp.status_code == 200:
for block in data["content"]:
if block["type"] == "text":
print(block["text"])
print("输入 token:", data["usage"]["input_tokens"])
print("输出 token:", data["usage"]["output_tokens"])
print("停止原因:", data["stop_reason"])
else:
print("错误:", data.get("detail", "未知错误"))
Python(流式)
import json
import requests
resp = requests.post(
"https://ai.jw-info.com/v1/messages",
headers={
"Content-Type": "application/json",
"x-api-key": "sk-你的密钥",
"anthropic-version": "2023-06-01",
},
json={
"model": "deepseek-v3.2",
"max_tokens": 512,
"messages": [{"role": "user", "content": "写一首关于春天的诗"}],
"stream": True,
},
stream=True,
)
for line in resp.iter_lines():
if not line or not line.startswith(b"data:"):
continue
event = json.loads(line[5:].strip())
if event.get("type") == "content_block_delta":
print(event["delta"].get("text", ""), end="", flush=True)
elif event.get("type") == "message_delta":
print("\n用量:", event.get("usage"))
可用模型
以下模型已实测支持本协议(模型名照模型广场的写法传入):
| 厂商 | 模型名 | 说明 |
|---|---|---|
| 通义千问 | qwen3.7-max | 旗舰模型,综合能力最强 |
| 通义千问 | qwen3.6-27b | 27B 参数模型,能力均衡 |
| 通义千问 | qwen3.6-35b-a3b | 35B 总参 / 3B 激活的 MoE 模型 |
| 通义千问 | qwen3-max | 通义千问 3 代旗舰模型 |
| 通义千问 | qwen-plus | 增强版,性价比之选 |
| 通义千问 | qwen3-coder-plus | 编程专用增强版 |
| DeepSeek | deepseek-v4-pro | DeepSeek V4 旗舰版 |
| DeepSeek | deepseek-v4-flash | DeepSeek V4 轻量极速版 |
| DeepSeek | deepseek-v3.2 | DeepSeek V3.2 版本 |
| DeepSeek | deepseek-r1 | DeepSeek 推理增强模型 |
| DeepSeek | deepseek-r1-0528 | DeepSeek R1 的 0528 版本 |
| 智谱AI | glm-5.2 | GLM-5.2 旗舰模型 |
| 智谱AI | glm-5.1 | GLM-5.1 版本 |
| 智谱AI | glm-5.0 | GLM-5.0 版本 |
| 智谱AI | glm-5-turbo | GLM-5 速度版 |
| MiniMax | minimax-m2.7 | MiniMax M2.7 版本 |
| MiniMax | minimax-m2.5 | MiniMax M2.5 版本 |
| 豆包 | doubao1.5-pro-32k | 豆包 1.5 Pro 32K 上下文版本 |
模型支持范围
本协议由模型侧支持,不是所有文本模型都支持(2026-09-17 全量实测:90 支文本模型里 73 支可用)。不支持的多为较早的第三方开源型号(如 qwen3-4b / qwen3-8b / qwen3-14b、deepseek-r1-distill-* 等),调用会返回 401 并提示「该模型不支持 anthropic 协议」——改用 /v1/chat/completions 调同一个模型即可,模型名与计费都不变。
计费
- 按输入 / 输出 token 计费,与
/v1/chat/completions同模型同价格:输入分「未命中缓存」与「命中缓存」两档单价,输出按输出单价。 - 非流式在响应返回时结算;流式在流结束时按最终 usage 结算。
- 账户余额不足时调用前直接返回
402,请管理员在控制台「费用中心」手工授信。 - 响应本身不返回费用信息,每次费用记入控制台「费用中心」。