如何通过 OpenAI 兼容 API 调用模型
2026-11-11
摘要
调用 OpenAI 兼容 API,先配置服务商的 API 密钥、基础地址(base URL)和准确的模型 ID,再通过 Chat Completions 接口发送对话请求。本文提供 Python 与 cURL 示例,带你完成首次调用、开启流式输出并排查错误,也说明图像、视频和语音生成分别应使用哪些接口。
通过 OpenAI 兼容 API 调用模型,只需给 OpenAI 客户端配置服务商的 API 密钥和基础地址(base URL),再用准确的模型 ID 向 Chat Completions 接口发送对话请求。也可以用 cURL 直接发送同样的请求,需要提供 Bearer 认证、JSON 格式的消息列表和模型 ID。
先发送一条简短的文本请求。收到回答后,再添加流式输出或应用所需的选项。相比一开始就同时加入工具、图像和长对话,这个顺序更容易定位配置错误。
1. 正确配置三个连接参数
OpenAI 兼容 API 沿用 OpenAI API 的请求与响应格式,但由服务商提供服务。使用 OpenAI SDK 不等于把请求发给 OpenAI;请求实际发往哪里,取决于你配置的基础地址。在 AIAdapter 支持的聊天模型之间切换时,可以复用客户端和同一账户的 API 密钥,让连接配置与模型选择彼此独立。
AIAdapter 的 API 文档规定了以下配置:
| 配置项 | 应填写的内容 |
|---|---|
| API 密钥 | 你的 AIAdapter 账户密钥 |
| 基础地址 | https://api.aiadapter.com/v1 |
| 模型 ID | 模型广场中的完整标识符,包含厂商前缀 |
SDK 会在基础地址后追加 /chat/completions。保留 /v1,不要把完整端点填入 base_url。
从模型广场选择聊天模型。以下示例使用已列出的 Qwen3.5-Plus 模型,标识符为 aliyun-bailian/qwen3.5-plus。请完整复制,不要只填写 Qwen 这样的模型家族名称。
在 Console → API Keys 中创建密钥。将密钥保存在服务端的环境变量或密钥管理服务中,不要写入前端 JavaScript。AIAdapter 密钥用于向 AIAdapter 认证,不能用 OpenAI 账户密钥替代。
2. 准备 Python 与环境变量
当前 OpenAI Python SDK 要求 Python 3.10 或更高版本。使用运行脚本的同一个解释器安装:
python -m pip install --upgrade openai在终端设置以下环境变量,把密钥占位符替换为你的账户密钥。
macOS、Linux 或 Bash:
export AIADAPTER_API_KEY="your-aiadapter-api-key"
export AIADAPTER_MODEL_ID="aliyun-bailian/qwen3.5-plus"Windows PowerShell:
$env:AIADAPTER_API_KEY = "your-aiadapter-api-key"
$env:AIADAPTER_MODEL_ID = "aliyun-bailian/qwen3.5-plus"这些环境变量仅在当前终端会话中生效。请从同一终端启动 Python,确保进程能读取它们。部署应用时,在托管平台的密钥设置中配置这些变量。避免在共享电脑上输入密钥,以免命令历史记录泄露密钥。
3. 发送第一条聊天请求
将以下示例保存为 call_model.py:
import os
from openai import OpenAI
with OpenAI(
api_key=os.environ["AIADAPTER_API_KEY"],
base_url="https://api.aiadapter.com/v1",
timeout=60.0,
max_retries=0,
) as client:
completion = client.chat.completions.create(
model=os.environ["AIADAPTER_MODEL_ID"],
messages=[
{"role": "user", "content": "Explain an API in two sentences."}
],
)
print(completion.choices[0].message.content)运行 python call_model.py。
SDK 会自动构建认证请求头并序列化请求。messages 用来传入对话内容,model 指定要调用的模型。普通文本响应中的回答位于 choices[0].message.content,脚本会将其打印出来。
首次请求未添加可选的采样、推理和输出长度限制字段。基本调用成功后,再按所选模型的文档添加这些字段。有些模型使用 max_tokens,其他模型则使用 max_completion_tokens 或不同的控制参数。
max_retries=0 会在排查首次调用时关闭 SDK 重试。timeout=60.0 为网络操作设置 60 秒超时,并不是整个脚本必须在 60 秒内执行完毕。用于生产环境时,应按应用需求设置超时时间,并限制重试次数。
4. 用 cURL 发送等效请求
使用以下 Bash 命令,不经过 Python SDK,直接测试 HTTP 请求:
curl https://api.aiadapter.com/v1/chat/completions \
-H "Authorization: Bearer $AIADAPTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "aliyun-bailian/qwen3.5-plus",
"messages": [
{"role": "user", "content": "Explain an API in two sentences."}
]
}'这里需要填写完整端点,因为 cURL 不会像 SDK 那样追加路径。-d 选项会发送 POST 请求。读取返回的 JSON;如果请求失败,也要查看其中的错误信息。
如果 cURL 成功而 Python 失败,检查环境变量、已安装的 SDK 和实际客户端配置。如果两者都失败,先排查密钥、端点、模型 ID 和账户余额,再修改提示词。
5. 开启流式输出,逐步接收回答
对于支持流式输出的聊天模型,设置 stream=True,并从每个数据块的 delta.content 中读取文本。将下面的示例保存为独立脚本,使用相同的环境变量:
import os
from openai import OpenAI
with OpenAI(
api_key=os.environ["AIADAPTER_API_KEY"],
base_url="https://api.aiadapter.com/v1",
timeout=60.0,
max_retries=0,
) as client:
with client.chat.completions.create(
model=os.environ["AIADAPTER_MODEL_ID"],
messages=[{"role": "user", "content": "Explain an API in two sentences."}],
stream=True,
) as stream:
for chunk in stream:
if chunk.choices:
text = chunk.choices[0].delta.content
if text:
print(text, end="", flush=True)
print()AIAdapter 文档说明,流式聊天响应使用 Server-Sent Events。代码中的检查会跳过不含新增文本的数据块,包括控制数据块或仅含用量信息的数据块。流式输出会逐步传递结果,但不会改变模型的输入要求。
6. 添加功能前先排查错误
结合 HTTP 状态码和返回的错误信息定位问题:
| 错误现象 | 优先排查或处理 |
|---|---|
401 认证错误 | 确认密钥属于当前服务商,且已传入进程或 Bearer 请求头。 |
404 或找不到模型 | 检查 /v1 路径、端点以及包含厂商前缀的准确模型 ID。 |
400 或 422 请求错误 | 将请求精简为 model 和 messages,再逐项核对可选字段。 |
429 限流错误 | 降低并发,采用有上限的退避策略重试。 |
| 余额或配额不足 | 检查控制台,先解决计费或配额问题,再重试。 |
| 连接失败或超时 | 检查 DNS、网络访问和客户端超时设置;再次提交前核查服务端处理情况。 |
在 Python 中,捕获 openai.APIStatusError 后可检查 status_code 和 response。连接失败则捕获 openai.APIConnectionError。流式响应中的错误也可能抛出 openai.APIError,因此不仅要处理创建请求时的异常,还要处理迭代读取流式数据时的异常。不要把密钥和敏感提示词写入诊断日志。
常见问题
OpenAI 兼容是否意味着所有 OpenAI 端点都能使用?
不是。服务商实际实现了哪些端点,才能使用哪些端点。本文使用 Chat Completions,因为 AIAdapter 文档明确列出了该接口。SDK 还可能提供 Responses、文件上传、助手等资源,但 SDK 中有这些方法,不代表服务商也支持对应功能。调用时应选用与服务商文档一致的 SDK 方法。添加高级对话功能前,先核对所选模型接受的工具、推理和结构化输出字段,再将它们加入已能正常运行的请求。
切换模型时,可以不修改这个 Python 客户端吗?
如果另一个模型也使用相同的 Chat Completions 端点和认证方式,就可以保留客户端,只更换模型 ID。脚本从 AIADAPTER_MODEL_ID 读取该值,因此修改配置即可选择另一个对话模型。切换后,仍需检查新模型支持的参数、上下文长度限制和响应处理方式。先用相同的简短消息确认新模型能正常调用,再恢复应用中的工具、格式约束或更长的对话历史。
这个聊天示例可以生成图像或视频吗?
应根据所需输出选择对应操作。AIAdapter 文档列出 /v1/images/generations 用于图像生成、/v1/video/generations 用于视频任务、/v1/audio/speech 用于语音合成。视频生成需要先提交任务,再轮询 /v1/video/generations/{id}。理解图像的视觉语言模型与生成图像的模型不同。各操作应使用对应模型的请求字段和输出处理方式,而不是把视频模型 ID 填进聊天示例。
重试会如何影响失败或超时的调用?
OpenAI Python SDK 默认会对部分连接错误和 HTTP 错误重试两次。本文在首次测试时关闭自动重试,以便定位失败原因。请求超时不代表服务端没有处理请求;重复提交生成请求可能导致重复执行。应限制重试次数,查看可用的请求或任务状态,并将额外尝试纳入用量和成本考虑。如果流式连接在输出部分文本后中断,也要单独处理已经收到的部分结果。
如何确认首次请求的成本?
调用前,在模型价格目录和对应模型详情页查看所选模型的当前价格与计费单位。按 token 计费的聊天调用,需要同时考虑输入和输出用量;可选字段和更长的回答都可能改变消耗。响应中提供用量时,应查看该数据,并与控制台的账单记录核对。图像、视频和语音操作可能采用不同的计费单位,不要用聊天 token 单价估算其成本。
先发送一条简短请求,确认返回的回答,再基于这套可用配置扩展功能。如果需要密钥,可以创建账户,完成第一次服务端接入。
常见问答
如何通过 OpenAI 兼容 API 调用模型
调用 OpenAI 兼容 API,先配置服务商的 API 密钥、基础地址(base URL)和准确的模型 ID,再通过 Chat Completions 接口发送对话请求。本文提供 Python 与 cURL 示例,带你完成首次调用、开启流式输出并排查错误,也说明图像、视频和语音生成分别应使用哪些接口。