Season2、はじめます。
Season1ではClaude APIの基礎をざっくり触ってみたんですが、気づいたら自分の周りのAI環境がけっこう変わっていて。モデルのラインナップも一新されて、Claudeも「claude-sonnet-4」という世代になっているし、SDKの使い方もちょっとずつ変わってたりする。
というわけで、Season2では「実際に使う」ことにフォーカスして書いていこうと思います。全4回の予定で、大まかな流れはこんな感じ。
- 第1回(今回):環境構築とClaude Sonnet 4を呼び出す基本
- 第2回:マルチターン会話・システムプロンプトの使い方
- 第3回:Tool Use(関数呼び出し)を実装する
- 第4回:Streaming + 実践的なユースケースをまとめる
まず今回は「Hello, Claude」から始めて、レスポンスの構造を把握するところまでやっていきます。
この記事でわかること
- APIキーを取得して環境変数として設定する方法
- PythonからClaude Sonnet 4を呼び出す最小限のコード
- レスポンスオブジェクトの主要フィールドと意味
- systemプロンプトの効果的な使い方
- max_tokensとコストの関係
Claude Sonnet 4 ってどんなモデルか
軽くおさらい。Claude Sonnet 4(モデルID: claude-sonnet-4-20250514)は2025年5月にリリースされたモデルで、Anthropicの「Claude 4」ファミリーのミドルティアに位置します。
特徴をざっくり挙げると:
- コンテキストウィンドウ:200,000トークン
- 入力:テキスト・画像対応
- Extended Thinking(拡張思考モード)対応
- コーディング系タスクに強い設計
Opusほど重くなく、Haikuほど割り切ってもない。日常的なAPI利用のメインどころとして使いやすいモデルという印象です。ちなみに現在(2026年5月時点)ではSonnet 4.5や4.6も登場していますが、基礎を押さえておくことが後続の理解にも直結するので、まずSonnet 4からスタートします。
環境構築
APIキーの取得
まずAnthropic Consoleでアカウントを作り、APIキーを発行します。無料枠でも試せますが、量が多いと課金が走るので注意。
キーは環境変数として管理するのが無難です。
# .envに書いておく
ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxxxxxx
本番コードにハードコードしてうっかりGitHubに上げる、という事故は定番中の定番なので、最初から環境変数の習慣をつけておくといいです(自分も一回やりました)。
Pythonライブラリのインストール
pip install anthropic
またはuv派の人は:
uv add anthropic
最近uvを使い始めたんですが、ローカル環境が整理されてとても快適です。まだpipでいいかなという人も、一度試してみる価値あり。
python-dotenvも入れておくと環境変数の読み込みが楽です。
pip install python-dotenv
最初のAPI呼び出し
ではさっそく動かしてみます。
import os
from dotenv import load_dotenv
from anthropic import Anthropic
load_dotenv()
client = Anthropic() # ANTHROPIC_API_KEYを自動で読んでくれる
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{"role": "user", "content": "Pythonでフィボナッチ数列を返す関数を書いてください"}
]
)
print(message.content[0].text)
client = Anthropic()は環境変数ANTHROPIC_API_KEYを自動で読み取ってくれるので、明示的に渡す必要はありません。明示的に渡したいならapi_key=os.environ.get("ANTHROPIC_API_KEY")と書けばOK。
実行するとこんな感じのレスポンスが返ってきます。
def fibonacci(n):
if n <= 0:
return []
elif n == 1:
return [0]
fib = [0, 1]
for i in range(2, n):
fib.append(fib[-1] + fib[-2])
return fib
ちゃんと動く。当たり前ですが毎回感動します。
レスポンスオブジェクトの構造を把握する
テキストを取り出すだけならmessage.content[0].textで十分ですが、レスポンス全体の構造を知っておくと後で困りません。
print(message)
# Message(
# id='msg_01...',
# content=[TextBlock(text='...', type='text')],
# model='claude-sonnet-4-20250514',
# role='assistant',
# stop_reason='end_turn',
# stop_sequence=None,
# type='message',
# usage=Usage(
# cache_creation_input_tokens=0,
# cache_read_input_tokens=0,
# input_tokens=23,
# output_tokens=87
# )
# )
主要なフィールドを整理するとこんな感じ。
content:レスポンス本文のリスト。通常はTextBlockが1つstop_reason:end_turnは正常終了。max_tokensなら出力が途中で切れてるusage.input_tokens/usage.output_tokens:トークン数。コスト計算のときに使う
stop_reasonのチェックは地味に大事で、max_tokensで切れていた場合はレスポンスが不完全なので、そのまま使うとまずいことがあります。
if message.stop_reason == "max_tokens":
print("⚠️ 出力が途中で切れています。max_tokensを増やすか、入力を短くしてください")
else:
print(message.content[0].text)
systemプロンプトを付けてみる
Claude APIにはsystemパラメータがあって、AIの役割や振る舞いを事前に指定できます。messagesの中ではなく、トップレベルのパラメータとして渡す点が少し独特です(OpenAI APIと使い方が違うのでたまに混乱する)。
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=512,
system="あなたはPythonの技術書を書くプロのエンジニアです。コードは常にPEP8に準拠し、型ヒントを付けてください。",
messages=[
{"role": "user", "content": "リストの最大値を返す関数を書いてください"}
]
)
print(message.content[0].text)
systemプロンプトをちゃんと書くだけで、アウトプットの質がかなり変わります。「〇〇のエキスパートとして回答してください」くらいのシンプルな一文でも効果があるので、入れない手はないです。
max_tokensとコストの考え方
Claude Sonnet 4の価格は、入力が$3/MTok、出力が$15/MTokです(1MTok = 100万トークン)。Extended Thinkingを使う場合はthinking tokensなどが出力トークンとして扱われるため、課金・トークンの見え方がややこしくなることがあります。注意が必要です。
max_tokensは「最大でここまで出力してよい」という上限であり、この数値が大きいほど課金されるわけではありません。実際の課金はusage.output_tokensベース。なので基本的には大きめに設定しておいて問題ありません。
ただし1リクエストで大量に生成させると当然コストも上がるので、用途に合わせて調整する必要はあります。自動化バッチで大量に回すときはusageをログに残しておくと後で確認しやすいです。
※この記事にはプロモーションが含まれます
ちなみに、Aiarty Image Enhancer(AI画像高画質化ツール。ノイズ除去・8倍拡大に対応)も気になっています。Aiarty Image Enhancer![]()
まとめ
今回は環境構築から基本的なClaude Sonnet 4 APIの呼び出し、レスポンス構造の確認、systemプロンプトの付け方、そしてコストの考え方まで触れました。コード量は少ないけど、ここの理解がゆるいと後で詰まることが多いので、しっかり手を動かしておくと良いと思います。
次回は「マルチターン会話」と「systemプロンプトのより実践的な使い方」をやります。
