← レッスンに戻る
第3章 · Claude API入門

Messages API の基本

Messages API Basics · 約 14 分

重要キーワード

English日本語説明
Messages API メッセージAPI Claude API の中心エンドポイント
Stateless ステートレス サーバーが会話状態を保持しない設計
Content Block コンテンツブロック 応答の構成要素 (text/image/tool_use 等)
stop_reason 停止理由 応答が終了した理由 (end_turn / max_tokens / tool_use ...)

Messages API

Claude API の中心は Messages API です。 messages.create() を呼ぶことで応答を得ます。

リクエストの構造

{
  "id": "msg_01...",
  "type": "message",
  "role": "assistant",
  "model": "claude-sonnet-4-6",
  "content": [
    {"type": "text", "text": "JavaScript は..."}
  ],
  "stop_reason": "end_turn",   # end_turn / max_tokens / stop_sequence / tool_use
  "usage": {"input_tokens": 42, "output_tokens": 128}
}

レスポンスの構造

{
  "id": "msg_01...",
  "type": "message",
  "role": "assistant",
  "model": "claude-sonnet-4-6",
  "content": [
    {"type": "text", "text": "JavaScript は..."}
  ],
  "stop_reason": "end_turn",   # end_turn / max_tokens / stop_sequence / tool_use
  "usage": {"input_tokens": 42, "output_tokens": 128}
}

マルチターン会話

会話履歴は すべてのターンを送り直す のが基本ルールです。 モデル側に状態は保持されません (stateless)。

history = []
def chat(user_msg):
    history.append({"role": "user", "content": user_msg})
    res = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=1024,
        messages=history,
    )
    text = res.content[0].text
    history.append({"role": "assistant", "content": text})
    return text

content の中身

contentテキスト・画像・ツール呼び出し などの「ブロック」の配列です。 複雑な応答ではブロックが複数返ることがあります。

for block in msg.content:
    if block.type == "text":
        print(block.text)
    elif block.type == "tool_use":
        print("Tool call:", block.name, block.input)
    elif block.type == "thinking":
        print("Internal thought:", block.thinking)

user メッセージも構造化できる

content は文字列だけでなく 配列 で渡せます。画像や複数テキストブロックが混在可能。

messages=[{
    "role": "user",
    "content": [
        {"type": "text", "text": "この画像を説明して"},
        {"type": "image", "source": {"type": "url", "url": "https://example.com/cat.jpg"}},
    ],
}]

stop_reason の意味

意味
end_turn 自然終了 (ふつうの完了)
max_tokens max_tokens に到達した (途中切断)
stop_sequence stop_sequences のいずれかが出現
tool_use ツール呼び出しを要求 (Tool Use 中)
pause_turn 長時間処理 (Claude Code on the web 等) で一時停止

試してみる: マルチターン

簡単な対話を Playground で再現してみましょう。

▶ ターンの感覚を掴む
私は今 Python の入門書を選んでいます。3 冊おすすめしてください。 (↑ の応答を見たら、続けて「2 冊目について、対象読者をもっと詳しく」と聞いてみましょう)

演習問題

演習 1: シンプルな CLI チャット

Python で 20 行程度の CLI チャットボット を作ってください。仕様: - ユーザーが quit と入力するまでループ - 履歴を保持してマルチターンに対応 - usage を毎回末尾に表示

スタータープロンプト:
Python で 20 行以内の CLI チャットボットを書いてください。仕様:
- anthropic SDK の Messages API を使う
- ユーザーが quit と入力するまで対話を続ける
- 会話履歴を保持
- 各応答後に input/output トークン数を表示
model は claude-haiku-4-5 を使用。コードのみ示してください。
ヒントを見る

history.append({"role": "assistant", "content": text}) を忘れずに。これを忘れるとモデルは「金魚の記憶」状態になります。

サンプル解答を見る
from anthropic import Anthropic

client = Anthropic()
history = []

while True:
    u = input('> ').strip()
    if u.lower() == 'quit': break
    history.append({'role': 'user', 'content': u})
    msg = client.messages.create(
        model='claude-haiku-4-5',
        max_tokens=512,
        messages=history,
    )
    text = msg.content[0].text
    history.append({'role': 'assistant', 'content': text})
    print(text)
    print(f'  [tokens] in={msg.usage.input_tokens} out={msg.usage.output_tokens}')

理解度チェック

  1. Messages API の必須パラメータは?
    1. model, max_tokens, messages
    2. api_key, prompt, length
    3. engine, query, stream
    4. user, password, model
  2. Claude API は会話の状態を保持しますか?
    1. はい、自動で保持
    2. いいえ、stateless
    3. Pro 契約のみ
    4. デフォルトは 1 時間保持
  3. `stop_reason` が `max_tokens` だった場合の意味は?
    1. 正常終了
    2. ユーザー停止
    3. 出力トークン上限に達した
    4. API キーが切れた
  4. Tool Use 実行中に応答が `tool_use` で停止した場合、次にすべきは?
    1. そのまま終了
    2. ツールを実行して `tool_result` を含む新しいメッセージを送る
    3. API キーを差し替える
    4. user メッセージを再送する
解答と解説を見る
  1. A — model / max_tokens / messages の 3 つが最低限必要です。
  2. B — API は stateless で、毎回履歴を送る必要があります。
  3. C — max_tokens に到達して途中で打ち切られたことを示します。
  4. B — ツール実行結果を tool_result ブロックで返して会話を継続します。