Agent Skills by ALSEL
Anthropic ClaudeLLM・AI開発⭐ リポ 14品質スコア 76/100

claude-api

Anthropic Messages API(Claude API)を使用するための包括的な知識を提供するスキルです。Claude モデルをアプリケーションに統合する際、ストリーミングレスポンスの実装、プロンプトキャッシングによるコスト削減、ツール利用(関数呼び出し)の追加、ビジョン機能による画像処理、または拡張思考モードの利用時に活用できます。 チャットボット、AI アシスタント、コンテンツ生成ツール、または Claude の言語理解能力を必要とするあらゆるアプリケーション構築に使用します。Node.js、Cloudflare Workers、Next.js などのサーバーサイド実装と直接的な API アクセスの両方に対応しています。 キーワード:claude api、anthropic api、messages api、@anthropic-ai/sdk、claude ストリーミング、プロンプトキャッシング、ツール利用、ビジョン、拡張思考、claude 3.5 sonnet、claude 3.7 sonnet、claude sonnet 4、関数呼び出し、SSE、レート制限、429 エラー

description の原文を見る

This skill provides comprehensive knowledge for working with the Anthropic Messages API (Claude API). It should be used when integrating Claude models into applications, implementing streaming responses, enabling prompt caching for cost savings, adding tool use (function calling), processing images with vision capabilities, or using extended thinking mode. Use when building chatbots, AI assistants, content generation tools, or any application requiring Claude's language understanding. Covers both server-side implementations (Node.js, Cloudflare Workers, Next.js) and direct API access. Keywords: claude api, anthropic api, messages api, @anthropic-ai/sdk, claude streaming, prompt caching, tool use, vision, extended thinking, claude 3.5 sonnet, claude 3.7 sonnet, claude sonnet 4, function calling, SSE, rate limits, 429 errors

SKILL.md 本文

Claude API (Anthropic Messages API)

Status: Production Ready Last Updated: 2025-10-25 Dependencies: なし (スタンドアロン API スキル) Latest Versions: @anthropic-ai/sdk@0.67.0


クイックスタート(5分)

1. API キーを取得

# https://console.anthropic.com/ でサインアップ
# API キーセクションに移動
# 新しいキーを作成して安全に保存
export ANTHROPIC_API_KEY="sk-ant-..."

重要な理由:

  • すべてのリクエストに API キーが必要
  • セキュリティを保つ(git にコミットしない)
  • 環境変数を使用

2. SDK をインストール(Node.js)

npm install @anthropic-ai/sdk
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: 'Hello, Claude!' }],
});

console.log(message.content[0].text);

重大注意:

  • 常にサーバーサイドで使用(クライアントコードに API キーを公開しない)
  • max_tokens を設定(必須パラメータ)
  • モデル名はバージョン管理されている(最新の安定版を使用)

3. または直接 API を使用(Cloudflare Workers)

// SDK 不要 - fetch() を使用
const response = await fetch('https://api.anthropic.com/v1/messages', {
  method: 'POST',
  headers: {
    'x-api-key': env.ANTHROPIC_API_KEY,
    'anthropic-version': '2023-06-01',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    model: 'claude-sonnet-4-5-20250929',
    max_tokens: 1024,
    messages: [{ role: 'user', content: 'Hello!' }],
  }),
});

const data = await response.json();

完全な Claude API リファレンス

目次

  1. Core API
  2. ストリーミング応答
  3. プロンプトキャッシング
  4. ツール使用(関数呼び出し)
  5. ビジョン(画像理解)
  6. 拡張思考モード
  7. レート制限
  8. エラーハンドリング
  9. プラットフォーム統合
  10. 既知の問題

Core API (Messages API)

利用可能なモデル(2025年10月)

モデルIDコンテキスト最適な用途コスト(百万トークンあたり)
Claude Sonnet 4.5claude-sonnet-4-5-20250929200k トークンバランス型パフォーマンス$3/$15 (入力/出力)
Claude 3.7 Sonnetclaude-3-7-sonnet-202502282M トークン拡張思考$3/$15
Claude Opus 4claude-opus-4-20250514200k トークン最高機能$15/$75
Claude 3.5 Haikuclaude-3-5-haiku-20241022200k トークン高速、コスト効率$1/$5

