mcpField
C
claude-api

claude-api

github.com/jezweb開発1.1k325 回インストール3 週間前に更新
リポジトリ

claude-api について

TypeScript 開発者向けの Claude API 実践ガイドで、構造化出力、ツール利用、ストリーミング応答、プロンプトキャッシュを中心に説明します。モデル変更、レート制限、一般的なエラーへの対処方法もまとめています。

主な機能

  1. 01JSON Schema に準拠した出力の生成
  2. 02strict モードでのツール引数の検証
  3. 03SSE ストリームとエラーの処理
  4. 04プロンプトキャッシュの設定
  5. 05レート制限の再試行とエラー処理

活用シーン

  1. 01非構造化テキストからの項目抽出
  2. 02API 応答のスキーマ形式への整形
  3. 03検証済みツール入力を使うエージェントワークフローの構築

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jezweb/claude-skills --skill claude-api

インストール後、Claude Code で/claude-apiを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
.claude-plugin/
plugin.json
references/
api-reference.md
prompt-caching-guide.md
rate-limits.md
tool-use-patterns.md
top-errors.md
vision-capabilities.md
rules/
claude-api.md
scripts/
check-versions.sh
templates/
basic-chat.ts
cloudflare-worker.ts
error-handling.ts
extended-thinking.ts
nextjs-api-route.ts
nodejs-example.ts
package.json
prompt-caching.ts
streaming-chat.ts
tool-use-advanced.ts
tool-use-basic.ts
vision-image.ts

詳細

Claude API - 構造化出力とエラー防止ガイド

パッケージ: @anthropic-ai/[email protected] 破壊的変更: 2025年10月 - Claude 3.5/3.7 モデルの提供終了、2025年11月 - 構造化出力ベータ 最終更新日: 2026-01-09


v0.69.0 以降の新機能(2025年11月)

主な機能:

1. 構造化出力(v0.69.0、2025年11月14日)- 重要 ⭐

JSON スキーマへの準拠を保証 - Claude の応答が、2 つのモードで JSON スキーマに厳密に従います。

⚠️ 正確性に関する注意: 構造化出力が保証するのは形式への準拠であり、正確性ではありません。モデルは依然として幻覚を起こす可能性があり、「完璧な形式の誤った回答」が返されることもあります。必ず意味的な正確性を検証してください(下記参照)。

JSON 出力(output_format) - データの抽出と整形に使用します。

import Anthropic from '@anthropic-ai/sdk';

const anthropic = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
});

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Extract contact info: John Doe, [email protected], 555-1234' }],
  betas: ['structured-outputs-2025-11-13'],
  output_format: {
    type: 'json_schema',
    json_schema: {
      name: 'Contact',
      strict: true,
      schema: {
        type: 'object',
        properties: {
          name: { type: 'string' },
          email: { type: 'string' },
          phone: { type: 'string' }
        },
        required: ['name', 'email', 'phone'],
        additionalProperties: false
      }
    }
  }
});

// Guaranteed valid JSON matching schema
const contact = JSON.parse(message.content[0].text);
console.log(contact.name); // "John Doe"

厳密なツール使用(strict: true) - 検証済みの関数パラメーターに使用します。

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Get weather for San Francisco' }],
  betas: ['structured-outputs-2025-11-13'],
  tools: [{
    name: 'get_weather',
    description: 'Get current weather',
    input_schema: {
      type: 'object',
      properties: {
        location: { type: 'string' },
        unit: { type: 'string', enum: ['celsius', 'fahrenheit'] }
      },
      required: ['location'],
      additionalProperties: false
    },
    strict: true  // ← Guarantees schema compliance
  }]
});

要件:

  • ベータヘッダー: structured-outputs-2025-11-13(betas 配列経由)
  • モデル: Claude Opus 4.5、Claude Sonnet 4.5、Claude Opus 4(上位モデルのみ)
  • SDK: v0.69.0 以降が必要です

