For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション

コンパクション

サーバー側とスタンドアロンのコンパクションで、長時間にわたる会話を管理します。

概要

長時間にわたるやり取りでは、コンパクションを使うことで、後続のターンに必要な状態を保持しながらコンテキストのサイズを削減できます。

コンパクションは、会話が長くなっても品質、コスト、レイテンシーのバランスを保つのに役立ちます。

サーバー側のコンパクション

Responses の作成リクエスト (POST /responses または client.responses.create)で、 context_managementcompact_threshold を設定すると、サーバー側のコンパクションを有効にできます。

  • レンダリング後のトークン数が設定したしきい値を超えると、サーバーがコンパクションを実行します。
  • このモードでは、/responses/compact を別途呼び出す必要はありません。
  • レスポンスストリームには、暗号化されたコンパクション項目が含まれます。
  • ZDR に関する注意:Responses の作成リクエストに store=false を設定すると、 サーバー側のコンパクションを ZDR と両立できます。

返されたコンパクション項目は、これまでの重要な状態と推論を、より少ないトークンで次の実行に引き継ぎます。内容は不透明で、人間が解釈することを想定したものではありません。

入力配列を使ってステートレスに会話をつなぐ場合は、通常どおり出力項目を追加します。 previous_response_id を使う場合は、各ターンで新しいユーザーメッセージだけを渡します。 いずれの場合も、コンパクション項目が次のウィンドウに必要なコンテキストを引き継ぎます。

レイテンシーを抑えるヒント:前回の入力項目に出力項目を追加した後、 最新のコンパクション項目より前の項目を削除すると、リクエストのサイズを小さく保ち、 ロングテールのレイテンシーを削減できます。最新のコンパクション項目には、 会話の継続に必要なコンテキストが含まれています。 previous_response_id で会話をつなぐ場合は、手動で項目を削除しないでください。

利用の流れ

  1. 通常どおり /responses を呼び出しますが、context_managementcompact_threshold を指定して、サーバー側のコンパクションを有効にします。
  2. レスポンスのストリーミング中にコンテキストのサイズがしきい値を超えると、サーバーはコンパクション処理を実行し、同じストリームにコンパクション出力項目を送出します。その後、コンテキストを削減してから推論を続行します。
  3. 次のいずれかの方式でループを続けます。入力配列を使ってステートレスに会話をつなぐ方式(コンパクション項目を含む 出力を次の入力配列に追加)か、 previous_response_id で会話をつなぐ方式(各ターンで新しいユーザーメッセージだけを渡し、 その ID を引き継ぐ)です。

利用フローの例

import OpenAI from "openai";
import { toResponseInputItems } from "openai/lib/responses/ResponseInputItems";

const client = new OpenAI();

const conversation = [
  {
    type: "message",
    role: "user",
    content: "Let's begin a long coding task.",
  },
];

const response = await client.responses.create({
  model: "gpt-5.3-codex",
  input: conversation,
  store: false,
  context_management: [{ type: "compaction", compact_threshold: 200_000 }],
});

conversation.push(...toResponseInputItems(response.output));
console.log(response.output_text);

スタンドアロンのコンパクションエンドポイント

長時間にわたるワークフローでステートレスなコンパクションを明示的に制御するには、 スタンドアロンのコンパクションエンドポイントを 使用します。

このエンドポイントは完全にステートレスで、ZDR と両立できます。

コンテキストウィンドウ全体(メッセージ、ツール、その他の項目)を送信すると、 エンドポイントはコンパクション済みの新しいコンテキストウィンドウを返します。これを次の /responses 呼び出しに渡せます。

返されたコンパクション済みのウィンドウには、暗号化されたコンパクション項目が含まれます。この項目は、これまでの重要な状態と推論を、より少ないトークンで引き継ぎます。内容は不透明で、人間が解釈することを想定したものではありません。

注意:コンパクション済みのウィンドウには、通常、コンパクション項目以外の項目も含まれます。前のウィンドウから保持された項目が含まれることもあります。

出力の扱い:/responses/compact の出力から項目を削除しないでください。 返されたウィンドウが次に使用すべき正規のコンテキストウィンドウなので、次の /responses 呼び出しに そのまま渡してください。

スタンドアロンのコンパクションの利用の流れ

  1. 通常どおり /responses を使用し、ユーザーメッセージ、 アシスタントの出力、ツールとのやり取りを含む入力項目を送信します。
  2. コンテキストウィンドウが大きくなったら、/responses/compact を呼び出して、 コンパクション済みの新しいコンテキストウィンドウを生成します。/responses/compact に送信するウィンドウは、 引き続きモデルのコンテキストウィンドウ内に収まっている必要があります。
  3. 以降の /responses 呼び出しでは、会話履歴全体の代わりに、返されたコンパクション済みのウィンドウ (コンパクション項目を含む)を入力として渡します。

利用フローの例

import OpenAI from "openai";

const client = new OpenAI();

const conversation = [{ role: "user", content: "Plan a trip to Kyoto." }];

const compacted = await client.responses.compact({
  model: "gpt-6-astra",
  input: conversation,
});

const nextInput = [
  ...compacted.output.map((item) => item),
  { role: "user", content: "Add two more days to the itinerary." },
];

const response = await client.responses.create({
  model: "gpt-6-astra",
  input: nextInput,
  store: false,
});

console.log(response.output_text);