大模型服务平台 TokenHub Anthropic Message 协议字段说明

// 字符串”system”: “你是一个友好的助手”// 内容块数组(可携带 cache_control)”system”: [ { “type”: “text”, “text”: “你是一个友好的助手” }, { “type”: “text”, “text”: “<长文档>“, “cache_control”: { “type”: “ephemeral” } }]。

相关产品
大模型服务平台 TokenHub 产品页,含版本规格、价格与购买入口。

三、基础参数

参数 类型 必选 说明
model string 是 要使用的模型名称,如 hy3。也支持 Claude 系列及其他 Anthropic 兼容模型名。需要图像输入时,请选择支持视觉能力的模型(如 glm-5.3-flash)。
messages array 是 对话消息列表,按时间顺序排列,含完整上下文。平台不做会话管理,多轮对话需由客户端完整携带历史。详情请参见 Message 对象详解。
system string 或 array 否 系统提示词。不在 messages 内,通过顶层 system 字段单独传入。这是与 OpenAI Chat 协议的关键区别。
max_tokens integer 是 模型单次输出的最大 Token 数上限。不同模型有各自上限;思维链消耗的 Token 计入此限制,因此开启 thinking 时须大于 budget_tokens。达到上限时 stop_reason 为 "max_tokens"。
stream boolean 否 是否启用流式响应(默认 false)。true 时以 SSE 格式逐事件返回。

system 支持两种形式:

注意:说明:

注意:关于 max_tokens:Anthropic 协议中该字段为必填。部分模型对缺失或非法 max_tokens 会做宽松兜底处理,但请始终按协议标准显式传入该字段,不要依赖兜底行为。

四、生成控制参数

参数 类型 范围 说明
temperature float [0, 1] 采样温度。注意 Anthropic 范围为 [0, 1],与 OpenAI 的 [0, 2] 不同。
top_p float (0, 1] 核采样。一般 temperature 与 top_p 只调其中一个。
top_k integer – 只从概率最高的前 K 个 token 中采样。Anthropic 特有参数,OpenAI Chat 协议无此字段。
stop_sequences string[] – 自定义停止序列。命中任一序列时立即停止,stop_reason 为 "stop_sequence",命中的序列回写在响应的 stop_sequence 字段。

注意:说明:

注意:关于 thinking 与 temperature:开启 thinking 时,部分模型要求 temperature 固定为 1;也有模型会容忍 temperature != 1。建议 thinking 场景使用默认值或 1,是否强校验按模型而定。
关于 stop_sequences:部分模型能稳定回写 stop_reason=stop_sequence 与命中的 stop_sequence,部分模型不保证回写。依赖精确停止语义的业务应针对目标模型验证。

五、工具调用

Anthropic 的工具定义结构与 OpenAI 不同:字段直接平铺,参数字段名为 input_schema(OpenAI 为 function.parameters)。

