第2章:生のリクエスト

ほとんどのチュートリアルでは pip install anthropic を実行するよう指示されています。しかし、本書ではそうしません。

SDKは真実を隠します。抽象化のレイヤーを重ねることで「Hello World」は簡単になりますが、「Error 400」のデバッグは悪夢になります。SDKを学べば、SDKを学んだことになります。生のHTTP呼び出しを学べば、あらゆるSDKの背後にあるプロトコルそのものを学んだことになります。

私たちは requests ライブラリだけを使ってClaudeにメッセージを送ります。ClaudeはAnthropicの主力LLMであり、コーディングタスクにおいて最も優れたモデルの一つです。

APIキーを取得する

Claudeと通信するには、APIキーが必要です。これは、課金アカウントに紐付いたパスワードのような長い文字列です。

  1. Anthropic Consoleにアクセスします。1
  2. サインアップして支払い方法を追加します(最低5ドルのクレジットが必要です)。
  3. 新しいAPIキーを作成し、nanocode という名前を付けます。
  4. キーをコピーします(sk-ant-... で始まります)。
An icon of a warning1

警告: このキーはパスワードと同様に扱ってください。このキーを持つ者は誰でもあなたの資金を使えます。

金庫(.env)

このキーを安全に保管する場所が必要です。キーをコードに直接書き込むことはしません。

プロジェクトのルートに .env という名前のファイルを作成します:

1 touch .env

開いて、キーを貼り付けてください:

1 ANTHROPIC_API_KEY=sk-ant-api03-...

python-dotenv は、まさにこの目的のために第1章でインストールしました。このライブラリは .env を読み込み、その値を os.environ にロードします。

リクエストの構造

LLMと通信するには、以下のURLにHTTP POSTリクエストを送信します:

https://api.anthropic.com/v1/messages

このリクエストには3つの要素が必要です。ヘッダーに含める認証情報(APIキー)、ボディに含める設定(使用するモデルやトークン数)、そしてメッセージそのものです。

ヘッダー

Anthropicは3つのヘッダーを必要とします:

ヘッダー 目的
x-api-key あなたのシークレットキー 認証
anthropic-version 2023-06-01 APIバージョン
content-type application/json フォーマット

ペイロード

「Messages API」は、メッセージの辞書のリストを受け取ります:

1 "messages": [
2     {"role": "user", "content": "Hello, world!"}
3 ]

各メッセージには role"user" または "assistant")と content(テキスト)があります。

コード

test_api.py というファイルを作成してください。これは接続が正しく動作することを証明するための「スモークテスト」です。後で削除します。

コンテキスト: 線形の手続き型コードを書いています。関数もクラスもありません。ベアメタル(素の実装)を直接見たいのです。

コード:

 1 import os
 2 import requests
 3 import json
 4 from dotenv import load_dotenv
 5 
 6 # 1. Load the vault
 7 load_dotenv()
 8 api_key = os.getenv("ANTHROPIC_API_KEY")
 9 
10 # Basic check so we don't crash with a confusing "NoneType" error later
11 if not api_key:
12     print("Error: ANTHROPIC_API_KEY not found in .env")
13     exit(1)
14 
15 # 2. Define the target
16 url = "https://api.anthropic.com/v1/messages"
17 
18 # 3. Authenticate
19 headers = {
20     "x-api-key": api_key,
21     "anthropic-version": "2023-06-01",
22     "content-type": "application/json"
23 }
24 
25 # 4. Construct the payload
26 payload = {
27     "model": "claude-sonnet-4-6",
28     "max_tokens": 4096,
29     "messages": [
30         {"role": "user", "content": "Hello, are you ready to code?"}
31     ]
32 }
33 
34 # 5. Fire! (No safety net)
35 print("📡 Sending request to Claude...")
36 response = requests.post(url, headers=headers, json=payload, timeout=120)
37 
38 # 6. Inspect the raw result
39 print(f"Status: {response.status_code}")
40 
41 if response.status_code == 200:
42     # Success: Print the beautiful JSON
43     print("Response:")
44     print(json.dumps(response.json(), indent=2))
45 else:
46     # Failure: Print the ugly raw text so we can debug
47     print("Error:", response.text)

ウォークスルー:

  • 7行目: load_dotenv().env ファイルを見つけ、変数を os.environ に読み込みます。
  • 8行目: APIキーを取得します。絶対にハードコードしないこと。
  • 11〜13行目: 基本的な確認処理です。これがないと、キーが見つからない場合にヘッダーの辞書で分かりにくい NoneType エラーが発生します。
  • 21行目: anthropic-version ヘッダーは必須です。省略すると、APIからリクエストが拒否されます。
  • 27行目: claude-sonnet-4-6 で使用するモデルを指定します。
  • 28行目: max_tokens は必須項目です。レスポンスの長さを制限し、コストが際限なく膨らむのを防ぎます。
  • 36行目: 2分のタイムアウトを設定してリクエストを送信します。try/except は使いません——ネットワークがダウンしている場合は、Pythonをクラッシュさせてください。どこで失敗しているかを確認する必要があります。
  • 41〜47行目: ステータスコードを確認します。200なら成功(JSONを整形して表示します)。それ以外の場合は、デバッグのために生のエラーテキストを出力します。

実行

1 python test_api.py

すべてうまくいけば、次のように表示されるはずです:

Status: 200
Response:
{
  "id": "msg_01...",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "Hello! Yes, I'm ready to code..."
    }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 15,
    "output_tokens": 81
  }
}

トラブルシューティング

エラー 原因 対処法
401 Unauthorized APIキーが無効 .env が読み込まれているか確認。os.environ.get("ANTHROPIC_API_KEY") を出力して検証してください。
400 Bad Request JSONの形式が不正 max_tokens を忘れていませんか? messages はリストになっていますか?
429 Rate Limit リクエスト過多またはクレジット不足 しばらく待つか、アカウントにクレジットを追加してください。

クリーンアップ

脳と通信できることを証明しました。test_api.py は削除してしまいましょう——もう必要ありません。

An icon of a info-circle1

補足: この test_api.py は使い捨てコードです——一回限りのスモークテストに過ぎません。本格的な自動テスト(FakeBrain と pytest を使ったもの)は第3章で登場します。API接続が正常に動作することを確認したら、必ずこのファイルを削除してください。

An icon of a info-circle1

補足: 支出を監視するには、Anthropic Consoleの使用状況タブを確認してください。2026年初頭時点では、Claude Sonnetを使った20〜30回のやり取りを含む典型的なコーディングセッションのコストは$0.10〜$0.50程度です。レスポンスJSONの末尾にある usage フィールドには正確なトークン数が表示されており、これをログに記録してコストをプログラム的に追跡することもできます。

まとめ

これが生のAPIコールです——ヘッダー、JSONペイロード、レスポンスの解析。あなたとワイヤーの間に抽象化レイヤーは一切ありません。何か問題が起きたとき(必ず起きます)、どのレイヤーで失敗したかが正確にわかります。なぜなら、レイヤーは一つしかないからです。

一つ問題があります。Claudeには記憶が一切ありません。リクエストのたびに白紙の状態から始まります。これを解決するために、毎回のやり取りで会話履歴全体を送り直すことで、偽の記憶を実現していきます。


  1. https://console.anthropic.com/settings/keys↩︎