← 返回资讯

智谱 GLM API Key 获取教程:注册、鉴权与首次调用

2026-07-20

智谱 GLM 的 API Key 申请全程在线完成,无需人工审核,注册后即可生成密钥并立即调用。GLM-4-Flash 模型提供免费额度,是开发者测试国产模型接口的低门槛起点。

如果你是第一次接国产模型接口,建议就从智谱下手:它的注册流程最短、免费额度到账最快,踩坑成本低。等你把这一套流程走通了,再去接百度、阿里的模型基本就是改几个字段的事,思路是通的。下面这套步骤我自己带过几个刚入行的同事照着做,平均十分钟内能拿到能用的 key,比看官方文档快。

注册与生成 API Key

  1. 访问 open.bigmodel.cn 点击「注册」,使用手机号完成实名;
  2. 登录后进入控制台 → 左侧菜单「API 密钥」→ 点击「创建新密钥」;
  3. 输入密钥备注(如 dev-test),点击确定;
  4. 页面弹窗展示完整密钥(sk-xxxxxxxx 格式),立即复制保存,弹窗关闭后无法再次查看;
  5. 控制台首页可查看赠送的免费 token 余额及消耗情况。

企业账号可在「团队管理」中为子成员分配独立密钥,统一结算。

实名这一步很多人会卡住,说清楚几个细节:智谱走的是手机号+短信验证码的轻量实名,不需要上传身份证照片或做人脸识别,比阿里云、腾讯云那套企业实名要简单得多。但如果你的手机号之前注册过智谱旗下其他产品(比如智谱清言 App),系统会提示「该手机号已存在账号」,这时候直接用原账号登录进控制台就行,不用重新注册,很多人误以为要换手机号,白白折腾一圈。

密钥备注这一栏别随手填个 test 就完事。我的习惯是按「项目名-环境」来命名,比如 blog-prodcrawler-dev,一个项目一把钥匙。好处是出问题时能立刻定位:哪个 key 消耗突增了、哪个 key 该禁用了,一目了然。如果所有项目共用一把 key,一旦某个测试脚本写了死循环疯狂调用,你根本分不清是谁在烧钱,只能整个项目一起停摆去查。这个坑我自己踩过一次,一个夜间跑批的脚本忘了加超时,一晚上把免费额度全部刷完,还牵连了线上的正式服务一起断供。

另外弹窗只出现一次这件事要认真对待,不是客套提醒。智谱后台数据库里存的是密钥的哈希值,不是明文,所以关闭弹窗之后哪怕是官方客服也没法帮你找回原文,唯一的办法是删掉重新生成一个。建议弹窗一出来就直接粘贴进你本地的密码管理器或者 .env 文件,别指望「等会再复制」。

接入示例:OpenAI 兼容调用

智谱 GLM 遵循 OpenAI Chat Completions 协议,base_url 固定为 https://open.bigmodel.cn/api/paas/v4

from openai import OpenAI

client = OpenAI(
    api_key="sk-xxxxxxxxxxxxxxxx",   # 替换为你的 GLM API Key
    base_url="https://open.bigmodel.cn/api/paas/v4",
)

response = client.chat.completions.create(
    model="glm-4-flash",             # 免费额度模型,可换 glm-4 / glm-4-plus
    messages=[
        {"role": "user", "content": "用 Python 写一个快速排序函数并附上注释"}
    ],
)
print(response.choices[0].message.content)

Node.js 示例:

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "sk-xxxxxxxxxxxxxxxx",
  baseURL: "https://open.bigmodel.cn/api/paas/v4",
});

const res = await client.chat.completions.create({
  model: "glm-4-flash",
  messages: [{ role: "user", content: "介绍一下函数调用(Function Calling)" }],
});
console.log(res.choices[0].message.content);

上面这两段代码看着简单,但有几个细节值得展开讲讲。首先是 base_url 这个参数,很多人第一次接国产模型都会在这里栽跟头:如果你之前项目里已经写好了调用 OpenAI 官方接口的代码,直接把 api_key 换成智谱的密钥、但忘了改 base_url,请求会打到 OpenAI 官方地址去,报的是 401 Unauthorized,错误信息里根本看不出「地址错了」,只会说密钥无效,很容易误判成密钥本身有问题去反复重置。排查这类问题的第一反应应该是打印一下实际请求的 URL,而不是先怀疑密钥。

其次 messages 里目前只写了 role: "user",实际项目里你几乎一定要加一条 system 角色的消息去设定人设或者约束输出格式,比如:

messages=[
    {"role": "system", "content": "你是一名严谨的 Python 助教,只返回代码和简短注释,不要输出多余解释。"},
    {"role": "user", "content": "用 Python 写一个快速排序函数并附上注释"}
]