基本的なメッセージ作成

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: 'Explain quantum computing in simple terms' }
  ],
});

console.log(message.content[0].text);

マルチターン会話

const messages = [
  { role: 'user', content: 'What is the capital of France?' },
  { role: 'assistant', content: 'The capital of France is Paris.' },
  { role: 'user', content: 'What is its population?' },
];

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages,
});

システムプロンプト

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  system: 'You are a helpful Python coding assistant. Always provide type hints and docstrings.',
  messages: [
    { role: 'user', content: 'Write a function to sort a list' }
  ],
});

重大注意:

  • システムプロンプトはメッセージ配列の前に必ず来る
  • システムプロンプトは会話全体の動作を設定
  • 1~10k トークンを使用可能(コンテキストウィンドウに影響)

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

SDK ストリームヘルパーを使用

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

// メソッド 1: イベントリスナー
stream
  .on('text', (text) => {
    process.stdout.write(text);
  })
  .on('message', (message) => {
    console.log('\n\nFinal message:', message);
  })
  .on('error', (error) => {
    console.error('Stream error:', error);
  });

// 完了を待つ
await stream.finalMessage();

手動反復でのストリーミング

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

for await (const event of stream) {
  if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
    process.stdout.write(event.delta.text);
  }
}

ストリーミングイベントタイプ

イベント発生時ユースケース
message_startメッセージ開始時UI の初期化
content_block_start新しいコンテンツブロックブロックを追跡
content_block_deltaテキストチャンク受信テキストを表示
content_block_stopブロック完了ブロックをフォーマット
message_deltaメタデータ更新停止理由を更新
message_stopメッセージ完了UI を最終化

Cloudflare Workers ストリーミング

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const response = await fetch('https://api.anthropic.com/v1/messages', {
      method: 'POST',
      headers: {
        'x-api-key': env.ANTHROPIC_API_KEY,
        'anthropic-version': '2023-06-01',
        'content-type': 'application/json',
      },
      body: JSON.stringify({
        model: 'claude-sonnet-4-5-20250929',
        max_tokens: 1024,
        messages: [{ role: 'user', content: 'Hello!' }],
        stream: true,
      }),
    });

    // SSE ストリームを直接返す
    return new Response(response.body, {
      headers: {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
      },
    });
  },
};

重大注意:

  • エラーは初期 200 応答の後に発生する可能性あり
  • 常にエラーイベントハンドラーを実装
  • stream.abort() でキャンセル可能
  • 適切な Content-Type ヘッダーを設定

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

概要

プロンプトキャッシングでは、頻繁に使用されるコンテキスト(システムプロンプト、ドキュメント、コードベース)をキャッシュして以下を実現:

  • コストを 90% 削減 (キャッシュ読み込み = 入力トークン価格の 10%)
  • レイテンシを 85% 削減 (最初のトークンまでの時間)
  • キャッシュ有効期間: 5分(デフォルト)または 1時間(設定可能)

最小要件

  • Claude 3.5 Sonnet: 1,024 トークン最小
  • Claude 3.5 Haiku: 2,048 トークン最小

基本的なプロンプトキャッシング

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  system: [
    {
      type: 'text',
      text: 'You are an AI assistant analyzing the following codebase...',
    },
    {
      type: 'text',
      text: LARGE_CODEBASE_CONTENT, // 50k トークン
      cache_control: { type: 'ephemeral' },
    },
  ],
  messages: [
    { role: 'user', content: 'Explain the auth module' }
  ],
});

// キャッシュ使用量をチェック
console.log('Cache read tokens:', message.usage.cache_read_input_tokens);
console.log('Cache creation tokens:', message.usage.cache_creation_input_tokens);

メッセージ内のキャッシング

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [
    {
      role: 'user',
      content: [
        {
          type: 'text',
          text: 'Analyze this documentation:',
        },
        {
          type: 'text',
          text: LONG_DOCUMENTATION, // 20k トークン
          cache_control: { type: 'ephemeral' },
        },
        {
          type: 'text',
          text: 'What are the main API endpoints?',
        },
      ],
    },
  ],
});

マルチターンキャッシング(チャットボットパターン)

