Claude Platform Docs
Messagesモデルの機能

バッチ処理

Message Batches APIを使用して大量のMessagesリクエストを非同期で処理し、コストを50%削減してスループットを向上させます。

バッチ処理は、大量のリクエストを効率的に処理するための強力なアプローチです。リクエストを1つずつ即座に応答しながら処理する代わりに、バッチ処理では複数のリクエストをまとめて送信し、非同期で処理できます。このパターンは特に以下の場合に有用です。

  • 大量のデータを処理する必要がある場合
  • 即座の応答が不要な場合
  • コスト効率を最適化したい場合
  • 大規模な評価や分析を実行している場合

Message Batches APIは、このパターンのAnthropicによる最初の実装です。

Message Batches API

Message Batches APIは、大量のMessagesリクエストを非同期で処理するための強力でコスト効率の高い方法です。このアプローチは即座の応答を必要としないタスクに適しており、ほとんどのバッチは1時間未満で完了し、コストを50%削減してスループットを向上させます。

このガイドに加えて、APIリファレンスを直接確認することもできます。

Message Batches APIの仕組み

Message Batches APIにリクエストを送信すると、次のようになります。

  1. システムは、提供されたMessagesリクエストで新しいMessage Batchを作成します。
  2. バッチは非同期で処理され、各リクエストは独立して処理されます。
  3. バッチのステータスをポーリングし、すべてのリクエストの処理が終了したときに結果を取得できます。

これは、即座の結果を必要としない以下のような一括操作に特に有用です。

  • 大規模な評価: 数千のテストケースを効率的に処理します。
  • コンテンツモデレーション: 大量のユーザー生成コンテンツを非同期で分析します。
  • データ分析: 大規模なデータセットのインサイトや要約を生成します。
  • 一括コンテンツ生成: さまざまな目的(例えば、製品説明、記事の要約)のために大量のテキストを作成します。

バッチの制限

  • Message Batchは、100,000件のMessageリクエストまたは256 MBのサイズのいずれか先に達した方に制限されます。
  • システムは各バッチを可能な限り高速に処理し、ほとんどのバッチは1時間以内に完了します。すべてのメッセージが完了したとき、または24時間後のいずれか早い方でバッチ結果にアクセスできます。処理が24時間以内に完了しない場合、バッチは期限切れになります。
  • バッチ結果は作成後29日間利用可能です。その後もBatchを表示できますが、その結果はダウンロードできなくなります。
  • バッチはWorkspaceにスコープされます。リクエストが実行されるWorkspace内で作成されたすべてのバッチ(およびその結果)を表示できます。
  • レート制限は、Batches APIのHTTPリクエストと、処理待ちのバッチ内のリクエスト数の両方に適用されます。Message Batches APIのレート制限を参照してください。さらに、現在の需要とリクエスト量に基づいて処理が遅くなる場合があります。その場合、24時間後に期限切れになるリクエストが増える可能性があります。
  • 高いスループットと並行処理のため、バッチはWorkspaceで設定された支出制限をわずかに超える場合があります。
  • 各バッチリクエストには、少なくとも1のmax_tokensが必要です。max_tokens: 0(キャッシュの事前ウォーミング)はバッチ内ではサポートされていません。これは、バッチ処理中に書き込まれた一時的なキャッシュエントリが、後続のリクエストが実行される前に期限切れになる可能性が高いためです。

サポートされているモデル

すべてのアクティブなモデルがMessage Batches APIをサポートしています。

バッチ処理できるもの

Messages APIに対して行えるほぼすべてのリクエストをバッチに含めることができます。これには以下が含まれます。

  • ビジョン
  • すべてのサーバーツール(ウェブ検索、ウェブフェッチ、コード実行、MCPコネクタ、アドバイザー、ツール検索)を含むツール使用
  • システムメッセージ
  • マルチターン会話
  • 拡張思考
  • ほとんどのベータ機能

バッチ内の各リクエストは独立して処理されるため、単一のバッチ内で異なるタイプのリクエストを混在させることができます。

少数のMessages APIパラメータは、バッチリクエストでサポートされていません。これらのいずれかを含めると、検証エラーが返されます。

