Anthropic独自のSDKは優れていますが、AIエコシステム全体はOpenAIクライアントの形に標準化されています。あらゆる例、フレームワークアダプター、「Hello World」チュートリアルは、OpenAI(...)インスタンスが手元にあることを前提としています。AnthropicのSDKを直接呼び出すようにコードを移行するのは、意味のあるリファクタリングです。
その必要はありません。この投稿では、OpenAI SDKを変更せずにClaude Opus 4.7、Sonnet 4.6、Haiku 4.5を呼び出す方法を説明します。Kunavo経由でリクエストをルーティングするだけです。同じSDK、同じ型、同じストリーミング、同じツール使用。その違いはbase_urlの1行だけです。
最小限の変更
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のスラッグ(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形式では表現できません。特に、プロンプトキャッシュ用のcache_controlディレクティブと、拡張thinkingトークンです。いずれかが必要な場合はSDKを切り替えますが、同じキーを使用できます。Kunavoはネイティブの/v1/messagesエンドポイントも公開しているため、AnthropicのSDKもbase_urlの変更1つで使えます。
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ドキュメントをご覧ください。プロンプトキャッシュによって反復プロンプトの入力コストを最大90%削減する方法は/docs/cachingをご覧ください。
プロンプトキャッシュ自体には、SDKの切り替えは必要ありません。長いプロンプトでは、KunavoがOpenAI形式のルート上でキャッシュのブレークポイントを代わりに設定します。設定先は、システムプロンプト、ツール定義、そしてアシスタントのターンをすでに含む会話の最後のメッセージです。システムメッセージ、ユーザーメッセージ、またはツール定義に自分で指定したcache_controlは、Claudeに転送されます。
失うものと得るもの
OpenAI形式のルートはネイティブプロトコルではなく、変換です。境界を越えられない小さな要素が2つあります。
- 思考の制御 — このルートでは、
thinkingとreasoning_effortはClaudeに転送されません。拡張思考を有効にしたり調整したりするには、ネイティブMessages APIを使用してください。 - 思考の出力 — モデルが思考しても、レスポンスにその思考内容は含まれず、usageオブジェクトにもそれを個別に数える項目はありません。思考トークンは
completion_tokensの中に含めて計上されます。
得られるものは大きいです。Claude、GPT、GPT-Image、Veo、その他のカタログ全体で1つのSDKを使用できます。モデルによっては上流の公式料金より安価です。現地通貨でのStripeネイティブ請求、サイレントなモデル変更なし、つまりフェイルオーバーで変わるのはベンダーであってモデルではなく、ダッシュボードには各呼び出しのモデル、トークン、コストが明細表示されます。
2分で確認
kunavo.com/app/signupでサインアップしてください。$10のチャージでClaudeを数千回呼び出せ、従量課金で、残高は失効しません。base_urlを入力し、モデルIDをClaudeのスラッグに変更して、既存のテストスイートを実行してください。うまく変換できない点があれば、contact@kunavo.comまでメールしてください。すべてのメッセージを確認しています。