制限事項:

  • ❌ 再帰スキーマには対応していません
  • ❌ 数値制約(minimum、maximum)には対応していません
  • ❌ 正規表現のサポートは限定的です(後方参照/先読みには対応していません)
  • ❌ 引用およびメッセージのプレフィルには対応していません
  • ⚠️ 文法のコンパイルにより、初回リクエストのレイテンシーが増加します(24 時間キャッシュされます)

パフォーマンス特性:

  • 初回リクエスト: 文法のコンパイルにより、レイテンシーが 200~500ms 増加します
  • 2 回目以降のリクエスト: 通常のレイテンシーです(文法は 24 時間キャッシュされます)
  • キャッシュ共有: スキーマが完全に同一の場合のみ共有されます(わずかな変更でも再コンパイルされます)

重要なスキーマの事前ウォームアップ:

// Pre-compile schemas during server startup
const warmupMessage = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 10,
  messages: [{ role: 'user', content: 'warmup' }],
  betas: ['structured-outputs-2025-11-13'],
  output_format: {
    type: 'json_schema',
    json_schema: YOUR_CRITICAL_SCHEMA
  }
});
// Later requests use cached grammar

意味的検証(重要):

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  messages: [{ role: 'user', content: 'Extract contact: John Doe' }],
  betas: ['structured-outputs-2025-11-13'],
  output_format: {
    type: 'json_schema',
    json_schema: contactSchema
  }
});

const contact = JSON.parse(message.content[0].text);

// ✅ Format is guaranteed valid
// ❌ Content may be hallucinated

// ALWAYS validate semantic correctness
if (!isValidEmail(contact.email)) {
  throw new Error('Hallucinated email detected');
}
if (contact.age < 0 || contact.age > 120) {
  throw new Error('Implausible age value');
}

使用する場面:

  • 非構造化テキストからのデータ抽出
  • API 応答の整形
  • 検証済みのツール入力を必要とするエージェントワークフロー
  • JSON の解析エラーの解消

⚠️ SDK v0.71.1 以降の非推奨事項: .parsed プロパティへの直接アクセスは非推奨です。更新された API については SDK ドキュメントを確認してください。

2. モデルの変更(2025年10月)- 破壊的変更

提供終了(エラーが返されます):

  • ❌ Claude 3.5 Sonnet(すべてのバージョン)
  • ❌ Claude 3.7 Sonnet - 非推奨(2025年10月28日)

アクティブなモデル(2026年1月):

モデルIDコンテキスト最適な用途料金(MTok あたり)
Claude Opus 4.5claude-opus-4-5-20251101200kフラッグシップ - 推論、コーディング、エージェントに最適$5/$25(入力/出力)
Claude Sonnet 4.5claude-sonnet-4-5-20250929200kバランスの取れたパフォーマンス$3/$15(入力/出力)
Claude Opus 4claude-opus-4-20250514200k高い能力$15/$75
Claude Haiku 4.5claude-haiku-4-5-20250929200k最先端に近い性能、高速$1/$5

注: Claude 3.x モデル(3.5 Sonnet、3.7 Sonnet など)は非推奨です。Claude 4.x 以降のモデルを使用してください。

3. コンテキスト管理(2025年10月28日)

思考ブロックのクリア - 思考ブロックを自動的にクリーンアップします。

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 4096,
  messages: [{ role: 'user', content: 'Solve complex problem' }],
  betas: ['clear_thinking_20251015']
});
// Thinking blocks automatically managed
4. Agent Skills API(2025年10月16日)

Office ファイル(PowerPoint、Excel、Word、PDF)向けの組み込みスキル:

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Analyze this spreadsheet' }],
  betas: ['skills-2025-10-02'],
  // Requires code execution tool enabled
});

📚 ドキュメント: https://platform.claude.com/docs/en/build-with-claude/structured-outputs


ストリーミング応答(SSE)

重要なエラーパターン - エラーは最初の 200 応答の後に発生します。

const stream = anthropic.messages.stream({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Hello' }],
});

