Anthropicは2026年6月9日にClaude Fable 5を出荷しました。もしあなたがコードを書くことを生業としているなら、Claude Fable 5 APIが最も関心のある部分でしょう。これは既存のMessages APIと同じものを実行するため、変更されるのはモデル文字列`claude-fable-5`のみです。このガイドでは、1行のcurlリクエストからストリーミング、ツール利用、エラー処理、コスト計算まで、動作するコードで実際のレスポンスを得るために必要なあらゆる呼び出しについて説明します。これまでClaudeを使って開発したことがある方には、その形式はおなじみのものに感じられるでしょう。以前のモデルから移行する方は、Claude Opus 4.8 APIと同様に、主に文字列の入れ替えで済みます。
TL;DR
AnthropicコンソールでAPIキーを取得し、それを`ANTHROPIC_API_KEY`として設定します。その後、`model: "claude-fable-5"`、`max_tokens`の値、および`messages`配列を含むMessages APIにPOSTリクエストを送信します。PythonまたはTypeScript用の公式Anthropic SDKを使用するか、生のHTTPを使用してください。長い出力はストリーミングすることで、リクエストタイムアウトを回避できます。料金は、入力トークン100万あたり10ドル、出力トークン100万あたり50ドルです。

始める前に
最初のリクエストを行う前に、4つの準備が必要です。
- Anthropicアカウント。console.anthropic.comでサインアップしてください。コンソールは、キー、使用状況、および請求を管理する場所です。
- APIキー。コンソールの「APIキー」で作成します。一度コピーしたら、二度と表示されませんので、パスワードのように扱ってください。
- 請求またはエンタープライズプラン。Fable 5は標準のClaude APIで利用可能であり、消費ベースのエンタープライズプランでも完全に利用できます。トラフィックを送信する前に支払い方法を追加するか、プランが対応していることを確認してください。Fable 5があなたのユースケースに適しているかどうか迷っている場合は、Claude Fable 5とは何かの概要が、モデルの強みを平易な言葉で説明しています。
- SDK(オプションですが推奨)。お使いの言語用の公式Anthropic SDKをインストールしてください。必要であれば、curlまたは任意のHTTPクライアントで生のHTTPエンドポイントを呼び出すこともできます。

