ModelSiteAPI

GLM 模型

glm-5.3 / glm-5.3-flash 按场景的调用示例:深度思考、流式、工具调用、JSON 输出、上下文缓存、图片输入

GLM 系列通过 /v1/chat/completions 与 /v1/messages 两种格式调用。平台对请求体透传:厂商专属参数原样转发,由上游模型决定是否生效。本页按场景组织,场景划分参照智谱官方能力文档(深度思考、流式输出、函数调用、结构化输出、上下文缓存、视觉理解、联网搜索等),但是否支持以平台实际接入的上游为准,不以官方为准。

每个场景标注证据:

  • 已实测(线上测试账号,2026-10-19):用线上账号真实调用过,响应取自真实输出(id、时间戳已替换为占位符)。
  • 依官方文档(未实测):只对照了官方文档,没有真实请求确认。

支持的模型

平台模型 id说明上下文窗口最大输出能力标签
glm-5.3GLM-5.3 旗舰,仅文本,强制思考1,000,000131,072对话、流式、工具调用、思考、缓存
glm-5.3-flashGLM-5.3-Flash,更快更省,强制思考1,000,000131,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_tokens1 到 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_formattext / 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 仍计费。

官方文档

本页内容