stream
  .on('error', (error) => {
    // Error can occur AFTER stream starts
    console.error('Stream error:', error);
    // Implement fallback or retry logic
  })
  .on('abort', (error) => {
    console.warn('Stream aborted:', error);
  });

重要な理由: 通常の HTTP エラーとは異なり、SSE エラーは 200 OK の後、ストリームの途中で発生するため、エラーイベントリスナーが必要です。


プロンプトキャッシュ(⭐ コストを 90% 削減)

重要なルール - cache_control は必ず最後のブロックに指定してください。

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  system: [
    {
      type: 'text',
      text: 'System instructions...',
    },
    {
      type: 'text',
      text: LARGE_CODEBASE, // 50k tokens
      cache_control: { type: 'ephemeral' }, // ← MUST be on LAST block
    },
  ],
  messages: [{ role: 'user', content: 'Explain auth module' }],
});

// Monitor cache usage
console.log('Cache reads:', message.usage.cache_read_input_tokens);
console.log('Cache writes:', message.usage.cache_creation_input_tokens);

最低要件:

  • Claude Sonnet 4.5: 最低 1,024 トークン
  • Claude Haiku 4.5: 最低 2,048 トークン
  • TTL は 5 分(使用するたびに更新されます)
  • キャッシュは内容が完全に同一の場合のみ共有されます

⚠️ AWS Bedrock の制限: AWS Bedrock では Claude 4 ファミリーのプロンプトキャッシュは機能しません(Claude 3.7 Sonnet では機能します)。Claude 4 のキャッシュ機能を使用するには、Anthropic API に直接接続してください。(GitHub Issue #1347)


ツールの使用(関数呼び出し)

重要なパターン:

厳密なツールの使用(構造化出力の場合):

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  betas: ['structured-outputs-2025-11-13'],
  tools: [{
    name: 'get_weather',
    description: 'Get weather data',
    input_schema: {
      type: 'object',
      properties: {
        location: { type: 'string' },
        unit: { type: 'string', enum: ['celsius', 'fahrenheit'] }
      },
      required: ['location'],
      additionalProperties: false
    },
    strict: true  // ← Guarantees schema compliance
  }],
  messages: [{ role: 'user', content: 'Weather in NYC?' }]
});

ツール結果のパターン - tool_use_id は一致する必要があります:

const toolResults = [];
for (const block of response.content) {
  if (block.type === 'tool_use') {
    const result = await executeToolFunction(block.name, block.input);

    toolResults.push({
      type: 'tool_result',
      tool_use_id: block.id,  // ← MUST match tool_use block id
      content: JSON.stringify(result),
    });
  }
}

messages.push({
  role: 'user',
  content: toolResults,
});

エラー処理 - ツール実行の失敗に対処します:

try {
  const result = await executeToolFunction(block.name, block.input);
  toolResults.push({
    type: 'tool_result',
    tool_use_id: block.id,
    content: JSON.stringify(result),
  });
} catch (error) {
  // Return error to Claude for handling
  toolResults.push({
    type: 'tool_result',
    tool_use_id: block.id,
    is_error: true,
    content: `Tool execution failed: ${error.message}`,
  });
}

コンテンツのサニタイズ - Unicode のエッジケースに対処します:

// U+2028 (LINE SEPARATOR) and U+2029 (PARAGRAPH SEPARATOR) cause JSON parse failures
function sanitizeToolResult(content: string): string {
  return content
    .replace(/\u2028/g, '\n') // LINE SEPARATOR → newline
    .replace(/\u2029/g, '\n'); // PARAGRAPH SEPARATOR → newline
}

const toolResult = {
  type: 'tool_result',
  tool_use_id: block.id,
  content: sanitizeToolResult(result) // Sanitize before sending
};

