7月3日、Bala Priya C氏が「Getting Started with the Claude API in Python」と題した記事を公開した。この記事では、PythonからClaude APIを呼び出す最初の一歩から、ストリーミングレスポンスの実装までを実際のコードとともに解説している。
なお、掲載媒体のKDnuggetsはデータサイエンス・機械学習分野を専門とする老舗技術メディアであり、実践的なチュートリアル記事を多数掲載している。Claude APIはAnthropicが提供するLLMアクセス用APIで、OpenAI APIと同様のRESTベース設計を採用しつつ、システムプロンプトをmessagesリストと明示的に分離した構造や、ツール使用(Function Calling相当)の扱いに独自の設計思想がある。APIの利用に慣れた開発者であれば差分を把握しやすく、本記事はその差分も含めてカバーしている。
「アカウント作成して最初のAPIコールまでは分かった。その先は?」
Claude APIの公式ドキュメントを読めば、アカウント作成から最初のリクエスト送信まではすぐ辿り着ける。しかし実際にアプリケーションへ組み込もうとすると、より具体的な疑問が出てくる——レスポンスオブジェクトには何が入っているのか、ストリーミングはどう実装するのか、プロダクション向けにはどう構造化すべきか。
本記事はその「その先」を扱う実践的なチュートリアルだ。
セットアップ:最低限必要なもの
必要なのはPython 3.9以上、Claude Consoleの無料アカウント、そしてConsoleの「Settings > API Keys」ページで発行したAPIキーの3点。記事内のコードを全部試すには**$5のクレジット**で十分とのことだ(※無料クレジットの付与条件はAnthropicのポリシー変更により変動することがある。元記事公開時点の情報として参照されたい)。
SDKのインストールは1行。PyPIページおよびGitHubリポジトリも参照できる:
pip install anthropic
APIキーは環境変数で管理する。ソースコードへのハードコードは厳禁だ:
export ANTHROPIC_API_KEY="YOUR-API-KEY-HERE"
SDKは自動でANTHROPIC_API_KEYを環境変数から読み取るため、コード中でキーを渡す処理は不要になる。
レスポンスオブジェクトの中身を把握する
最初のAPIコールはシンプルだ。client.messages.create()にモデルID・max_tokens・messagesリストの3つを渡す:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=256,
messages=[
{
"role": "user",
"content": "In one sentence, what is a context window?"
}
]
)
print(response.content[0].text)
※元記事ではmodel="claude-sonnet-5"と記載されているが、2025年7月時点でAnthropicの公式モデル一覧で確認できる表記とは異なる可能性がある。実際にコードを実行する際はAnthropicモデル一覧で最新のモデルIDを確認した上で差し替えることを推奨する。
ここでresponseをそのままprint()すると、レスポンスオブジェクトの全体像が見える:
Message(
id='msg_01XFDUDYJgAACzvnptvVoYEL',
type='message',
role='assistant',
content=[TextBlock(text='A context window is...', type='text')],
model='claude-sonnet-5',
stop_reason='end_turn',
stop_sequence=None,
usage=Usage(input_tokens=19, output_tokens=42)
)
特に注目すべきフィールドが2つある。
**stop_reason**:Claudeが生成を止めた理由を示す。end_turnなら正常終了。max_tokensが返ってきた場合は上限で打ち切られたことを意味し、max_tokensの値を上げるかプロンプトを見直す必要がある。
**usage**:入力・出力それぞれのトークン数を記録する。課金計算の根拠であり、コンテキスト上限への接近を検知する手段でもある。contentはリスト構造のため、テキストを取り出す際はresponse.content[0].textが定石となる。
システムプロンプトで役割を固定する
システムプロンプトは、会話全体を通じてClaudeの役割や制約を定義するための仕組みだ。messagesリストとは別に、systemパラメータとして渡す:
response = client.messages.create(
model="claude-sonnet-5",
max_tokens=512,
system=(
"You are a Python code reviewer. "
"Respond only with corrected or improved Python code. "
"Do not explain changes unless the user explicitly asks."
),
messages=[
{
"role": "user",
"content": (
"def get_user(id):\n"
" db = connect()\n"
" return db.query('SELECT * FROM users WHERE id=' + id)"
)
}
]
)
システムプロンプトはすべてのターンで有効であり、毎回メッセージに書き直す必要がない。ロールの指示やフォーマットルールはここに集約するのが基本だ。OpenAI APIではmessagesリスト内のrole: "system"として渡す設計と異なり、Claude APIでは専用パラメータとして明示的に分離されている点は覚えておきたい差分だ。
ストリーミング:応答を逐次表示する
レスポンスに数秒かかる場合、全文生成を待ってから表示するよりも、生成されながらリアルタイムに表示する方がUXとして明らかに優れる。SDKはclient.messages.stream()をコンテキストマネージャとして提供しており、text_streamイテレータで各チャンクを逐次受け取れる:
with client.messages.stream(
model="claude-sonnet-5",
max_tokens=512,
messages=[
{
"role": "user",
"content": "Walk me through what happens when a Python list grows beyond its initial capacity."
}
]
) as stream:
for chunk in stream.text_stream:
print(chunk, end="", flush=True)
print()
end=""とflush=Trueを指定することで、バッファリングされずに文字が流れるように表示される。コンテキストマネージャはストリーム途中で例外が発生した場合もHTTP接続を確実にクローズする。ストリーミング後にトークン使用量などの完全なMessageオブジェクトが必要な場合は、ブロックを抜ける前にstream.get_final_message()を呼ぶ。
次のステップ
記事では、エラーハンドリング・マルチターン会話・構造化出力・ツール使用(Function Calling相当の機能)についても触れている。特にマルチターン会話はAPIがステートレスな設計のため、リクエストごとに会話履歴全体を送信する必要がある点に注意が必要だ。ツール使用の詳細についてはAnthropic公式ドキュメントのTool useページも合わせて参照すると理解が深まる。
詳細はGetting Started with the Claude API in Pythonを参照していただきたい。