9.4 上下文压缩(Compaction)
9.4.1 自动压缩触发机制
触发时机:上下文溢出检测
// src/agents/pi-embedded-runner/run.ts(简化)
const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 3;
let overflowCompactionAttempts = 0;
while (true) {
const attempt = await runAttempt({ ... });
if (promptError && !aborted) {
const errorText = describeUnknownError(promptError);
if (isContextOverflowError(errorText)) {
const isCompactionFailure = isCompactionFailureError(errorText);
// 仅对"真正的"上下文溢出进行压缩,不对压缩失败再次压缩
if (!isCompactionFailure &&
overflowCompactionAttempts < MAX_OVERFLOW_COMPACTION_ATTEMPTS) {
overflowCompactionAttempts++;
log.warn(
`context overflow detected (attempt ${overflowCompactionAttempts}/` +
`${MAX_OVERFLOW_COMPACTION_ATTEMPTS}); attempting auto-compaction`
);
const compactResult = await compactEmbeddedPiSessionDirect({
sessionId: params.sessionId,
sessionFile: params.sessionFile,
workspaceDir: resolvedWorkspace,
provider,
model: modelId,
// ...其他参数
});
if (compactResult.compacted) {
log.info("auto-compaction succeeded; retrying prompt");
continue; // 压缩成功,重试当前请求
}
log.warn(`auto-compaction failed: ${compactResult.reason}`);
}
// 所有压缩尝试失败或不可压缩
return {
payloads: [{
text: "Context overflow: prompt too large for the model.",
isError: true,
}],
meta: { error: { kind: isCompactionFailure
? "compaction_failure" : "context_overflow" } },
};
}
}
// ...正常处理
}两种压缩模式
模式
实现
特点
9.4.2 压缩流程(src/agents/compaction.ts)
src/agents/compaction.ts)核心算法:Token 估算与消息分块
按 Token 份额分割消息
按最大 Token 数分块
自适应分块比率
超大消息检测
分阶段摘要(summarizeInStages)
渐进式降级(summarizeWithFallback)
级别
策略
何时触发
9.4.3 压缩前的记忆刷新(Memory Flush)
会话写锁
历史清理流程
Lane 排队
9.4.4 压缩重试与缓冲重置
Safeguard 模式:高级压缩策略
1. 历史裁剪(History Pruning)
2. 工具失败保留
3. 文件操作记录
压缩事件的订阅与缓冲重置
压缩结果类型
本节小结
Last updated