{ "name": "get_weather", "description": "查询指定城市的天气信息", "input_schema": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称" } }, "required": ["location"] }}

字段 类型 必填 说明
name string 是 工具名称。
description string 否 工具用途描述,帮助模型判断何时调用。
input_schema object 是 参数定义,遵循 JSON Schema 格式。
type string 否 普通工具留空;内置工具填类型名(如 web_search_20250305)。
max_uses integer 否 内置工具单次会话最大调用次数。
cache_control object 否 工具定义级缓存标记。

tool_choice(Anthropic 用对象形式):

Anthropic tool_choice 等价 OpenAI 说明
{"type":"auto"} "auto" 默认,模型自行决定
{"type":"any"} "required" 强制调用任一工具
{"type":"none"} "none" 禁止调用工具
{"type":"tool","name":"x"} {"type":"function","function":{"name":"x"}} 强制调用指定工具

可选子字段 disable_parallel_tool_use(boolean):设为 true 时禁止单次响应并行调用多个工具。

注意:与 thinking 的组合限制:开启或默认进入 thinking 模式时,部分模型不支持强制工具调用(tool_choice:any 与 tool_choice:tool),通常仅支持 auto / none 与 thinking 共用。如需强制工具调用,建议先显式传 thinking: {"type":"disabled"} 再使用 any 或指定工具。各模型的具体差异见 各模型字段兼容情况。

六、思维链(Extended Thinking)

启用扩展思维链,让模型在生成最终回复前先进行内部推理,适用于复杂逻辑、数学、代码等任务。

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

字段 类型 必填 说明
type string 是 "enabled" 开启 / "disabled" 关闭 / "adaptive" 自适应。
budget_tokens integer 视情况 enabled 时建议提供,思维链 token 预算(建议 1024~32000),须小于 max_tokens。
display string 否 思维过程展示方式(部分模型支持)。

不同 type 的字段要求:enabled 携带 budget_tokens(及可选 display);disabled 仅 type;adaptive 携带 type(及可选 display),由模型自适应分配预算。

注意:说明:

注意:模型差异:部分推理模型在不传 thinking 时也会默认返回 thinking block;部分模型会容忍缺失 budget_tokens、budget_tokens >= max_tokens 或 temperature != 1 等非严格约束。这类属于模型/平台兼容行为,不应当作所有模型的通用契约。如不希望返回思考内容,建议显式传 thinking: {"type":"disabled"}。
与 OpenAI 兼容参数的关系:部分厂商文档会使用 enable_thinking、reasoning_effort 等字段描述思考能力。在 Anthropic Messages 协议中,对应表达为 thinking.type、output_config.effort,以及多轮历史中原样回传 assistant 的 thinking / redacted_thinking 内容块;不要在 Messages 请求体中直接混用 enable_thinking。

交错思维链(Interleaved Thinking):部分模型支持在生成回复过程中穿插思维内容。混元等模型通过请求头 Hunyuan-Beta 开启,平台会将该头透传给模型服务。该请求头属扩展能力,不支持的模型会忽略该头而不报错;是否实际生效需结合所用模型的能力说明确认。

七、输出配置

output_config(object):控制输出努力程度与结构化格式。

{ "output_config": { "effort": "high", "format": { "type": "json_schema", "schema": { "type": "object", "properties": { "answer": { "type": "string" } } } } }}

字段 类型 说明
effort string 输出努力程度:low / medium / high / xhigh / max。
format.type string 结构化输出类型(如 json_schema)。
format.schema object JSON Schema 定义。

注意:说明:

注意:该字段为扩展能力,各厂商支持情况不一:output_config.effort 多数模型可接收;output_config.format.type=json_schema 的结构化输出仅部分模型能稳定按 schema 生成 JSON,部分模型返回 200 但 JSON 不完全符合 schema,也有模型返回 400。不要将 json_schema 当作所有模型的通用能力,使用前请针对目标模型验证。

八、缓存(Prompt Caching)

通过 cache_control 标记可缓存内容,命中后大幅降低重复 prompt 的 input_tokens 计费。支持三个层级标记:

层级 标记位置 说明
工具级 tools[n].cache_control 缓存工具定义
系统级 system[n].cache_control 缓存 system 内容块
消息/内容块级 messages[n].content[m].cache_control 缓存历史消息或内容块

cache_control 对象结构:

{ "type": "ephemeral" } // 默认 5 分钟 TTL{ "type": "ephemeral", "ttl": "1h" } // 1 小时 TTL

缓存命中情况通过响应 usage 中的 cache_creation_input_tokens、cache_read_input_tokens 返回。若模型不支持缓存,相关 token 统计为 0。

注意:说明:

注意:能力说明:多数模型可观察到部分 cache token,但顶层 cache_control、文档块级 cache、ttl:"1h" 明细、cache_creation.ephemeral_1h_input_tokens 等普遍不完整。建议按“部分支持 Prompt Caching” 理解,不要依赖完整的 Anthropic TTL / usage 明细。

九、元信息与服务层级

metadata(object):请求元信息,metadata.user_id(string)为终端用户唯一标识,用于滥用检测、用量归因。

service_tier(string):服务层级 / TPM 保障渠道标识,响应中会回写实际命中的层级。

取值 说明
auto 自动选择
standard 标准层级
priority 优先层级(更高保障)
batch 批处理层级

十、请求头

请求头 必填 说明
x-api-key 是 API Key(Anthropic 习惯);平台同时兼容 Authorization: Bearer <key>。
anthropic-version 是 API 版本,固定 2023-06-01。
content-type 是 application/json
anthropic-beta 否 beta 功能开关(如 prompt-caching、interleaved-thinking 等),平台原样透传给模型服务。

十一、Message 对象详解

messages 数组中的每个元素代表对话中的一条消息。

role 枚举:

role 含义 使用位置
user 人类用户的输入(含工具结果 tool_result) 奇数轮对话。
assistant 模型的历史回复(可含 text / thinking / tool_use) 偶数轮对话,多轮时需携带历史。

注意:说明:

注意:关键差异:Anthropic 协议没有独立的 tool role。工具执行结果以 user 消息中的 tool_result 内容块表达,且紧跟在对应 assistant 的 tool_use 之后。这与 OpenAI Chat 协议(独立 tool role)不同。system 不在 messages 内,通过顶层 system 字段传入。

content 格式:支持字符串与内容块数组两种形式。

// 字符串{ "role": "user", "content": "你好" }// 内容块数组{ "role": "user", "content": [ { "type": "text", "text": "这张图片里有什么?" }, { "type": "image", "source": { "type": "url", "url": "https://example.com/img.jpg" } } ]}

content block 类型:

block type 关键字段 适用 role 说明
text text、cache_control user / assistant 文本内容
image source user 图片
video source user 视频
document source、title、context、citations、cache_control user 文档输入与引用
search_result source、title、content、citations user 搜索结果内容块
tool_use id、name、input assistant 模型请求调用工具
tool_result tool_use_id、content user 工具执行结果
thinking thinking、signature assistant 思维链内容
redacted_thinking data assistant 加密思维链

注意:说明:

注意:能力说明:text、tool_use、文本 tool_result、thinking 在支持相应能力的模型上整体可用。image block 需使用明确支持视觉/多模态的模型;纯文本模型会返回 400。document 多数模型可接收但不返回 citations;search_result 当前模型普遍不支持。

多模态 block:

图片块(type: "image"):

// Base64{ "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "/9j/4AAQ…" } }// URL{ "type": "image", "source": { "type": "url", "url": "https://example.com/photo.jpg" } }

source 字段 类型 说明
type string "base64" 或 "url"。
media_type string base64 时必填,如 image/jpeg、image/png、image/gif、image/webp。
data string base64 时的图片数据。
url string url 时的图片地址。
detail string low / high / auto,图像分析精度。

注意:说明:

注意:能力说明:需要图片理解时应使用明确支持视觉/多模态(VL)的模型,并在模型能力说明中单独确认;纯文本模型对 image block 返回 400。

文档块(type: "document"):source(支持文本、base64、URL 等)、title、context、citations、cache_control。多数模型可接收文档请求(返回 200),但响应不包含 citations,适合作为普通上下文降级处理,不应承诺 Anthropic 引用能力。

搜索结果块(type: "search_result"):用于把外部搜索结果作为带来源的内容块交给模型,通常配合 citations 使用。当前模型普遍返回 400,不支持该 content block。

视频块(type: "video"):结构与图片块一致,source 额外支持 fps(采样帧率)字段。视频理解为各厂商扩展能力,并非 Anthropic 原生支持。

工具相关 block:

tool_use(assistant 消息)——模型请求调用工具时携带:

{ "type": "tool_use", "id": "toolu_001", "name": "get_weather", "input": { "location": "北京" } }

字段 类型 说明
id string 工具调用唯一 ID,需在对应 tool_result 中回传。
name string 调用的工具名称。
input object 工具参数(对象,非 JSON 字符串,与 OpenAI 的 arguments 字符串不同)。

tool_result(user 消息)——工具执行后,结果以 tool_result 块放入 user 消息:

{ "type": "tool_result", "tool_use_id": "toolu_001", "content": "北京今天晴天,25度" }

字段 类型 说明
tool_use_id string 对应 tool_use.id。
content string 或 array 工具结果,可为纯文本或内容块数组(支持文本+图片)。
is_error boolean 工具执行失败时设为 true。
cache_control object 缓存标记。

注意:排列要求:同一 assistant 轮次产生的所有 tool_result,必须放在同一条紧随其后的 user 消息中。图片类型的 tool_result.content 仅部分多模态模型支持。

思维链相关 block:

thinking(assistant 消息):

{ "type": "thinking", "thinking": "让我逐步分析:外层 n 次,内层 log n 次…", "signature": "EqoBCkgIARgC…" }

字段 类型 说明
thinking string 模型的推理过程文本
signature string 思维块完整性签名

注意:多轮回传要求:多轮对话时,assistant 历史消息中的 thinking 块必须原样携带 signature 回传,否则服务返回 400 Invalid signature。signature 是加密凭证,不能截断或修改。该校验语义主要适用于 Claude 系列模型;其他模型以自有协议承载思维链时,回传要求以对应模型的说明为准。部分模型(如 hy3)不返回 signature,此时多轮对话无需回传该字段。

redacted_thinking(assistant 消息):部分思维内容因安全原因被加密,以 { "type": "redacted_thinking", "data": "<加密数据>" } 返回,仅含 data 字段。多轮对话时需按原顺序全部回传,以维持上下文续写能力。该内容块主要出现在 Claude 系列模型,其他模型通常不返回。

十三、非流式响应

{ "id": "msg_xxx", "type": "message", "role": "assistant", "model": "<your-model-name>", "content": [ { "type": "thinking", "thinking": "…", "signature": "…" }, { "type": "text", "text": "回复内容" }, { "type": "tool_use", "id": "toolu_xxx", "name": "get_weather", "input": { "location": "北京" } } ], "stop_reason": "end_turn", "stop_sequence": null, "usage": { "input_tokens": 12, "output_tokens": 6, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0 }, "service_tier": "standard"}

字段 类型 说明
id string 响应唯一标识(msg_ 前缀)。
type string 固定 "message"。
role string 固定 "assistant"。
model string 实际使用的模型名称。
content array 内容块数组,顺序通常为 thinking → text → tool_use。
stop_reason string 停止原因,见下方枚举。
stop_sequence string 或 null 命中的停止序列(命中 stop_sequences 时)。
usage object Token 用量,请参见 Token 用量。
container object 代码执行容器信息(id、expires_at),仅用到 code_execution 内置工具时返回。
service_tier string 实际命中的服务层级。

注意:说明:

注意:请求追踪 ID:排查日志时优先使用响应体 id;流式响应优先使用 message_start 事件的 data.message.id。平台会同时透传/生成客户端请求头中的 X-Request-Id / X-Tc-Requestid,但最终有效的模型响应 ID 以 message id 为准。

十四、流式响应(SSE)

stream: true 时返回 SSE,响应头 Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive。

标准事件顺序:

message_start → content_block_start → content_block_delta(多次) → content_block_stop (第 1 个块) → content_block_start → content_block_delta(多次) → content_block_stop (第 2 个块) … → message_delta → message_stop

辅助事件:ping(保活心跳)、error(错误)。每个 SSE 帧格式为 event: <类型> + data: {json}。

主要事件说明:

事件 含义 关键字段
message_start 消息开始,返回初始 message 骨架 message(含初始 usage 的 input/cache)
content_block_start 一个内容块开始 index、content_block(type 为 text/thinking/tool_use)
content_block_delta 内容增量 index、delta(见下表)
content_block_stop 一个内容块结束 index
message_delta 消息级增量 delta.stop_reason、usage(最终 output_tokens)
message_stop 消息结束 –

content_block_delta.delta 类型:

delta.type 字段 含义
text_delta text 文本增量。
thinking_delta thinking 思维过程增量。
signature_delta signature 思维块完整性签名(在 thinking 块结束前下发)。
input_json_delta partial_json 工具参数 JSON 片段,需累积后整体解析。

注意:说明:

注意:流式错误处理:若在发送响应头(HTTP 200)之前发生错误,返回标准 JSON 错误体或触发故障转移重试;若流已开始后发生错误,以 error 事件下发或直接关闭连接,客户端需通过连接异常感知。
能力说明:基础 SSE 事件在支持相应能力的模型上均可用;citations_delta 当前普遍不返回。流式工具参数(input_json_delta)在部分模型上需先显式关闭 thinking 才可用。

十五、stop_reason 枚举

值 含义 处理建议
end_turn 模型正常结束 正常处理。
max_tokens 达到 max_tokens 限制,输出被截断 增大 max_tokens 或分段生成。
stop_sequence 命中 stop_sequences 检查命中的 stop_sequence 字段。
tool_use 模型请求调用工具 执行工具,将结果以 tool_result 回传继续对话。
pause_turn server tool 长轮次暂停 原样回传当前内容继续请求以恢复。
refusal 模型因安全原因拒答 检查输入是否触发安全策略。

十六、Token 用量(usage)

字段 类型 说明
input_tokens integer 净输入 token(不含缓存读写部分)
output_tokens integer 输出 token(含 thinking 内容)
cache_creation_input_tokens integer 写入缓存的 token 数
cache_read_input_tokens integer 命中缓存读取的 token 数(计费大幅降低)
cache_creation.ephemeral_5m_input_tokens integer 5 分钟 TTL 缓存创建 token(分 TTL 明细)
cache_creation.ephemeral_1h_input_tokens integer 1 小时 TTL 缓存创建 token(分 TTL 明细)
server_tool_use.web_search_requests integer 内置 web_search 调用次数
server_tool_use.web_fetch_requests integer 内置 web_fetch 调用次数
service_tier string 实际命中的服务层级

注意:说明:

注意:input_tokens 互斥规则:Anthropic 规范中 input_tokens、cache_read_input_tokens、cache_creation_input_tokens 三者互斥,真实总输入 = 三者之和。计算成本时需将三项相加,不要只看 input_tokens。
流式响应中,message_start 事件给出初始的 input_tokens 与缓存 token;message_delta 事件给出最终的 output_tokens。

十七、典型场景示例

注意:说明:

注意:所有示例统一请求入口:POST /v1/messages,需带 anthropic-version 与 x-api-key 头。以下 ${BASE_URL} 取 https://tokenhub.tencentmaas.com。

十八、示例:基础对话

cURLPythonNode.jsJavaGocurl -s -X POST "${BASE_URL}/v1/messages" \\ -H 'Content-Type: application/json' \\ -H 'anthropic-version: 2023-06-01' \\ -H "x-api-key: ${API_KEY}" \\ -d '{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "你好" }], "max_tokens": 1024 }'import requestsresp = requests.post( "https://tokenhub.tencentmaas.com/v1/messages", headers={ "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, json={ "model": "<your-model-name>", "messages": [{"role": "user", "content": "你好"}], "max_tokens": 1024, },)print(resp.json())const resp = await fetch("https://tokenhub.tencentmaas.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, body: JSON.stringify({ model: "<your-model-name>", messages: [{ role: "user", content: "你好" }], max_tokens: 1024, }),});console.log(await resp.json());import okhttp3.*;public class BasicMessage { public static void main(String[] args) throws Exception { String body = """ { "model": "<your-model-name>", "messages": [{ "role": "user", "content": "你好" }], "max_tokens": 1024 } """; Request request = new Request.Builder() .url("https://tokenhub.tencentmaas.com/v1/messages") .header("Content-Type", "application/json") .header("anthropic-version", "2023-06-01") .header("x-api-key", "YOUR_API_KEY") .post(RequestBody.create(body, MediaType.parse("application/json"))) .build(); try (Response response = new OkHttpClient().newCall(request).execute()) { System.out.println(response.body().string()); } }}package mainimport ( "fmt" "io" "net/http" "strings")func main() { body := `{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "你好" }], "max_tokens": 1024}` req, _ := http.NewRequest("POST", "https://tokenhub.tencentmaas.com/v1/messages", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") req.Header.Set("anthropic-version", "2023-06-01") req.Header.Set("x-api-key", "YOUR_API_KEY") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() data, _ := io.ReadAll(resp.Body) fmt.Println(string(data))}

十九、示例:带 system + 流式

cURLPythonNode.jsJavaGocurl -s -N -X POST "${BASE_URL}/v1/messages" \\ -H 'Content-Type: application/json' \\ -H 'anthropic-version: 2023-06-01' \\ -H "x-api-key: ${API_KEY}" \\ -d '{ "model": "<your-model-name>", "system": [{ "type": "text", "text": "你是一个友好的助手" }], "messages": [{ "role": "user", "content": "1+1等于几?" }], "max_tokens": 1024, "stream": true }'import requestsresp = requests.post( "https://tokenhub.tencentmaas.com/v1/messages", headers={ "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, json={ "model": "<your-model-name>", "system": [{"type": "text", "text": "你是一个友好的助手"}], "messages": [{"role": "user", "content": "1+1等于几?"}], "max_tokens": 1024, "stream": True, }, stream=True,)for line in resp.iter_lines(decode_unicode=True): if line: print(line)const resp = await fetch("https://tokenhub.tencentmaas.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, body: JSON.stringify({ model: "<your-model-name>", system: [{ type: "text", text: "你是一个友好的助手" }], messages: [{ role: "user", content: "1+1等于几?" }], max_tokens: 1024, stream: true, }),});const reader = resp.body.getReader();const decoder = new TextDecoder();while (true) { const { done, value } = await reader.read(); if (done) break; process.stdout.write(decoder.decode(value));}import okhttp3.*;import java.io.BufferedReader;import java.io.InputStreamReader;public class SystemStream { public static void main(String[] args) throws Exception { String body = """ { "model": "<your-model-name>", "system": [{ "type": "text", "text": "你是一个友好的助手" }], "messages": [{ "role": "user", "content": "1+1等于几?" }], "max_tokens": 1024, "stream": true } """; Request request = new Request.Builder() .url("https://tokenhub.tencentmaas.com/v1/messages") .header("Content-Type", "application/json") .header("anthropic-version", "2023-06-01") .header("x-api-key", "YOUR_API_KEY") .post(RequestBody.create(body, MediaType.parse("application/json"))) .build(); try (Response response = new OkHttpClient().newCall(request).execute(); BufferedReader reader = new BufferedReader( new InputStreamReader(response.body().byteStream()))) { String line; while ((line = reader.readLine()) != null) { if (!line.isEmpty()) System.out.println(line); } } }}package mainimport ( "bufio" "fmt" "net/http" "strings")func main() { body := `{ "model": "<your-model-name>", "system": [{ "type": "text", "text": "你是一个友好的助手" }], "messages": [{ "role": "user", "content": "1+1等于几?" }], "max_tokens": 1024, "stream": true}` req, _ := http.NewRequest("POST", "https://tokenhub.tencentmaas.com/v1/messages", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") req.Header.Set("anthropic-version", "2023-06-01") req.Header.Set("x-api-key", "YOUR_API_KEY") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() scanner := bufio.NewScanner(resp.Body) for scanner.Scan() { if line := scanner.Text(); line != "" { fmt.Println(line) } }}

期望 SSE 事件链:message_start → content_block_start → content_block_delta → content_block_stop → message_delta → message_stop。

20、示例:多轮对话

多轮对话需完整携带历史消息(平台不做会话管理):

{ "model": "<your-model-name>", "messages": [ { "role": "user", "content": "如何读取 CSV 文件?" }, { "role": "assistant", "content": "使用 pandas:pd.read_csv('file.csv')" }, { "role": "user", "content": "如果文件很大内存放不下怎么办?" } ], "max_tokens": 1024}

21、示例:多模态(图片理解)

理解图片(URL):

{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": [ { "type": "text", "text": "请详细描述图中的场景" }, { "type": "image", "source": { "type": "url", "url": "https://example.com/photo.jpg" } } ] }], "max_tokens": 1024}

Base64 图片:

{ "role": "user", "content": [ { "type": "text", "text": "识别图中的文字" }, { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": "/9j/4AAQSkZJRgAB…" } } ]}

22、示例:工具调用

cURLPythonNode.jsJavaGocurl -s -X POST "${BASE_URL}/v1/messages" \\ -H 'Content-Type: application/json' \\ -H 'anthropic-version: 2023-06-01' \\ -H "x-api-key: ${API_KEY}" \\ -d '{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "北京今天天气怎么样?" }], "max_tokens": 1024, "tools": [{ "name": "get_weather", "description": "查询指定城市的天气信息", "input_schema": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称" } }, "required": ["location"] } }], "tool_choice": { "type": "auto" } }'import requestsresp = requests.post( "https://tokenhub.tencentmaas.com/v1/messages", headers={ "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, json={ "model": "<your-model-name>", "messages": [{"role": "user", "content": "北京今天天气怎么样?"}], "max_tokens": 1024, "tools": [ { "name": "get_weather", "description": "查询指定城市的天气信息", "input_schema": { "type": "object", "properties": {"location": {"type": "string", "description": "城市名称"}}, "required": ["location"], }, } ], "tool_choice": {"type": "auto"}, },)print(resp.json())const resp = await fetch("https://tokenhub.tencentmaas.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, body: JSON.stringify({ model: "<your-model-name>", messages: [{ role: "user", content: "北京今天天气怎么样?" }], max_tokens: 1024, tools: [ { name: "get_weather", description: "查询指定城市的天气信息", input_schema: { type: "object", properties: { location: { type: "string", description: "城市名称" } }, required: ["location"], }, }, ], tool_choice: { type: "auto" }, }),});console.log(await resp.json());import okhttp3.*;public class ToolUse { public static void main(String[] args) throws Exception { String body = """ { "model": "<your-model-name>", "messages": [{ "role": "user", "content": "北京今天天气怎么样?" }], "max_tokens": 1024, "tools": [{ "name": "get_weather", "description": "查询指定城市的天气信息", "input_schema": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称" } }, "required": ["location"] } }], "tool_choice": { "type": "auto" } } """; Request request = new Request.Builder() .url("https://tokenhub.tencentmaas.com/v1/messages") .header("Content-Type", "application/json") .header("anthropic-version", "2023-06-01") .header("x-api-key", "YOUR_API_KEY") .post(RequestBody.create(body, MediaType.parse("application/json"))) .build(); try (Response response = new OkHttpClient().newCall(request).execute()) { System.out.println(response.body().string()); } }}package mainimport ( "fmt" "io" "net/http" "strings")func main() { body := `{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "北京今天天气怎么样?" }], "max_tokens": 1024, "tools": [{ "name": "get_weather", "description": "查询指定城市的天气信息", "input_schema": { "type": "object", "properties": { "location": { "type": "string", "description": "城市名称" } }, "required": ["location"] } }], "tool_choice": { "type": "auto" }}` req, _ := http.NewRequest("POST", "https://tokenhub.tencentmaas.com/v1/messages", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") req.Header.Set("anthropic-version", "2023-06-01") req.Header.Set("x-api-key", "YOUR_API_KEY") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() data, _ := io.ReadAll(resp.Body) fmt.Println(string(data))}

模型返回 tool_use 后,客户端执行工具并以 tool_result(放入 user 消息)回传:

{ "model": "<your-model-name>", "messages": [ { "role": "user", "content": "北京今天天气怎么样?" }, { "role": "assistant", "content": [ { "type": "tool_use", "id": "toolu_001", "name": "get_weather", "input": { "location": "北京" } } ]}, { "role": "user", "content": [ { "type": "tool_result", "tool_use_id": "toolu_001", "content": "北京今天晴天,25度" } ]} ], "max_tokens": 1024, "tools": [{ "name": "get_weather", "description": "查询天气", "input_schema": { "type": "object", "properties": { "location": { "type": "string" } }, "required": ["location"] } }]}

23、示例:思维链

cURLPythonNode.jsJavaGocurl -s -X POST "${BASE_URL}/v1/messages" \\ -H 'Content-Type: application/json' \\ -H 'anthropic-version: 2023-06-01' \\ -H "x-api-key: ${API_KEY}" \\ -d '{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "请解释什么是递归" }], "max_tokens": 4096, "thinking": { "type": "enabled", "budget_tokens": 2048 } }'import requestsresp = requests.post( "https://tokenhub.tencentmaas.com/v1/messages", headers={ "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, json={ "model": "<your-model-name>", "messages": [{"role": "user", "content": "请解释什么是递归"}], "max_tokens": 4096, "thinking": {"type": "enabled", "budget_tokens": 2048}, },)print(resp.json())const resp = await fetch("https://tokenhub.tencentmaas.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, body: JSON.stringify({ model: "<your-model-name>", messages: [{ role: "user", content: "请解释什么是递归" }], max_tokens: 4096, thinking: { type: "enabled", budget_tokens: 2048 }, }),});console.log(await resp.json());import okhttp3.*;public class Thinking { public static void main(String[] args) throws Exception { String body = """ { "model": "<your-model-name>", "messages": [{ "role": "user", "content": "请解释什么是递归" }], "max_tokens": 4096, "thinking": { "type": "enabled", "budget_tokens": 2048 } } """; Request request = new Request.Builder() .url("https://tokenhub.tencentmaas.com/v1/messages") .header("Content-Type", "application/json") .header("anthropic-version", "2023-06-01") .header("x-api-key", "YOUR_API_KEY") .post(RequestBody.create(body, MediaType.parse("application/json"))) .build(); try (Response response = new OkHttpClient().newCall(request).execute()) { System.out.println(response.body().string()); } }}package mainimport ( "fmt" "io" "net/http" "strings")func main() { body := `{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "请解释什么是递归" }], "max_tokens": 4096, "thinking": { "type": "enabled", "budget_tokens": 2048 }}` req, _ := http.NewRequest("POST", "https://tokenhub.tencentmaas.com/v1/messages", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") req.Header.Set("anthropic-version", "2023-06-01") req.Header.Set("x-api-key", "YOUR_API_KEY") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() data, _ := io.ReadAll(resp.Body) fmt.Println(string(data))}

响应 content 中会包含 thinking 块(带 signature)与 text 块。注意 max_tokens 须大于 budget_tokens。

24、示例:多轮思维链(携带 signature)

多轮对话时,必须将上一轮 assistant 的 thinking 块连同 signature 原样回传:

{ "model": "<your-model-name>", "messages": [ { "role": "user", "content": "分析这段代码复杂度" }, { "role": "assistant", "content": [ { "type": "thinking", "thinking": "外层 n 次内层 log n 次…", "signature": "EqoBCkgIARgC…" }, { "type": "text", "text": "O(n log n)" } ]}, { "role": "user", "content": "如何优化成 O(n)?" } ], "max_tokens": 4096, "thinking": { "type": "enabled", "budget_tokens": 2048 }}

注意:关键:signature 必须原样保留回传,否则服务报 400 Invalid signature。

25、示例:内置工具(web_search)

cURLPythonNode.jsJavaGocurl -s -X POST "${BASE_URL}/v1/messages" \\ -H 'Content-Type: application/json' \\ -H 'anthropic-version: 2023-06-01' \\ -H "x-api-key: ${API_KEY}" \\ -d '{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "2026年有哪些新大模型?" }], "max_tokens": 2048, "tools": [{ "type": "web_search_20250305", "name": "web_search", "max_uses": 3 }] }'import requestsresp = requests.post( "https://tokenhub.tencentmaas.com/v1/messages", headers={ "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, json={ "model": "<your-model-name>", "messages": [{"role": "user", "content": "2026年有哪些新大模型?"}], "max_tokens": 2048, "tools": [{"type": "web_search_20250305", "name": "web_search", "max_uses": 3}], },)print(resp.json())const resp = await fetch("https://tokenhub.tencentmaas.com/v1/messages", { method: "POST", headers: { "Content-Type": "application/json", "anthropic-version": "2023-06-01", "x-api-key": "YOUR_API_KEY", }, body: JSON.stringify({ model: "<your-model-name>", messages: [{ role: "user", content: "2026年有哪些新大模型?" }], max_tokens: 2048, tools: [{ type: "web_search_20250305", name: "web_search", max_uses: 3 }], }),});console.log(await resp.json());import okhttp3.*;public class BuiltinTool { public static void main(String[] args) throws Exception { String body = """ { "model": "<your-model-name>", "messages": [{ "role": "user", "content": "2026年有哪些新大模型?" }], "max_tokens": 2048, "tools": [{ "type": "web_search_20250305", "name": "web_search", "max_uses": 3 }] } """; Request request = new Request.Builder() .url("https://tokenhub.tencentmaas.com/v1/messages") .header("Content-Type", "application/json") .header("anthropic-version", "2023-06-01") .header("x-api-key", "YOUR_API_KEY") .post(RequestBody.create(body, MediaType.parse("application/json"))) .build(); try (Response response = new OkHttpClient().newCall(request).execute()) { System.out.println(response.body().string()); } }}package mainimport ( "fmt" "io" "net/http" "strings")func main() { body := `{ "model": "<your-model-name>", "messages": [{ "role": "user", "content": "2026年有哪些新大模型?" }], "max_tokens": 2048, "tools": [{ "type": "web_search_20250305", "name": "web_search", "max_uses": 3 }]}` req, _ := http.NewRequest("POST", "https://tokenhub.tencentmaas.com/v1/messages", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") req.Header.Set("anthropic-version", "2023-06-01") req.Header.Set("x-api-key", "YOUR_API_KEY") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() data, _ := io.ReadAll(resp.Body) fmt.Println(string(data))}

注意:说明:

注意:内置工具通过 type 指定版本化类型名,无需 input_schema。内置工具的支持情况因模型而异,详情请参见 各模型字段兼容情况。

26、示例:Prompt Caching

在 system 长文档或工具定义上打 cache_control 标记,命中缓存后大幅降低 input_tokens 计费:

{ "model": "<your-model-name>", "system": [ { "type": "text", "text": "你是一个文档问答助手。" }, { "type": "text", "text": "<很长的文档内容…>", "cache_control": { "type": "ephemeral", "ttl": "1h" } } ], "messages": [{ "role": "user", "content": "文档第三章讲了什么?" }], "max_tokens": 1024}

响应 usage 中可见 cache_creation_input_tokens(首次写缓存)与 cache_read_input_tokens(后续命中读取)。

赞 (0)
上一篇 4天前
下一篇 4天前