智谱API使用教程:密钥申请与Python调用示例
调用智谱API并不复杂:先到智谱AI开放平台注册账号并创建API Key,然后安装官方SDK或直接发HTTP请求即可。
下面从密钥申请到代码验证逐步说明,适合第一次接触智谱API的开发者。
准备工作:账号与密钥
在开始写代码前,需要完成两件事:注册开放平台账号、创建API Key。
- 浏览器访问
open.bigmodel.cn,用手机号或邮箱注册并登录。 - 进入控制台,在「API Keys」或「密钥管理」页面点击「创建API Key」。
- 为密钥起一个便于识别的名称(例如
my-first-key),创建后立即复制并保存到安全位置。密钥只显示一次,关闭页面后无法再次查看完整值。
如果使用Python SDK,还需要安装依赖:
pip install zhipuai
注意:智谱的Python包名是 zhipuai,不是 zhipu。
安装前建议确认Python版本在3.8以上。
发送第一个请求
拿到密钥后,可以通过两种方式调用:官方SDK或直接发HTTP请求。
新手推荐先用SDK,代码更短。
方式一:使用Python SDK
将API Key设置为环境变量,避免硬编码在代码中:
export ZHIPUAI_API_KEY="你的API Key"
然后新建 test_zhipu.py:
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="你的API Key") # 也可从环境变量读取
response = client.chat.completions.create(
model="glm-4-flash", # 按需替换为可用模型
messages=[
{"role": "user", "content": "用一句话介绍Python"}
]
)
print(response.choices[0].message.content)
运行 python test_zhipu.py,如果终端输出模型返回的文本,说明调用成功。
方式二:直接发HTTP请求
如果不使用SDK,可以用 requests 库调用兼容OpenAI的接口地址:
import requests
url = "https://open.bigmodel.cn/api/paas/v4/chat/completions"
headers = {
"Authorization": "Bearer 你的API Key",
"Content-Type": "application/json"
}
data = {
"model": "glm-4-flash",
"messages": [{"role": "user", "content": "你好"}]
}
resp = requests.post(url, headers=headers, json=data, timeout=30)
print(resp.status_code)
print(resp.json())
返回的JSON中,choices[0].message.content 就是模型回复。
常见报错与排查
调用失败时,先看HTTP状态码和返回体中的 error 字段。
- 401 Unauthorized:密钥无效或未正确传递。检查
Authorization头是否写成Bearer 你的Key,注意Bearer后有空格;确认密钥没有多余空格或换行。 - 429 Too Many Requests:请求频率超限或余额不足。登录控制台查看「账户余额」和「调用统计」,免费额度用完后需要充值或等待次日重置。
- 400 Bad Request:参数格式错误。常见原因是
messages不是列表,或model名称拼写错误。对照官方文档确认模型标识。 - 超时:服务器网络不通。用
curl -I https://open.bigmodel.cn测试连通性,若超时检查防火墙或代理设置。
避坑提醒:不要把API Key提交到GitHub公开仓库。
建议使用 .env 文件配合 python-dotenv 加载,或在部署环境中设置环境变量。
验证调用是否正常
完成首次调用后,建议做一次完整验证:
- 在控制台「调用日志」中确认有对应的请求记录,状态为成功。
- 检查返回内容是否包含预期的回复文本,而不是错误信息。
- 如果用于生产,设置超时和重试逻辑,例如
timeout=30,并对429状态码做退避重试。
只要密钥配置正确且账户有余额,上述步骤就能跑通。
遇到异常时,优先核对密钥和余额,再检查请求参数格式。
常见疑问
免费额度怎么查看? 登录控制台后,在「费用中心」或「资源包管理」页面可以看到剩余tokens或调用次数。
不同模型额度不同,以页面显示为准。
能不能在前端直接调用? 不建议。
API Key暴露在前端代码中容易被盗用,应由后端服务代理请求,前端只调用自己的接口。
支持流式输出吗? 支持。
在请求参数中设置 stream=True,SDK和HTTP方式都可以逐块接收回复,适合需要实时显示的场景。