智谱 GLM API 调用
官方来源
基于 官方 Python SDK、流式消息、视觉理解和工具调用文档整理。中国智谱开放平台使用
ZhipuAiClient,Python 包名为zai-sdk。
本页教学默认值已随官方 SDK 升级
2026-07-22 的官方 Python SDK 用
glm-5.2演示文本、流式与工具调用,并以glm-5v-turbo演示视觉输入;本页对应默认值已更新。它们只是当前课程基线,不保证每个账户、套餐或地域可用,也不代表旧glm-5.1在已有回归/路由中可以无评测直接替换。
常用入口
| Python 方法 | 用途 |
|---|---|
client.chat.completions.create() | 文本、多轮、流式、视觉和工具调用 |
client.embeddings.create() | 文本向量 |
client.images.generations() | 图像生成;按当前 SDK 版本核对签名 |
client.models.list() | 查看可用模型;若当前 SDK/账户支持 |
安装与设置 API Key
python -m pip install --upgrade zai-sdk # 安装或更新当前官方 zai-sdk Python 包。
$env:ZAI_API_KEY = Read-Host 'ZAI_API_KEY' -MaskInput # 仅在当前 PowerShell 进程以遮罩方式读取 Key,不写进代码。Note
历史代码可能使用
zhipuai包或ZHIPUAI_API_KEY。本笔记使用当前zai-sdk与ZAI_API_KEY,不要混用两套示例。
1. 文本生成
from zai import ZhipuAiClient # 导入当前官方 SDK 的客户端类。
client = ZhipuAiClient() # 从进程环境中的 ZAI_API_KEY 创建客户端;不要硬编码凭据。
response = client.chat.completions.create( # 发起一轮 Chat Completions 请求。
model="glm-5.2", # 选择本课教学模型;上线前以官方模型页和账户权限核对。
messages=[ # 按角色和时间顺序传入上下文。
{"role": "system", "content": "你是一个简洁的中文技术老师。"}, # 约束回答风格。
{"role": "user", "content": "用三点解释 API 调用。"}, # 当前用户问题。
],
temperature=0.6, # 设置适度随机性;模型支持的范围应以当前文档为准。
)
print(response.choices[0].message.content) # 输出第一候选助手消息的文本内容。
print(response.usage) # 输出服务返回的实际用量。模型名更新较快,应从 模型概览 选择。文本、视觉、图像生成和视频生成使用不同模型系列。
2. 多轮对话
messages = [ # 在客户端保存完整历史;API 不会自动记住上一轮请求。
{"role": "system", "content": "你是 Python 老师。"}, # 固定的系统指令。
{"role": "user", "content": "字典是什么?"}, # 第一轮用户提问。
]
first = client.chat.completions.create(model="glm-5.2", messages=messages) # 发起首轮请求。
messages.append({ # 将首轮回答追加进历史,供下一轮上下文使用。
"role": "assistant", # 声明消息来自助手。
"content": first.choices[0].message.content, # 保存第一候选的回答文本。
})
messages.append({"role": "user", "content": "给一个读取键值的例子。"}) # 添加基于前文的追问。
second = client.chat.completions.create(model="glm-5.2", messages=messages) # 将完整历史发送给第二轮。
print(second.choices[0].message.content) # 输出第二轮文本回答。3. 流式输出
stream = client.chat.completions.create( # 请求服务以增量 chunk 形式返回生成内容。
model="glm-5.2", # 选择流式生成的模型。
messages=[{"role": "user", "content": "写一份 Python API 学习建议。"}], # 提供本轮用户任务。
stream=True, # 开启流式模式。
)
for chunk in stream: # 按到达顺序消费每个流分片。
if not chunk.choices: # 有些分片不含候选内容。
continue # 跳过空 choices,避免下标访问错误。
delta = chunk.choices[0].delta # 读取第一候选的本次增量字段。
if delta.content: # 只在有可见文本时输出。
print(delta.content, end="", flush=True) # 立即打印文本增量,模拟流式界面。思考模型可能在 delta.reasoning_content 中返回思考增量,最后一个 chunk 还可能包含 finish_reason 和 usage。
4. 图片理解
response = client.chat.completions.create( # 发起包含公开图片 URL 的视觉理解请求。
model="glm-5v-turbo", # 选择视觉模型,不能将图像内容格式发送给纯文本模型。
messages=[ # 构造一条多模态用户消息。
{ # 单条用户消息对象。
"role": "user", # 指定消息角色。
"content": [ # 使用内容块数组组合文字任务和图片。
{"type": "text", "text": "解释图表趋势并提取坐标轴名称。"}, # 说明图片分析任务。
{ # 第二个内容块提供图片 URL。
"type": "image_url", # 声明图片由 URL 引用。
"image_url": { # 包装实际的图片地址。
"url": "https://api.nga.gov/iiif/a2e6da57-3cd1-4235-b20e-95dcaefed6c8/full/!800,800/0/default.jpg" # 使用公开示例图片,生产中须遵守访问和版权规则。
},
},
],
}
],
)
print(response.choices[0].message.content) # 输出视觉分析得到的文本。本地图片可编码为 data:image/png;base64,...。图片格式、大小与模型能力以视觉模型文档为准。
5. Function Calling
import json # 用于解析模型函数参数并序列化本地工具结果。
def get_weather(city: str) -> dict: # 定义由宿主实际执行的无副作用教学工具。
return {"city": city, "temperature": 25, "unit": "celsius"} # 返回固定离线值,避免示例访问真实服务。
tools = [{ # 声明模型可选择调用的函数工具。
"type": "function", # 指定工具类别。
"function": { # 描述函数名称、用途和输入 schema。
"name": "get_weather", # 工具名必须匹配宿主白名单。
"description": "查询指定城市的天气。", # 帮助模型判断何时调用。
"parameters": { # 使用 JSON Schema 限制参数形状。
"type": "object", # 参数必须是对象。
"properties": {"city": {"type": "string"}}, # 只允许 city 字符串字段。
"required": ["city"], # 调用时必须提供 city。
},
},
}]
messages = [{"role": "user", "content": "上海现在多少度?"}] # 初始化会在工具轮次间保存的对话历史。
first = client.chat.completions.create( # 先让模型决定是否调用工具。
model="glm-5.2", # 选择支持 Function Calling 的模型。
messages=messages, # 发送当前用户问题。
tools=tools, # 提供允许执行的工具 schema。
tool_choice="auto", # 允许模型自行决定是否调用工具。
)
assistant_message = first.choices[0].message # 取得模型消息及可能存在的 tool_calls。
messages.append(assistant_message.model_dump()) # 序列化并保留完整 assistant 消息,避免丢失工具关联字段。
for tool_call in assistant_message.tool_calls or []: # 遍历全部工具调用;未调用时安全跳过。
arguments = json.loads(tool_call.function.arguments) # 解析模型给出的 JSON 参数;生产代码应先做 schema、权限和语义校验。
result = get_weather(**arguments) # 将通过校验的参数解包传给本地函数。
messages.append({ # 添加与当前调用 ID 对应的工具结果消息。
"role": "tool", # 声明该消息承载工具执行结果。
"tool_call_id": tool_call.id, # 精确关联模型的调用 ID。
"content": json.dumps(result, ensure_ascii=False), # 将结果编码为 JSON,并保留中文字符。
})
if assistant_message.tool_calls: # 只有实际执行过工具时才发起续接轮。
final = client.chat.completions.create( # 让模型基于工具结果生成最终回答。
model="glm-5.2", # 使用与工具决策轮一致的模型。
messages=messages, # 传入 assistant tool-call 和匹配的 tool 结果。
tools=tools, # 继续提供同一工具契约。
)
print(final.choices[0].message.content) # 输出最终文本回答。如果一次返回多个 tool_calls,应全部执行并回传。高风险函数必须做参数校验和人工确认。
6. 内置 Web Search
response = client.chat.completions.create( # 发起允许模型使用内置 Web Search 的请求。
model="glm-5.2", # 选择当前支持该工具的模型;能力与计费需以官方文档为准。
messages=[ # 提供需要检索时效信息的用户任务。
{"role": "user", "content": "查找今天 Python 官方生态的重要更新。"}, # 当前检索请求。
],
tools=[ # 显式声明模型能够使用的内置工具。
{ # 定义 Web Search 工具配置。
"type": "web_search", # 声明工具类别为内置网络检索。
"web_search": { # 配置检索关键词和结果返回方式。
"search_query": "Python 官方更新", # 设定工具实际发送的查询词。
"search_result": True, # 请求在响应中附带搜索结果信息。
},
}
],
)
print(response.choices[0].message.content) # 输出模型整合搜索后的文本;生产代码还应核对引用和来源。工具支持情况取决于模型和套餐,生产中应检查搜索结果及引用,而不是只信最终总结。
7. Embedding
response = client.embeddings.create( # 调用 Embeddings API,把多段文本转换为数值向量。
model="embedding-3", # 选择入库和查询时必须保持一致的 embedding 模型。
input=[ # 批量提供待向量化文本。
"Python 适合快速开发。", # 第一条输入。
"Rust 重视性能和内存安全。", # 第二条输入。
],
)
vectors = [item.embedding for item in response.data] # 按返回顺序取出每条文本对应的向量。
print(len(vectors), len(vectors[0])) # 检查向量数量和单条维度。Embedding 用于语义搜索、相似度、聚类和 RAG。向量入库与查询要使用同一模型及相同维度。
错误处理
import zai # 导入 SDK 模块,以便捕获其公开异常类型。
try: # 将一次远程调用置于可分类处理的异常边界内。
response = client.chat.completions.create( # 发起最小聊天请求以演示异常捕获。
model="glm-5.2", # 使用运行前应确认仍可用的模型。
messages=[{"role": "user", "content": "你好"}], # 提供简单用户输入。
)
except zai.core.APIStatusError as exc: # 服务返回可识别的 API 状态错误。
print("API 状态错误:", exc) # 输出错误摘要;生产日志应脱敏并关联请求 ID。
except zai.core.APITimeoutError: # SDK 等待服务响应超时。
print("请求超时。") # 提示调用方按整体预算决定是否受控重试。这里只捕获当前示例能采取明确动作的 SDK 异常;未识别异常应保留调用栈并由应用边界统一记录,不用宽泛 except Exception 吞掉。
常见易错点
zai-sdk与旧zhipuai包混用。ZAI_API_KEY与历史环境变量名混用。- 通用 API endpoint 与 Coding 套餐 endpoint 混用。
- 文本模型处理图片,或把不同视觉模型的参数直接套用。
- 工具执行后没有回传
tool_call_id。 - 没有根据当前 SDK 版本核对图像生成、视频生成等低频方法签名。
官方延伸阅读
返回 厂商 AI API 参考目录;通用 HTTP 契约与可靠性见 API 学习目录。