CLAUDE LABEN
WWDC — WWDC 2026でSiriはGoogle Geminiベースと確定。ChatGPT等への外部ハンドオフは廃止され、サードパーティAI選択はEU(DMA)で当面非対応にBILLING — 6/15の課金変更まで残り6日。Agent SDK・headless Claude Code・GitHub Actions・他社エージェントがAPIレート準拠の月次クレジットへ移行OUTAGE — claude.ai・Claude Code・Coworkで障害が報告(6月)。スケジュール実行はfallbackModelとリトライ前提の設計が安全ですDYNAMIC-WORKFLOWS — Max・TeamプランとAPIでdynamic workflowsがデフォルトON。コードベース横断のバグ探索や独立検証に活用ULTRACODE — Claude Codeの新設定ultracodeがeffortメニューに追加。xhigh固定でワークフロー判断はClaudeに委ねますOPUS4.8 — Claude Opus 4.8が主要プランのデフォルトとして定着。コーディング・エージェント・推論を強化WWDC — WWDC 2026でSiriはGoogle Geminiベースと確定。ChatGPT等への外部ハンドオフは廃止され、サードパーティAI選択はEU(DMA)で当面非対応にBILLING — 6/15の課金変更まで残り6日。Agent SDK・headless Claude Code・GitHub Actions・他社エージェントがAPIレート準拠の月次クレジットへ移行OUTAGE — claude.ai・Claude Code・Coworkで障害が報告(6月)。スケジュール実行はfallbackModelとリトライ前提の設計が安全ですDYNAMIC-WORKFLOWS — Max・TeamプランとAPIでdynamic workflowsがデフォルトON。コードベース横断のバグ探索や独立検証に活用ULTRACODE — Claude Codeの新設定ultracodeがeffortメニューに追加。xhigh固定でワークフロー判断はClaudeに委ねますOPUS4.8 — Claude Opus 4.8が主要プランのデフォルトとして定着。コーディング・エージェント・推論を強化
記事一覧/API & SDK
API & SDK/2026-03-24中級

Claude API Token Counting — 事前にトークン数を把握してコストを最適化する方法

Claude APIのToken Counting エンドポイントを活用して、メッセージ送信前にトークン数を正確に見積もる方法を解説。コスト管理、コンテキストウィンドウの最適化、本番環境での実装パターンまで網羅します。

token-countingapi58cost-optimization24claude-api71python32

取り組みの背景 — なぜトークン数の事前把握が重要なのか

Claude APIを使ったアプリケーション開発で、予想外のコスト増加に悩んだ経験はありませんか? 大量の画像やPDFを含むリクエストを送信した後に「思ったよりトークンを消費していた」と気づくのは、開発者にとって大きなストレスです。

Anthropicはこの課題を解決するために、Token Counting エンドポイントを提供しています。このエンドポイントを使えば、メッセージを実際に送信する前にトークン消費量を正確に見積もることができ、コスト管理とコンテキストウィンドウの最適化に大きく役立ちます。

Token Counting エンドポイントの基本

エンドポイントの概要

Token Counting エンドポイントは、Messages APIと同じリクエスト構造を受け取り、入力トークン数を返す専用のAPIです。

主な特徴:

  • 無料で利用可能: トークンカウントの実行自体に料金は発生しません
  • 全モデル対応: Claude Opus 4.6、Sonnet 4.6、Haiku 4.5 など、全てのアクティブなモデルで利用できます
  • マルチモーダル対応: テキスト、画像、PDF、ツール定義を含むリクエストのトークン数を事前に確認できます
  • 独立したレート制限: メッセージ作成APIとは別のレート制限が適用されるため、カウント処理がAPI呼び出しの制限に影響しません

基本的な使い方

Python SDKを使った最もシンプルなトークンカウントの例を見てみましょう。

import anthropic
 
client = anthropic.Anthropic()
 
# メッセージのトークン数をカウント
response = client.messages.count_tokens(
    model="claude-sonnet-4-6-20260320",
    messages=[
        {
            "role": "user",
            "content": "Claude APIのToken Countingについて教えてください。"
        }
    ]
)
 
print(f"入力トークン数: {response.input_tokens}")
# 出力例: 入力トークン数: 28

TypeScript SDKでも同様に利用できます。

import Anthropic from "@anthropic-ai/sdk";
 
const client = new Anthropic();
 