パラメータ理由
stream: trueバッチの結果はストリームではなく、単一のファイルとして返されます。
speed(Fast mode)Fast modeは同期処理のレイテンシを調整するものであり、非同期のバッチ処理には適用されません。
max_tokens: 0バッチの制限事項を参照してください。

料金

Batches APIは大幅なコスト削減を提供します。すべての使用量は標準API価格の50%で課金されます。

ModelBatch tokens
NameInputOutput
Claude Fable 5.1For demanding reasoning and long-horizon agentic work
$5 /
$25 / MTok
Claude Opus 5.5For long-running agentic coding and knowledge work
$2 / MTok
$10 / MTok
Claude Sonnet 5The best combination of speed and intelligence
$1 / MTok
$5 / MTok
Claude Haiku 4.5The fastest model with near-frontier intelligence
$0.50 / MTok
$2.50 / MTok
$5 / MTok
$25 / MTok
$5 / MTok
$25 / MTok
$5 / MTok
$25 / MTok
$2.50 / MTok
$12.50 / MTok
$2.50 / MTok
$12.50 / MTok
$2.50 / MTok
$12.50 / MTok
$2.50 / MTok
$12.50 / MTok
$2.50 / MTok
$12.50 / MTok
Claude Opus 4.1
$7.50 / MTok
$37.50 / MTok
Claude Opus 4
$7.50 / MTok
$37.50 / MTok
$1.50 / MTok
$7.50 / MTok
$1.50 / MTok
$7.50 / MTok
Claude Sonnet 4
$1.50 / MTok
$7.50 / MTok
Claude Haiku 3.5
$0.40 / MTok
$2 / MTok

Message Batches APIの使用方法

バッチの準備と作成

Message Batchは、Messageを作成するためのリクエストのリストで構成されます。個々のリクエストの形式は以下で構成されます。

  • Messagesリクエストを識別するための一意のcustom_id。1〜64文字で、英数字、ハイフン、アンダースコアのみを含む必要があります(^[a-zA-Z0-9_-]{1,64}$に一致)。
  • 標準のMessages APIパラメータを持つparamsオブジェクト

このリストをrequestsパラメータに渡すことで、バッチを作成できます。

from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request

client = anthropic.Anthropic()

message_batch = client.messages.batches.create(
    requests=[
        Request(
            custom_id="my-first-request",
            params=MessageCreateParamsNonStreaming(
                model="claude-opus-5-5",
                max_tokens=1024,
                messages=[
                    {
                        "role": "user",
                        "content": "Hello, world",
                    }
                ],
            ),
        ),
        Request(
            custom_id="my-second-request",
            params=MessageCreateParamsNonStreaming(
                model="claude-opus-5-5",
                max_tokens=1024,
                messages=[
                    {
                        "role": "user",
                        "content": "Hi again, friend",
                    }
                ],
            ),
        ),
    ]
)

print(message_batch)

この例では、2つの別々のリクエストが非同期処理のためにまとめてバッチ化されています。各リクエストには一意のcustom_idがあり、Messages API呼び出しで使用する標準パラメータが含まれています。

バッチが最初に作成されると、レスポンスの処理ステータスはin_progressになります。

Output
{
  "id": "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
  "type": "message_batch",
  "processing_status": "in_progress",
  "request_counts": {
    "processing": 2,
    "succeeded": 0,
    "errored": 0,
    "canceled": 0,
    "expired": 0
  },
  "ended_at": null,
  "created_at": "2024-09-24T18:37:24.100435Z",
  "expires_at": "2024-09-25T18:37:24.100435Z",
  "cancel_initiated_at": null,
  "results_url": null
}

バッチの追跡

Message Batchのprocessing_statusフィールドは、バッチが処理されている段階を示します。最初はin_progressで始まり、バッチ内のすべてのリクエストの処理が完了して結果の準備ができるとendedに更新されます。Consoleにアクセスするか、取得エンドポイントを使用して、バッチの状態を監視できます。

Message Batchの完了をポーリングする

Message Batchをポーリングするには、そのidが必要です。これはバッチ作成時のレスポンスまたはバッチのリスト表示で提供されます。処理が終了するまで定期的にバッチのステータスをチェックするポーリングループを実装できます。