キーがソースコードに残らないように、環境変数として設定してください。
export ANTHROPIC_API_KEY="sk-ant-..."
両方のSDKは環境から`ANTHROPIC_API_KEY`を自動的に読み取るため、コードで渡すことはほとんどありません。キーはGitに含めないでください。キーが漏洩した場合は、すぐにコンソールでローテーションしてください。
事前に知っておくべき動作の1つとして、Fable 5には、機密性の高いクエリ(サイバーセキュリティ、生物学と化学、モデル蒸留の試み)のごく一部をClaude Opus 4.8にルーティングするセーフガードが組み込まれています。これはセッションの5%未満で発生します。この設定を行う必要はありませんが、時折、異なるモデルとしてラベル付けされたレスポンスが返ってくる理由を説明します。これについてはエラー処理のセクションで詳しく説明します。
最初のClaude Fable 5 API呼び出し
最初にcurlを使って、生の要求と応答を何も遮るものなく確認しましょう。エンドポイントは`POST https://api.anthropic.com/v1/messages`で、Anthropic Messages APIリファレンスに記載されています。これには3つのヘッダーとJSONボディが必要です。
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{"model":"claude-fable-5","max_tokens":1024,"messages":[{"role":"user","content":"Summarize what makes a good REST API in 3 bullet points."}]}'
ここでは3つのヘッダーが重要です。`x-api-key`はあなたのキーを運びます。`anthropic-version`はAPIバージョンを固定します(`2023-06-01`が現在の安定版です)。`content-type`は、JSONを送信していることをサーバーに伝えます。ボディには、`model`、`max_tokens`、`messages`の3つの必須フィールドがあります。これが契約のすべてです。
レスポンスはJSONオブジェクトとして返されます。関心のある部分は`content`で、これはブロックのリストです。
{
"id": "msg_01ABC...",
"type": "message",
"role": "assistant",
"model": "claude-fable-5",
"content": [
{ "type": "text", "text": "- Predictable, resource-oriented URLs..." }
],
"stop_reason": "end_turn",
"usage": { "input_tokens": 18, "output_tokens": 96 }
}
`content`は文字列ではなくリストです。なぜなら、単一のレスポンスがテキスト、ツール利用ブロック、思考ブロックを混在させることができるためです。`text`を読み取る前に、常にリストをループし、各ブロックの`type`を確認してください。`stop_reason`はモデルが停止した理由(`end_turn`はきれいな完了を意味します)を示し、`usage`は後でコスト計算に使用するトークン数を提供します。
PythonからFable 5を呼び出す
公式のAnthropic Python SDKは、ヘッダーとJSONの定型コードを不要にします。まずこれをインストールします。
pip install anthropic
これが基本的な呼び出しです。クライアントは環境からキーを読み取るため、コードで渡す必要はありません。
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from env
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Summarize what makes a good REST API."}],
)
for block in response.content:
if block.type == "text":
print(block.text)
パターンはcurl呼び出しを反映しています。`model`、`max_tokens`、`messages`を渡し、`content`がブロックのリストであるレスポンスを受け取ります。ループは`block.type == "text"`で保護されているため、非テキストブロックでつまずくことはありません。
システムプロンプトの追加
システムプロンプトは、モデルの役割と会話全体に対する基本ルールを設定します。`messages`とは別に、`system`フィールドとして渡します。
response = client.messages.create(
model="claude-fable-5",
max_tokens=2048,
system="You are a senior backend engineer. Be concise and use code examples.",
messages=[{"role": "user", "content": "Write a Flask route that validates a JSON body."}],
)
for block in response.content:
if block.type == "text":
print(block.text)
システムプロンプトは、ペルソナ、出力形式ルール、およびすべてのターンで保持したい制約を設定するのに適した場所です。プロンプトキャッシュを後で追加する場合、リクエストごとに変更すると効果がなくなるため、安定した状態に保つようにしてください。
長い出力のストリーミング
長い回答を生成する場合は、それをストリーミングします。ストリーミングはトークンが生成されると同時に送信されるため、進行状況をすぐに表示でき、大規模な非ストリーミング応答で発生するリクエストタイムアウトを回避できます。Fable 5の長期的な作業では、これが実際のワークロードのデフォルトの選択肢となります。
with client.messages.stream(
model="claude-fable-5",
max_tokens=4096,
messages=[{"role": "user", "content": "Explain idempotency keys for payment APIs."}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final = stream.get_final_message()
print(f"\n\nTokens: {final.usage.output_tokens}")
`stream.text_stream`はテキストチャンクが到着するたびに生成します。`flush=True`は、各チャンクがバッファリングされるのではなく、すぐに表示されるために重要です。ストリームが完了すると、`stream.get_final_message()`が最終的な`usage`数値を含む完全な組み立てられたメッセージを返します。これにより、ストリーミングされたUXと完全なオブジェクトを2回目のリクエストなしで取得できます。
TypeScript / NodeからFable 5を呼び出す
Node SDKも同じ形式に従います。インストールしてください。
npm install @anthropic-ai/sdk
次に呼び出しを行います。クライアントはPythonと同じように、環境から`ANTHROPIC_API_KEY`を読み取ります。
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // reads ANTHROPIC_API_KEY
const msg = await client.messages.create({
model: "claude-fable-5",
max_tokens: 1024,
messages: [{ role: "user", content: "List 3 common API security mistakes." }],
});
console.log(msg.content);
`msg.content`は、Pythonおよびcurlで見たのと同じブロックのリストです。テキストだけを抽出するには、ブロックタイプでフィルターをかけます。
const text = msg.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);
ストリーミングはPythonと同じように機能します。`client.messages.stream({...})`を使用してイベントを反復処理するか、組み立てられた結果を得るために`finalMessage()`をawaitします。これをフロントエンドチャットに接続している場合、サーバーのルートからストリーミングし、チャンクをブラウザに転送します。NodeまたはPythonのどちらで構築する場合でも、同じテスト習慣が適用され、Apidogのようなツールを使用すると、クライアントコードを記述する前に契約を簡単に検証できます。これはApidogでのChatGPT APIのテストで説明されているワークフローと同じです。
Fable 5でのツール利用(関数呼び出し)
ツール利用により、Fable 5はあなたが定義した関数を呼び出すことができます。JSONスキーマでツールを記述し、モデルがいつ呼び出すかを決定し、実際の関数を実行して結果をフィードバックします。Fable 5はツール利用に強く、エージェントループによく適合します。
名前、説明、および`input_schema`を持つツールを定義します。
tools = [
{
"name": "get_order_status",
"description": "Look up the status of a customer order by ID.",
"input_schema": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
}
]
`messages`を渡すのと同じように、`tools`をリクエストに渡します。
messages = [{"role": "user", "content": "What's the status of order A1855?"}]
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
tools=tools,
messages=messages,
)
モデルがツールを使用したい場合、`stop_reason == "tool_use"`とツール名および選択された入力を含む`tool_use`ブロックを含むレスポンスが返されます。ループは簡単です。アシスタントのレスポンスを追加し、ツールを実行し、その結果を新しいユーザーターンで`tool_result`ブロックとして送り返します。
if response.stop_reason == "tool_use":
tool_use = next(b for b in response.content if b.type == "tool_use")
# Run your real function with the model's chosen input
result = lookup_order(tool_use.input["order_id"]) # your code
messages.append({"role": "assistant", "content": response.content})
messages.append({
"role": "user",
"content": [{
"type": "tool_result",
"tool_use_id": tool_use.id,
"content": result,
}],
})
# Send the result back; the model now answers using it
followup = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
tools=tools,
messages=messages,
)
重要な点は`tool_use_id`です。`tool_result`ブロックは、モデルがどの呼び出しに対する結果であるかを認識できるように、`tool_use`ブロックの正確な`id`を参照する必要があります。多段階エージェントの場合、これを`stop_reason`が`end_turn`になるまで続けるループでラップします。Python SDKには、ループを自動的に処理するツールランナーも付属していますが、上記の「手動」バージョンは、内部で何が起こっているかを示し、承認ゲートやロギングを追加する場所を提供します。
適応的思考と努力
Fable 5は、モデルが回答する前にいつ、どの程度深く推論するかを自ら決定する適応的思考をサポートしています。これはオプションです。`thinking`を渡し、`output_config`で全体の深さとトークン消費を調整することで有効にします。
response = client.messages.create(
model="claude-fable-5",
max_tokens=4096,
thinking={"type": "adaptive"},
output_config={"effort": "high"}, # low | medium | high
messages=[{"role": "user", "content": "Design a retry strategy for a flaky webhook receiver."}],
)
`effort`は、モデルがどの程度思考し、作業するかを制御します。低い努力はより簡潔で高速なレスポンスを意味し、高い努力はより徹底的な推論を意味しますが、トークンコストは高くなります。簡単な検索や短い回答の場合は、余分な推論がトークンに見合わないため、両方をオフにしておきます。Fable 5が構築されたような、困難な多段階の問題や長期的な計画にはこれらを使用します。最初はシンプルに始め、必要と判断したルートに後から`thinking`を追加することができます。
エラー処理とセーフガードのフォールバック
実際の統合では、障害を適切に処理する必要があります。SDKは型付き例外を発生させるため、エラー文字列を照合するのではなく、特定のクラスをキャッチしてください。最もよく見られる3つは、HTTP 401、429、400に対応します。
import anthropic
client = anthropic.Anthropic()
try:
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Explain CORS preflight requests."}],
)
except anthropic.AuthenticationError:
# 401: bad or missing API key. Check ANTHROPIC_API_KEY.
print("Invalid API key. Rotate it in the Console and re-export.")
except anthropic.RateLimitError as e:
# 429: too many requests. Back off and retry.
retry_after = e.response.headers.get("retry-after", "60")
print(f"Rate limited. Retry after {retry_after}s.")
except anthropic.BadRequestError as e:
# 400: malformed request (bad params, empty messages, wrong shape).
print(f"Bad request: {e.message}")
それぞれの意味と修正方法は次のとおりです。
- 401 (`AuthenticationError`): キーが見つからない、形式が不正、または失効している。`ANTHROPIC_API_KEY`がコードが実際に実行される環境に設定されており、キーがコンソールでまだアクティブであることを確認してください。
- 429 (`RateLimitError`): 1分あたりのリクエスト数または1分あたりのトークン数の制限を超過した。SDKは、指数関数的バックオフ(デフォルトで2回の再試行)で429および5xxエラーを既に再試行します。カスタムバックオフを追加する場合は、`retry-after`ヘッダーを読み取ってください。
- 400 (`BadRequestError`): リクエストの形式が不正。一般的な原因は、空の`messages`配列、欠落した`max_tokens`、または役割が正しく交互になっていないメッセージです。エラーメッセージには通常、フィールド名が記載されています。
次に、セーフガードのフォールバックについてです。Fable 5は、機密性の高いクエリ(サイバーセキュリティ、生物学と化学、蒸留の試み)のごく一部を、直接回答する代わりにClaude Opus 4.8にルーティングします。これはセッションの5%未満で発生します。これはエラーではなく、リクエストは成功しますが、レスポンスには異なるモデルのタグが付いて返ってくる場合があります。`response.model`をログに記録したりアサートしたりする場合でも、`claude-fable-5`でないからといって厳密に失敗させないでください。リクエストは処理されており、単に舞台裏で別のモデルによって行われただけです。アプリケーションがどのモデルが回答したかを厳密に知る必要がある場合は、送信したものと一致すると仮定するのではなく、返されたオブジェクトから`response.model`を読み取ってください。
リクエストあたりのコストの見積もり
料金は、入力トークン100万あたり10ドル、出力トークン100万あたり50ドルです。すべてのレスポンスには`usage`に正確なカウントが含まれているため、推測するのではなく、リクエストあたりのコストを正確に計算できます。
response = client.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Write a SQL query to find duplicate emails."}],
)
input_tokens = response.usage.input_tokens
output_tokens = response.usage.output_tokens
input_cost = input_tokens / 1_000_000 * 10
output_cost = output_tokens / 1_000_000 * 50
total = input_cost + output_cost
print(f"Input: {input_tokens} tokens = ${input_cost:.6f}")
print(f"Output: {output_tokens} tokens = ${output_cost:.6f}")
print(f"Total: ${total:.6f}")
出力トークンは入力トークンの5倍のコストがかかるため、最も安価な手段はレスポンスを簡潔に保つことです。2,000の入力トークンと500の出力トークンを含むリクエストのコストは、`2000 / 1M * $10 + 500 / 1M * $50`で、これは`$0.02 + $0.025 = $0.045`です。リクエストの量に応じて予算を計算してください。出力コストが請求の大部分を占める場合は、`max_tokens`を制限し、システムプロンプトで簡潔な回答を求めてください。出力料金は、Claude Opus 4.8の料金モデルと同じ計算方法で、Fable 5の数値を使用するだけです。
ApidogでClaude Fable 5 APIをテストおよびデバッグする
クライアントコードを記述する前に、手動でいくつかのリクエストを送信し、何が返ってくるかを正確に確認することは非常に有効です。Apidogは、この目的のために構築されたAPIクライアントです。`https://api.anthropic.com/v1/messages`に実際のリクエストを送信し、ストリーミングされたレスポンスを検査し、リクエストを保存してチーム全体が同じ定義で作業できるようにします。ゼロから動作する保存済みリクエストへのクリーンなパスを以下に示します。