(GitHub Issue #882)


ビジョン(画像の理解)

重要なルール:

  • 形式:JPEG、PNG、WebP、GIF(アニメーションなし)
  • 最大サイズ:画像 1 枚あたり 5MB
  • Base64 のオーバーヘッド:サイズが約 33% 増加します
  • コンテキストへの影響:画像はトークン上限に含まれます
  • キャッシュ:画像を繰り返し分析する場合は検討してください

形式の検証 - エンコード前に確認します:

const validFormats = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
if (!validFormats.includes(mimeType)) {
  throw new Error(`Unsupported format: ${mimeType}`);
}

拡張思考モード

⚠️ モデルの互換性:

  • ❌ Claude 3.7 Sonnet - 非推奨(2025 年 10 月 28 日)
  • ❌ Claude 3.5 Sonnet - 提供終了(サポート対象外)
  • ✅ Claude Opus 4.5 - 拡張思考に対応(フラッグシップ)
  • ✅ Claude Sonnet 4.5 - 拡張思考に対応
  • ✅ Claude Opus 4 - 拡張思考に対応

重要:

  • 思考ブロックはキャッシュできません
  • より大きな max_tokens が必要です(思考にトークンを消費します)
  • 思考ブロックを想定する前にモデルを確認してください

レート制限

重要なパターン - 指数バックオフを使用し、retry-after ヘッダーに従ってください:

async function makeRequestWithRetry(
  requestFn: () => Promise<any>,
  maxRetries = 3,
  baseDelay = 1000
): Promise<any> {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    try {
      return await requestFn();
    } catch (error) {
      if (error.status === 429) {
        // CRITICAL: Use retry-after header if present
        const retryAfter = error.response?.headers?.['retry-after'];
        const delay = retryAfter
          ? parseInt(retryAfter) * 1000
          : baseDelay * Math.pow(2, attempt);

        console.warn(`Rate limited. Retrying in ${delay}ms...`);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
  throw new Error('Max retries exceeded');
}

レート制限ヘッダー:

  • anthropic-ratelimit-requests-limit - 許可される合計 RPM
  • anthropic-ratelimit-requests-remaining - 残りのリクエスト数
  • anthropic-ratelimit-requests-reset - リセット時刻

エラー処理

一般的なエラーコード:

ステータスエラータイプ原因解決策
400invalid_request_error不正なパラメーターリクエスト本文を検証します
401authentication_error無効な API キー環境変数を確認します
403permission_error機能へのアクセス権がありませんアカウントのプランを確認します
404not_found_error無効なエンドポイントAPI バージョンを確認します
429rate_limit_errorリクエストが多すぎますリトライ処理を実装します
500api_error内部エラーバックオフを行って再試行します
529overloaded_errorシステムが過負荷です後で再試行します

重要:

  • ストリーミングのエラーは、最初の 200 レスポンスの後に発生します
  • ストリームには必ずエラーイベントリスナーを実装してください
  • 429 エラーでは retry-after ヘッダーに従ってください
  • 重要な処理にはフォールバック戦略を用意してください

既知の問題の予防

このスキルは、文書化されている 16 件の問題を防止します:

問題 #1:バックオフなしで発生するレート制限 429 エラー

エラー:429 Too Many Requests: Number of request tokens has exceeded your per-minute rate limit ソース:https://docs.claude.com/en/api/errors 発生理由:RPM、TPM、または 1 日あたりのトークン上限を超過した場合 予防策:retry-after ヘッダーに従う指数バックオフを実装します

問題 #2:ストリーミング SSE の解析エラー

エラー:不完全なチャンク、不正な SSE イベント ソース:一般的な SDK の問題(GitHub #323) 発生理由:ネットワークの中断、不適切なイベント解析 予防策:SDK のストリームヘルパーを使用し、エラーイベントリスナーを実装します

問題 #3:プロンプトキャッシュが有効にならない

エラー:cache_control ブロックを設定しているのにコストが高い ソース:https://platform.claude.com/docs/en/build-with-claude/prompt-caching 発生理由:cache_control の配置が誤っている(最後に置く必要があります) 予防策:キャッシュ可能なコンテンツの最後のブロックに必ず cache_control を配置します

問題 #4:ツール使用のレスポンス形式エラー

エラー:invalid_request_error: tools[0].input_schema is invalid ソース:API の検証エラー 発生理由:JSON Schema が無効、必須フィールドが不足 予防策:JSON Schema バリデーターでスキーマを検証し、十分にテストします

問題 #5:ビジョンでの画像形式の問題

エラー:invalid_request_error: image source must be base64 or url ソース:API ドキュメント 発生理由:エンコードの誤り、未対応の形式 予防策:形式(JPEG/PNG/WebP/GIF)を検証し、適切な Base64 エンコードを行います

Issue #6:課金時のトークン数の不一致

エラー:予想外の高額なコスト、コンテキストウィンドウの超過 原因:トークン数のカウント方法の違い 発生理由:特殊トークンや書式設定が考慮されていない 予防策:公式のトークンカウンターを使用し、使用量ヘッダーを監視します

Issue #7:システムプロンプトの順序に関する問題

エラー:システムプロンプトが無視される、または上書きされる 原因:API の動作 発生理由:システムプロンプトが messages 配列の後に配置されている 予防策:システムプロンプトは必ず messages の前に配置します

Issue #8:コンテキストウィンドウの超過(200k)

エラー:invalid_request_error: messages: too many tokens 原因:モデルの制限 発生理由:履歴を整理せずに会話を続けている 予防策:メッセージ履歴を整理する仕組みを実装し、キャッシュを使用します

Issue #9:誤ったモデルでの拡張思考

エラー:応答に思考ブロックが含まれない 原因:モデルの機能 発生理由:提供終了または非推奨のモデル(3.5/3.7 Sonnet)を使用している 予防策:拡張思考は Claude Opus 4.5、Claude Sonnet 4.5、または Claude Opus 4 でのみ使用します

Issue #10:クライアントコードでの API キーの漏えい

エラー:CORS エラー、セキュリティ上の脆弱性 原因:セキュリティのベストプラクティス 発生理由:ブラウザーから API を呼び出している 予防策:サーバー側でのみ呼び出し、環境変数を使用します

Issue #11:レート制限のティアに関する混乱

エラー:予想より低い上限 原因:アカウントのティア制度 発生理由:ティアの引き上げの仕組みを理解していない 予防策:Console で現在のティアを確認します。使用状況に応じて自動的にスケールします

Issue #12:メッセージバッチのベータヘッダーの設定漏れ

エラー:invalid_request_error: unknown parameter: batches 原因:ベータ API の要件 発生理由:anthropic-beta ヘッダーが設定されていない 予防策:anthropic-beta: message-batches-2024-09-24 ヘッダーを含めます

Issue #13:ストリームエラーを .withResponse() で捕捉できない(v0.71.2 で修正済み)

エラー:messages.stream().withResponse() の使用時に未処理の Promise 拒否が発生する 原因:GitHub Issue #856 発生理由:SDK 内部のエラー処理により、ユーザーの catch ブロックが機能しなかった(v0.71.2 より前) 予防策:v0.71.2 以降にアップグレードするか、代わりにイベントリスナーを使用します

v0.71.2 以降で修正済み:

try {
  const stream = await anthropic.messages.stream({
    model: 'claude-sonnet-4-5-20250929',
    max_tokens: 1024,
    messages: [{ role: 'user', content: 'Hello' }]
  }).withResponse();
} catch (error) {
  // Now properly catchable in v0.71.2+
  console.error('Stream error:', error);
}

v0.71.2 より前の回避策:

const stream = anthropic.messages.stream({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [{ role: 'user', content: 'Hello' }]
});

stream.on('error', (error) => {
  console.error('Stream error:', error);
});
Issue #14:MCP ツールの接続による2分間のタイムアウト

エラー:約121秒後に Connection error / 499 Client disconnected 原因:GitHub Issue #842 発生理由:MCP ツールを実際に使用していない場合でも、MCP サーバーの接続管理が長時間実行されるリクエストと競合する 予防策:2分を超えるリクエストでは、MCP の代わりに直接 toolRunner を使用します

症状:

  • MCP を使用しなければリクエストは正常に動作する
  • MCP が登録されていると、約121秒で必ず失敗する
  • ダッシュボードに「Client disconnected (code 499)」と表示される
  • ストリーミングと非ストリーミングの両方で複数のユーザーが確認済み

回避策:

// Don't use MCP for long requests
const message = await anthropic.beta.messages.toolRunner({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 4096,
  messages: [{ role: 'user', content: 'Long task >2 min' }],
  tools: [customTools] // Direct tool definitions, not MCP
});

注:これは既知の制限であり、公式な修正はありません。ツールを使う長時間のリクエストが必要な場合は、アーキテクチャの変更を検討してください。

Issue #15:構造化出力のハルシネーションのリスク

エラー:JSON 形式は有効だが、内容が誤っている、またはハルシネーションが含まれる 原因:Structured Outputs Docs 発生理由:構造化出力が保証するのは形式への準拠であり、正確性ではありません 予防策:形式だけでなく、意味的な正しさも必ず検証します

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  messages: [{ role: 'user', content: 'Extract contact: John Doe' }],
  betas: ['structured-outputs-2025-11-13'],
  output_format: {
    type: 'json_schema',
    json_schema: contactSchema
  }
});

const contact = JSON.parse(message.content[0].text);

// ✅ Format is guaranteed valid
// ❌ Content may be hallucinated

// CRITICAL: Validate semantic correctness
if (!isValidEmail(contact.email)) {
  throw new Error('Hallucinated email detected');
}
if (contact.age < 0 || contact.age > 120) {
  throw new Error('Implausible age value');
}
Issue #16:ツールの結果に含まれる U+2028 行区切り文字(コミュニティからの報告)

エラー:ツールの結果に U+2028 が含まれている場合、JSON の解析に失敗する、またはエラーが通知されずに発生する 原因:GitHub Issue #882 発生理由:U+2028 は JSON では有効ですが、JavaScript の文字列リテラルでは有効ではありません 予防策:SDK に渡す前にツールの結果をサニタイズします

function sanitizeToolResult(content: string): string {
  return content
    .replace(/\u2028/g, '\n') // LINE SEPARATOR → newline
    .replace(/\u2029/g, '\n'); // PARAGRAPH SEPARATOR → newline
}

const toolResult = {
  type: 'tool_result',
  tool_use_id: block.id,
  content: sanitizeToolResult(result)
};

公式ドキュメント


パッケージのバージョン

最新: @anthropic-ai/[email protected]

{
  "dependencies": {
    "@anthropic-ai/sdk": "^0.71.2"
  },
  "devDependencies": {
    "@types/node": "^20.0.0",
    "typescript": "^5.3.0",
    "zod": "^3.23.0"
  }
}

トークン効率:

  • スキルなし: 約8,000トークン(基本設定、ストリーミング、キャッシュ、ツール、ビジョン、エラー)
  • スキルあり: 約4,200トークン(知識の不足部分+エラー防止+重要なパターン)
  • 削減量: 約48%(約3,800トークン)

防止したエラー: 解決策を明記した16件の既知の問題 主な価値: 構造化出力(v0.69.0以降)、モデルの非推奨化(2025年10月)、プロンプトキャッシュのエッジケース、ストリーミングのエラーパターン、レート制限の再試行ロジック、MCPのタイムアウト回避策、ハルシネーションの検証


最終確認日: 2026-01-20 | スキルのバージョン: 2.2.0 | 変更点: コミュニティ調査に基づく新たな問題を4件追加:ストリーミングのエラー処理(v0.71.2で修正)、MCPのタイムアウト回避策、構造化出力のハルシネーション検証、U+2028のサニタイズ。パフォーマンス特性と精度に関する注意事項を追加し、構造化出力のセクションを拡充。AWS Bedrockのキャッシュ制限を追加

コメント