TL;DR
Claude APIは @anthropic-ai/[email protected](TypeScript)または [email protected](Python)のSDKで即座に使い始められる。Messages APIの最小実装から、ツール使用・ストリーミング・プロンプトキャッシュまでをこの記事一本で押さえられる。本番運用には指数バックオフによるリトライと429/529エラーへの対処が必須となる。
Claude APIとは?2026年の主要機能一覧
Claude APIはAnthropicが提供するLLM APIです。REST形式のMessages APIに加えて、ツール使用(Function Calling)、ストリーミング、プロンプトキャッシュ、Batch APIなど、プロダクション開発に必要な機能が2026年時点で揃っています。
公式の開始ガイドは Anthropic API Getting Started を参照してください。
対応モデルとユースケース早見表
| モデル | 特徴 | 主なユースケース |
|---|---|---|
| claude-opus-4-8 | 最高精度・最大コンテキスト | 複雑な推論・コード生成 |
| claude-sonnet-4-6 | バランス型(速度・品質) | 汎用アプリ・チャットボット |
| claude-haiku-4-5 | 高速・低コスト | リアルタイム処理・分類タスク |
迷ったら claude-opus-4-8 を選択してください。品質を最優先するユースケースでは最も信頼性が高く、スループットが重要な場面では claude-haiku-4-5 へ切り替えることでコストを大幅に削減できます。
料金体系の考え方(公式サイト参照誘導)
料金はモデルごとに入力トークン・出力トークンで課金される従量制です。プロンプトキャッシュを活用すると繰り返し参照する大きなコンテキストのコストを下げられます。Batch APIを使うと通常の50%割引が適用され、最大100,000リクエストを1バッチで処理できます。具体的な単価は変動するため Anthropicの公式料金ページ を参照してください。
セットアップ(APIキー取得 〜 SDK初期化)
APIキーの取得と環境変数設定
- Anthropic Console にアクセスしてアカウントを作成する
- 「API Keys」からキーを発行する
.envファイルに環境変数を設定する
# .env
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx
APIキー設定の詳細は Claude Code セットアップガイド も参考にしてください。
:::message alert APIキーをコードやリポジトリに直接埋め込まないでください。必ず環境変数経由で参照します。 :::
TypeScript(@anthropic-ai/sdk)のインストール・初期化
# @anthropic-ai/[email protected]
pnpm add @anthropic-ai/sdk
// @anthropic-ai/[email protected]
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY, // 省略時は環境変数から自動読み込み
});
Python(anthropic)のインストール・初期化
# [email protected]
pip install anthropic==0.109.1
# [email protected]
import anthropic
import os
client = anthropic.Anthropic(
api_key=os.environ.get("ANTHROPIC_API_KEY"),
)
基本メッセージ送信(Messages API)
Messages APIのエンドポイントは https://api.anthropic.com/v1/messages です。SDKを使う場合、このURLを直接指定する必要はありません。
最小実装コード(TypeScript / Python)
// @anthropic-ai/[email protected]
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const message = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [
{
role: "user",
content: "TypeScriptでフィボナッチ数列を実装してください。",
},
],
});
console.log(message.content[0].type === "text" ? message.content[0].text : "");
# [email protected]
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{
"role": "user",
"content": "Pythonでフィボナッチ数列を実装してください。",
}
],
)
print(message.content[0].text)
systemプロンプトの設定
system パラメータでモデルの振る舞いを固定できます。
// @anthropic-ai/[email protected]
const message = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
system: "あなたは日本語のみで回答するエキスパートエンジニアです。",
messages: [{ role: "user", content: "Reactのベストプラクティスを教えてください。" }],
});
入力トークン上限とmax_tokensの設定
max_tokens は必須パラメータです。出力の上限トークン数を指定します。モデルごとにコンテキストウィンドウの最大値が異なるため、長いドキュメントを処理する場合は事前に入力トークン数を確認してください。
// @anthropic-ai/[email protected]
// トークン数を事前確認する
const tokenCount = await client.messages.countTokens({
model: "claude-opus-4-8",
messages: [{ role: "user", content: longDocument }],
});
console.log(`入力トークン数: ${tokenCount.input_tokens}`);
ツール使用(Tool Use / Function Calling)
ツール使用を使うと、モデルが外部API・データベース・計算処理を呼び出せるようになります。実装の詳細は Anthropic Tool Use ドキュメント を参照してください。
MCPとtool useの関係については Claude MCP完全ガイド も参照してください。
ツール定義の書き方(JSON Schemaベース)
// @anthropic-ai/[email protected]
const tools: Anthropic.Tool[] = [
{
name: "get_weather",
description: "指定した都市の現在の天気を取得します。",
input_schema: {
type: "object",
properties: {
city: {
type: "string",
description: "天気を取得する都市名(例: Tokyo)",
},
unit: {
type: "string",
enum: ["celsius", "fahrenheit"],
description: "温度の単位",
},
},
required: ["city"],
},
},
];
# [email protected]
tools = [
{
"name": "get_weather",
"description": "指定した都市の現在の天気を取得します。",
"input_schema": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "天気を取得する都市名(例: Tokyo)",
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度の単位",
},
},
"required": ["city"],
},
}
]
ツール呼び出しのループ実装パターン
モデルがツールを呼び出すと stop_reason: "tool_use" が返ります。ツール実行結果を tool_result として返し、モデルが最終回答を生成するまでループします。
// @anthropic-ai/[email protected]
async function runWithTools(userMessage: string): Promise<string> {
const messages: Anthropic.MessageParam[] = [
{ role: "user", content: userMessage },
];
while (true) {
const response = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
tools,
messages,
});
if (response.stop_reason === "end_turn") {
const textBlock = response.content.find((b) => b.type === "text");
return textBlock?.type === "text" ? textBlock.text : "";
}
if (response.stop_reason !== "tool_use") break;
// アシスタントの応答を履歴に追加
messages.push({ role: "assistant", content: response.content });
// ツールを実行して結果を収集
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type !== "tool_use") continue;
const result = await executeToolCall(block.name, block.input);
toolResults.push({
type: "tool_result",
tool_use_id: block.id,
content: JSON.stringify(result),
});
}
// ツール結果をユーザーメッセージとして追加
messages.push({ role: "user", content: toolResults });
}
return "";
}
// ツール実行の実装例
async function executeToolCall(name: string, input: unknown): Promise<unknown> {
if (name === "get_weather") {
const { city } = input as { city: string };
// 実際のAPI呼び出しに置き換える
return { city, temperature: 22, condition: "晴れ" };
}
throw new Error(`未知のツール: ${name}`);
}
複数ツールの並列実行
1回のレスポンスに複数の tool_use ブロックが含まれる場合、並列実行することでレイテンシを削減できます。
// @anthropic-ai/[email protected]
const toolUseBlocks = response.content.filter((b) => b.type === "tool_use");
// Promise.allで並列実行
const toolResults = await Promise.all(
toolUseBlocks.map(async (block) => {
if (block.type !== "tool_use") return null;
const result = await executeToolCall(block.name, block.input);
return {
type: "tool_result" as const,
tool_use_id: block.id,
content: JSON.stringify(result),
};
})
);
ストリーミング実装
ストリーミングを使うと、モデルが生成したテキストをトークン単位でリアルタイムに受け取れます。公式ドキュメントは Anthropic Streaming ドキュメント を参照してください。
TypeScriptでのストリーミング
// @anthropic-ai/[email protected]
const stream = await client.messages.stream({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: [{ role: "user", content: "Rustの所有権を説明してください。" }],
});
for await (const chunk of stream) {
if (
chunk.type === "content_block_delta" &&
chunk.delta.type === "text_delta"
) {
process.stdout.write(chunk.delta.text);
}
}
const finalMessage = await stream.finalMessage();
console.log(`\n完了 - 出力トークン: ${finalMessage.usage.output_tokens}`);
Pythonでのストリーミング
# [email protected]
import anthropic
client = anthropic.Anthropic()
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "Rustの所有権を説明してください。"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
final_message = stream.get_final_message()
print(f"\n完了 - 出力トークン: {final_message.usage.output_tokens}")
ストリーミング中のツール使用
ストリーミングとツール使用を組み合わせる場合、input_json_delta イベントでツール入力のJSONを逐次受信します。
// @anthropic-ai/[email protected]
const stream = await client.messages.stream({
model: "claude-opus-4-8",
max_tokens: 1024,
tools,
messages: [{ role: "user", content: "東京の天気を教えてください。" }],
});
for await (const chunk of stream) {
switch (chunk.type) {
case "content_block_delta":
if (chunk.delta.type === "text_delta") {
process.stdout.write(chunk.delta.text);
}
break;
case "message_stop":
console.log("\nストリーム完了");
break;
}
}
マルチターン会話(会話履歴管理)
messagesアレイの構造と管理方法
Claude APIは会話状態をサーバー側に保持しません。クライアントが messages アレイに全履歴を含めてリクエストを送る必要があります。
// @anthropic-ai/[email protected]
const conversationHistory: Anthropic.MessageParam[] = [];
async function chat(userInput: string): Promise<string> {
conversationHistory.push({ role: "user", content: userInput });
const response = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
messages: conversationHistory,
});
const assistantText =
response.content[0].type === "text" ? response.content[0].text : "";
conversationHistory.push({ role: "assistant", content: assistantText });
return assistantText;
}
トークン上限対策(履歴の切り捨て戦略)
長い会話ではコンテキストウィンドウを超える可能性があります。古いメッセージを削除するスライディングウィンドウ方式が一般的です。
// @anthropic-ai/[email protected]
const MAX_HISTORY_TURNS = 20; // 直近20ターンのみ保持
function trimHistory(
history: Anthropic.MessageParam[]
): Anthropic.MessageParam[] {
if (history.length <= MAX_HISTORY_TURNS * 2) return history;
// user/assistantのペアを保持するため偶数でスライス
return history.slice(-MAX_HISTORY_TURNS * 2);
}
マルチエージェント構成での会話管理については マルチエージェント開発パターン を参照してください。
プロンプトキャッシュ(Prompt Caching)
プロンプトキャッシュを使うと、同じプレフィックスを含むリクエストのコスト削減とレイテンシ短縮が期待できます。デフォルトのキャッシュTTLは5分で、拡張キャッシュを使うと1時間(ttl: '1h')保持できます。
cache_controlの設定方法
// @anthropic-ai/[email protected]
const largeSystemPrompt = `
あなたは詳細なドキュメントを持つ専門家アシスタントです。
[...数千トークンのコンテキスト...]
`;
const response = await client.messages.create({
model: "claude-opus-4-8",
max_tokens: 1024,
system: [
{
type: "text",
text: largeSystemPrompt,
cache_control: { type: "ephemeral", ttl: "1h" }, // 1時間キャッシュ
},
],
messages: [{ role: "user", content: "このドキュメントを要約してください。" }],
});
# [email protected]
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system=[
{
"type": "text",
"text": large_system_prompt,
"cache_control": {"type": "ephemeral", "ttl": "1h"},
}
],
messages=[{"role": "user", "content": "このドキュメントを要約してください。"}],
)
キャッシュ効果の測定とコスト削減試算
レスポンスの usage フィールドでキャッシュヒットを確認できます。
// @anthropic-ai/[email protected]
console.log("キャッシュ書き込みトークン:", response.usage.cache_creation_input_tokens);
console.log("キャッシュ読み取りトークン:", response.usage.cache_read_input_tokens);
console.log("通常入力トークン:", response.usage.input_tokens);
cache_read_input_tokens が増えるほど、再計算コストが削減されています。長いシステムプロンプトや大量のドキュメントを繰り返し参照するユースケースで効果が大きいです。出力品質管理と組み合わせる方法は LLM出力品質ゲート も参考にしてください。
エラーハンドリングとリトライ戦略
よくあるエラーコードと原因(429 / 529 / 500)
| エラーコード | 意味 | 対処法 |
|---|---|---|
| 400 | リクエスト不正 | パラメータ・フォーマット確認 |
| 401 | 認証エラー | APIキー確認 |
| 429 | レート制限超過 | 指数バックオフでリトライ |
| 500 | サーバーエラー | リトライ |
| 529 | APIオーバーロード | 時間を置いてリトライ |
指数バックオフ実装パターン
// @anthropic-ai/[email protected]
import Anthropic from "@anthropic-ai/sdk";
const RETRYABLE_STATUS_CODES = new Set([429, 500, 529]);
const MAX_RETRIES = 5;
const BASE_DELAY_MS = 1000;
async function createMessageWithRetry(
params: Anthropic.MessageCreateParamsNonStreaming
): Promise<Anthropic.Message> {
for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
try {
return await client.messages.create(params);
} catch (error) {
if (!(error instanceof Anthropic.APIError)) throw error;
if (!RETRYABLE_STATUS_CODES.has(error.status)) throw error;
if (attempt === MAX_RETRIES - 1) throw error;
const delay = BASE_DELAY_MS * Math.pow(2, attempt);
const jitter = Math.random() * delay * 0.1;
console.warn(`リトライ ${attempt + 1}/${MAX_RETRIES} - ${delay + jitter}ms後`);
await new Promise((resolve) => setTimeout(resolve, delay + jitter));
}
}
throw new Error("最大リトライ回数を超えました");
}
# [email protected]
import time
import random
import anthropic
RETRYABLE_STATUS_CODES = {429, 500, 529}
MAX_RETRIES = 5
BASE_DELAY = 1.0
def create_message_with_retry(client: anthropic.Anthropic, **kwargs) -> anthropic.types.Message:
for attempt in range(MAX_RETRIES):
try:
return client.messages.create(**kwargs)
except anthropic.APIStatusError as e:
if e.status_code not in RETRYABLE_STATUS_CODES:
raise
if attempt == MAX_RETRIES - 1:
raise
delay = BASE_DELAY * (2 ** attempt)
jitter = random.uniform(0, delay * 0.1)
print(f"リトライ {attempt + 1}/{MAX_RETRIES} - {delay + jitter:.1f}秒後")
time.sleep(delay + jitter)
raise RuntimeError("最大リトライ回数を超えました")
:::message
@anthropic-ai/sdk はSDKレベルで自動リトライ機能を内蔵しています(デフォルト2回)。new Anthropic({ maxRetries: 5 }) で変更できます。独自実装との二重リトライに注意してください。
:::
タイムアウト・接続エラー対策
// @anthropic-ai/[email protected]
const client = new Anthropic({
timeout: 60_000, // 60秒タイムアウト
maxRetries: 3,
});
# [email protected]
client = anthropic.Anthropic(
timeout=60.0, # 60秒タイムアウト
max_retries=3,
)
長時間かかる処理には Batch API の利用も検討してください。最大100,000リクエストをバッチ送信でき、通常の50%割引が適用されます。
FAQ
Q1. Claude APIの使い方は?
Anthropic ConsoleでAPIキーを取得し、SDKをインストールしてから client.messages.create() を呼び出します。TypeScriptなら @anthropic-ai/[email protected]、Pythonなら [email protected] を使います。最小実装は model・max_tokens・messages の3パラメータのみで動作します。詳細は「基本メッセージ送信」セクションのコードサンプルを参照してください。
Q2. Anthropic APIのPythonでの実装方法は?
pip install anthropic==0.109.1 でSDKをインストール後、anthropic.Anthropic() でクライアントを初期化します。APIキーは環境変数 ANTHROPIC_API_KEY に設定するか、Anthropic(api_key="...") で直接渡します。client.messages.create() でメッセージを送信し、response.content[0].text でテキストを取得します。
Q3. Claude APIでストリーミングを実装するには?
client.messages.create() の代わりに client.messages.stream() を使います。TypeScriptでは for await (const chunk of stream) でイベントを受け取り、chunk.delta.type === "text_delta" のブロックからテキストを取得します。Pythonでは with client.messages.stream() as stream: for text in stream.text_stream のパターンが最もシンプルです。
Q4. tool use(ツール使用)の実装方法は?
ツールをJSON Schema形式で定義し、tools パラメータに渡します。stop_reason === "tool_use" になったらツールを実行し、結果を tool_result ブロックとしてメッセージ履歴に追加します。このループを stop_reason === "end_turn" になるまで繰り返します。「ツール呼び出しのループ実装パターン」セクションの完全なコードを参考にしてください。
Q5. プロンプトキャッシュはどう使う?
systemプロンプトや大きなコンテキストブロックに cache_control: { type: "ephemeral" } を付与します。デフォルトTTLは5分で、ttl: "1h" を指定すると1時間まで延長できます。レスポンスの usage.cache_read_input_tokens がゼロより大きければキャッシュヒットしています。同じシステムプロンプトを繰り返し使うRAGやチャットボットで特に効果的です。
References
- Anthropic API Getting Started — APIキーの取得からはじめるチュートリアル
- Tool Use(ツール使用)公式ドキュメント — ツール定義・呼び出しパターンの完全リファレンス
- Streaming(ストリーミング)公式ドキュメント — ストリーミングイベントの仕様と実装例