// 最初のリクエスト - キャッシュを作成
const message1 = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  system: [
    {
      type: 'text',
      text: SYSTEM_INSTRUCTIONS,
      cache_control: { type: 'ephemeral' },
    },
  ],
  messages: [
    { role: 'user', content: 'Hello!' }
  ],
});

// 2番目のリクエスト - キャッシュヒット(5分以内)
const message2 = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  system: [
    {
      type: 'text',
      text: SYSTEM_INSTRUCTIONS, // 同じコンテンツ = キャッシュヒット
      cache_control: { type: 'ephemeral' },
    },
  ],
  messages: [
    { role: 'user', content: 'Hello!' },
    { role: 'assistant', content: message1.content[0].text },
    { role: 'user', content: 'Tell me a joke' },
  ],
});

コスト比較

キャッシング なし:
- 100k 入力トークン = 100k × $3/MTok = $0.30

キャッシング あり(最初のリクエスト後):
- キャッシュ書き込み: 100k × $3.75/MTok = $0.375 (最初のリクエスト)
- キャッシュ読み込み: 100k × $0.30/MTok = $0.03 (以降のリクエスト)
- 削減: リクエストあたり 90%削減(最初の後)

重大注意:

  • cache_control はキャッシュ可能なコンテンツの最後のブロックに必須
  • キャッシュは同一コンテンツのリクエスト間で共有
  • cache_creation_input_tokens vs cache_read_input_tokens を監視
  • 5分の TTL は各使用時に更新

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

基本的なツール定義

const tools = [
  {
    name: 'get_weather',
    description: 'Get the current weather in a given location',
    input_schema: {
      type: 'object',
      properties: {
        location: {
          type: 'string',
          description: 'City name, e.g. San Francisco, CA',
        },
        unit: {
          type: 'string',
          enum: ['celsius', 'fahrenheit'],
          description: 'Temperature unit',
        },
      },
      required: ['location'],
    },
  },
];

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  tools,
  messages: [{ role: 'user', content: 'What is the weather in NYC?' }],
});

if (message.stop_reason === 'tool_use') {
  const toolUse = message.content.find(block => block.type === 'tool_use');
  console.log('Claude wants to use:', toolUse.name);
  console.log('With parameters:', toolUse.input);
}

ツール実行ループ

async function chatWithTools(userMessage: string) {
  const messages = [{ role: 'user', content: userMessage }];

  while (true) {
    const response = await anthropic.messages.create({
      model: 'claude-sonnet-4-5-20250929',
      max_tokens: 1024,
      tools,
      messages,
    });

    // アシスタント応答を追加
    messages.push({
      role: 'assistant',
      content: response.content,
    });

    // ツール実行が必要かチェック
    if (response.stop_reason === 'tool_use') {
      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,
            content: JSON.stringify(result),
          });
        }
      }

      // ツール結果を追加
      messages.push({
        role: 'user',
        content: toolResults,
      });
    } else {
      // 最終応答
      return response.content.find(block => block.type === 'text')?.text;
    }
  }
}

ベータツールランナー(SDK ヘルパー)

import { betaZodTool } from '@anthropic-ai/sdk/helpers/zod';
import { z } from 'zod';

const weatherTool = betaZodTool({
  name: 'get_weather',
  inputSchema: z.object({
    location: z.string(),
    unit: z.enum(['celsius', 'fahrenheit']).optional(),
  }),
  description: 'Get the current weather in a given location',
  run: async (input) => {
    // 実際の API 呼び出しを実行
    const weather = await fetchWeatherAPI(input.location, input.unit);
    return `The weather in ${input.location} is ${weather.temp}°${input.unit || 'F'}`;
  },
});

const finalMessage = await anthropic.beta.messages.toolRunner({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1000,
  messages: [{ role: 'user', content: 'What is the weather in San Francisco?' }],
  tools: [weatherTool],
});

console.log(finalMessage.content[0].text);

重大注意:

  • ツールスキーマは有効な JSON Schema である必須
  • tool_use_idtool_result で一致する必須
  • ツール実行エラーを適切に処理
  • ループ防止のための合理的な max_iterations を設定

ビジョン(画像理解)

サポートされている画像形式

  • 形式: JPEG、PNG、WebP、GIF(非アニメーション)
  • 最大サイズ: 画像あたり 5MB
  • 入力方法: Base64 エンコード、URL(アクセス可能な場合)

