GLM 模型
glm-5.3 / glm-5.3-flash 按场景的调用示例:深度思考、流式、工具调用、JSON 输出、上下文缓存、图片输入
GLM 系列通过 /v1/chat/completions 与 /v1/messages 两种格式调用。平台对请求体透传:厂商专属参数原样转发,由上游模型决定是否生效。本页按场景组织,场景划分参照智谱官方能力文档(深度思考、流式输出、函数调用、结构化输出、上下文缓存、视觉理解、联网搜索等),但是否支持以平台实际接入的上游为准,不以官方为准。
每个场景标注证据:
- 已实测(线上测试账号,2026-10-19):用线上账号真实调用过,响应取自真实输出(
id、时间戳已替换为占位符)。 - 依官方文档(未实测):只对照了官方文档,没有真实请求确认。
支持的模型
| 平台模型 id | 说明 | 上下文窗口 | 最大输出 | 能力标签 |
|---|---|---|---|---|
glm-5.3 | GLM-5.3 旗舰,仅文本,强制思考 | 1,000,000 | 131,072 | 对话、流式、工具调用、思考、缓存 |
glm-5.3-flash | GLM-5.3-Flash,更快更省,强制思考 | 1,000,000 | 131,072 | 对话、流式、工具调用、思考、缓存 |
- 能力标签以
GET /v1/models返回为准。两个模型的标签都不含vision,图片输入见「图片输入」。 - 官方说明
glm-5.3仅处理文本。
平台不会替你开启或关闭思考。平台不会默认注入 thinking、reasoning_effort 或 temperature,你传什么就转发什么。GLM-5.3 系列本身强制思考,不能关闭(见下)。
场景总览
| 场景 | 官方是否提供 | 我们的情况 | 示例 |
|---|---|---|---|
| 深度思考(强度、读取思考内容) | 是 | 支持(强制思考,不能关闭) | 深度思考 |
| 流式输出 | 是 | 支持 | 流式输出 |
| 函数调用(工具调用) | 是 | 支持;tool_choice 只支持 auto | 工具调用 |
工具调用参数流式(tool_stream) | 是 | 部分支持:依官方文档,未实测 | 工具调用 注意事项 |
| 结构化输出(JSON 模式) | 是 | 支持(json_object) | JSON 输出 |
| 上下文缓存 | 是 | 支持(隐式,自动,无参数) | 上下文缓存 |
| 视觉理解(图片) | 官方 glm-5.3-flash 为多模态,glm-5.3 仅文本 | 部分支持:glm-5.3-flash 实测能识图,但平台未列为视觉能力,不承诺;glm-5.3 不支持 | 图片输入 |
保留式思考(clear_thinking: false) | 是 | 部分支持:依官方文档,未实测 | 保留式思考 |
| Anthropic 格式调用 | 官方有 Anthropic 兼容入口 | 部分支持:同一条管线,GLM 上未单独实测 | Anthropic 格式 |
联网搜索(web_search 工具) | 是 | 不支持:实测 tools 只接受 function 类型,传 web_search 返回 400 | 无 |
关闭思考(thinking: disabled) | 官方不支持(GLM-5.3 系列强制思考) | 不支持:平台直接返回 400 | 见深度思考 |
| 角色扮演(CharGLM 等专用模型) | 是(独立模型) | 未接入:平台没有接入这类模型 | 无 |
| 视频、文件输入 | glm-5.3-flash 官方称支持 | 未接入:能力标签无 vision,未验证 | 无 |
深度思考
证据:已实测(线上测试账号,2026-10-19),glm-5.3。
何时用:复杂分析、多步推理、方案设计。GLM-5.3 系列强制思考,不需要传 thinking;用 reasoning_effort 调强度,只接受 low、high、max(官方默认 max)。思考过程在 reasoning_content,最终回答在 content。
请求
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
resp = client.chat.completions.create(
model="glm-5.3",
messages=[{"role": "user", "content": "9.11 和 9.9 哪个大?一句话回答。"}],
max_tokens=1500,
reasoning_effort="low",
)
msg = resp.choices[0].message
print(getattr(msg, "reasoning_content", None)) # 思考过程
print(msg.content) # 最终回答响应
{
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "9.9 大,因为 0.9 > 0.11。",
"refusal": null,
"reasoning_content": "Simple: 9.11 vs 9.9. 9.9 is larger."
},
"finish_reason": "stop"
}
],
"created": 1760000000,
"id": "chatcmpl-xxxx",
"model": "glm-5.3",
"object": "chat.completion",
"request_id": "req-xxxx",
"usage": {
"completion_tokens": 37,
"completion_tokens_details": {
"reasoning_tokens": 20,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
},
"prompt_tokens": 28,
"prompt_tokens_details": {
"cached_tokens": 0
},
"reasoning_tokens": 20,
"total_tokens": 65
}
}关闭思考会被拒绝:glm-5.3 和 glm-5.3-flash 都不能关闭思考。请求里带 "thinking": {"type": "disabled"} 时平台直接返回 400,不会转给上游:
{
"error": {
"code": "invalid_request_error",
"message": "This model does not support disabling thinking: thinking.type \"disabled\" is not allowed.",
"type": "invalid_request_error"
}
}从别的模型迁移过来的代码如果传了 thinking: {"type": "disabled"},换成 GLM-5.3 前要去掉,或改成 reasoning_effort: "low" 降低思考量。
注意事项
reasoning_effort取值只有low、high、max,其他值官方说明会报错;平台不做映射。max_tokens范围 1 到 131072,官方建议不小于 1024,且思考 token 计入输出,值太小会只有思考没有正文。官方参数表只列max_tokens,请用它而不是max_completion_tokens。- 采样:
temperature范围 [0, 1](不是 OpenAI 的 0 到 2),默认 1.0;top_p范围 [0.01, 1.0],默认 0.95;官方建议两者只调一个。平台不做范围校验,超范围的值原样交给上游。do_sample: false时temperature、top_p被忽略(放extra_body)。 stop最多 4 个字符串。- 也有可能得到空的
reasoning_content:在glm-5.3-flash的工具调用实测里,usage.completion_tokens_details.reasoning_tokens为 0,响应里没有思考内容。不要假设每次都有思考内容。
流式输出
证据:已实测(线上测试账号,2026-10-19),glm-5.3-flash。
何时用:边生成边显示。传 stream: true;思考内容在 delta.reasoning_content,回答在 delta.content;finish_reason 与 usage 只出现在最后的数据块里,部分数据块没有 choices,读取前先判断。
请求
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
stream = client.chat.completions.create(
model="glm-5.3-flash",
messages=[{"role": "user", "content": "数到五,用逗号分隔。"}],
max_tokens=600,
reasoning_effort="low",
stream=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)响应
data: {"id":"chatcmpl-xxxx","object":"chat.completion.chunk","created":1760000000,"model":"glm-5.3-flash","choices":[{"index":0,"delta":{"role":"assistant","content":"","reasoning_content":""}}]}
data: {"id":"chatcmpl-xxxx","object":"chat.completion.chunk","created":1760000000,"model":"glm-5.3-flash","choices":[{"index":0,"delta":{"content":"一"}}]}
data: {"id":"chatcmpl-xxxx","object":"chat.completion.chunk","created":1760000000,"model":"glm-5.3-flash","choices":[{"index":0,"delta":{"content":"、二、三"}}]}
data: {"id":"chatcmpl-xxxx","object":"chat.completion.chunk","created":1760000000,"model":"glm-5.3-flash","choices":[{"index":0,"delta":{"content":"、四、五"}}]}
data: {"id":"chatcmpl-xxxx","object":"chat.completion.chunk","created":1760000000,"model":"glm-5.3-flash","choices":[{"delta":{},"finish_reason":"stop","index":0}]}
data: {"id":"chatcmpl-xxxx","object":"chat.completion.chunk","created":1760000000,"model":"glm-5.3-flash","choices":[],"usage":{"prompt_tokens":21,"completion_tokens":11,"total_tokens":32,"prompt_tokens_details":{"cached_tokens":0,"created_cache_tokens":0},"completion_tokens_details":{"reasoning_tokens":0,"audio_tokens":0,"accepted_prediction_tokens":0,"rejected_prediction_tokens":0}},"system_fingerprint":"fp_xxxx"}
data: [DONE]注意事项
- 流式请求没传
stream_options时,网关自动加include_usage,usage出现在最后一个choices为空的数据块里。
工具调用
证据:已实测(线上测试账号,2026-10-19),glm-5.3-flash;glm-5.3 同一管线,未单独实测。
何时用:让模型决定调用你定义的函数。模型本身不执行函数:它返回 tool_calls,由你的代码执行后把结果以 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": "How is the weather in Hangzhou?"}]
resp = client.chat.completions.create(
model="glm-5.3-flash", messages=messages, tools=tools,
tool_choice="auto", max_tokens=800, reasoning_effort="low",
)
msg = resp.choices[0].message
messages.append(msg) # 把带 tool_calls 的 assistant 消息放回历史第一轮响应:finish_reason 为 tool_calls,function.arguments 是 JSON 字符串,需要自己解析。
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "glm-5.3-flash",
"choices": [
{
"finish_reason": "tool_calls",
"index": 0,
"message": {
"role": "assistant",
"content": null,
"refusal": null,
"tool_calls": [
{
"id": "chatcmpl-tool-xxxx",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"Hangzhou, China\"}"
}
}
]
}
}
],
"usage": {
"prompt_tokens": 186,
"completion_tokens": 15,
"total_tokens": 201,
"prompt_tokens_details": {
"cached_tokens": 0,
"created_cache_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"system_fingerprint": "fp_xxxx"
}第二轮:执行函数,把结果放回历史再请求。
for call in msg.tool_calls:
result = "24℃, cloudy" # 你的函数实际执行结果
messages.append({"role": "tool", "tool_call_id": call.id, "content": result})
resp = client.chat.completions.create(
model="glm-5.3-flash", messages=messages, tools=tools,
max_tokens=800, reasoning_effort="low",
)
print(resp.choices[0].message.content)第二轮响应
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "glm-5.3-flash",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"role": "assistant",
"content": "The weather in Hangzhou is currently 24°C and cloudy.",
"refusal": null
}
}
],
"usage": {
"prompt_tokens": 208,
"completion_tokens": 15,
"total_tokens": 223,
"prompt_tokens_details": {
"cached_tokens": 0,
"created_cache_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"system_fingerprint": "fp_xxxx"
}注意事项
tool_choice只接受auto(官方:默认且仅支持auto)。平台不拦截其他取值,上游是否报错未验证;用 Anthropic 格式时,any(转成required)和tool(转成指定函数)上游不一定接受,建议只用auto。tools最多 128 个函数;函数名只能含a-zA-Z0-9_-,最长 64。tool_stream(工具调用参数流式):依官方文档,未实测。布尔,默认false;与stream: true同时开启时,函数调用参数分片流式返回,需要按index拼接delta.tool_calls[*].function.arguments;非 OpenAI 字段,放extra_body。官方说明 GLM-5.3 默认开启;glm-5.3-flash是否在这一范围内未验证。- Anthropic 格式
tool_choice: {"type": "none"}转成tool_choice: "none",disable_parallel_tool_use: true转成parallel_tool_calls: false。
JSON 输出
证据:已实测(线上测试账号,2026-10-19),glm-5.3-flash。
何时用:信息抽取、需要机器可解析的结果。设置 response_format: {"type": "json_object"},并把期望的 JSON 结构写进提示词;官方只支持 text 与 json_object,没有 json_schema。
请求
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="glm-5.3-flash",
messages=[
{"role": "system", "content": "提取姓名和年龄,以 JSON 输出,格式:{\"name\": \"...\", \"age\": 0}"},
{"role": "user", "content": "大家好,我叫张三,今年 20 岁。"},
],
response_format={"type": "json_object"},
max_tokens=600,
reasoning_effort="low",
)
print(json.loads(resp.choices[0].message.content))响应
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "glm-5.3-flash",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"role": "assistant",
"content": "{\"name\": \"张三\", \"age\": 20}",
"refusal": null,
"reasoning_content": "Extract."
}
}
],
"usage": {
"prompt_tokens": 48,
"completion_tokens": 17,
"total_tokens": 65,
"prompt_tokens_details": {
"cached_tokens": 0,
"created_cache_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 2,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"system_fingerprint": "fp_xxxx"
}注意事项
- 格式定义要写在提示词里,模型依提示生成;官方仍建议对返回做二次校验(Schema 校验加业务校验)并准备降级方案。
max_tokens要给思考留足空间,否则 JSON 可能不完整。
上下文缓存
证据:已实测(线上测试账号,2026-10-19),glm-5.3-flash。
何时用:同一份长系统提示(知识库、制度文档)反复提问,或多轮对话。缓存是隐式的:自动识别重复前缀,没有请求参数。官方建议重复内容在 500 token 以上,把稳定内容放在前面、变化的问题放在用户消息里;缓存异步生效,第一次请求之后稍等再发才容易命中。
请求:两次请求使用相同的长系统提示,只换用户问题。
from openai import OpenAI
client = OpenAI(base_url="https://api.modelsite.ai/v1", api_key="sk-ms-xxxxxxxx")
KNOWLEDGE = "……一份很长的制度文档(几千 token)……"
system = "你是客服助手,根据下面的制度回答。\n" + KNOWLEDGE
for q in ["退货期限是几天?一句话", "退款几个工作日到账?一句话"]:
resp = client.chat.completions.create(
model="glm-5.3-flash",
messages=[{"role": "system", "content": system}, {"role": "user", "content": q}],
max_tokens=300,
reasoning_effort="low",
)
print(resp.choices[0].message.content, resp.usage.prompt_tokens_details.cached_tokens)响应:实测用约 3,400 token 的系统提示。第一次请求 cached_tokens 为 0;紧接着的第二次请求(只换了用户问题)命中 1152 token:
{
"usage": {
"prompt_tokens": 3413,
"completion_tokens": 15,
"total_tokens": 3428,
"prompt_tokens_details": {
"cached_tokens": 1152,
"created_cache_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}(只摘出 usage;其余字段与上面的普通对话响应相同。)
注意事项
- 命中不保证:命中多少取决于上游;没命中的部分按普通输入价计费。
- 请求里内容块上的
cache_control标记对 GLM 无效,平台会去掉,不要使用。
图片输入
证据:已实测(线上测试账号,2026-10-19),仅 glm-5.3-flash。
两个模型的能力标签都不含 vision,平台没有把 GLM 作为视觉模型开通,所以只能算「部分支持」:
glm-5.3-flash:官方是多模态模型。用一张纯红色 64x64 PNG 实测,模型能正确回答颜色,响应里出现usage.prompt_tokens_details.multimodal_tokens。但这是上游的行为,平台没有承诺,计费口径也没有单独核对,不建议用于生产。glm-5.3:官方仅文本,不要传图片。
请求
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="glm-5.3-flash",
messages=[{"role": "user", "content": [
{"type": "text", "text": "这张图是什么颜色?一句话。"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
]}],
max_tokens=600,
reasoning_effort="low",
)
print(resp.choices[0].message.content)响应
{
"id": "chatcmpl-xxxx",
"object": "chat.completion",
"created": 1760000000,
"model": "glm-5.3-flash",
"choices": [
{
"finish_reason": "stop",
"index": 0,
"message": {
"role": "assistant",
"content": "这张图是红色的。",
"refusal": null
}
}
],
"usage": {
"prompt_tokens": 37,
"completion_tokens": 7,
"total_tokens": 44,
"prompt_tokens_details": {
"cached_tokens": 0,
"created_cache_tokens": 0,
"multimodal_tokens": {
"image": 16
}
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"system_fingerprint": "fp_xxxx"
}保留式思考
证据:依官方文档(未实测)。
何时用:多轮 Agent 任务里希望模型沿用之前轮次的思考。thinking 对象里的 clear_thinking 是布尔,官方默认 true(丢弃历史轮次的 reasoning_content);设为 false 保留,此时历史 reasoning_content 必须原样、按原顺序回传。官方对 GLM-5.3-Flash 推荐 false。
请求
resp = client.chat.completions.create(
model="glm-5.3-flash",
messages=messages, # 历史 assistant 消息带着上一轮返回的 reasoning_content,原样放回
max_tokens=1500,
reasoning_effort="high",
extra_body={"thinking": {"type": "enabled", "clear_thinking": False}},
)注意事项
- 你的客户端要把上一轮返回的
reasoning_content完整、未修改、按原顺序放回历史;平台会把历史 assistant 消息里的reasoning_content转发给上游。 - 这一场景没有实测,是否生效以上游为准。
thinking.type在 GLM-5.3 系列只能是enabled。
Anthropic 格式
证据:依官方文档(未实测);同一条管线在 DeepSeek 与 MiniMax 上做过实测,GLM 上未单独实测。
何时用:客户端只能说 /v1/messages(Anthropic SDK、Claude Code 等)。调用方式与鉴权见 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="glm-5.3-flash",
max_tokens=1500,
messages=[{"role": "user", "content": "用一句话解释量子纠缠"}],
extra_body={"reasoning_effort": "low"},
)
for block in resp.content:
if block.type == "thinking":
print("思考:", block.thinking)
elif block.type == "text":
print("回答:", block.text)注意事项
- GLM-5.3 强制思考,不要传
thinking: {"type": "disabled"};要降低思考量,在请求体里加顶层reasoning_effort(low/high/max),平台原样转发。 - 返回里的思考过程以
thinking内容块给出(预期行为,GLM 上未实测)。
参数速查
| 参数 | 说明 |
|---|---|
thinking | 只能 enabled;disabled 返回 400;adaptive 不转发;clear_thinking 作为子字段原样转发 |
reasoning_effort | 只接受 low / high / max |
max_tokens | 1 到 131072;max_completion_tokens 平台原样转发(不改名),GLM 是否识别未验证,请用 max_tokens |
temperature、top_p、do_sample | 见深度思考 |
stop | 最多 4 个字符串 |
tools、tool_choice | 最多 128 个函数;tool_choice 只支持 auto |
tool_stream | 依官方,未实测,放 extra_body |
response_format | text / json_object;没有 json_schema |
request_id、user_id | 智谱的标识字段,非 OpenAI 标准,放 extra_body 原样转发 |
stream_options | 官方参数表没有;平台流式没传时自动加 include_usage,上游是否识别未验证 |
top_k、n、service_tier、store、metadata 等 | 官方未列,平台原样转发,上游是否识别未验证 |
未知顶层字段、extra_body 里的键 | 原样平铺转发 |
developer 角色 | 转为 system |
其他:reasoning 对象(OpenRouter 风格)由平台自己处理,其中 enabled: true 会补 reasoning_effort: "medium"、effort: "none" 会转成 thinking: disabled,对 GLM-5.3 都会被拒绝,请直接用 reasoning_effort;reasoning.exclude: true 或 include_reasoning: false 会在响应里去掉思考内容,思考 token 仍计费。
官方文档