Claude

Claude API実践入門|Pythonでの実装パターン集

Claude API Python

Claude API実践入門
Pythonでの実装パターン集

Claude APIをPythonで活用する実践的な方法を解説。テキスト生成、ストリーミング、エラーハンドリングまで、すぐに使えるコード例とともに学べます。

こんな人向けの記事です

  • Claude APIをPythonで使いたい
  • ストリーミングレスポンスを実装したい
  • エラーハンドリングやレート制限対策を知りたい

Step 1Claude APIの概要とAPIキーの取得

Claude APIは、Anthropic社が提供するLLM(大規模言語モデル)のAPIです。REST APIとして提供されており、HTTPリクエストまたは公式SDKを通じて利用できます。

項目内容
提供元Anthropic
API形式REST API(Messages API)
認証方式APIキー(x-api-key ヘッダー)
課金方式従量課金(入力/出力トークン数)
公式SDKPython / TypeScript

APIキーの取得手順

  1. Anthropic Console にアクセスしてアカウントを作成
  2. ダッシュボードの「API Keys」セクションに移動
  3. 「Create Key」をクリックしてAPIキーを生成
  4. 生成されたキーを安全な場所に保存する(再表示できません)

ターミナル

# 環境変数にAPIキーを設定(.bashrc や .zshrc に追記)
export ANTHROPIC_API_KEY="sk-ant-api03-xxxxxxxxxxxxxxxx"

APIキーの取り扱い注意

APIキーは絶対にソースコードにハードコードしないでください。環境変数や .env ファイルで管理し、.gitignore に追加しましょう。キーが漏洩すると第三者に不正利用される可能性があります。

料金体系

モデル入力(100万トークン)出力(100万トークン)
Claude Opus 4$15$75
Claude Sonnet 4$3$15
Claude Haiku 3.5$0.80$4

無料クレジット

新規アカウント作成時に$5分の無料クレジットが付与されます。まずはこのクレジットで試してみましょう。

Step 2anthropicライブラリのインストール

Pythonの公式SDKである anthropic ライブラリをインストールします。

ターミナル

pip install anthropic

仮想環境を使う場合のセットアップ例です。

ターミナル

# 仮想環境の作成と有効化
python -m venv venv
source venv/bin/activate  # macOS / Linux

# anthropic のインストール
pip install anthropic

# バージョン確認
python -c "import anthropic; print(anthropic.__version__)"

インストールが完了したら、まず接続テストを行いましょう。

test_connection.py

import anthropic

client = anthropic.Anthropic()  # ANTHROPIC_API_KEY 環境変数を自動取得

# 簡単なテストメッセージ
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=100,
    messages=[
        {"role": "user", "content": "Hello!"}
    ]
)
print(message.content[0].text)
print(f"使用トークン: 入力={message.usage.input_tokens}, 出力={message.usage.output_tokens}")

APIキーを明示的に渡す方法

環境変数を使わず、コード内で直接指定することも可能です:client = anthropic.Anthropic(api_key="sk-ant-...")。ただし本番環境では環境変数を推奨します。

Step 3テキスト生成の基本(Messages API)

Claude APIのメインエンドポイントは Messages API です。チャット形式でメッセージを送信し、Claudeからの応答を受け取ります。

基本的なリクエスト

basic_message.py

import anthropic

client = anthropic.Anthropic()

message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Pythonのデコレータについて簡潔に説明してください"}
    ]
)

# レスポンスの取得
print(message.content[0].text)

# メタ情報の確認
print(f"モデル: {message.model}")
print(f"停止理由: {message.stop_reason}")
print(f"入力トークン: {message.usage.input_tokens}")
print(f"出力トークン: {message.usage.output_tokens}")

主要パラメータ一覧

パラメータ必須説明
modelstringはい使用するモデル名
max_tokensintはい最大出力トークン数
messageslistはいメッセージのリスト
systemstringいいえシステムプロンプト
temperaturefloatいいえランダム性(0.0〜1.0、デフォルト1.0)
top_pfloatいいえnucleus sampling(0.0〜1.0)
stop_sequenceslistいいえ生成を停止する文字列のリスト

マルチターン会話

会話の履歴を messages に含めることで、文脈を維持した対話が可能です。

multi_turn.py

import anthropic

client = anthropic.Anthropic()

# 会話履歴を保持するリスト
conversation = []

def chat(user_message: str) -> str:
    """マルチターン会話を行う関数"""
    conversation.append({"role": "user", "content": user_message})

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=conversation
    )

    assistant_message = response.content[0].text
    conversation.append({"role": "assistant", "content": assistant_message})
    return assistant_message

# 会話例
print(chat("Pythonでリストの要素を逆順にする方法は?"))
print(chat("その方法の計算量はそれぞれどのくらい?"))  # 前の文脈を覚えている

temperatureによる出力制御

temperature_example.py

