Anthropic 自己的 SDK 很優秀,但整個 AI 生態系已標準化採用 OpenAI 的用戶端形式——每個範例、每個框架介面卡,以及每篇「hello world」教學都假設您手邊有一個 OpenAI(...) 實例。將程式碼遷移為直接呼叫 Anthropic SDK 是一項實質性的重構。
其實不必如此。本文章說明如何在不修改 OpenAI SDK 的情況下,透過 Kunavo 呼叫 Claude Opus 4.7、Sonnet 4.6 與 Haiku 4.5——將呼叫經由 Kunavo 路由。相同的 SDK、相同的型別、相同的串流、相同的工具使用。唯一變更的行是 base_url。
最小變更
只要已安裝 Python 的 openai 套件,完整遷移如下。
from openai import OpenAI
client = OpenAI(
api_key="sk-kn-...",
base_url="https://api.kunavo.com/v1", # the only line that changes
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6", # a Claude slug, not 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 會成為您的 Kunavo 金鑰(在 /app/keys 建立)。base_url 指向我們的閘道。模型 ID 從 gpt-4o 切換為 Claude slug——claude-opus-4-7、claude-sonnet-4-6、claude-haiku-4-5。請求主體、回應格式,以及 SDK 中的每個輔助工具,都會如同使用 OpenAI 時完全照常運作。
串流
串流的運作方式完全相同。Kunavo 會將 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 的函式呼叫相同——差異只存在於線路層級。Kunavo 會雙向轉換 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 URL 或 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 格式表達——最重要的是用於 prompt 快取的 cache_control 指示詞,以及延伸的 thinking token。如果您需要其中任一項,請切換 SDK,但保留相同金鑰:Kunavo 也提供原生 /v1/messages 端點,因此 Anthropic SDK 同樣只需變更 base_url 即可使用。
from anthropic import Anthropic
client = Anthropic(
api_key="sk-kn-...",
base_url="https://api.kunavo.com", # SDK appends /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 了解 prompt 快取如何在重複提示中節省最高 90% 的輸入成本。
prompt 快取本身不需要切換 SDK。對於較長的提示詞,Kunavo 會在 OpenAI 格式路由上替您設定快取斷點:設定在系統提示詞、工具定義,以及已有 assistant 回合的對話的最後一則訊息上。您自行加在系統訊息、使用者訊息或工具定義上的 cache_control 會轉送給 Claude。
您放棄的功能,以及獲得的功能
OpenAI 格式路由是轉換,而非原生協定。有兩項小功能無法跨越這個界線:
- 思考控制——在此路由上,
thinking和reasoning_effort不會轉送給 Claude。若要啟用或調整延伸思考,請使用原生 Messages API。 - 思考輸出——模型進行思考時,回應不會包含這些思考內容,usage 物件也沒有為此提供個別計數:思考 token 會計入
completion_tokens。
您獲得的功能相當可觀:在 Claude、GPT、GPT-Image、Veo 與其他目錄模型間使用單一 SDK;視模型而定,低於上游官方價格;使用本地貨幣進行 Stripe 原生計費;不會默默替換模型——故障切換只會變更供應商,不會變更模型,而儀表板會逐筆列出每次呼叫的模型、token 與成本。
兩分鐘完成確認
在 kunavo.com/app/signup 註冊——$10 儲值即可支付數千次 Claude 呼叫,按量付費,餘額永不過期。填入您的 base_url,將模型 ID 替換為 Claude slug,然後對其執行現有測試套件。如果有任何功能無法順利轉換,請寄信至 contact@kunavo.com——我們會閱讀每一封訊息。