- リクエストを作成します。Apidogで新しいHTTPリクエストを作成し、メソッドを`POST`に設定して、URL`https://api.anthropic.com/v1/messages`を貼り付けます。これはこのガイドのすべての例がアクセスするエンドポイントと同じです。
- キーを環境変数として保存します。Apidogの環境変数を作成し、`anthropic_api_key`のような名前を付け、キーをシークレット値として貼り付けます。キーを環境に保持することで、保存されたリクエストや共有するすべてのエクスポートからキーが除外されます。
- ヘッダーを設定します。値`{{anthropic_api_key}}`を持つ`x-api-key`、次に`anthropic-version: 2023-06-01`、`content-type: application/json`を追加します。Bearerスタイルのシークレット変数を希望する場合は、トークンを同じ方法で保存し、`{{...}}`構文で参照することで、生の値がリクエストに表示されないようにします。
- JSONボディを追加します。最小限のペイロード`{"model": "claude-fable-5", "max_tokens": 1024, "messages": [{"role": "user", "content": "Explain idempotency keys for payment APIs."}]}`をドロップします。それを送信し、レスポンスを読み取ります。レスポンスパネルに`content`ブロック、`stop_reason`、および`usage`が直接表示されるはずです。
- ストリーミングされたレスポンスを表示します。ボディに`"stream": true`を設定し、再度送信します。Apidogはサーバー送信イベントが到着すると同時にレンダリングするため、アプリに組み込む前に、トークンがストリーミングされる様子を観察し、ストリーミングロジックがAPIが実際に送信するものと一致することを確認できます。
- コードを保存して生成します。リクエストをコレクションに保存してチームメイトが再利用できるようにし、Apidogのコード生成を使用して、Python、JavaScript、curl、またはその他の言語で動作するスニペットをエクスポートします。これにより、白紙のファイルではなく、テスト済みの出発点が得られます。
このフローは、APIの正確なレスポンス形式を学習し、アプリで誤動作するリクエストをデバッグする最速の方法です。自分のコードのリクエストを既知の良好なリクエストと並べて比較できるためです。準備ができたら、Apidogをダウンロードし、上記の最小限のボディから始めてください。