system 消息不占用额外的调用次数,但会实实在在影响输出风格和长度,是控制成本最直接的手段之一——同样的问题,加了明确约束的 system 提示词往往能把输出 token 数砍掉三到五成。

如果你的应用是聊天机器人或者需要边生成边展示的场景,别用上面这种「等全部生成完再拿结果」的方式,用户体验会很差,几秒钟的白屏很致命。改成流式调用,加一个 stream=True 就行:

stream = client.chat.completions.create(
    model="glm-4-flash",
    messages=[{"role": "user", "content": "写一段 300 字的产品介绍"}],
    stream=True,
)
for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

流式模式下拿到的是一个个 chunk,每个 chunk 里的 delta.content 才是本次新增的文字片段,不是完整回复,这一点新手最容易搞混——很多人拿到 chunk 直接当完整结果打印,发现输出全是零碎重复的字,其实是没做拼接就直接展示了。

批量处理场景(比如给几百条客服记录做摘要)建议用异步 + 并发,同步循环调用一条一条等,慢得离谱。写法上把 OpenAI 换成 AsyncOpenAI,配合 asyncio.gather 控制并发数:

import asyncio
from openai import AsyncOpenAI

client = AsyncOpenAI(
    api_key="sk-xxxxxxxxxxxxxxxx",
    base_url="https://open.bigmodel.cn/api/paas/v4",
)

async def ask(question: str) -> str:
    resp = await client.chat.completions.create(
        model="glm-4-flash",
        messages=[{"role": "user", "content": question}],
    )
    return resp.choices[0].message.content

async def main():
    questions = ["总结第一段", "总结第二段", "总结第三段"]
    sem = asyncio.Semaphore(5)  # 控制并发数,避免触发限流

    async def guarded(q):
        async with sem:
            return await ask(q)

    results = await asyncio.gather(*(guarded(q) for q in questions))
    print(results)

asyncio.run(main())

这里的 asyncio.Semaphore(5) 是关键,不加的话 gather 会把所有请求瞬间全部发出去,很容易撞到接口的限流阈值触发 429。并发数设多少合适没有统一标准,看你的账号等级和实际额度,我一般从 5 开始压测,观察是否报错,再逐步往上调,别一上来就设 50。

主要模型速查

模型名定位上下文是否有免费额度
glm-4-flash轻量快速,日常对话128k是(注册赠送)
glm-4通用旗舰,工具调用强128k否,按量计费
glm-4-plus增强推理,复杂任务128k否,按量计费
glm-4v图文多模态8k
glm-4-alltools网页/代码/图表全工具128k

截至 2026-06,以官方为准;具体单价见 价格对比表

怎么选不用死记硬背,按场景对号入座:写内部工具、做客服问答这类对响应速度敏感、任务本身不复杂的,闭眼选 glm-4-flash,免费额度也够你跑很久的测试;涉及复杂推理、长文档摘要、多步骤任务编排,或者需要模型稳定按照你给的格式输出结构化 JSON,上 glm-4-plus,多花的费用换来的是更少的返工和更少的异常兜底代码;如果你的场景需要模型自己判断要不要调用外部工具(查天气、算数、搜索),glm-4-alltools 省心,不用自己写一套完整的 function calling 编排逻辑;纯图文识别、图表读取这类需求才用得到 glm-4v,它的上下文只有 8k,别拿它处理长文本任务,会被截断。

有个容易被忽略的取舍点:glm-4glm-4-plus 长得很像,都是按量计费、都是 128k 上下文,区别主要在推理能力和复杂指令遵循上。如果你的任务是相对简单的分类、抽取、翻译,选 glm-4 就够,没必要为了「更强」多掏钱;只有当你发现 glm-4 在你的具体任务上经常理解偏、指令遵循不到位,再升级到 glm-4-plus 去试,别一上来就无脑用最贵的模型。

鉴权方式说明

智谱平台支持两种鉴权:

  • 标准 Bearer Token(推荐):在 HTTP Header 中加 Authorization: Bearer sk-xxxxx,即 OpenAI SDK 默认行为;
  • 自签 JWT:适合对 token 有效期有严格要求的场景,参考官方文档生成签名。

大多数开发者直接用标准 Bearer Token 即可,OpenAI SDK 自动处理,无需额外配置。