import time

client = anthropic.Anthropic()

MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"

message_batch = None
while True:
    message_batch = client.messages.batches.retrieve(MESSAGE_BATCH_ID)
    if message_batch.processing_status == "ended":
        break

    print(f"Batch {MESSAGE_BATCH_ID} is still processing...")
    time.sleep(60)
print(message_batch)

すべてのMessage Batchのリスト表示

リストエンドポイントを使用して、Workspace内のすべてのMessage Batchをリスト表示できます。APIはページネーションをサポートしており、必要に応じて追加のページを自動的に取得します。

client = anthropic.Anthropic()

# 必要に応じて自動的に追加のページを取得します。
for message_batch in client.messages.batches.list(limit=20):
    print(message_batch)

バッチ結果の取得

バッチ処理が終了すると、バッチ内の各Messagesリクエストには結果があります。4つの結果タイプがあります。

結果タイプ説明
succeededリクエストが成功しました。メッセージ結果が含まれます。
erroredリクエストでエラーが発生し、メッセージが作成されませんでした。考えられるエラーには、無効なリクエストや内部サーバーエラーが含まれます。これらのリクエストには課金されません。
canceledこのリクエストがモデルに送信される前に、ユーザーがバッチをキャンセルしました。これらのリクエストには課金されません。
expiredこのリクエストがモデルに送信される前に、バッチが24時間の有効期限に達しました。これらのリクエストには課金されません。

バッチのrequest_countsは結果の概要を示し、これら4つの状態のそれぞれに到達したリクエストの数を示します。

バッチの結果は、Message Batchのresults_urlプロパティでダウンロードでき、組織の権限が許可する場合はConsoleでも利用できます。結果のサイズが大きくなる可能性があるため、一度にすべてをダウンロードするのではなく、結果をストリーミングで取得することをお勧めします。

client = anthropic.Anthropic()

# 結果ファイルをメモリ効率の良いチャンク単位でストリーミングし、1つずつ処理します
for result in client.messages.batches.results(
    "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d",
):
    outcome = result.result
    match outcome.type:
        case "succeeded":
            print(f"Success! {result.custom_id}")
        case "errored":
            if outcome.error.error.type == "invalid_request_error":
                # リクエストを再送信する前にリクエスト本文を修正する必要があります
                print(f"Validation error {result.custom_id}")
            else:
                # リクエストはそのまま再試行できます
                print(f"Server error {result.custom_id}")
        case "expired":
            print(f"Request expired {result.custom_id}")

結果は.jsonl形式で、各行はMessage Batch内の単一リクエストの結果を表す有効なJSONオブジェクトです。ストリーミングされた各結果について、そのcustom_idと結果タイプに応じて異なる処理を行うことができます。以下は結果のセットの例です。