# 正確な回答が必要な場合(コード生成、データ分析)
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    temperature=0.0,  # 決定的な出力
    messages=[{"role": "user", "content": "SQLのJOINの種類を表にまとめて"}]
)

# 創造的な出力が欲しい場合(ブレインストーミング、文章作成)
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    temperature=0.8,  # ランダム性を高める
    messages=[{"role": "user", "content": "AI活用のビジネスアイデアを5つ提案して"}]
)

Step 4ストリーミングレスポンス

通常のAPIコールはレスポンス全体が完成してから返されますが、ストリーミングを使うと生成中のテキストをリアルタイムに受信できます。ChatGPTのように文字が流れるように表示されるUIを実現するのに必須の機能です。

基本的なストリーミング

streaming_basic.py

import anthropic

client = anthropic.Anthropic()

# with文でストリームを管理
with client.messages.stream(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Pythonの非同期処理について詳しく解説して"}
    ]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

print()  # 改行

ストリーミングでイベントを取得

テキストだけでなく、各種イベントを個別にハンドリングすることもできます。

streaming_events.py

import anthropic

client = anthropic.Anthropic()

with client.messages.stream(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Djangoの特徴を3つ挙げて"}
    ]
) as stream:
    for event in stream:
        # イベントの種類に応じて処理を分岐
        if event.type == "content_block_start":
            print("[生成開始]")
        elif event.type == "content_block_delta":
            if event.delta.type == "text_delta":
                print(event.delta.text, end="", flush=True)
        elif event.type == "message_stop":
            print("
[生成完了]")

# 最終メッセージの取得
final_message = stream.get_final_message()
print(f"合計トークン: {final_message.usage.input_tokens + final_message.usage.output_tokens}")

非同期ストリーミング

Webアプリケーション(FastAPI等)で使う場合は、非同期版を利用します。

async_streaming.py

import anthropic
import asyncio

async def stream_response():
    client = anthropic.AsyncAnthropic()

    async with client.messages.stream(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[
            {"role": "user", "content": "FastAPIの基本的な使い方を教えて"}
        ]
    ) as stream:
        async for text in stream.text_stream:
            print(text, end="", flush=True)

asyncio.run(stream_response())

ストリーミングと通常リクエストの使い分け

ユーザーに即座にフィードバックを返したい場合(チャットUI等)はストリーミング、バッチ処理や内部処理で結果全体が必要な場合は通常リクエストが適しています。

Step 5システムプロンプトとモデルの選択

システムプロンプトはClaudeの振る舞いを制御する強力な機能です。用途に応じて適切なモデルを選ぶことも重要です。

システムプロンプトの活用パターン

system_prompt_patterns.py

import anthropic

client = anthropic.Anthropic()

# パターン1: 専門家として振る舞わせる
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system="あなたはセキュリティの専門家です。"
           "すべての回答にはセキュリティの観点からのアドバイスを含めてください。"
           "脆弱性がある場合は必ず警告してください。",
    messages=[
        {"role": "user", "content": "ユーザー認証の実装方法を教えて"}
    ]
)

# パターン2: 出力形式を制御する
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    system="回答はJSON形式で出力してください。"
           "キーは英語、値は日本語で記述してください。",
    messages=[
        {"role": "user", "content": "日本の四季の特徴を教えて"}
    ]
)

# パターン3: コードレビュアー
message = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=2048,
    system="""あなたは経験豊富なPythonコードレビュアーです。
以下の観点でレビューしてください:
- バグの可能性
- パフォーマンスの問題
- セキュリティの問題
- PEP 8準拠
- 改善提案
各項目について「問題なし」または具体的な指摘を行ってください。""",
    messages=[
        {"role": "user", "content": "def get_user(id):
  return db.query(f"SELECT * FROM users WHERE id={id}")"}
    ]
)

モデルの選び方

モデル特徴適した用途
claude-opus-4-20250514最高性能・コスト高複雑な推論、高度なコード生成、研究
claude-sonnet-4-20250514性能とコストのバランス一般的なコード生成、文章作成、分析
claude-haiku-3-5-20241022高速・低コスト分類、要約、リアルタイム応答

model_selection.py

import anthropic

client = anthropic.Anthropic()

def ask_claude(prompt: str, task_type: str = "general") -> str:
    """タスクの種類に応じてモデルを自動選択する"""
    model_map = {
        "complex": "claude-opus-4-20250514",       # 複雑な推論
        "general": "claude-sonnet-4-20250514",     # 一般的なタスク
        "simple":  "claude-haiku-3-5-20241022",    # 単純なタスク
    }

    model = model_map.get(task_type, "claude-sonnet-4-20250514")

    message = client.messages.create(
        model=model,
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}]
    )
    return message.content[0].text

