概览
为了支持长时间运行的交互,你可以使用压缩来减少上下文大小,同时保留后续轮次所需的状态。
随着对话不断增长,压缩有助于平衡质量、成本和延迟。
服务端压缩
你可以在 Responses create 请求(POST /responses or client.responses.create)中设置以启用服务端压缩
context_management with compact_threshold.
- 当渲染的 token 数量超过配置的阈值时,服务器将运行服务端压缩。
- 在这种模式下不需要单独的
/responses/compact调用。 - 响应流中包含加密的压缩项。
- ZDR 注意事项:当你在 Responses create 请求中设置
store=false时,服务端压缩与 ZDR 兼容。
返回的压缩项使用更少的 token 将关键的历史状态和推理延续到下一次运行中。该项是不透明的,不打算供人类解读。
对于无状态输入数组串联,请像往常一样追加输出项。如果你正在使用 previous_response_id,则每次只传递新的用户消息。在这两种情况下,压缩项都承载了下一个窗口所需的上下文。
延迟提示:在将输出项追加到之前的输入项之后,你可以丢弃最近一次压缩项之前的项,以保持请求较小并减少长尾延迟。最新的压缩项包含了继续对话所需的上下文。如果你使用
previous_response_id 串联,请不要手动修剪。
用户旅程
- 像往常一样调用
/responses,但需包含context_managementwithcompact_thresholdto enable server-side compaction. - 在响应流式传输时,如果上下文大小超过阈值,服务器会触发一次压缩过程,在同一数据流中输出一个压缩输出项,并在继续推理之前修剪上下文。
- 使用以下两种模式之一继续你的循环:无状态输入数组链式调用(将包含压缩项在内的输出附加到你下一次的输入数组中),或者
previous_response_id链式调用(每次只传递新的用户消息,并将该 ID 向前传递)。
示例用户流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
conversation = [
{
"type": "message",
"role": "user",
"content": "Let's begin a long coding task.",
}
]
while keep_going:
response = client.responses.create(
model="gpt-5.3-codex",
input=conversation,
store=False,
context_management=[{"type": "compaction", "compact_threshold": 200000}],
)
conversation.extend(response.output)
conversation.append(
{
"type": "message",
"role": "user",
"content": get_next_user_input(),
}
)独立的压缩端点
如需显式控制,请使用 独立的压缩端点 在长时间运行的工作流中进行无状态压缩。
此端点完全无状态,且兼容 ZDR。
您发送完整的上下文窗口(消息、工具及其他项),该端点将返回一个新的压缩后上下文窗口,您可以将其传递给下一次
/responses call.
返回的压缩窗口包含一个加密的压缩项,该压缩项使用更少的 token 延续了之前的关键状态和推理。它是不可见的,不打算供人类解读。
注意:压缩后的窗口通常不仅仅包含压缩项。它还可以包含来自先前窗口的保留项。
输出处理:请勿删减 /responses/compact 输出。返回的窗口是规范的下一个上下文窗口,因此请将其原样传递至您的下一次 /responses
调用中。
独立压缩的用户旅程
- 使用
/responses通常,发送包含用户消息、助手输出和工具交互的输入项。 - 当你的上下文窗口变大时,调用
/responses/compact以生成一个新的压缩上下文窗口。你发送给/responses/compact的窗口仍必须适应模型的上下文窗口限制。 - For subsequent
/responses在后续调用中,将返回的压缩窗口(包括压缩项)作为输入传入,而不是完整的对话记录。
示例用户流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# Full window collected from prior turns
long_input_items_array = [...]
# 1) Compact the current window
compacted = client.responses.compact(
model="gpt-5.5",
input=long_input_items_array,
)
# 2) Start the next turn by appending a new user message
next_input = [
*compacted.output, # Use compact output as-is
{
"type": "message",
"role": "user",
"content": user_input_message(),
},
]
next_response = client.responses.create(
model="gpt-5.5",
input=next_input,
store=False, # Keep the flow ZDR-friendly
)