.jsonl file
{"custom_id":"my-second-request","result":{"type":"succeeded","message":{"id":"msg_014VwiXbi91y3JMjcpyGBHX5","type":"message","role":"assistant","model":"claude-opus-5-5","content":[{"type":"text","text":"Hello again! It's nice to see you. How can I assist you today? Is there anything specific you'd like to chat about or any questions you have?"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":11,"output_tokens":36}}}}
{"custom_id":"my-first-request","result":{"type":"succeeded","message":{"id":"msg_01FqfsLoHwgeFbguDgpz48m7","type":"message","role":"assistant","model":"claude-opus-5-5","content":[{"type":"text","text":"Hello! How can I assist you today? Feel free to ask me any questions or let me know if there's anything you'd like to chat about."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"output_tokens":34}}}}

結果にエラーがある場合、そのresult.errorは標準のエラー形式に設定されます。

Message Batchのキャンセル

キャンセルエンドポイントを使用して、現在処理中のMessage Batchをキャンセルできます。キャンセル直後、バッチのprocessing_statusはcancelingになります。前述と同じポーリング手法を使用して、キャンセルが確定するまで待機できます。キャンセルされたバッチはendedのステータスになり、キャンセル前に処理されたリクエストの部分的な結果が含まれる場合があります。

client = anthropic.Anthropic()

MESSAGE_BATCH_ID = "msgbatch_01HkcTjaV5uDC8jWR4ZsDV8d"

message_batch = client.messages.batches.cancel(
    MESSAGE_BATCH_ID,
)
print(message_batch)

レスポンスはバッチがcanceling状態であることを示します。

Output
{
  "id": "msgbatch_013Zva2CMHLNnXjNJJKqJ2EF",
  "type": "message_batch",
  "processing_status": "canceling",
  "request_counts": {
    "processing": 2,
    "succeeded": 0,
    "errored": 0,
    "canceled": 0,
    "expired": 0
  },
  "ended_at": null,
  "created_at": "2024-09-24T18:37:24.100435Z",
  "expires_at": "2024-09-25T18:37:24.100435Z",
  "cancel_initiated_at": "2024-09-24T18:39:03.114875Z",
  "results_url": null
}

Message Batchでのプロンプトキャッシングの使用

Message Batches APIはプロンプトキャッシングをサポートしており、バッチリクエストのコストと処理時間を削減できる可能性があります。プロンプトキャッシングとMessage Batchesの価格割引は積み重ねることができ、両方の機能を一緒に使用するとさらに大きなコスト削減が得られます。ただし、バッチリクエストは非同期かつ並行して処理されるため、キャッシュヒットはベストエフォートベースで提供されます。ユーザーは通常、トラフィックパターンに応じて30%から98%のキャッシュヒット率を経験します。

バッチリクエストでのキャッシュヒットの可能性を最大化するには、以下を行います。

  1. バッチ内のすべてのMessageリクエストに同一のcache_controlブロックを含めます。
  2. キャッシュエントリが5分間の有効期間後に期限切れにならないように、安定したリクエストのストリームを維持します。
  3. できるだけ多くのキャッシュされたコンテンツを共有するようにリクエストを構造化します。

バッチでプロンプトキャッシングを実装する例:

from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request

client = anthropic.Anthropic()

message_batch = client.messages.batches.create(
    requests=[
        Request(
            custom_id="my-first-request",
            params=MessageCreateParamsNonStreaming(
                model="claude-opus-5-5",
                max_tokens=1024,
                system=[
                    {
                        "type": "text",
                        "text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n",
                    },
                    {
                        "type": "text",
                        "text": "<the entire contents of Pride and Prejudice>",
                        "cache_control": {"type": "ephemeral"},
                    },
                ],
                messages=[
                    {
                        "role": "user",
                        "content": "Analyze the major themes in Pride and Prejudice.",
                    }
                ],
            ),
        ),
        Request(
            custom_id="my-second-request",
            params=MessageCreateParamsNonStreaming(
                model="claude-opus-5-5",
                max_tokens=1024,
                system=[
                    {
                        "type": "text",
                        "text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n",
                    },
                    {
                        "type": "text",
                        "text": "<the entire contents of Pride and Prejudice>",
                        "cache_control": {"type": "ephemeral"},
                    },
                ],
                messages=[
                    {
                        "role": "user",
                        "content": "Write a summary of Pride and Prejudice.",
                    }
                ],
            ),
        ),
    ]
)

この例では、バッチ内の両方のリクエストに同一のシステムメッセージと、キャッシュヒットの可能性を高めるためにcache_controlでマークされた『高慢と偏見』の全文が含まれています。

サーバーツールとエージェントループ

すべてのサーバーツール(ウェブ検索、ウェブフェッチ、コード実行、MCPコネクタ、アドバイザー、ツール検索)はバッチリクエストで動作します。バッチワーカーは、同期Messages APIと同じサーバーサイドのエージェントループを実行します。

維持すべきオープン接続がないため、バッチループはstop_reason: "pause_turn"を返す前に、同期リクエストよりもターンあたりより多くの反復を実行します。バッチ結果がpause_turnで返された場合、ターンは完了していません。pause_turn継続パターンに示されているとおり、一時停止されたアシスタントコンテンツを後続のリクエスト(バッチまたは同期)で送信することで継続できます。

バッチワーカーはさらに、高度に並行したバッチ処理が組織のウェブ検索レート制限を使い果たさないように、組織ごとにweb_searchをスロットリングします。バッチはスロットリングされたリクエストを自動的に再試行します。これを自分で処理する必要はありませんが、非常に大きなウェブ検索バッチは完了までに時間がかかる場合があります。

拡張出力(ベータ)

output-300k-2026-03-24ベータヘッダーは、Claude Opus 5.5、Claude Opus 5、Claude Opus 4.8、Claude Opus 4.7、Claude Opus 4.6、Claude Sonnet 5、またはClaude Sonnet 4.6を使用するバッチリクエストのmax_tokensの上限を300,000に引き上げます。このヘッダーを含めると、1回のターンで標準の128kのmax_tokens制限をはるかに超える長さの出力を生成できます。

書籍の長さの草稿や技術文書、網羅的な構造化データ抽出、大規模なコード生成スキャフォールド、長い推論チェーンなどの長文生成に拡張出力を使用してください。

単一の300kトークン生成は完了までに1時間以上かかる場合があるため、24時間の処理ウィンドウを念頭に置いてバッチ送信を計画してください。標準のバッチ料金(標準API価格の50%)が適用されます。

from anthropic.types.beta.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.beta.messages.batch_create_params import Request

client = anthropic.Anthropic()

message_batch = client.beta.messages.batches.create(
    betas=["output-300k-2026-03-24"],
    requests=[
        Request(
            custom_id="long-form-request",
            params=MessageCreateParamsNonStreaming(
                model="claude-opus-5-5",
                max_tokens=300_000,
                messages=[
                    {
                        "role": "user",
                        "content": "Write a comprehensive technical guide to building distributed systems, covering architecture patterns, consistency models, fault tolerance, and operational best practices.",
                    }
                ],
            ),
        ),
    ],
)

print(message_batch)

効果的なバッチ処理のためのベストプラクティス

Batches APIを最大限に活用するには、以下を行います。

  • バッチ処理のステータスを定期的に監視し、失敗したリクエストに対して適切な再試行ロジックを実装します。
  • 順序が保証されないため、結果とリクエストを簡単に一致させるために意味のあるcustom_id値を使用します。
  • 管理しやすくするために、非常に大きなデータセットを複数のバッチに分割することを検討します。
  • 検証エラーを回避するために、Messages APIで単一のリクエスト形式をドライランします。

一般的な問題のトラブルシューティング

予期しない動作が発生した場合:

  • バッチリクエストの合計サイズが256 MBを超えていないことを確認します。リクエストサイズが大きすぎる場合、413 request_too_largeエラーが発生する可能性があります。
  • バッチ内のすべてのリクエストにサポートされているモデルを使用していることを確認します。
  • バッチ内の各リクエストに一意のcustom_idがあることを確認します。
  • バッチのcreated_at(処理のended_atではない)時刻から29日未満であることを確認します。29日以上経過している場合、結果は表示できなくなります。
  • バッチがキャンセルされていないことを確認します。

バッチ内の1つのリクエストの失敗は、他のリクエストの処理に影響しないことに注意してください。

バッチのストレージとプライバシー

  • Workspaceの分離: バッチは作成されたWorkspace内で分離されます。同じWorkspace内のAPIリクエスト、またはConsoleでWorkspaceバッチを表示する権限を持つユーザーのみがアクセスできます。

  • 結果の利用可能性: バッチ結果はバッチ作成後29日間利用可能で、取得と処理に十分な時間を確保できます。

データ保持

バッチ処理は、バッチ作成後最大29日間、リクエストとレスポンスのデータを保存します。処理後はいつでもDELETE /v1/messages/batches/{batch_id}エンドポイントを使用してメッセージバッチを削除できます。処理中のバッチを削除するには、まずキャンセルしてください。非同期処理では、バッチの完了と結果の取得まで、入力と出力の両方をサーバーサイドで保存する必要があります。

すべての機能にわたるZDR適格性については、APIとデータ保持を参照してください。

よくある質問

次のステップ

ソース帰属を伴う検索結果を提供することで、RAGアプリケーションの自然な引用を有効にします。

バッチ内のリクエスト間で共有されるプロンプトプレフィックスをキャッシュすることで、コストとレイテンシを削減します。

Was this page helpful?