Claude API 入門 — Messages API の基本
Anthropic SDK を使った最初のリクエストから、システムプロンプト、ストリーミング、思考(thinking)、プロンプトキャッシュ、エラー処理までの要点。
#概要
Claude の機能はほぼすべて POST /v1/messages(Messages API)に集約されている。ツール利用、構造化出力、画像入力、思考機能はすべてこの1エンドポイントのパラメータ。
- 公式 SDK: Python、TypeScript、Java、Go、Ruby、C#、PHP
- 認証: 環境変数
ANTHROPIC_API_KEY(またはant auth loginによるプロファイル)
#セットアップ(TypeScript)
npm install @anthropic-ai/sdk
export ANTHROPIC_API_KEY=sk-ant-...
#最初のリクエスト
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // 環境変数から認証情報を読む
const response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
system: "あなたは簡潔に答えるアシスタントです。",
messages: [{ role: "user", content: "日本で一番高い山は?" }],
});
for (const block of response.content) {
if (block.type === "text") console.log(block.text);
}
ポイント:
contentは ブロックの配列(text / tool_use / thinking など)。typeで分岐するmax_tokensは出力上限。小さすぎると途中で切れる(stop_reason: "max_tokens")- API は ステートレス。会話を続けるには履歴をすべて送り直す
#会話履歴
const messages: Anthropic.MessageParam[] = [
{ role: "user", content: "私の名前は山田です。" },
{ role: "assistant", content: "山田さん、はじめまして。" },
{ role: "user", content: "私の名前は?" },
];
#ストリーミング
長い出力や高い max_tokens を使うときはストリーミングにする(タイムアウト回避と体感速度の改善)。
const stream = client.messages.stream({
model: "claude-opus-5",
max_tokens: 64000,
messages: [{ role: "user", content: "TypeScriptの型システムを解説して" }],
});
stream.on("text", (text) => process.stdout.write(text));
const final = await stream.finalMessage();
console.log("\n", final.usage);
#思考(thinking)と effort
最近のモデルは回答前に思考する。adaptive を指定すると必要に応じて思考の深さをモデルが判断する。深さは output_config.effort で調整。
const response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
thinking: { type: "adaptive", display: "summarized" },
output_config: { effort: "high" }, // low | medium | high | xhigh | max
messages: [{ role: "user", content: "この設計のトレードオフを分析して…" }],
});
メモ
旧来の budget_tokens 指定は新しいモデルではエラーになる。thinking: { type: "adaptive" } + effort に置き換える。
#プロンプトキャッシュ
同じ前置き(長いシステムプロンプト、資料、ツール定義)を繰り返し送る場合、キャッシュで入力コストを大幅に下げられる。前方一致 なので、変わらない内容を先頭に、変わる内容を後ろに置く。
const response = await client.messages.create({
model: "claude-opus-5",
max_tokens: 16000,
system: [
{
type: "text",
text: longDocument, // 変わらない大きな資料
cache_control: { type: "ephemeral" },
},
],
messages: [{ role: "user", content: "要点を3つ挙げて" }],
});
console.log(response.usage.cache_read_input_tokens); // 2回目以降にここが増えていれば効いている
#構造化出力(JSON)
後続処理で使う場合は、プロンプトで「JSONで返して」と頼むより、output_config.format で JSON Schema を指定する方が確実。SDK の messages.parse() はスキーマ検証まで行ってくれる。
#エラー処理
SDK の型付き例外を使い、リトライすべきもの(429、5xx、ネットワーク)とそうでないもの(400、404)を分ける。
try {
await client.messages.create({ /* ... */ });
} catch (err) {
if (err instanceof Anthropic.RateLimitError) {
// 待って再試行
} else if (err instanceof Anthropic.BadRequestError) {
// リクエストを修正
} else if (err instanceof Anthropic.APIError) {
console.error(err.status, err.message);
}
}
SDK は既定で2回自動リトライする。
#stop_reason を必ず見る
| 値 | 意味 |
|---|---|
end_turn | 正常終了 |
max_tokens | 上限で切れた → max_tokens を増やすかストリーミング |
tool_use | ツール呼び出し要求 → 実行して結果を返す |
refusal | 安全上の理由で拒否 → stop_details を確認 |
#コストの見方
usage.input_tokens/output_tokens/cache_read_input_tokensで毎回確認- 出力は入力より単価が高い
- 即時性不要な大量処理は バッチAPI(割引)を使う
#まとめ
- すべては Messages API。
contentはブロック配列、API はステートレス - 長い出力はストリーミング、難しいタスクは thinking + effort
- 繰り返す前置きはキャッシュ、後続処理は構造化出力
stop_reasonとusageを常にログに残す