Qwen(通义千问)模型
qwen3.7-max / qwen3.7-plus / qwen3.8-max / qwen3-vl-plus 按场景的调用示例:思考、工具调用、JSON 输出、联网搜索、图片与视频理解、缓存
Qwen 系列通过 /v1/chat/completions 与 /v1/messages 两种格式调用。平台对请求体透传:Qwen 专属参数(enable_thinking、thinking_budget、top_k、enable_search 等)原样转发,由上游模型决定是否生效。本页按场景组织,场景划分参照阿里云百炼官方文档(深度思考、联网搜索、视觉理解、结构化输出、函数调用、上下文缓存等),但是否支持以平台实际接入的上游为准,不以官方为准。
每个场景标注证据:
- 已实测(线上测试账号,2026-10-19):用线上账号真实调用过,响应取自真实输出(
id、时间戳已替换为占位符)。 - 依官方文档(未实测):只对照了官方文档,没有真实请求确认。
支持的模型
| 平台模型 id | 说明 | 上下文窗口 | 最大输出 | 能力标签 |
|---|---|---|---|---|
qwen3.8-max | Qwen3.8 旗舰,文本 + 图像 / 视频理解 | 1,000,000 | 131,072 | 对话、流式、视觉、工具调用、思考、缓存 |
qwen3.7-max | Qwen3.7 旗舰,文本 | 1,000,000 | 131,072 | 对话、流式、工具调用、思考、缓存 |
qwen3.7-plus | Qwen3.7 均衡款,文本 + 图像 / 视频理解 | 1,000,000 | 131,072 | 对话、流式、视觉、工具调用、思考、缓存 |
qwen3-vl-plus | Qwen3-VL 视觉理解 | 262,144 | 32,768 | 对话、流式、视觉、工具调用、思考、缓存 |
能力标签以 GET /v1/models 返回为准。qwen3.7-max 的标签不含 vision,不能传图片(实测会报错,见「图片与视频输入」)。
平台不会替你开启或关闭思考。平台不会默认注入 enable_thinking、thinking_budget、reasoning_effort 或 temperature。你不传就由上游默认决定:官方文档写明 qwen3.8-max、qwen3.7-max、qwen3.7-plus 默认开启思考;qwen3-vl-plus 官方未写明默认值。需要确定的行为,就显式传 enable_thinking。
用 enable_thinking 控制 Qwen 的思考,不要用 thinking。OpenAI 与 Anthropic 两种格式下,都用顶层的 enable_thinking / thinking_budget(Python SDK 放进 extra_body)。你传的 thinking 平台会原样转发(adaptive 除外,不转发),但不会替你换算成 enable_thinking、thinking_budget 或 reasoning_effort;qwen3.7-plus 的上游会校验 thinking.type(只认 enabled / disabled / auto),其余模型是否识别未验证,请不要依赖。
场景总览
| 场景 | 官方是否提供 | 我们的情况 | 示例 |
|---|---|---|---|
深度思考(开关 enable_thinking、读取思考内容) | 是 | 支持 | 思考模式 |
思考预算 thinking_budget、强度 reasoning_effort、保留思考 preserve_thinking | 是 | 部分支持:依官方文档,未实测 | 思考模式 注意事项 |
| 流式输出 | 是 | 部分支持:同一条管线,Qwen 上未单独实测 | 流式输出 |
| 函数调用(含并行调用) | 是 | 支持 | 工具调用 |
工具调用参数流式(tool_stream) | 是 | 部分支持:依官方文档,未实测 | 工具调用 注意事项 |
结构化输出:json_object | 是 | 支持 | JSON 输出 |
结构化输出:json_schema | 是(部分模型) | 支持(qwen3.7-max 已实测;qwen3-vl-plus 官方不在支持名单) | JSON Schema |
联网搜索(enable_search) | 是 | 部分支持:基础搜索已实测;搜索来源、搜索策略等选项未实测,Chat Completions 官方不返回搜索来源 | 联网搜索 |
| 图片理解(单图) | 是 | 部分支持:qwen3-vl-plus 已实测;qwen3.8-max、qwen3.7-plus 依官方(未实测);qwen3.7-max 不支持 | 图片与视频输入 |
| 多图、视频理解、OCR、目标定位、文档解析 | 是 | 部分支持:依官方文档,未实测 | 图片与视频输入 |
| 上下文缓存:隐式缓存 | 是 | 支持(自动,无参数) | 上下文缓存 |
上下文缓存:显式缓存(cache_control) | 是 | 部分支持:依赖尚未发布的更新,线上目前不生效 | 上下文缓存 |
| Anthropic 格式调用 | 是(官方 Anthropic 兼容) | 部分支持:同一条管线,Qwen 上未单独实测 | Anthropic 格式 |
tool_choice: "required" | 官方说明 Qwen 不支持 | 不支持 | 无 |
| 思考模式下指定具体函数 | 官方说明不支持 | 不支持;先 enable_thinking: false | 见工具调用 |
长文本文件问答(qwen-long 文件 ID) | 是(独立模型) | 未接入:平台没有文件上传入口,也没有该模型 | 无 |
| 角色扮演专用模型 | 是(独立模型) | 未接入 | 无 |
| 批处理(Batch) | 是 | 不支持:平台不提供批处理 | 无 |
qwen3.7-max 的图片输入 | 无(文本模型) | 不支持:实测返回 400 | 见图片与视频输入 |
思考模式
证据:已实测(线上测试账号,2026-10-19),qwen3.8-max(开启)与 qwen3.7-plus(关闭)。
何时用:推理、代码、数学等需要多步思考的任务开启;简单对话关闭,省延迟和 token。enable_thinking 不是 OpenAI 标准字段,Python SDK 放进 extra_body,原生 HTTP 放请求体顶层。
请求
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
# 开启思考
resp = client.chat.completions.create(
model="qwen3.8-max",
messages=[{"role": "user", "content": "9.11 和 9.9 哪个大?一句话回答。"}],
max_tokens=1500,
extra_body={"enable_thinking": True},
)
msg = resp.choices[0].message
print(getattr(msg, "reasoning_content", None)) # 思考过程
print(msg.content) # 最终回答
# 关闭思考
resp = client.chat.completions.create(
model="qwen3.7-plus",
messages=[{"role": "user", "content": "用一句话解释量子纠缠"}],
max_tokens=300,
extra_body={"enable_thinking": False},
)响应(开启思考,qwen3.8-max):思考过程在 reasoning_content,回答在 content,思考 token 在 usage.completion_tokens_details.reasoning_tokens。
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "qwen3.8-max",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "9.9 更大。",
"refusal": null,
"reasoning_content": "We need answer user's simple Chinese question: \"9.11 和 9.9 哪个大?一句话回答。\" Need answer one sentence. Need be careful: numeric comparison 9.11 vs 9.9. 9.9 = 9.90, so 9.9 larger than 9.11. Need final one sentence in Chinese."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 78,
"completion_tokens": 90,
"total_tokens": 168,
"prompt_tokens_details": {
"cached_tokens": 0,
"text_tokens": 78
},
"completion_tokens_details": {
"reasoning_tokens": 81,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0,
"text_tokens": 90
}
}
}响应(关闭思考,qwen3.7-plus):没有 reasoning_content,reasoning_tokens 为 0。
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "qwen3.7-plus",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "量子纠缠是指两个或多个粒子形成一种特殊的关联状态,使得无论它们相距多远,对其中一个粒子的测量会瞬间决定另一个粒子的状态。",
"refusal": null
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 17,
"completion_tokens": 31,
"total_tokens": 48,
"prompt_tokens_details": {
"cached_tokens": 0,
"text_tokens": 17
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}注意事项
thinking_budget(依官方文档,未实测):整数,思考部分最多使用的 token 数,达到后模型直接输出回答;官方支持 Qwen3.8 / 3.7 / 3.6 / 3.5 / Qwen3-VL,默认是模型的最大思维链长度;放extra_body。reasoning_effort(依官方文档,未实测):官方只明确列出 qwen3.8 系列,取值xhigh(默认)、medium、low,none关闭思考;不能与thinking_budget同时设置。qwen3.7-max、qwen3.7-plus、qwen3-vl-plus官方未列出此参数,请不要依赖。preserve_thinking(依官方文档,未实测):布尔,默认false;为true时把历史 assistant 消息里的reasoning_content一并作为输入,官方要求必须原样回传,历史思考会计入输入 token 并计费。平台会把历史里的reasoning_content转发给上游,客户端需要自己把上一轮返回的思考内容放回历史。- 采样:
temperature范围 [0, 2),默认值因模型与是否思考而异,官方建议temperature与top_p只设一个;top_k官方默认 20,非 OpenAI 字段,放extra_body;平台不做范围校验,超范围的值原样交给上游。 max_completion_tokens是总输出上限,含思考与回答,思考模型推荐用它;qwen3-vl-plus官方未列入支持范围,请用max_tokens;两者都传时平台只转发max_completion_tokens。
流式输出
证据:依官方文档(未实测);流式管线与 DeepSeek、GLM 页的实测响应一致。
何时用:边生成边显示,思考模型尤其推荐(思考耗时长,非流式容易超时)。传 stream: true;思考在 delta.reasoning_content,回答在 delta.content。
请求
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
stream = client.chat.completions.create(
model="qwen3.8-max",
messages=[{"role": "user", "content": "数到五,用逗号分隔。"}],
max_tokens=1000,
stream=True,
extra_body={"enable_thinking": True},
)
reasoning, content = "", ""
for chunk in stream:
if not chunk.choices:
continue
d = chunk.choices[0].delta
if getattr(d, "reasoning_content", None):
reasoning += d.reasoning_content
elif d.content:
content += d.content
print(content)响应:SSE 数据块的结构与其他模型相同(见 DeepSeek 页的流式响应),最后会带 usage。
注意事项
- 流式请求没传
stream_options时,网关自动加include_usage。 - 官方提示:思考模式耗时长,长提示词请开启流式或把客户端超时设到 180 秒以上。
工具调用
证据:已实测(线上测试账号,2026-10-19),qwen3.7-plus,只测了第一轮(模型返回工具调用);回传工具结果的第二轮依官方文档(未实测)。
何时用:让模型决定调用你定义的函数;parallel_tool_calls: true 时一次返回多个独立的调用。模型本身不执行函数:由你的代码执行后,把结果以 role: "tool" 消息(带对应 tool_call_id)放回历史再请求。
第一轮请求
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get weather of a location, the user should supply a location first.",
"parameters": {
"type": "object",
"properties": {"location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"}},
"required": ["location"],
},
},
}]
messages = [{"role": "user", "content": "查询北京和上海现在的天气。"}]
resp = client.chat.completions.create(
model="qwen3.7-plus", messages=messages, tools=tools,
parallel_tool_calls=True, max_tokens=500,
extra_body={"enable_thinking": False},
)
msg = resp.choices[0].message
messages.append(msg) # 把带 tool_calls 的 assistant 消息放回历史第一轮响应:同时返回两个 tool_calls(北京、上海)。
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "qwen3.7-plus",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "我来为您查询北京和上海的天气。\n\n",
"refusal": null,
"tool_calls": [
{
"id": "call_xxxx",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"北京\"}"
}
},
{
"id": "call_xxxx",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"上海\"}"
},
"index": 1
}
]
},
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 300,
"completion_tokens": 60,
"total_tokens": 360,
"prompt_tokens_details": {
"cached_tokens": 0,
"text_tokens": 300
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}第二轮(依官方文档,未实测):对每个 tool_calls 各追加一条 role: "tool" 消息,tool_call_id 一一对应,再请求一次;官方提示总结工具结果时去掉 tool_choice,否则会再次返回工具调用。
for call in msg.tool_calls:
messages.append({"role": "tool", "tool_call_id": call.id, "content": "晴,26℃"})
resp = client.chat.completions.create(
model="qwen3.7-plus", messages=messages, tools=tools, max_tokens=500,
extra_body={"enable_thinking": False},
)
print(resp.choices[0].message.content)注意事项
tool_choice:官方默认auto;none禁用工具;required官方说明 Qwen 模型不支持;指定具体函数在思考模式下不支持,需要强制调用某个工具时先enable_thinking: false。parallel_tool_calls官方默认false,设为true才并行调用;只适合互相独立的任务,有依赖的调用要串行循环。tool_stream(依官方文档,未实测):布尔,默认false,仅与stream: true配合,让工具参数增量流出;官方只列了部分 qwen3.8 / 3.7 档位,放extra_body。n设置tools时必须为 1。- Anthropic 格式
tool_choice: {"type": "none"}转成tool_choice: "none";disable_parallel_tool_use: true转成parallel_tool_calls: false。
JSON 输出
证据:已实测(线上测试账号,2026-10-19),qwen3.7-max,关闭思考。
何时用:需要稳定的 JSON,例如信息抽取。设置 response_format: {"type": "json_object"};提示词里必须明确出现 JSON 字样,否则请求报错(官方)。
请求
import json
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
resp = client.chat.completions.create(
model="qwen3.7-max",
messages=[
{"role": "system", "content": "提取姓名和年龄,以 JSON 输出,格式:{\"name\": \"...\", \"age\": 0}"},
{"role": "user", "content": "大家好,我叫张三,今年 20 岁。"},
],
response_format={"type": "json_object"},
extra_body={"enable_thinking": False},
)
print(json.loads(resp.choices[0].message.content))响应
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "qwen3.7-max",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\"name\": \"张三\", \"age\": 20}",
"refusal": null
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 54,
"completion_tokens": 13,
"total_tokens": 67,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}注意事项
- 官方提示:不要给结构化输出设
max_tokens,可能把 JSON 截断;字段名与类型在多次调用间可能变化,下游使用前要校验。 - 思考模式下
json_object可能不返回严格 JSON,建议关闭思考。
JSON Schema
证据:已实测(线上测试账号,2026-10-19),qwen3.7-max,关闭思考。
何时用:需要精确控制字段、类型的自动化解析。response_format 用 json_schema,建议 strict: true 且 additionalProperties: false;提示词里不需要出现 JSON 字样。官方只对 Qwen3.7-Plus、Qwen3.7-Max、Qwen3.8-Max 等部分系列开放,qwen3-vl-plus 不在名单内。
请求
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
resp = client.chat.completions.create(
model="qwen3.7-max",
messages=[{"role": "user", "content": "大家好,我叫张三,今年 20 岁。"}],
response_format={
"type": "json_schema",
"json_schema": {
"name": "user_info",
"strict": True,
"schema": {
"type": "object",
"properties": {"name": {"type": "string"}, "age": {"type": "integer"}},
"required": ["name", "age"],
"additionalProperties": False,
},
},
},
extra_body={"enable_thinking": False},
)
print(resp.choices[0].message.content)响应(这次返回的键顺序是 age、name,与上面 json_object 那次不同,说明约束确实由 Schema 驱动)
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "qwen3.7-max",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "{\"age\": 20, \"name\": \"张三\"}",
"refusal": null
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 26,
"completion_tokens": 14,
"total_tokens": 40,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}注意事项
- 严格模式下
multipleOf、uniqueItems、contains、patternProperties、propertyNames等关键字会返回 400(官方)。 - 图片、视频、音频输入不支持
json_schema,会退回json_object,Schema 不被强制(官方)。
联网搜索
证据:已实测(线上测试账号,2026-10-19),qwen3.7-max,只测了最基础的 enable_search: true;其余选项依官方文档(未实测)。
何时用:问题依赖实时信息(天气、新闻、行情)。enable_search 是非 OpenAI 字段,Python SDK 放 extra_body;开启后模型自己判断是否需要搜索。
请求
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
resp = client.chat.completions.create(
model="qwen3.7-max",
messages=[{"role": "user", "content": "今天杭州的天气怎么样?一句话。"}],
max_tokens=500,
extra_body={"enable_search": True, "enable_thinking": False},
)
print(resp.choices[0].message.content)响应:注意 prompt_tokens 是 4270,而问题本身只有十几个 token:搜索到的网页内容会作为输入注入提示词,并按输入 token 计费。
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "qwen3.7-max",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "今天杭州多云,气温23~31℃。",
"refusal": null
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 4270,
"completion_tokens": 12,
"total_tokens": 4282,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}注意事项
- 开启搜索会显著增加输入 token,成本要自己评估。
- 依官方文档(未实测)的其他选项:
search_options.forced_search(每次都搜索)、search_strategy(turbo默认 /max/agent/agent_max,agent类每次调用额外收费)、enable_search_extension(天气、股票等垂域)、freshness、assigned_site_list等。这些字段平台都会原样转发,是否生效以上游为准。 - 官方说明 OpenAI 兼容的 Chat Completions 不返回搜索来源和角标(
enable_source/enable_citation只有 DashScope 原生接口支持)。 - 官方提示 Qwen3.8 的多模态接口不支持
agent策略;搜索时思考模型也可以开启enable_search。
图片与视频输入
证据:已实测(线上测试账号,2026-10-19),qwen3-vl-plus(单图)与 qwen3.7-max(确认不支持);qwen3.8-max、qwen3.7-plus 以及多图、视频、OCR、定位等依官方文档(未实测)。
何时用:看图问答、描述、OCR、图表分析、截图转代码、多图对比、视频理解。图片放在 content 数组里,image_url.url 可以是公网 URL 或 Base64 Data URL。能力标签含 vision 的模型才能传图:qwen3.8-max、qwen3.7-plus、qwen3-vl-plus。
单图请求(qwen3-vl-plus,一张纯红色 64x64 PNG)
import base64
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
b64 = base64.b64encode(open("red.png", "rb").read()).decode()
resp = client.chat.completions.create(
model="qwen3-vl-plus",
messages=[{"role": "user", "content": [
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
{"type": "text", "text": "这张图是什么颜色?一句话。"},
]}],
max_tokens=200,
)
print(resp.choices[0].message.content)响应:usage.prompt_tokens_details.image_tokens 是图片占用的 token。qwen3-vl-plus 在这次请求里没有开启思考(官方默认关闭),所以 reasoning_content 为空字符串。
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "qwen3-vl-plus",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "这张图是纯红色。",
"refusal": null,
"reasoning_content": ""
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 81,
"completion_tokens": 7,
"total_tokens": 88,
"prompt_tokens_details": {
"cached_tokens": 0,
"text_tokens": 15,
"image_tokens": 66
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0,
"text_tokens": 7
}
}
}不支持的情况:qwen3.7-max 没有 vision 标签,传图片实测返回 400:
{
"error": {
"code": "api_error",
"message": "The request could not be completed. (",
"type": "api_error"
}
}其他视觉场景(依官方文档,未实测)
- 多图:在
content里放多个image_url块。qwen3.8-max、qwen3.7-plus官方最多 2048 张,qwen3-vl-plus最多 256 张,所有图片与文本的 token 总和须小于模型的最大输入。 - 视频文件:用
video_url块;图片序列当视频用video块(图片 URL 数组)。fps控制抽帧,官方范围 0.1 到 10、默认 2.0,字段的放置方式以官方文档为准。视频文件时长官方限制:Qwen3.8 / 3.7 系列 2 秒到 2 小时,qwen3-vl-plus2 秒到 1 小时。平台没有验证过视频的传入方式与大小,请先用短样例验证。 - OCR、信息抽取、解题、截图转代码、目标定位、文档解析:都是在图片输入基础上改提示词,不需要额外参数;官方提示通用对话尽量不要用 system 消息,把指令放在用户消息里。
resp = client.chat.completions.create(
model="qwen3.8-max",
messages=[{"role": "user", "content": [
{"type": "video_url", "video_url": {"url": "https://example.com/demo.mp4"}},
{"type": "text", "text": "概括这段视频,并给出关键事件的时间点。"},
]}],
max_tokens=1000,
extra_body={"enable_thinking": False},
)注意事项
- 图片限制(官方):宽高均大于 10 像素,长短边比不超过 200:1;4K 以下支持 BMP、JPEG、PNG、TIFF、WEBP、HEIC,4K 到 8K 仅 JPEG、PNG;单张不超过 20 MB。
- 平台与上游网关另有请求体大小上限,大图、长视频请先小规模实测。
qwen3-vl-plus官方默认关闭思考,qwen3.8-max、qwen3.7-plus默认开启;需要确定行为请显式传enable_thinking。
上下文缓存
证据:已实测(线上测试账号,2026-10-19),qwen3.7-max:隐式缓存命中已实测;显式缓存依赖尚未发布的更新,线上目前实测不生效。
何时用:同一份长文档、长系统提示反复提问,或多轮对话。
隐式缓存(自动):不可关闭,没有请求参数,命中不保证;官方最少约 1024 token,命中通常按输入价的约 20% 计费(因模型而异);把重复内容放提示词开头、变化的内容放末尾。命中数在 usage.prompt_tokens_details.cached_tokens。
请求:同一份约 3,300 token 的系统提示,先后问不同的问题。
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
KNOWLEDGE = "……一份很长的制度文档(几千 token)……"
for q in ["退货期限是几天?一句话", "退款几个工作日到账?一句话"]:
resp = client.chat.completions.create(
model="qwen3.7-max",
messages=[
{"role": "system", "content": "你是客服助手,根据下面的制度回答。\n" + KNOWLEDGE},
{"role": "user", "content": q},
],
max_tokens=60,
extra_body={"enable_thinking": False},
)
print(resp.choices[0].message.content, resp.usage.prompt_tokens_details.cached_tokens)响应(只摘出 usage):3316 个输入 token 里 2304 个命中缓存。
{
"usage": {
"prompt_tokens": 3316,
"completion_tokens": 8,
"total_tokens": 3324,
"prompt_tokens_details": {
"cached_tokens": 2304
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}这次实测的请求里给系统消息的内容块带了 cache_control 标记,但 usage 里没有 cache_creation_input_tokens,命中来自隐式缓存,说明标记没有触发显式缓存。
显式缓存(cache_control: {"type": "ephemeral"},依赖尚未发布的更新):官方规则是在 messages 的 content 块上加标记,只支持 ephemeral、有效期 5 分钟、每个请求最多 4 个标记、缓存块至少 1024 token、标记只能放在 content 里;创建缓存按输入价 125% 计费,命中通常 10%;用量在 cache_creation_input_tokens 与 cached_tokens。线上目前会去掉请求里的这类标记,显式缓存不生效,待更新发布后才会转发。显式缓存与隐式缓存互斥,单个请求只能用一种。
Anthropic 格式
证据:依官方文档(未实测);同一条管线在 DeepSeek 与 MiniMax 上做过实测,Qwen 上未单独实测。
何时用:客户端只能说 /v1/messages。调用方式与鉴权见 Messages 页(SDK 用 auth_token,不是 api_key)。
请求
from anthropic import Anthropic
client = Anthropic(base_url="https://api.modelsite.ai", auth_token="sk-ms-xxxxxxxx")
resp = client.messages.create(
model="qwen3.8-max",
max_tokens=1500,
messages=[{"role": "user", "content": "用一句话解释量子纠缠"}],
extra_body={"enable_thinking": True},
)
for block in resp.content:
if block.type == "thinking":
print("思考:", block.thinking)
elif block.type == "text":
print("回答:", block.text)注意事项
- 用顶层
enable_thinking/thinking_budget控制思考,不要用 Anthropic 的thinking字段(见页首提示)。 top_k在 Anthropic 格式下可直接用标准的顶层字段;stop_sequences对应stop;metadata.user_id对应user。
参数速查
| 参数 | 说明 |
|---|---|
enable_thinking、thinking_budget、preserve_thinking | Qwen 专属,放 extra_body,平台原样转发 |
reasoning_effort | 官方只明确列出 qwen3.8 系列,不能与 thinking_budget 同时设置 |
thinking | 平台原样转发,不换算;adaptive 不转发;qwen3.7-plus 上游只认 enabled / disabled / auto |
top_k、repetition_penalty、seed | 非 OpenAI 字段,放 extra_body;top_k 官方默认 20 |
max_completion_tokens / max_tokens | 前者含思考;qwen3-vl-plus 用 max_tokens;两个都传只转发 max_completion_tokens |
tool_choice | auto / none / 指定函数(非思考);required 不支持 |
parallel_tool_calls、tool_stream | 官方默认 false,放 extra_body(tool_stream) |
n | 1 到 4,设置 tools 时必须为 1 |
response_format | text / json_object / json_schema(部分模型) |
enable_search、search_options | 联网搜索,放 extra_body |
vl_high_resolution_images、fps | 视觉相关;字段形态以官方文档为准,上游是否生效未验证 |
cache_control | 显式缓存标记,线上目前被去掉,见上下文缓存 |
未知顶层字段、extra_body 里的键 | 原样平铺转发 |
developer 角色 | 转为 system |
其他:reasoning 对象(OpenRouter 风格)由平台自己处理,转换后的字段对 Qwen 未必生效,要开关思考请用 enable_thinking;reasoning.exclude: true 或 include_reasoning: false 会在响应里去掉思考内容,思考 token 仍计费。
官方文档