AIREITER

Claude Message Threads APIガイド(2026年11月版)

最終更新日: 2026-11-03 00:20:15

Anthropicは2026年11月2日、Message Threadsをパブリックベータで公開した。ただし、見出しだけを読むと誤解しやすい。500K〜1Mトークンのリクエストでは、初回トークン生成までの時間(TTFT)の中央値が約35%短くなる一方、トークン料金は変わらない。長時間動くエージェントを運用しているなら、これは転送量を減らす仕組みだ。ただし、アイドル状態が5分続くとスレッドは期限切れになる。

速くなっても料金は同じ。Message Threadsで変わること、変わらないこと

Message Threadsは、Messages APIで一時的に使えるサーバー側の会話状態だ。2026年11月2日にパブリックベータとして提供が始まった。最初のリクエストでthread: { "type": "create" }を指定して履歴全体を送信し、以降は新しいメッセージとprevious_message_idだけをthread: { "type": "continue" }で送る。Anthropicの発表と公式ドキュメントによると、状態は暗号化されたメモリ上に保持され、ディスクには書き込まれない。アイドル状態が5分続くと期限切れになり、最後の利用から1時間以内には削除される。

スレッド内のすべてのリクエストには、anthropic-beta: message-threads-2026-08-12のベータヘッダーが必要だ。料金体系とレート制限は変わらない。Claudeは各ターンで会話全体を読み込むため、入出力トークンの料金は従来どおり。ただし、クライアントからアップロードするデータ量は大幅に減る。