# 使用例
result = ask_claude("このメールはスパム?: お得なキャンペーン実施中!", task_type="simple")
result = ask_claude("Pythonでバイナリツリーの最短経路を求めるアルゴリズムを実装して", task_type="complex")

Step 6エラーハンドリングとレート制限

本番環境で安定してAPIを利用するために、適切なエラーハンドリングとレート制限への対応は不可欠です。

主要なエラーの種類

HTTPステータス例外クラス原因
400BadRequestErrorリクエストの形式が不正
401AuthenticationErrorAPIキーが無効
403PermissionDeniedErrorアクセス権限なし
429RateLimitErrorレート制限超過
500InternalServerErrorAnthropicサーバー側の問題
529OverloadedErrorAPI過負荷

基本的なエラーハンドリング

error_handling.py

import anthropic

client = anthropic.Anthropic()

try:
    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1024,
        messages=[{"role": "user", "content": "Hello"}]
    )
    print(message.content[0].text)

except anthropic.AuthenticationError:
    print("エラー: APIキーが無効です。ANTHROPIC_API_KEY を確認してください。")

except anthropic.RateLimitError:
    print("エラー: レート制限に達しました。しばらく待ってから再試行してください。")

except anthropic.BadRequestError as e:
    print(f"エラー: リクエストが不正です - {e.message}")

except anthropic.InternalServerError:
    print("エラー: サーバー側の問題です。しばらく待ってから再試行してください。")

except anthropic.APIError as e:
    print(f"APIエラー: {e.status_code} - {e.message}")

リトライ付きの堅牢な実装

retry_client.py

import anthropic
import time

def call_with_retry(
    client: anthropic.Anthropic,
    max_retries: int = 3,
    base_delay: float = 1.0,
    **kwargs
) -> anthropic.types.Message:
    """指数バックオフでリトライするラッパー関数"""
    for attempt in range(max_retries):
        try:
            return client.messages.create(**kwargs)

        except anthropic.RateLimitError:
            if attempt == max_retries - 1:
                raise
            delay = base_delay * (2 ** attempt)  # 1秒, 2秒, 4秒...
            print(f"レート制限。{delay}秒後にリトライ... ({attempt + 1}/{max_retries})")
            time.sleep(delay)

        except anthropic.InternalServerError:
            if attempt == max_retries - 1:
                raise
            delay = base_delay * (2 ** attempt)
            print(f"サーバーエラー。{delay}秒後にリトライ... ({attempt + 1}/{max_retries})")
            time.sleep(delay)

        except anthropic.OverloadedError:
            if attempt == max_retries - 1:
                raise
            delay = base_delay * (2 ** attempt) * 2  # 過負荷時はより長く待つ
            print(f"API過負荷。{delay}秒後にリトライ... ({attempt + 1}/{max_retries})")
            time.sleep(delay)

# 使用例
client = anthropic.Anthropic()
message = call_with_retry(
    client,
    max_retries=3,
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}]
)
print(message.content[0].text)

レート制限の確認

rate_limit_check.py

import anthropic

client = anthropic.Anthropic()

# レスポンスヘッダーからレート制限情報を取得
response = client.messages.with_raw_response.create(
    model="claude-sonnet-4-20250514",
    max_tokens=100,
    messages=[{"role": "user", "content": "Hi"}]
)

# レート制限に関するヘッダーを確認
headers = response.headers
print(f"リクエスト上限: {headers.get('anthropic-ratelimit-requests-limit')}")
print(f"残りリクエスト: {headers.get('anthropic-ratelimit-requests-remaining')}")
print(f"リセット時刻:   {headers.get('anthropic-ratelimit-requests-reset')}")
print(f"トークン上限:   {headers.get('anthropic-ratelimit-tokens-limit')}")
print(f"残りトークン:   {headers.get('anthropic-ratelimit-tokens-remaining')}")

# パース済みレスポンスも取得可能
message = response.parse()
print(message.content[0].text)

レート制限の階層

Anthropic APIのレート制限は利用プラン(Tier)によって異なります。無料プランでは1分あたり5リクエスト・40,000トークンと制限が厳しいため、本番利用ではプランのアップグレードを検討してください。

本番運用のチェックリスト

  • APIキーは環境変数で管理している
  • レート制限時の指数バックオフリトライを実装している
  • サーバーエラー(500/529)時のリトライを実装している
  • APIキーのローテーション方法を確認している
  • トークン使用量のモニタリングを設定している
  • エラーログを適切に出力している

まとめ

  • APIキー取得: Anthropic Consoleでキーを発行し、環境変数で管理する
  • 基本操作: anthropic ライブラリで messages.create() を呼ぶだけ
  • マルチターン: messages リストに会話履歴を渡して文脈を維持
  • ストリーミング: messages.stream() でリアルタイム応答を実現
  • システムプロンプト: Claudeの振る舞いを自在にカスタマイズ
  • エラー対策: 指数バックオフとエラー別ハンドリングで堅牢に