Anthropic 自家的 SDK 很好用,但整个 AI 生态都已经统一围着 OpenAI 客户端的 形态来设计 —— 每一份示例、每一个框架适配器、每一篇「hello world」教程,都 默认你手边有一个现成的 OpenAI(...) 实例。要把你的代码改成 直接调用 Anthropic 的 SDK,是一次相当可观的重构。
其实大可不必。本文会演示如何在不改动 OpenAI SDK 的前提下 调用 Claude Opus 4.7、Sonnet 4.6 和 Haiku 4.5 —— 办法就是 把你的调用经由 Brievio 转发。同一个 SDK、同一套类型、同样的流式、同样的工具 调用,而另一端接的是货真价实的模型。唯一需要改的,只有 base_url这一行。
最小改动
在 Python 已经装好 openai 包的情况下,完整的迁移就是下面 这个样子。
from openai import OpenAI
client = OpenAI(
api_key="sk-brievio-...",
base_url="https://api.brievio.com/v1", # 唯一需要改的一行
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6", # 填 Claude 的模型名,而不是 gpt-4o
messages=[
{"role": "system", "content": "You are a senior platform engineer."},
{"role": "user", "content": "Critique this SQL migration..."},
],
)
print(resp.choices[0].message.content)api_key 换成你的 Brievio 密钥(在 /app/keys 里创建)。base_url 指向 我们的网关。模型名从 gpt-4o 换成 Claude 的模型名 —— claude-opus-4-7、claude-sonnet-4-6、 claude-haiku-4-5。请求体、响应结构,以及 SDK 里的每一个辅助 方法,行为都跟对接 OpenAI 时一模一样。
流式输出
流式的用法完全一致。Brievio 会把 Anthropic 的 SSE 数据块,按 OpenAI 的 chat.completion.chunk 格式转发出来,所以你原有的异步迭代写法 不用改动就能跑。
for chunk in client.chat.completions.create(
model="claude-opus-4-7",
messages=[{"role": "user", "content": "Explain Raft in 200 words."}],
stream=True,
):
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)工具调用 / 函数调用
Anthropic 的工具调用协议,在语义上和 OpenAI 的函数调用是一回事 —— 两者 只在传输层的细节上有差别。Brievio 会双向翻译 tools 数组、 响应里的 tool_calls,以及后续的 tool 消息。无论你 用 tool_choice="auto"、 "none",还是指定某个具名工具 —— 它们全都能对应 得上。
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather in a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["city"],
},
},
}
]
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
tools=tools,
tool_choice="auto",
)
print(resp.choices[0].message.tool_calls)视觉(图像)
Claude 从 3.5 起就支持多模态;传图用的就是 OpenAI 标准的那个 content: [{ type: 'text' }, { type: 'image_url' }] 数组。image_url.url 既可以是 https 链接,也可以是 data: 开头的 base64 URI。
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image_url",
"image_url": {"url": "https://example.com/cat.jpg"}},
],
}],
)什么时候你确实需要原生的 Anthropic SDK
有些 Anthropic 独有的特性,没法用 OpenAI 的形态来表达 —— 其中最重要的, 是用于提示缓存的 cache_control 指令,以及扩展 thinking(思考)token。如果你需要其中任意一项,就换用 SDK,但 密钥不用变:Brievio 同样开放了原生的 /v1/messages 接口,所以 Anthropic 的 SDK 也只需改一行 base_url 就能用。
from anthropic import Anthropic
client = Anthropic(
api_key="sk-brievio-...",
base_url="https://api.brievio.com", # SDK 会自动补上 /v1/messages
)
resp = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
system="You are a senior platform engineer.",
messages=[{"role": "user", "content": "What is a hot standby?"}],
)
print(resp.content[0].text)完整的透传参数清单,请看 原生 Messages API 文档;至于提示缓存 如何在重复提示上为你省下高达 90% 的输入成本,请看 /docs/caching。
你会失去什么 —— 又会得到什么
走 OpenAI 形态的这条路是一层翻译,而非原生协议。有两个小东西跨不过这道 边界:
- cache_control(提示缓存)—— 这一项请改用原生的 Messages SDK,或者通过
input这个后门参数传进去。 - 扩展思考 token —— 它能在响应的 usage 对象里读到,但 没法作为请求参数直接传;要精细控制,就切到原生那一套。
而你得到的则相当可观:一个 SDK 就能打通货真价实的 Claude、Gemini、 GPT-Image 和 Veo 全套目录;每一个模型都 比官方报价低约 15%,并按真实 token 数计费;原生对接 Stripe 的账单;以及透明的路由 —— 仪表板始终显示每一次调用究竟是由哪个 上游真正服务的。
两分钟就能验证
到 brievio.com/app/signup 注册 —— 赠送的 2 美元额度,足够跑上几千次 Claude 调用。把你的 base_url 填进去,把模型名换成 Claude 的,再用你现有的测试 套件对着它跑一遍。要是有哪一处没能干净地跨过来,写邮件到 contact@brievio.com —— 每一封我们都会读。