単一画像

import fs from 'fs';

const imageData = fs.readFileSync('./photo.jpg', 'base64');

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [
    {
      role: 'user',
      content: [
        {
          type: 'image',
          source: {
            type: 'base64',
            media_type: 'image/jpeg',
            data: imageData,
          },
        },
        {
          type: 'text',
          text: 'What is in this image?',
        },
      ],
    },
  ],
});

複数画像

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  messages: [
    {
      role: 'user',
      content: [
        {
          type: 'text',
          text: 'Compare these two images:',
        },
        {
          type: 'image',
          source: {
            type: 'base64',
            media_type: 'image/jpeg',
            data: image1Data,
          },
        },
        {
          type: 'image',
          source: {
            type: 'base64',
            media_type: 'image/png',
            data: image2Data,
          },
        },
        {
          type: 'text',
          text: 'What are the differences?',
        },
      ],
    },
  ],
});

ビジョンとツール

const message = await anthropic.messages.create({
  model: 'claude-sonnet-4-5-20250929',
  max_tokens: 1024,
  tools: [searchTool, saveTool],
  messages: [
    {
      role: 'user',
      content: [
        {
          type: 'image',
          source: {
            type: 'base64',
            media_type: 'image/jpeg',
            data: productImage,
          },
        },
        {
          type: 'text',
          text: 'Search for similar products and save the top 3 results',
        },
      ],
    },
  ],
});

重大注意:

  • 画像はコンテキストウィンドウにカウント
  • Base64 エンコーディングはサイズを増加(約 33% 増)
  • エンコーディング前に画像形式を検証
  • 繰り返し画像分析にはキャッシングを検討

拡張思考モード

⚠️ モデル利用可能性

拡張思考は以下でのみ利用可能:

  • Claude 3.7 Sonnet (claude-3-7-sonnet-20250228)
  • Claude 4 モデル(Opus 4、Sonnet 4)

Claude 3.5 Sonnet では利用不可

動作方法

拡張思考では Claude が応答前に「考える」ことで、推論プロセスを表示できます。以下に有用:

  • 複雑な STEM 問題(物理、数学)
  • ソフトウェアデバッグと設計
  • 法的分析と金融モデリング
  • 多段階推論タスク

基本的な使用

// Claude 3.7 Sonnet または Claude 4 でのみ動作
const message = await anthropic.messages.create({
  model: 'claude-3-7-sonnet-20250228', // claude-sonnet-4-5 ではない
  max_tokens: 4096, // 思考用に上限を高く
  messages: [
    {
      role: 'user',
      content: 'Solve this physics problem: A ball is thrown upward with velocity 20 m/s. How high does it go?'
    }
  ],
});

// 応答に思考ブロックが含まれる
for (const block of message.content) {
  if (block.type === 'thinking') {
    console.log('Claude is thinking:', block.text);
  } else if (block.type === 'text') {
    console.log('Final answer:', block.text);
  }
}

思考 vs 通常応答

通常応答:
"The ball reaches a height of approximately 20.4 meters."

拡張思考を使用:
[思考ブロック]: "I need to use kinematic equations. The relevant formula is v² = u² + 2as, where v=0 at max height, u=20 m/s, a=-9.8 m/s². Solving: 0 = 400 - 19.6s, so s = 400/19.6 = 20.4m"
[テキストブロック]: "The ball reaches a height of approximately 20.4 meters."

重大注意:

  • 拡張思考を期待する前にモデル名を確認
  • より高い max_tokens が必要(思考はトークンを消費)
  • 思考ブロックはキャッシュ不可
  • 推論深度が必要な場合のみ使用(コストが増加)

レート制限

レート制限を理解する

Claude API はトークンバケットアルゴリズムを使用:

  • 容量は継続的に補充(固定間隔ではなく)
  • 3つのタイプ: 分あたりのリクエスト(RPM)、分あたりのトークン(TPM)、1日のトークン

レート制限ティア

ティア基準例制限
Tier 1新規アカウント50 RPM、40k TPM
Tier 2$10 使用1000 RPM、100k TPM
Tier 3$50 使用2000 RPM、200k TPM
Tier 4$500 使用4000 RPM、400k TPM

制限はモデルごとに異なります。正確な制限は Console でご確認ください。

429 エラーの処理

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) {
        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');
}

// 使用方法
const message = await makeRequestWithRetry(() =>
  anthropic.messages.create({
    model: 'claude-sonnet-4-5-20250929',
    max_tokens: 1024,
    messages: [{ role: 'user', content: 'Hello' }],
  })
);

レート制限ヘッダーをチェック

const response = await fetch('https://api.anthropic.com/v1/messages', {
  // ... リクエスト設定
});

console.log('Limit:', response.headers.get('anthropic-ratelimit-requests-limit'));
console.log('Remaining:', response.headers.get('anthropic-ratelimit-requests-remaining'));
console.log('Reset:', response.headers.get('anthropic-ratelimit-requests-reset'));

重大注意:

  • retry-after ヘッダーを常に尊重
  • 指数バックオフを実装
  • Console で使用状況を監視
  • 高ボリュームはバッチ処理を検討

エラーハンドリング

一般的なエラーコード

ステータスエラータイプ原因ソリューション
400invalid_request_error不正なパラメータリクエストボディを検証
401authentication_error無効な API キーenv 変数をチェック
403permission_error機能へのアクセスなしアカウントティアをチェック
404not_found_error無効なエンドポイントAPI バージョンをチェック
429rate_limit_errorリクエストが多すぎるリトライロジックを実装
500api_error内部エラーバックオフで再試行
529overloaded_errorシステム過負荷後で再試行

包括的なエラーハンドラー

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

async function safeAPICall(request: Anthropic.MessageCreateParams) {
  try {
    return await anthropic.messages.create(request);
  } catch (error) {
    if (error instanceof Anthropic.APIError) {
      console.error('API Error:', error.status, error.message);

      switch (error.status) {
        case 400:
          console.error('Invalid request:', error.error);
          throw new Error('Request validation failed');

        case 401:
          console.error('Authentication failed. Check API key.');
          throw new Error('Invalid credentials');

        case 429:
          console.warn('Rate limited. Implement retry logic.');
          // リトライを実装(レート制限セクション参照)
          break;

        case 500:
        case 529:
          console.warn('Service unavailable. Retrying...');
          // 指数バックオフでリトライを実装
          break;

        default:
          console.error('Unexpected error:', error);
          throw error;
      }
    } else {
      console.error('Non-API error:', error);
      throw error;
    }
  }
}

ストリーミングエラーハンドリング

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);
    // エラーは初期 200 応答の後に発生する可能性あり
    // フォールバックまたはリトライロジックを実装
  })
  .on('abort', (error) => {
    console.warn('Stream aborted:', error);
  })
  .on('end', () => {
    console.log('Stream ended successfully');
  });

重大注意:

  • SSE ストリーム内のエラーは 200 応答後に発生
  • 常にエラーイベントリスナーを実装
  • コンテキスト付きエラーをログに記録してデバッグ
  • 重要な操作にはフォールバック戦略を用意

プラットフォーム統合

Cloudflare Workers

export interface Env {
  ANTHROPIC_API_KEY: string;
}

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const { messages } = await request.json();

    const response = await fetch('https://api.anthropic.com/v1/messages', {
      method: 'POST',
      headers: {
        'x-api-key': env.ANTHROPIC_API_KEY,
        'anthropic-version': '2023-06-01',
        'content-type': 'application/json',
      },
      body: JSON.stringify({
        model: 'claude-sonnet-4-5-20250929',
        max_tokens: 1024,
        messages,
      }),
    });

    return new Response(await response.text(), {
      headers: { 'Content-Type': 'application/json' },
    });
  },
};

Next.js API ルート (App Router)

// app/api/chat/route.ts
import Anthropic from '@anthropic-ai/sdk';
import { NextRequest } from 'next/server';

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

export async function POST(request: NextRequest) {
  try {
    const { messages } = await request.json();

    const stream = anthropic.messages.stream({
      model: 'claude-sonnet-4-5-20250929',
      max_tokens: 1024,
      messages,
    });

    // クライアントにストリームを返す
    return new Response(
      new ReadableStream({
        async start(controller) {
          for await (const event of stream) {
            if (event.type === 'content_block_delta' && event.delta.type === 'text_delta') {
              controller.enqueue(new TextEncoder().encode(event.delta.text));
            }
          }
          controller.close();
        },
      }),
      {
        headers: {
          'Content-Type': 'text/event-stream',
          'Cache-Control': 'no-cache',
        },
      }
    );
  } catch (error) {
    console.error('Chat error:', error);
    return new Response(JSON.stringify({ error: 'Internal error' }), {
      status: 500,
    });
  }
}

