できること
会話途中で指示を追加
トップレベルの system フィールドを編集せずに、新しい指示が必要になった位置へ role: "system" のメッセージを追加できます。指示はその位置から後の会話に適用されます。
キャッシュを保ったまま変更
キャッシュ済みの接頭部分を変えないため、指示を変えてもプロンプトキャッシュのヒットが保たれます。追加した指示は運用者レベルの優先度を持ちます。
ターン限定のリマインダー
clear_at: "next_user_message" を設定すると、指示は現在のターンだけに反映され、その後はトークンコストなしで履歴に残ります。このリマインダーは蓄積せず、プロンプトキャッシュや後続の thinking ブロックを無効化しません。
機能解説
概要
キャッシュ済みの接頭部分は変わらないため、次のリクエストでもキャッシュから読み取られ、追加した指示は通常のユーザーの文章ではなく system の指示として扱われます。長時間のセッションの途中で、アプリケーション側から指示を変える場面に関わる機能です。
user メッセージはエンドユーザーからのもの、system メッセージはアプリケーションの運用者からのものとして扱われ、両者が食い違うときは system の指示が優先されます。会話途中の system メッセージは、この運用者レベルの優先度を保ちながら、トップレベルの system フィールドを編集した場合のキャッシュミスのコストを避けられます。
指示の優先順位は次のとおりです。
- 指示が食い違う場合、後の system メッセージが前の system メッセージより優先されます。
- 会話途中の system メッセージは、その後のターンについてトップレベルの
systemフィールドより優先されます。
Managed Agents では、system.message イベントを送ると、そのターンと以降のすべてのターンに適用されます。エージェント自身の system フィールドはセッション中に変更できません。
配置のルールと注意点
- 内容 (
text、tool_addition、tool_removalのブロック) を持つ system メッセージは、userターン (tool_resultブロックを含むものを含む) か、サーバーツールの結果で終わるassistantターンの直後に置き、assistantターンの前に置くか配列の末尾にします。tool_useブロックとそのtool_resultの間には置けません。それ以外の位置では 400 エラーが返ります。 - 内容を持つ system メッセージは
messagesの最初の要素にできません。最初から適用する指示はトップレベルのsystemフィールドを使います。 - 連続する system メッセージは受け付けられ、1 つの system セクションとして扱われます。配置のルールはそのまとまり全体に適用されます。
- 会話に入った system メッセージは安定した履歴の一部になり、それ自体もキャッシュの対象です。送信済みのものを編集・削除すると、その位置から後のキャッシュが無効になります。
- 生のツール出力、取得した文書、Web のコンテンツなど、会話の外から来た文章を system メッセージに直接入れないでください。その文章に運用者レベルの権限を与えることになります。
- Claude Sonnet 5.5 と Claude Haiku 5.5 では、ツールの結果の直後に置いた system メッセージが信頼できない文章として扱われ、無視される場合があります。これらのモデルでは、ユーザーの言葉は user ターンで渡します。
ターン限定の system メッセージ (beta)
Turn-scoped system messages (ターン限定の system メッセージ) は beta として提供されており、mid-conversation-system-clear-at-2026-08-21 ヘッダーを使います。
role: "system"のメッセージのclear_atフィールドに"next_user_message"を設定すると、現在のターンに限定できます。SDK ではmessages内のrole: "system"の要素にclear_at(csharp・go はClearAt、java は.clearAt()、php はclearAt) を設定し、beta ヘッダーを送ります。- 文章が反映されるのは、後ろに
role: "user"のメッセージが無い間だけです。tool_resultブロックだけを持つ user メッセージも user メッセージに数えます。後に user メッセージが来るとクリアされ、配列には残りますが何も反映されず、そのリクエスト以降は入力トークンもかかりません。 clear_atの既定値は"never"で、その場合はメッセージを含むすべてのリクエストでその位置に反映されます。- ターン限定のメッセージの内容は text だけです。
tool_addition・tool_removalのブロックやoutput_configを付けると 400 エラーが返ります。 - ツールのループでリマインダーを見せたいときは、そのたびに
tool_resultメッセージの後に追加し、それまでのコピーはそのまま残します。 - クリアされたメッセージも会話履歴の一部です。現在の状態から作り直す (新しいトークン数やタイムスタンプを入れる)、不要とみなして削除する、
clear_atの値を変える、といった操作は前のメッセージの編集にあたるため、送信済みの内容をそのまま送り直します。
提供状況の注意
提供開始時点では、Claude Opus 4.8 でユーザーターンの後に role: "system" のメッセージを送れる機能として案内されました。その後、Claude Fable 5、Claude Mythos 5、Claude Opus 4.8 で、Claude API、Claude in Amazon Bedrock、Google Cloud 上で利用でき、beta ヘッダーは不要という内容に訂正されています。ターン限定の system メッセージは beta で、専用のヘッダーが必要です。対象プランについては、公式のリリースノートには記載がありません。
使い方
会話途中の system メッセージは Claude Fable 5、Claude Mythos 5、Claude Opus 4.8 で使え、beta ヘッダーは不要です。
- リクエストに
cache_controlを含めて、キャッシュを明示的に有効にします。トップレベルの自動キャッシュのフィールドか、content block への明示的なブレークポイントのどちらかを使います。 cache_controlは、リクエスト間で変わらない最後のブロックに置きます。messages配列に"role": "system"のメッセージを追加します。contentには、userやassistantのターンと同じく、文字列か content blocks を使います。- 追加する system メッセージは、キャッシュのブレークポイントより後に置きます。接頭部分のハッシュが変わらないため、キャッシュはヒットします。
利用シーン
長時間のエージェントのセッションで、途中から運用者として方針を変える場面に向いています。キャッシュ済みの接頭部分を変えずに指示を追加できます。
ツールを繰り返し呼び出すループの中で、毎ターン短いリマインダーを渡す場面に使えます。ターン限定にすれば、リマインダーは蓄積しません。
エンドユーザーの入力と運用者の指示を分けて扱いたいアプリケーションに向いています。食い違ったときは system の指示が優先されます。
ChatGPT・OpenAI の対応する機能
比較の単位となる業務: 長時間セッション中の指示の途中変更 (キャッシュを保ったまま)
Queued prompts (Steer) は Codex の機能で、オプトインの instant_interrupt により、モデルの応答中や長時間の code-mode 呼び出し中に新しい入力で Codex をステアできます。フォローアップの既定の動作として Queue と Steer を選ぶ設定画面もあります。会話途中の system メッセージは、API の messages 配列に role: "system" のメッセージを追加する仕組みで、その指示はアプリケーションの運用者からのものとして扱われます。
キャッシュの面では、12-hour prompt caching は OpenAI の機能で、GPT-5.6 で明示的なプロンプトキャッシュ制御が加わり、Prompt Caching ダッシュボードでキャッシュヒット率の推移やトークンの内訳を確認できます。会話途中の system メッセージは、キャッシュ済みの接頭部分を変えずに指示を追加することで、次のリクエストでもキャッシュから読み取られる仕組みです。
これまでの変更
ターン限定の system メッセージが beta として提供され、
clear_at: "next_user_message"で現在のターンだけに反映できるようになりました。提供状況が訂正され、Claude Fable 5、Claude Mythos 5、Claude Opus 4.8 で、Claude API、Claude in Amazon Bedrock、Google Cloud 上で利用でき、beta ヘッダーは不要となりました。
会話途中の system メッセージが提供開始されました。Claude Opus 4.8 で、
messages配列のユーザーターンの後にrole: "system"のメッセージを送れます。