Anthropic 自家的 SDK 很好用,但整個 AI 生態系早已統一在 OpenAI 客戶端的形狀上 — 每一個範例、每一個框架的轉接層、每一份 OpenAI(...) 物件。把你的程式碼改寫成直接呼叫 Anthropic 的 SDK,是一次相當有份量的重構。
其實不必如此。本文示範如何透過 Brievio,用原封不動的 OpenAI SDK 呼叫 Claude Opus 4.7、Sonnet 4.6 與 Haiku 4.5 — 同一套 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 指向我們的閘道。模型 id 從 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)工具呼叫 / function calling
Anthropic 的工具呼叫協定在語意上,和 OpenAI 的 function calling 是一樣的 — 兩者只差在傳輸層的格式。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 權杖。如果你需要其中任何一項,就換一套 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 文件,而 /docs/caching 則說明了提示快取 如何在重複的提示上,替你省下最多 90% 的輸入成本。
你會失去什麼 — 又會得到什麼
OpenAI 形狀這條路是一層轉換,而非原生協定。有兩件小事無法跨越 這道邊界:
- cache_control 提示快取 — 這部分請改用原生的 Messages SDK,或透過
input這個逃生口傳入。 - 擴充思考權杖 — 可以在回應的 usage 物件裡讀到, 但無法當成直接的請求參數;若你需要精細控制,就切換到原生。
而你得到的,意義重大:一套 SDK 就能橫跨貨真價實的 Claude、Gemini、 GPT-Image 與 Veo 型錄;每一個模型都比官方參考價低約 15%, 並依真實的權杖數計費;原生整合 Stripe 的帳務;以及透明的路由 — 儀表板永遠會顯示每一次呼叫實際是由哪個上游服務的。
兩分鐘就能確認
到 brievio.com/app/signup 註冊 — $2 的免費額度足以涵蓋好幾千次 Claude 呼叫。把你的 base_url 填進去,把模型 id 換成一個 Claude 代號,再對 它跑一遍你現有的測試套件。如果有哪裡沒能順利跨越,來信 contact@brievio.com — 我們每一封都會看。