大模型应用开发中,推理API是最核心的调用入口。OpenAI和Anthropic都提供了官方的Python SDK,能够帮助开发者省去手动拼装HTTP请求、处理认证和解析响应的繁琐工作。本文将详细介绍两个SDK的推理调用方法,并通过一个统一封装层的示例,展示如何让业务代码在两个模型之间平滑切换。

OpenAI SDK的推理调用详解
OpenAI官方SDK使用pip install openai即可安装。新版本SDK采用了统一的同步与异步双客户端设计,通过OpenAI和AsyncOpenAI两个类分别处理不同场景。认证方面,SDK默认读取环境变量OPENAI_API_KEY,也可以在初始化时显式传入。
最基础的推理调用使用chat.completions.create方法。消息以列表形式传入,每条消息包含role和content两个字段。下面是一个完整的示例:
from openai import OpenAI
client = OpenAI(api_key="sk-xxxx")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个专业的技术助手"},
{"role": "user", "content": "解释一下什么是推理API"}
],
temperature=0.7,
max_tokens=1024
)
print(response.choices[0].message.content)
print(f"消耗Token数: {response.usage.total_tokens}")流式输出是实际生产环境中非常常用的能力,尤其适合聊天类应用。只需设置stream=True,返回对象就变成了一个可迭代的事件流,每个chunk包含增量文本内容:
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "写一段Python快速排序代码"}],
stream=True
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")Anthropic SDK的推理调用详解
Anthropic的官方SDK通过pip install anthropic安装,整体风格与OpenAI SDK类似,但消息结构有明显差异。最大的特点是系统提示词不在消息列表中,而是作为独立的system参数传入,这种设计让系统级指令与人机对话内容分离得更清晰。
基础调用示例如下:
import anthropic
client = anthropic.Anthropic(api_key="sk-ant-xxxx")
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
system="你是一个专业的技术助手",
messages=[
{"role": "user", "content": "解释一下什么是推理API"}
]
)
print(message.content[0].text)
print(f"输入Token: {message.usage.input_tokens}, 输出Token: {message.usage.output_tokens}")注意Anthropic要求max_tokens是必填参数,这与OpenAI的可选设计不同。响应内容是一个块列表,普通文本位于text类型的块中,如果模型调用了工具,还会出现tool_use类型的块,因此解析时需要按类型遍历。
Anthropic的流式调用返回的是事件对象,每个事件有明确的type字段,语义比OpenAI的chunk结构更清晰:
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "写一段Python快速排序代码"}]
) as stream:
for text in stream.text_stream:
print(text, end="")两家SDK的核心差异对比
虽然两个SDK的整体使用体验接近,但在细节上存在不少差异,封装前必须了解清楚。下表列出了主要区别点:
| 对比项 | OpenAI SDK | Anthropic SDK |
|---|---|---|
| 系统提示词 | 放在messages列表中,role为system | 独立的system参数 |
| max_tokens | 可选参数 | 必填参数 |
| 响应结构 | choices[0].message.content | content列表,需按类型遍历 |
| 流式返回 | chunk增量对象 | 带type字段的事件流 |
| Token统计 | usage.total_tokens | input_tokens与output_tokens分列 |
这些差异意味着直接切换SDK时,消息构造和响应解析代码都要改动。对于需要做多模型对比、灰度切换或者供应商容灾的应用来说,做一层统一抽象是非常值得的投入。
构建统一的推理封装层
封装的目标是定义一个统一的接口,把消息构造、参数适配和响应解析的差异全部收敛到适配器内部。可以借助抽象基类定义规范,再为每个供应商实现具体的适配器:
from abc import ABC, abstractmethod
class LLMClient(ABC):
@abstractmethod
def chat(self, system: str, messages: list, **kwargs) -> str:
pass
class OpenAIClient(LLMClient):
def __init__(self, api_key: str, model: str = "gpt-4o"):
from openai import OpenAI
self.client = OpenAI(api_key=api_key)
self.model = model
def chat(self, system: str, messages: list, **kwargs) -> str:
full_messages = [{"role": "system", "content": system}] + messages
resp = self.client.chat.completions.create(
model=self.model,
messages=full_messages,
max_tokens=kwargs.get("max_tokens", 1024),
temperature=kwargs.get("temperature", 0.7),
)
return resp.choices[0].message.content
class AnthropicClient(LLMClient):
def __init__(self, api_key: str, model: str = "claude-sonnet-4-5"):
import anthropic
self.client = anthropic.Anthropic(api_key=api_key)
self.model = model
def chat(self, system: str, messages: list, **kwargs) -> str:
resp = self.client.messages.create(
model=self.model,
system=system,
messages=messages,
max_tokens=kwargs.get("max_tokens", 1024),
temperature=kwargs.get("temperature", 0.7),
)
return "".join(block.text for block in resp.content if block.type == "text")使用时,业务代码只面向LLMClient接口编程,切换模型只需替换实现类的实例化代码:
def get_client(provider: str) -> LLMClient:
if provider == "openai":
return OpenAIClient(api_key="sk-xxxx")
elif provider == "anthropic":
return AnthropicClient(api_key="sk-ant-xxxx")
raise ValueError(f"不支持的供应商: {provider}")
client = get_client("anthropic")
answer = client.chat(
system="你是一个Python专家",
messages=[{"role": "user", "content": "装饰器的原理是什么"}]
)
print(answer)错误处理与生产环境建议
推理API属于网络调用,超时、限流和偶发服务端错误都不可避免。两个SDK都提供了类型化的异常类,OpenAI有RateLimitError、APIConnectionError等,Anthropic有RateLimitError、APIStatusError等。建议在封装层统一捕获并做指数退避重试,SDK自身也内置了自动重试机制,可以通过max_retries参数配置。
from openai import OpenAI, APIStatusError
client = OpenAI(max_retries=3, timeout=30)
try:
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "你好"}]
)
except APIStatusError as e:
print(f"API返回错误状态: {e.status_code}")此外还有几点实践建议:API密钥一律通过环境变量管理,不要硬编码进代码;对超时时间做显式设置,避免默认值在生产环境造成请求堆积;记录每次调用的Token消耗,便于成本监控;流式接口配合前端逐字渲染时,要注意处理连接中断后的部分结果展示。做好这些细节,封装层才能真正支撑生产环境的稳定运行。
OpenAI SDKAnthropic SDKPython推理API修改时间:2026-09-02 16:53:10