「いい仕組みだけど、トークン料金は下がらないんだよね :( Claudeは毎ターン会話全体を読み込むから、トークン消費量は変わらない」 — 公式ローンチスレッドへの返信、@_navicstein

公式の発表では、500K〜1MトークンのリクエストにおけるTTFTの中央値が約35%短縮されるとしている。トークン料金の割引はない。

Threadsとプロンプトキャッシュの違い

Threadsが減らすのは送信するデータであり、プロンプトキャッシュが減らすのは通常料金で課金される入力だ。Threadsが自動的にキャッシュしてくれるわけではないため、引き続きcache_controlでブレークポイントを指定する必要がある。詳しい連携方法は実装の解説に従う。すべての継続リクエストでトップレベルのcache_controlを維持し、キャッシュ読み取り時の料金は通常の入力料金の0.1倍(Claude Opus 5.5とSonnet 5.5では0.05倍)になる。

ThreadsとManaged Agentのセッションスレッドは別物

検索結果では、2種類の「スレッド」が混同されがちだ。この記事で扱うMessages APIのメッセージスレッドは、リクエストサイズを抑えるための一時的な仕組みで、一覧・取得・削除APIはない。一方、Managed Agentのセッションスレッド(GET /v1/sessions/{session_id}/threads/{thread_id})は、Anthropicのmanaged-agents API内で実行を管理するスレッドであり、一覧表示・取得・アーカイブのエンドポイントを持つ。子スレッド、イベントストリーム、アーカイブといった記述が出てきたなら、別のAPIを見ている可能性が高い。必要な機能がどちらに属するかは、セッションスレッドのAPIリファレンスで確認してほしい。

長時間動作するエージェント向けのサーバー側会話状態を説明するAnthropicのMessage Threads発表ページ

スレッドの流れを理解する:作成、継続、期限切れ

実際のスレッドは追記専用だ。最初にコンテキスト全体を付けて作成し、その後は差分を送り、状態を失ったら最初からリプレイする。分岐、編集、巻き戻し、状態確認のAPIは用意されていない。レスポンスごとに新しいidが返され、各idを継続に使えるのは1回だけだ。このセクションのフィールドとエラーに関するルールは、公式ドキュメントおよび実装の解説に基づいている。

作成時は、messages、system、toolsを含む必要な情報をすべて送る。

{
  "model": "claude-opus-5-5",
  "system": "You are a support agent for Acme. Keep replies short.",
  "messages": [{ "role": "user", "content": "Hi! I have a question about an order." }],
  "thread": { "type": "create" }
}

継続時に送るのは、新しく追加する内容だけだ。通常はユーザーメッセージ、またはtool_resultブロックになる。

{
  "model": "claude-opus-5-5",
  "messages": [{ "role": "user", "content": "How long does standard shipping usually take?" }],
  "thread": { "type": "continue", "previous_message_id": "msg_xxx_from_create" }
}

継続リクエストではsystemとtoolsを省略すること。"system": nullと指定しても400エラーになる。ストリーミング中はmessage_stopを受け取ってから次の継続リクエストを送る。継続に使えるIDはmessage_startで届く。

スレッド途中で変更できるフィールド

Anthropicは、作成リクエストの一部をフィンガープリントとして管理している。対象となる値を変更するとthread_fingerprint_mismatchが返り、新しいスレッドを作り直す必要がある。

グループ例継続時のルール
作成時のみsystem、tools再送しない。nullでも失敗する
固定model、tool_choice、thinking、mcp_servers、context_management、output_config、コンテナスキル、トップレベルのcache_controlの扱い同じ値を維持する必要がある
変更可能max_tokens、stop_sequences、stream、metadata、service_tierターンごとに変更できる
毎回再送MCPサーバーのURL / 認証トークン、container IDサーバー側には保存されないため、使用するたびに含める

拡張思考モデルを使う場合は、さらに注意が必要だ。systemやtoolsを変更すると、過去のthinking / redacted_thinkingブロックが無効になる可能性がある。期限切れ後のフルリプレイで400エラーが返った場合は、古いthinkingブロックを履歴から削除してからリプレイする。内容をそのまま再送しても解決しない。

5分ルールと、必ず実装すべきリプレイ処理

Threadsはベストエフォートの仕組みとして扱おう。完全な履歴、system、tools、ファイル参照はローカルに保持しておく必要がある。次の継続リクエストが成功するまで、サーバー側に保存されているとは考えないほうがいい。ファイルは参照として保持されるため、スレッドの途中でファイルを削除すると継続に失敗する。

期限切れのタイマーは、保存に成功したレスポンスを受け取るたびにリセットされる。アイドル状態が5分続くと、次の継続リクエストは404を返す。その場合は会話全体を新しいcreateとして送り直す。データは最後の利用から1時間以内には削除される。

HTTPコード起きたこと対処
404thread_not_found期限切れ、保存失敗、キーやワークスペースの不一致、テキスト専用スレッドへの最初の画像追加、フォールバックモデルによる応答、またはレスポンス生成中キー、ワークスペース、設定を確認し、履歴全体を新しいcreateとしてリプレイする
400thread_fingerprint_mismatch固定フィールドが変更された元の値に戻すか、新しいスレッドを開始する
400thread_already_continuedそのprevious_message_idはすでに使用済み最新のidから継続する
400thread_continue_in_flight同じIDに対して並行した継続リクエストを送った処理を待ち、新しいIDを使う。難しければリプレイする
400thread_unsupported_request未対応の設定(例:キャッシュブレークポイントが4個を超える、バッチ利用)設定を削除するか、スレッドなしで送信する

ドキュメントの概要によれば、スレッド関連の失敗リクエストはモデル実行前に処理される。そのためトークンは消費せず、期限切れタイマーもリセットしない。次のターンを受け付ける前に、最後に成功したレスポンスIDをアトミックに保存しておこう。ツール操作に副作用がある場合は、リプレイが二重実行されないよう冪等性も確保する必要がある。

Pythonでのリプレイ例。確認済みのthread_not_foundだけを処理し、フィンガープリント不一致、同時実行、未対応リクエストのエラーは別分岐で扱う。

try:
    resp = client.beta.messages.create(
        model="claude-opus-5-5",
        messages=[new_msg],  # delta only
        thread={"type": "continue", "previous_message_id": last_id},
        extra_headers={"anthropic-beta": "message-threads-2026-08-12"},
    )
except NotFoundError:  # thread_not_found after checking identity/config
    resp = client.beta.messages.create(
        model="claude-opus-5-5",
        system=SYSTEM, tools=TOOLS,
        messages=full_history + [new_msg],  # you stored this
        thread={"type": "create"},
        extra_headers={"anthropic-beta": "message-threads-2026-08-12"},
    )

プロキシとキーのローテーションで起きる404

ここからは公式ドキュメントではなく、運用者から報告されている挙動だ。スレッドは作成時の組織、ワークスペース、認証情報にひも付く。リクエストごとにAPIキーを切り替えるリレーでは、キーAで作成したスレッドをキーBで継続することになる。すると期限切れとまったく同じ404が発生し、レイテンシ短縮の恩恵がないまま、毎回フルリプレイを繰り返す。

「threadは作成したkeyとworkspaceにひも付いている。keyを変えると404 thread_not_foundになる。中継サーバーがkeyをローテーションすると、まず404になってから全量再送される」 — @ak12kpoot(プロキシ挙動に関する中国語の開発者メモ)

1つのスレッドでは同じキーを固定して使うか、キーをプールする経路ではThreadsを無効にしよう。

対応環境、制約、今すぐ移行すべきケース

Message Threadsは、Claude API、AWS上のClaude Platform、Anthropicが管理するGoogle Cloud Claude Models、Microsoft FoundryのClaudeで利用できる。ベータ対象のすべてのモデルが含まれており、別途モデルの許可リストやウェイトリストは案内されていない。

ローンチ時の計画では、使える場所よりも使えない機能のほうが重要になる。

項目対応状況
Amazon Bedrock非対応
Message Batches非対応。バッチ内のスレッドアイテムは失敗する
トークンカウントエンドポイント非対応。履歴全体を自分で数える必要がある
コンパクション / コンテキスト編集非対応(keep allを指定したclear_thinkingを除く)
ゼロデータ保持、HIPAA対応、推論フック対象外
スレッド管理APIなし。スレッドの一覧表示、読み取り、削除はできない

導入判断のチェックリスト

  • 今すぐ使う: アクティブなコーディングエージェント、スクリーンショットを扱うコンピュータ操作ループ、または5分未満の間隔で数十ターン実行するドキュメント中心の処理。プロンプトキャッシュとリプレイ処理を組み合わせること。
  • 現時点では見送る: 人間のペースで進むチャット、途中で長く停止するワークフロー、バッチ処理、ZDR/HIPAA要件のある処理、Bedrockへのデプロイ。
  • 組み合わせる場合の注意: すべてのリクエストに付けるトップレベルのcache_controlは、4個のブレークポイント制限に含まれる。create時のsystem/toolsに設定したブレークポイントも、すべてのcontinueで再びカウントされる。上限を超えるとthread_unsupported_requestになるため、両方を有効にする前にブレークポイントを整理しておこう。

関連記事:Claude API料金ガイド 2026、Claude Skills APIガイド。

FAQ

必要なベータヘッダーとパラメータは?

スレッド内のすべてのリクエストでanthropic-beta: message-threads-2026-08-12を送る。最初の呼び出しではthread: { "type": "create" }を指定し、2回目以降はthread: { "type": "continue", "previous_message_id": "<last response id>" }を使う。

スレッドの期限が切れるとどうなる?

次のcontinueが404のthread_not_foundを返す。messages全体と、最初に指定したsystem/toolsを新しいcreateとして再送する。期限切れはアイドル状態が5分続いた場合に発生し、最後の利用から1時間以内には削除される。

スレッドの一覧表示、確認、削除はできる?

できない。Messages APIのスレッドには管理APIが用意されていない。永続的な記録として残るのは、ローカルに保存した履歴だけだ。

Amazon Bedrockで使える?

使えない。対応しているのはClaude API、AWS Claude Platform、Microsoft Foundry、Anthropicが管理するGoogle Cloud。Bedrockでは、これまでどおり履歴全体を送信する方式を使う必要がある。

スレッド途中でsystem promptやtoolsを変更できる?

できない。新しいsystem/toolsでスレッドを作り直す必要がある。continueで変更後の値を送るとthread_fingerprint_mismatchになる。model、tool_choice、thinkingの設定も同様だ。

ストリーミング、ツール、MCPには対応している?

対応しているが、いくつかルールがある。次の継続リクエストはmessage_stopを受け取ってから送る。MCPのURLとトークン、container IDは毎ターン再送する。また、fallbacksはすべてのリクエストに含めるか、すべてから外すこと。フォールバックモデルが生成したレスポンスは保存されないため、リプレイが必要になる。