Anthropic 純正の SDK は優れていますが、AI エコシステム全体はすでに OpenAI クライアントの形に標準化しています — あらゆるサンプル、あらゆる フレームワークのアダプター、あらゆる「hello world」チュートリアルが、 手元に OpenAI(...) のインスタンスがある前提で書かれています。 自分のコードを Anthropic の SDK 直叩きに移行するのは、それなりに重い リファクタリングです。
でも、そうする必要はありません。本記事では、Claude Opus 4.7、 Sonnet 4.6、Haiku 4.5 を OpenAI SDK のまま呼び出す方法を示します — Brievio 経由で呼び出しをルーティングするだけです。同じ SDK、同じ型、 同じストリーミング、同じツール使用、そして向こう側にいるのは本物のモデル。 変更するのは base_url の 1 行だけです。
最小限の変更
Python の openai パッケージがすでにインストールされていれば、 移行の全体像はこれだけです。
from openai import OpenAI
client = OpenAI(
api_key="sk-brievio-...",
base_url="https://api.brievio.com/v1", # 変更するのはこの 1 行だけ
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6", # gpt-4o ではなく Claude のスラッグ
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)ツール使用 / 関数呼び出し
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 の 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 は 切り替えつつキーはそのまま使えます。Brievio は純正の /v1/messages エンドポイントも公開しているので、Anthropic の SDK も base_url を 1 か所変えるだけで動きます。
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 形式のルートは翻訳であって、ネイティブのプロトコルではありません。 境界を越えられない小さなものが 2 つあります。
- cache_control(プロンプトキャッシュ用)— これには純正の Messages SDK を使うか、
inputのエスケープハッチ経由で渡します。 - 拡張された思考トークン — レスポンスの usage オブジェクト からは参照できますが、リクエストの直接パラメーターとしては渡せません。 きめ細かく制御したいなら純正に切り替えてください。
得られるものは大きいです。本物の Claude、Gemini、GPT-Image、Veo の カタログ全体を 1 つの SDK で扱え、すべてのモデルで 公式の定価より約 15% 安く、しかも本当のトークン数で課金され、 Stripe ネイティブの請求、そして透明なルーティング — ダッシュボードには、 各呼び出しを実際にどの上流が処理したかが常に表示されます。
2 分で確認する
brievio.com/app/signup でサインアップ してください — 2 ドルの無料クレジットで Claude を数千回呼び出せます。 base_url を差し替え、モデル ID を Claude のスラッグに変え、 既存のテストスイートをそのまま走らせてみてください。うまく越えられない ものがあれば contact@brievio.com までメールを。当社はすべてのメッセージに目を通しています。