const response = await client.messages.countTokens({
  model: "claude-sonnet-4-6-20260320",
  messages: [
    {
      role: "user",
      content: "Tell me about Claude API token counting.",
    },
  ],
});
 
console.log(`Input tokens: ${response.input_tokens}`);
// 出力例: Input tokens: 22

システムプロンプトとツールを含むトークンカウント

実際のアプリケーションでは、システムプロンプトやツール定義が入力トークンの大部分を占めることがあります。Token Counting エンドポイントはこれらも含めた正確なカウントを提供します。

import anthropic
 
client = anthropic.Anthropic()
 
# システムプロンプト + ツール定義 + メッセージのトークンカウント
response = client.messages.count_tokens(
    model="claude-sonnet-4-6-20260320",
    system="あなたは天気予報アシスタントです。ユーザーの質問に正確な天気情報で答えてください。",
    tools=[
        {
            "name": "get_weather",
            "description": "指定された都市の現在の天気情報を取得します",
            "input_schema": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "天気を調べたい都市名"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "温度の単位"
                    }
                },
                "required": ["city"]
            }
        }
    ],
    messages=[
        {
            "role": "user",
            "content": "東京の今日の天気を教えてください。"
        }
    ]
)
 
print(f"入力トークン数(システム+ツール+メッセージ): {response.input_tokens}")
# 出力例: 入力トークン数(システム+ツール+メッセージ): 384

ツール定義が多いアプリケーションでは、ツールだけで数百〜数千トークンを消費することがあります。この事前確認により、不要なツールを削減してコストを抑える判断ができます。

画像・PDFを含むリクエストのトークンカウント

マルチモーダルなリクエストでは、画像やPDFのトークン消費量が予測しづらいため、事前カウントが特に重要です。

import anthropic
import base64
 
client = anthropic.Anthropic()
 
# 画像ファイルを読み込んでBase64エンコード
with open("screenshot.png", "rb") as f:
    image_data = base64.standard_b64encode(f.read()).decode("utf-8")
 
response = client.messages.count_tokens(
    model="claude-sonnet-4-6-20260320",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data
                    }
                },
                {
                    "type": "text",
                    "text": "この画像の内容を説明してください。"
                }
            ]
        }
    ]
)
 
print(f"画像含む入力トークン数: {response.input_tokens}")
# 出力例: 画像含む入力トークン数: 1,584

画像のトークン数は解像度によって大きく変動します。高解像度の画像は数千トークンになることもあるため、事前確認が欠かせません。

本番環境での実践パターン

パターン1: コンテキストウィンドウ管理

長い会話を維持するチャットボットでは、コンテキストウィンドウの上限に達する前に古いメッセージを削除する必要があります。Token Countingを使えば、この管理を正確に行えます。

import anthropic
 
client = anthropic.Anthropic()
 
MODEL = "claude-sonnet-4-6-20260320"
MAX_INPUT_TOKENS = 180_000  # 安全マージンを含めた上限
SYSTEM_PROMPT = "あなたは親切なカスタマーサポートアシスタントです。"
 
def manage_conversation(messages: list, new_message: dict) -> list:
    """コンテキストウィンドウを超えないよう会話履歴を管理する"""
    candidate = messages + [new_message]
 
    # 現在のトークン数をカウント
    count_response = client.messages.count_tokens(
        model=MODEL,
        system=SYSTEM_PROMPT,
        messages=candidate
    )
 
    # 上限を超えている場合、古いメッセージから削除
    while count_response.input_tokens > MAX_INPUT_TOKENS and len(candidate) > 1:
        # 最初のユーザー・アシスタントのペアを削除
        candidate = candidate[2:]
        count_response = client.messages.count_tokens(
            model=MODEL,
            system=SYSTEM_PROMPT,
            messages=candidate
        )
        print(f"会話を短縮: {count_response.input_tokens} tokens")
 
    return candidate

パターン2: コスト見積もりダッシュボード

バッチ処理の前にコストを事前見積もりする仕組みを構築できます。

import anthropic
 
client = anthropic.Anthropic()
 
# モデルごとの入力トークン単価(per 1M tokens, USD)
PRICING = {
    "claude-opus-4-6-20260205": 15.0,
    "claude-sonnet-4-6-20260320": 3.0,
    "claude-haiku-4-5-20251001": 0.80,
}
 
