2026-05-20 21:39:12 +08:00

95 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 上下文压缩与历史视图
created: 2026-04-19
updated: 2026-04-23
type: concept
tags: [runtime, agent, api, backend]
sources: [packages/backend/src/modules/netaclaw/runtime/compaction.ts, packages/backend/src/modules/netaclaw/session-tree/context_builder.ts, packages/backend/src/modules/netaclaw/session-tree/types.ts, packages/backend/src/modules/netaclaw/service/chat_orchestrator.ts, packages/frontend/src/modules/agent/store/chat.ts, packages/frontend/src/modules/agent/views/chat.vue]
---
# 上下文压缩与历史视图
上下文压缩用于长对话的 token 控制。早期实现更接近在线性消息表上标记 `compactedAt` 和摘要消息;当前架构下,压缩结果应进入 [[session-tree-runtime]],成为 `compaction` 节点,并由 active path 决定是否参与模型上下文。
## 核心目标
- 控制模型上下文窗口。
- 保留长会话的可读摘要。
- 避免切断 assistant/tool 成对消息。
- 支持前端在历史中展示压缩事件。
- 与分支、子 Agent 批次、模型切换共享同一会话树。
## 运行流程
```text
ChatOrchestrator 准备运行
-> SessionTreeContextBuilder 读取 active path
-> 估算上下文 token
-> 达到阈值时触发 compaction
-> CompactionService 生成摘要
-> appendCompaction 写入 session tree
-> runtimeContext 使用摘要后的上下文
-> 前端 snapshot/patch 展示 compaction 节点
```
## 与 Session Tree 的关系
压缩不应只作为消息 metadata 存在。新的表达方式是:
- `compaction` entry 保存摘要、`firstKeptEntryId``tokensBefore`、details。
- `activePath` 决定压缩摘要是否对当前分支生效。
- `runtimeContext.messages``context_builder.ts` 构造,负责把压缩节点转成模型可消费消息。
- 前端 `visibleEntries` 把压缩节点渲染为会话中的结构化提示。
这让压缩和分支天然兼容。
## 手动与自动触发
手动触发仍可通过对话命令或 UI 入口发起。自动触发由 Agent 配置中的上下文阈值控制,运行前由后端判断是否需要压缩。
配置页面需要注意:
- 压缩阈值是 Agent 运行配置的一部分。
- 辅助模型配置会影响压缩质量和成本。
- 压缩结果在刷新后应从 session tree 恢复。
当前还要注意一个过渡事实:
- legacy `netaclaw_message.compactedAt` 相关逻辑仍存在,主要用于兼容旧历史与压缩服务本身。
- 但 Agent Chat 的主展示和主恢复路径已经切到 Session Tree压缩节点应该被理解为 `compaction entry`,不是“数据库里某几条 message 被隐藏了”这么简单。
## 前端展示
Agent 对话页需要展示:
- 压缩开始、完成、失败状态。
- 摘要内容。
- 压缩前 token 数和保留边界。
- 当前是否处于压缩后的 active path。
前端不应自行计算“哪些历史已经压缩”,而应依赖后端 snapshot 和 compaction entry。
## 与子 Agent 的关系
子 Agent 批次也写入会话树,因此压缩时需要明确哪些批次节点进入摘要、哪些仅用于 UI 展示。当前建议:
- `subagent_batch``subagent_result` 可作为可见节点保留。
- 进入模型上下文时使用其摘要信息,而不是完整工具日志。
- 压缩摘要应保留子任务结论和影响主任务的关键事实。
随着子 Agent 回放投影落地,这里的边界也更清楚:
- evidence summary、process replay、tool execution 主要属于 UI/回放层。
- 真正进入压缩摘要和后续 prompt 的,应该是对主任务有语义价值的结论,而不是完整过程事件。
详见 [[subagent-session]]。
## 相关页面
- [[agent-runtime]]
- [[session-tree-runtime]]
- [[subagent-session]]
- [[frontend-architecture]]
- [[websocket-gateway]]
- [[prompt-builder]]