Next.js API ルート (Pages Router)

// pages/api/chat.ts
import type { NextApiRequest, NextApiResponse } from 'next';
import Anthropic from '@anthropic-ai/sdk';

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

export default async function handler(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method !== 'POST') {
    return res.status(405).json({ error: 'Method not allowed' });
  }

  try {
    const { messages } = req.body;

    const message = await anthropic.messages.create({
      model: 'claude-sonnet-4-5-20250929',
      max_tokens: 1024,
      messages,
    });

    res.status(200).json(message);
  } catch (error) {
    console.error('API error:', error);
    res.status(500).json({ error: 'Internal server error' });
  }
}

重要なルール

常に実施すること

✅ API キーを環境変数に保存(ハードコーディングしない) ✅ max_tokens パラメータを設定(必須) ✅ 最新の安定版モデル ID を使用(ドキュメント定期確認) ✅ すべての API 呼び出しにエラーハンドリングを実装 ✅ レート制限を指数バックオフで尊重 ✅ cache_control をキャッシュ可能なコンテンツの末尾に配置 ✅ ツール入力スキーマを厳密に検証 ✅ ストリーミングエラーを処理(200 後に発生する可能性) ✅ トークン使用状況を監視(入力 + 出力 + キャッシュ) ✅ サーバーサイドのみ使用(クライアントに キーを公開しない)

絶対にしないこと

❌ クライアント側コードに API キーを公開(セキュリティリスク) ❌ 429 エラー時に retry-after ヘッダーを無視 ❌ Claude 3.5 Sonnet で拡張思考を使用(非対応) ❌ 最小トークン閾値下でコンテンツをキャッシュ(1024/2048) ❌ システムプロンプトをメッセージ配列の後に配置(前が必須) ❌ 初期 200 応答後のストリーム成功を想定 ❌ 検証されていないユーザー入力を API に直接送信 ❌ ツール実行エラーの処理を忘れる ❌ メッセージ削減なくコンテキストウィンドウを超過 ❌ 古いモデル ID を使用(例: claude-2.1)


既知の問題防止

このスキルは12個の文書化された問題を防止:

問題 #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://docs.claude.com/en/docs/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 エンコーディング

問題 #6: 請求のトークン数計算のずれ

エラー: 予期しない高コスト、コンテキストウィンドウ超過 出典: トークン数計算の違い 発生理由: 特殊トークン、フォーマットを考慮していない 防止: 公式トークンカウンターを使用、使用状況ヘッダーを監視

問題 #7: システムプロンプト順序の問題

エラー: システムプロンプトが無視または上書きされる 出典: API 動作 発生理由: システムプロンプトがメッセージ配列の後に配置 防止: システムプロンプトを常にメッセージ前に配置

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

エラー: invalid_request_error: messages: too many tokens 出典: モデル制限 発生理由: 削減なし長会話 防止: メッセージ履歴削減を実装、キャッシングを使用

問題 #9: 間違ったモデルで拡張思考

エラー: 応答に思考ブロックなし 出典: モデル機能 発生理由: Claude 3.7 Sonnet または Claude 4 ではなく Claude 3.5 Sonnet を使用 防止: 拡張思考は Claude 3.7 Sonnet または Claude 4 でのみ使用

問題 #10: クライアントコードの API キー公開

エラー: CORS エラー、セキュリティ脆弱性 出典: セキュリティベストプラクティス 発生理由: ブラウザから API 呼び出し 防止: サーバーサイドのみ、環境変数を使用

問題 #11: レート制限ティア混同

エラー: 予想より低い制限 出典: アカウントティアシステム 発生理由: ティア進行を理解していない 防止: Console で現在のティアをチェック、使用状況で自動スケール

問題 #12: メッセージバッチベータヘッダー欠落

エラー: invalid_request_error: unknown parameter: batches 出典: ベータ API 要件 発生理由: anthropic-beta ヘッダー欠落 防止: anthropic-beta: message-batches-2024-09-24 ヘッダーを含める