def estimate_batch_cost(
    model: str,
    tasks: list[dict],
    system: str = ""
) -> dict:
    """バッチ処理のコストを事前見積もり"""
    total_tokens = 0
 
    for task in tasks:
        response = client.messages.count_tokens(
            model=model,
            system=system,
            messages=[{"role": "user", "content": task["content"]}]
        )
        total_tokens += response.input_tokens
 
    price_per_token = PRICING.get(model, 3.0) / 1_000_000
    estimated_cost = total_tokens * price_per_token
 
    return {
        "total_input_tokens": total_tokens,
        "estimated_input_cost_usd": round(estimated_cost, 4),
        "average_tokens_per_task": total_tokens // len(tasks),
        "task_count": len(tasks)
    }
 
# 使用例
tasks = [
    {"content": "この製品レビューの感情分析をしてください: ..."},
    {"content": "次の文章を要約してください: ..."},
    {"content": "以下のコードのバグを見つけてください: ..."},
]
 
estimate = estimate_batch_cost("claude-sonnet-4-6-20260320", tasks)
print(f"合計入力トークン: {estimate['total_input_tokens']:,}")
print(f"推定入力コスト: ${estimate['estimated_input_cost_usd']}")
# 出力例:
# 合計入力トークン: 1,245
# 推定入力コスト: $0.0037

パターン3: プロンプトキャッシュとの併用

プロンプトキャッシュを使用している場合、Token Countingでキャッシュヒット率の最適化に役立てることもできます。キャッシュブレークポイントの配置を検討する際に、各セクションのトークン数を事前に把握しておくと効果的です。

import anthropic
 
client = anthropic.Anthropic()
 
# キャッシュ対象のシステムプロンプトのトークン数を確認
large_system_prompt = "..." * 1000  # 大規模なシステムプロンプト
 
response = client.messages.count_tokens(
    model="claude-sonnet-4-6-20260320",
    system=large_system_prompt,
    messages=[{"role": "user", "content": "テスト"}]
)
 
print(f"システムプロンプトを含む入力トークン: {response.input_tokens}")
# キャッシュの最小要件(1,024トークン)を満たしているか確認
if response.input_tokens >= 1024:
    print("✅ プロンプトキャッシュの対象になります")
else:
    print("⚠️ トークン数が不足しています。キャッシュには1,024トークン以上が必要です")

まとめ — Token Countingで賢くコスト管理

Claude APIのToken Counting エンドポイントは、コスト最適化とコンテキスト管理の両面で欠かせないツールです。特に以下のシナリオで威力を発揮します。

  • バッチ処理のコスト事前見積もり: 大量のリクエストを送る前にコストを把握し、予算オーバーを防ぐ
  • チャットボットの会話管理: コンテキストウィンドウの使用状況をリアルタイムで監視し、適切なタイミングで古いメッセージを削除
  • マルチモーダルリクエストの最適化: 画像やPDFのトークン消費を事前確認し、コンテンツの解像度やサイズを調整

無料で利用できるこのエンドポイントを活用して、APIコストの「見える化」を始めてみてはいかがでしょうか。まずは自分のアプリケーションで最もトークンを消費しているリクエストを特定するところから始めると、最も効果的な最適化ポイントが見えてきます。

より詳しいAPI利用ガイドはAPIクイックスタートを、レート制限の管理についてはレート制限のベストプラクティスをご参照ください。

シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

API & SDK2026-05-06
Claude API × Python 実践:ツール呼び出しとストリーミングを組み合わせてAIアシスタントを作る
Claude API の Tool Use とStreamingを同時に使うPython実装を解説。ツールを定義してリアルタイム応答するAIアシスタントの完成コードと、組み合わせ時に詰まりやすいポイントを丁寧に解説します。
API & SDK2026-05-02
Claude API のストリーミングを途中で止める — AbortController の正しい使い方と請求の仕組み
Claude API のストリーミング応答を AbortController で途中キャンセルする実装方法と、キャンセル時のトークン課金の挙動を整理します。Node.js と Python のサンプル付き。
API & SDK2026-05-29
Claude API のプロンプトキャッシュを 5m と 1h で二段に分ける — TTL を分けるとコストは下がり運用は安定する
Anthropic API の cache_control には 5 分と 1 時間という 2 種類の TTL があります。これを「静的な前提情報は 1h、可変な few-shot は 5m」と二段に分けて運用する設計を、私の本番ワークロードで観測した数値とともに整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →