Remote Compact 把类型化 History、Base Instructions、ToolSpec 和推理设置发送到专用 compact endpoint,由服务端返回替代 transcript。返回成功还不等于已经改变 Session;只有经过过滤、初始上下文处理并调用 replace_compacted_history 后,结果才成为 live History。
请求前先给超大工具输出瘦身
远端请求从 Session 克隆 History,按 context window 估算重写过大的 Function outputs,然后执行 for_prompt()。V1 发送标准 compact unary payload;V2 在 input 末尾加入 CompactionTrigger,通过流式 Responses 协议要求恰好一个 Compaction output item。
async def remote_compact_attempt(session, step):
history = session.history.snapshot()
trim_outputs_to_fit(history, step.model.context_window)
input_items = history.for_prompt(step.model.modalities)
result = await compact_endpoint.send(
instructions=session.base_instructions,
input=input_items,
tools=step.router.model_visible_specs(),
)
return input_items, validate_compaction_result(result)
Provider 声明支持远端压缩时才走这条路径。某些错误允许使用当前模型再尝试一次 previous-model compaction fallback;原始错误在 fallback 也失败时仍被保留,避免掩盖根因。
过滤后再安装
V1 返回列表经过 should_keep_compacted_history_item 过滤,只保留协议允许的 assistant、有效 user warning/summary 和 compaction 类型。V2 从请求输入中保留规定形状的消息与图片,在 Token 预算内截断文本,最后追加服务端 Compaction item。
async def install_remote_compaction(session, result, injection):
filtered = [x for x in result.items if keep_compacted_item(x)]
context, baseline = await build_initial_context_if_needed(injection)
replacement = insert_context_at_canonical_boundary(filtered, context)
window = await session.advance_window()
await trace.record_installed(replacement, window)
await session.replace_compacted_history(replacement, baseline, window)
await session.recompute_token_usage()
若请求成功后在安装前被取消或过滤校验失败,旧 live History 仍应保持不变。这个提交式边界让重试和遥测能区分“服务端生成成功”与“客户端已采用”。
源码与测试锚点
codex-rs/core/src/compact_remote_request.rs:V1 请求。codex-rs/core/src/compact_remote_v2_attempt.rs与compact_remote_v2.rs:V2 trigger、流校验和保留形状。codex-rs/core/src/compact_remote.rs:过滤与安装边界。
评论
登录后即可评论