依存関係

必須(SDK 使用時):

  • @anthropic-ai/sdk@0.67.0+ - 公式 TypeScript SDK

オプション(拡張機能用):

  • zod@3.23.0+ - betaZodTool による型安全ツールスキーマ
  • @types/node@20.0.0+ - Node.js の TypeScript タイプ

プラットフォーム固有:

  • Cloudflare Workers: なし(fetch API を使用)
  • Next.js: next@14.0.0+ または 15.x.x
  • Node.js: v18.0.0+ (ネイティブ fetch 用)

公式ドキュメント


パッケージバージョン(2025-10-25検証済)

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

本番例

このスキルは Anthropic の公式ドキュメント と SDK パターンに基づいています:

  • ライブ例: Anthropic Cookbook (https://github.com/anthropics/anthropic-cookbook)
  • 検証: ✅ SDK 0.67.0 ですべてのパターン検証済
  • コスト最適化: プロンプトキャッシング 90% 削減検証済
  • プラットフォームサポート: Cloudflare Workers、Next.js、Node.js 検証済

トラブルシューティング

問題: 429 レート制限エラーが継続

ソリューション: Console で現在のティアを確認、適切なバックオフを実装、バッチ処理を検討

問題: プロンプトキャッシングが動作しない

ソリューション: コンテンツが >= 1024 トークン確認、cache_control を末尾に配置、使用状況ヘッダーをチェック

問題: ツール使用ループが終わらない

ソリューション: max_iterations を設定、タイムアウトを追加、ツール応答を検証

問題: ストリーミングが途中で停止

ソリューション: max_tokens を増加、ネットワーク安定性を確認、再接続ロジックを実装

問題: 拡張思考が表示されない

ソリューション: Claude 3.7 Sonnet または Claude 4 を使用確認(Claude 3.5 Sonnet ではない)

問題: 画像の高いトークン使用

ソリューション: エンコーディング前に画像を圧縮、繰り返し画像分析にキャッシングを使用


完全なセットアップチェックリスト

  • API キーを Console から取得(https://console.anthropic.com/)
  • API キーを環境変数に保存
  • SDK をインストール(@anthropic-ai/sdk@0.67.0+) または fetch API を用意
  • エラーハンドリングを実装(try/catch、エラーイベント)
  • 指数バックオフ付きレート制限処理
  • ストリーミングエラーを処理(エラーイベントリスナー)
  • トークン使用状況監視(入力 + 出力 + キャッシュ)
  • サーバーサイドのみ(クライアント API 呼び出しなし)
  • 最新のモデル ID を使用(claude-sonnet-4-5-20250929)
  • プロンプトキャッシングを設定(長コンテキスト使用時)
  • ツールスキーマを検証(関数呼び出し使用時)
  • 拡張思考を正しいモデルで検証(3.7/4)

質問? 問題?

  1. references/top-errors.md で一般的な問題をチェック
  2. セットアップ手順のすべてのステップを確認
  3. 公式ドキュメント確認: https://docs.claude.com/en/api
  4. Console で API キーに正しい権限があることを確認

トークン効率: 手動 API 統合比で推定 62% 削減 エラー防止: 100%(すべての 12個の文書化されたエラーを防止) 開発時間: テンプレート使用で 5分 vs 手動 2+ 時間

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
jackspace
リポジトリ
jackspace/ClaudeSkillz
ライセンス
MIT
最終更新
2025/11/20

Source: https://github.com/jackspace/ClaudeSkillz / ライセンス: MIT

関連スキル

OpenAILLM・AI開発⭐ リポ 6,054

agent-browser

AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。

by JimmyLv
汎用LLM・AI開発⭐ リポ 1,982

anyskill

AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。

by LeoYeAI
汎用LLM・AI開発⭐ リポ 1,982

engram

AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。

by LeoYeAI
汎用LLM・AI開発⭐ リポ 21,584

skyvern

AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。

by Skyvern-AI
汎用LLM・AI開発⭐ リポ 1,149

pinchbench

PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。

by pinchbench
汎用LLM・AI開発⭐ リポ 4,693

openui

OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。

by thesysdev
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: jackspace · jackspace/ClaudeSkillz · ライセンス: MIT