用 OpenAI Python SDK 调用国产大模型要怎么改代码?
直接回答
用 OpenAI Python SDK 调用国产大模型只需要改三处:创建客户端时把 base_url 设为兼容服务的地址,api_key 换成该平台的 Key,调用时把 model 写成目标模型的 ID。其余的 messages、stream 等写法保持不变。
官方的 openai Python 包可以直接用来调用国产大模型,前提是对方提供 OpenAI 兼容接口。需要改的只有三处:base_url、api_key 和 model。
下面以 EasyAPI 为例给出可以直接运行的代码。EasyAPI 的 OpenAI 兼容 Base URL 是 https://token.easyapi.com/v1,一个 Key 可以调用多家国产模型,所以换模型时连前两处都不用再动。
关键要点
- 安装官方包
pip install openai即可,不需要额外的厂商 SDK。 base_url要写到/v1为止,不要带/chat/completions。- API Key 建议放在环境变量里,不要写进代码或提交到仓库。
- 模型 ID 区分大小写,以模型广场显示的为准。
- 流式输出只需加
stream=True,写法与调用 OpenAI 时相同。
完整示例
步骤如下:
- 在 EasyAPI 控制台的令牌管理中创建令牌,复制
sk-开头的 Key。 - 把 Key 写入环境变量:
export EASYAPI_API_KEY="sk-..."。 - 安装 SDK:
pip install openai。 - 运行下面的代码。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://token.easyapi.com/v1", # 改动 1:服务地址
api_key=os.environ["EASYAPI_API_KEY"], # 改动 2:平台签发的 Key
)
resp = client.chat.completions.create(
model="deepseek-v4.1-flash-1017", # 改动 3:模型 ID
messages=[
{"role": "system", "content": "你是一个简洁的助手。"},
{"role": "user", "content": "用三句话解释什么是向量数据库。"},
],
)
print(resp.choices[0].message.content)
print(resp.usage) # 本次调用的输入、输出 Token 数
换一个模型
客户端不用重新创建,只改 model 即可。下面这些模型 ID 都在 EasyAPI 当前的公开目录里:
| 模型 ID | 厂商 | 目录中的定位 |
|---|---|---|
deepseek-v4.1-flash-1017 | DeepSeek | 主力模型,支持思考与非思考模式 |
qwen3.8-max | 阿里 Qwen | Qwen3.8 系列的旗舰推理模型 |
kimi-k3 | 月之暗面 | 面向复杂编程与长时间智能体任务的多模态推理模型 |
glm-5.3 | 智谱 | 面向复杂软件工程与长程智能体任务 |
for name in ["deepseek-v4.1-flash-1017", "qwen3.8-max", "kimi-k3", "glm-5.3"]:
r = client.chat.completions.create(
model=name,
messages=[{"role": "user", "content": "1+1 等于几?只回答数字。"}],
)
print(name, "->", r.choices[0].message.content)
目录会随供应商调整,完整列表以模型广场为准,也可以调用 client.models.list() 查看当前 Key 可用的模型。
流式输出
stream = client.chat.completions.create(
model="qwen3.8-max",
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)
流式模式下内容是分块到达的,每个数据块里的 delta.content 可能为空,所以要先判断再输出。需要统计用量时,可以在请求里加上 stream_options={"include_usage": True},用量信息会出现在靠后的数据块中。
上线前建议补上的三件事
示例代码能跑通只是开始,放进正式项目前建议再做三件事:
- 设置超时和重试。 创建客户端时可以传入
timeout和max_retries,避免网络抖动时请求一直挂起。哪些错误值得重试,见报错排查一文。 - 限制输出长度。 通过
max_tokens或max_completion_tokens给输出设上限,防止异常情况下生成过长内容而多扣费。 - 按环境拆分 Key。 开发、测试、生产各用一个令牌,并在控制台为每个令牌设置额度和可用模型,出问题时可以单独停用。
容易填错的地方
- base_url 少了
/v1或多了路径。 正确写法是https://token.easyapi.com/v1。 - 用了别的平台的 Key。 Key 与签发它的平台绑定,换了地址就要换 Key。
- 模型名拼写或大小写不对。 建议直接从模型广场复制。
- 参数不被目标模型支持。 例如部分新模型需要用
max_completion_tokens替代max_tokens。切换模型后遇到参数报错,先去掉非必需参数再逐个加回。 - 把视频模型当成对话模型调用。 视频生成使用异步任务接口,不能通过
chat.completions调用。
需要说明的边界:OpenAI SDK 只覆盖兼容格式里的通用能力。如果你要用某家厂商的专有参数或专有接口,这种写法不一定能满足,需要查该模型的说明或改用厂商官方 SDK。原理见 OpenAI 兼容 API 是什么。
常见问题
调用国产大模型需要装各家自己的 SDK 吗?
不需要。只要服务提供 OpenAI 兼容接口,用官方 openai 包就能调用;通过 EasyAPI 接入时,多家模型共用同一个客户端对象。
代码里的 api_key 可以直接写死吗?
不建议。Key 拥有完整的调用权限,写进代码容易随仓库或截图泄露。放在环境变量或密钥管理服务中,并按环境使用不同的令牌更稳妥。
运行后报 401 怎么办?
先检查 Key 是否完整、是否属于当前平台、令牌是否过期或被禁用。完整排查步骤见 调用大模型 API 返回 401 / 429 / 5xx 分别该怎么排查。
异步客户端 AsyncOpenAI 也能这样用吗?
可以。AsyncOpenAI 与 OpenAI 接受同样的 base_url 和 api_key 参数,改法相同。
小结
用 OpenAI Python SDK 调用国产大模型,只需要改 base_url、api_key 和 model 三处,流式、多轮对话等写法都不变。切换模型后记得验证参数支持情况,接口细节见 EasyAPI 文档。