这两种方式的本质区别在于「谁来控制过期时间」。用标准 Bearer Token,你的密钥长期有效,除非手动去控制台禁用,否则一直能用——简单,但也意味着一旦泄露,风险窗口是无限的,直到你发现并删除为止。自签 JWT 则是反过来:你在本地用密钥的 idsecret 部分自己签发一个短时效的令牌(比如设置 5 分钟后过期),拿这个临时令牌去请求接口,即便令牌被截获,过期后也自动失效。

什么时候真的用得上 JWT?不是所有项目都需要,别为了「看起来更专业」硬上。典型场景是你在做一个多租户的 SaaS 系统,需要给每个租户的前端页面直接下发一个能调用大模型接口的凭证,这时候你肯定不能把长期有效的主密钥直接暴露给浏览器端——一旦被人从网络请求里扒出来就是永久性泄露。这种情况下应该由你的后端服务持有主密钥,每次给前端签发一个几分钟内有效的短时 JWT,前端拿着这个临时凭证去调用,即便被截获也只是几分钟的风险敞口。普通的后端到后端调用、没有前端直接接触密钥的场景,用标准 Bearer Token 足够,没必要多引入一套签名逻辑增加维护成本。

常见问题

生成密钥后多久可以使用? 立即生效。密钥创建成功后直接发起请求即可,无延迟审核期。

API Key 泄露了怎么办? 在控制台「API 密钥」页面找到对应密钥,点击「禁用」或「删除」,然后重新生成一个。泄露的密钥建议立即删除,不要只是禁用。

调用返回 11131101 错误码怎么解决? 1101 为鉴权失败,检查 api_key 是否完整复制(无空格);1113 为账户余额不足,前往控制台充值或确认免费额度未耗尽。

排查 1101 有个细节容易漏掉:从网页复制密钥时,如果是用鼠标框选再 Ctrl+C,浏览器有时会把密钥前后的换行符或者不可见的空格一起带上,粘贴进代码里肉眼完全看不出异常,但请求就是失败。稳妥的做法是复制之后在代码里加一行 api_key = api_key.strip(),或者用编辑器打开隐藏字符显示确认一下,这个坑我见过好几个人反复重置密钥三四次都没解决,最后发现就是多了一个空格。

GLM-4-Flash 的免费额度有多少? 截至 2026-06,以官方控制台显示为准;新用户注册一般有数百万 token 赠送额度,详情参考 国产模型免费额度盘点

请求报 429 限流错误,是不是账号被封了? 不是,429 就是单纯的请求频率超过了你当前账号等级允许的并发或每分钟调用上限,跟余额、跟封号没关系。正确的处理方式不是立刻重试,而是做指数退避:第一次等 1 秒重试,失败再等 2 秒、4 秒、8 秒,逐步拉长间隔,避免在接口本就繁忙的时候继续加压。用 tenacity 库几行代码就能包一层:

from tenacity import retry, wait_exponential, stop_after_attempt

@retry(wait=wait_exponential(multiplier=1, min=1, max=16), stop=stop_after_attempt(5))
def call_glm(question: str):
    return client.chat.completions.create(
        model="glm-4-flash",
        messages=[{"role": "user", "content": question}],
    )

如果退避几次之后依然频繁 429,说明是账号等级的并发上限撞到了天花板,这时候该做的是去控制台申请提额或者升级账号等级,而不是继续加大重试次数硬扛,那样只会让延迟越拖越长。

长文本调用报 context length exceeded 或类似超限提示怎么办? 说明你传入的 messages 加上模型即将生成的内容,总 token 数超过了模型的上下文窗口(glm-4-flash 是 128k,glm-4v 只有 8k,很容易在这里翻车)。多轮对话场景尤其容易踩这个坑:每一轮都把历史消息原样带上,聊了几十轮之后上下文就爆了。处理办法一般有两种,一是做滑动窗口,只保留最近 N 轮加一段摘要式的历史概括;二是调用前先用 Token 计数器 估算一下当前 messages 的总 token 数,留出安全余量再发请求,不要卡着上限硬发。

中文输出出现乱码或者被截断,是编码问题吗? 先别急着怀疑接口,九成情况是你本地打印或者写文件时没有指定 utf-8 编码。Python 在 Windows 环境下 print 中文有时会因为终端默认编码不是 UTF-8 而报 UnicodeEncodeError 或者显示乱码,写文件时记得显式加 encoding="utf-8",比如 open("out.txt", "w", encoding="utf-8")。真正由接口返回不完整内容导致的截断,多半是 max_tokens 参数设得太小,模型话说到一半就被截断了,把这个参数适当调大,或者干脆不传使用默认值。


相关阅读国产大模型 API 全景指南 · 国产模型免费额度盘点 · 国产模型 OpenAI 兼容接口详解

分类导航国产模型专题

实用工具价格对比表 · Token 计数器