GLM API 的接入成本比很多人想象得低:它提供 OpenAI 兼容接口,现有 OpenAI SDK 通常只需要改三处——API Key、Base URL 和模型名。真正的坑不在“能不能调通”,而在模型名是否有效、流式输出怎么处理、工具调用返回什么格式,以及从 OpenAI 迁移时哪些参数不能照搬。

本文用一条最小请求把链路跑通,再补充流式、工具调用、报错排查和迁移清单。所有示例都可以直接替换 Key 后运行。

说明:智谱、GLM、BigModel 是相关权利人的商标,本文仅作技术说明,与智谱无隶属、代理或授权关系。Base URL、模型名、上下文长度与计费口径可能调整,请以智谱开放平台官方文档和站内模型价格为准。

一、接入前准备

开始前确认三样东西:

  • 一个可用的 API Key,且类型与要调用的接口匹配。
  • 正确的 Base URL,官方直连与网关地址不能混用。
  • 一个当前真实可用的模型名,不要照抄旧文章里的示例。

如果是新项目,建议先用 curl 验证鉴权和网络,再接入 SDK。这样出错时容易判断是 Key、地址还是代码问题。

二、Base URL 怎么填

智谱官方 OpenAI 兼容接口的 Base URL 通常写作:

https://open.bigmodel.cn/api/paas/v4

中商起航 AI 网关的 OpenAI 兼容地址是:

https://ai.zhongshangqihang.com/v1

两者都按 OpenAI 的 /chat/completions 路径拼接。注意不要在代码里重复拼接版本段或 /chat/completions,也不要在末尾随意加减斜杠后混用。

接入方式 Base URL 示例 适用场景 注意事项
智谱官方 https://open.bigmodel.cn/api/paas/v4 只用 GLM、要最新功能 需官方账号与余额
中商起航网关 https://ai.zhongshangqihang.com/v1 多模型统一入口、统一账单 需在网关创建 Key

三、模型名怎么选

GLM 系列按能力分为文本、视觉、语音、向量等类别。文本模型里又有不同档位:有的偏向通用对话与 Agent,有的偏向低延迟和高并发,有的支持更长的上下文。以官方文档当前列出的 GLM-5 系列为例,常见写法包括 glm-5.3、glm-5.3-flash、glm-5.2 等,但模型会持续更新,实际可用名称请以控制台和模型价格页为准。

选型时不要只看“最强”。客服问答、批量分类这类任务,用低延迟档位往往更划算;长文档分析、复杂 Agent 再上高配。把模型名做成配置项,而不是写死在代码里,后续切换会轻松很多。

如果任务涉及图片理解,要选择支持视觉输入的模型;涉及向量检索,则使用 embedding 系列。文本、视觉、向量模型的接口路径和参数并不完全相同,不要用同一个请求体硬套。上线前把候选模型放进同一套评测集,比较准确率、延迟和用量,再决定主力与备用。

四、用 curl 跑通第一次调用

先准备环境变量,避免 Key 出现在命令历史里:

export GLM_API_KEY="your_key_here"

curl https://open.bigmodel.cn/api/paas/v4/chat/completions \
  -H "Authorization: Bearer $GLM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "glm-5.3",
    "messages": [
      {"role": "system", "content": "你是一名简洁的技术助手。"},
      {"role": "user", "content": "用三句话解释什么是 API 网关。"}
    ],
    "temperature": 0.6
  }'

返回正常时,重点看三个字段:choices[0].message.content 是回答,usage 是本次用量,finish_reason 表示结束原因。如果返回 401,先查 Key 和请求头;如果返回 1211,先查模型名。

五、用 Python SDK 调用与流式输出

OpenAI SDK 需要 1.0 以上版本。把 Base URL 指向 GLM 后,调用方式与 OpenAI 基本一致:

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("GLM_API_KEY"),
    base_url="https://open.bigmodel.cn/api/paas/v4",
)

stream = client.chat.completions.create(
    model="glm-5.3",
    messages=[{"role": "user", "content": "写一段产品介绍,不超过一百字。"}],
    stream=True,
)

for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

流式输出要注意:首个 chunk 可能只有角色信息,content 为空;不要假设每个 chunk 都有文本。开启思考模式时,推理内容可能出现在 reasoning_content 字段,最终回答仍在 content,两者要分开处理,避免把推理过程直接展示给终端用户。

六、工具调用与参数差异

工具调用沿用 OpenAI 的 tools 和 tool_choice 格式。模型返回 message.tool_calls 后,需要把每个调用的 function.arguments 按 JSON 解析,执行本地函数,再把结果以 tool 角色消息回传。生产环境要做参数校验和超时控制,不能直接信任模型生成的参数。

从 OpenAI 迁移时有几个差异要留意:temperature 的取值范围通常是 0 到 1 之间,传 0 可能不生效;默认值约为 0.6;部分新能力需要通过 extra_body 传参。具体参数以官方 OpenAI 兼容文档为准。

流式场景还要处理客户端断开。用户关闭页面后,服务端应尽快取消上游请求,避免继续生成和计费;如果业务必须完整生成,就把任务转到后台队列,不要依赖前端连接。

七、常见错误对照

现象 可能原因 处理方式
401 / 1000 Key 错误、类型不匹配 核对 Key 类型与请求头
1211 模型名不存在或未开通 查控制台可用模型
1261 输入超过上下文限制 压缩提示词或分段
1302 / 1305 账户限流或平台繁忙 降并发、退避重试
1113 账户欠费 充值后重试
连接超时 DNS、代理或网络路径 先用 curl 定位网络层

重试只对 429、5xx 和网络超时有效。401、1211、1261 这类错误重试不会变好,反而浪费时间和额度。

八、从 OpenAI 迁移的检查清单

  1. 备份现有提示词、模型参数和评测集。
  2. 新建 GLM 专用 Key,不要复用其他厂商的 Key。
  3. 把 Base URL 和模型名改为配置项。
  4. 用同一批样本对比输出质量、延迟和用量。
  5. 检查流式解析、工具调用和 JSON 输出是否兼容。
  6. 调整重试、超时和并发,观察一周再切全量。

九、常见问题(FAQ)

1. GLM API 完全兼容 OpenAI 吗?

大部分常用接口兼容,但仍存在参数范围、思考字段和部分高级能力的差异。建议按官方 OpenAI 兼容文档逐项验证,不要假设所有参数行为一致。

2. Base URL 末尾要不要加斜杠?

官方文档中带斜杠和不带斜杠的写法都出现过,SDK 通常会自动处理。关键是不要重复拼接路径,选一种写法并在项目内统一。

3. 流式输出能拿到推理过程吗?

部分模型在思考模式下会返回 reasoning_content。是否需要展示取决于产品设计,面向终端用户时通常只展示最终回答。

4. 工具调用和 OpenAI 格式一样吗?

工具定义和返回结构基本沿用 OpenAI 格式,但参数细节可能随模型变化。上线前用真实工具做一轮回归测试。

5. 官方和网关的模型名一样吗?

多数情况下沿用同一套模型名,但网关是否开通某个模型、是否支持某个参数,要以网关控制台和模型价格页为准。

相关阅读