跳转到内容
Crystal CodeDocs
简简体中文

压缩

Crystal 不缩减上下文。每轮模型之前,以及回合后压缩检查之前,可选的微压缩可以把旧的成功工具结果替换为 Tool result omitted after compaction.。它不调用模型。最后 protectTurns 个用户回合保持完整,然后更早成功结果中最新的 protectTokens 保持完整。更早的成功结果只有在被移除文本的估计大小超过 minimumTokens 时才被替换。替换它们的占位符不从该估计中减去。用户文本、助手文本和失败结果保留。遍历在先前摘要处停止。存档、屏幕、恢复、分叉和导出保留原始工具文本。改写保存在模型记录上。随后的压缩决定使用该记录的估计,因为先前的提供商用量仍计入被移除的文本。省略 microCompaction 时微压缩关闭。/compact micro 切换它,on 或 off 设置它,写入 config.json,且不总结。回合或压缩期间它被拒绝。/status 只在它打开时增加 Microcompaction 行。默认是 2 个回合、40000 个受保护 token 和 20000 个最小 token。protectTurns 必须至少为 1。token 计数必须非负。无效值拒绝启动。完整压缩自己的修剪不跟随此开关。

当估计的记录大小或上一轮模型用量超过模型上下文窗口配置比例与可用窗口(上下文减去保留输出)中的较小者时,宿主会:

  1. 在受保护的最近区间(2 个用户回合和 40000 个 token)之外清除旧工具结果,当这样能释放超过 20000 个 token 时。
  2. 请求对较早回合做一次结构化摘要,折叠任何先前摘要,并逐字保留最近尾部。尾部是可用窗口的 25%,至少 2000 个 token,至多 32000。该摘要请求遵循与模型轮次相同的 retry 策略。除非启用了 compactionModel,否则会话模型编写它。摘要提示保留 min(会话模型 maxTokens, 16384) 个 token,且从不超过有效摘要窗口的一半,因此小于 16384 的窗口仍可被总结。没有 maxTokens 的模型在窗口足够大时保留 16384。结束原因是 length 的摘要不被存储。
  3. 如果摘要请求本身放不下,或摘要者什么都不返回且修剪没有帮助,则停止。回合不会循环重试压缩。

CTX 百分比在一轮流式输出时使用上一轮模型的提供商用量,然后在下轮报告前于每个工具批次之后使用本地记录估计。它不是回合中各轮的总和。用量达到或超过窗口时,状态栏可以显示 100%。压缩不阻塞会话循环:进度行保持 Compacting,输入框仍可用。

/compact(别名 /summarize)立即运行,不等待阈值。保留的尾部已经包含每个回合时,它仍然总结最新用户回合之前的一切。该回合之前没有任何内容的会话打印 Nothing earlier to compact。回合正在运行时它被拒绝。/compact model 和 /compact thinking 显示或设置可选摘要者及其档位。/compact summary 切换 showCompactionSummary,/compact auto(别名 automatic)切换 showAutomaticCompactionSummary。/compact micro 切换微压缩。这些命令中的任何一个接受 on 或 off,写入 config.json,且不总结。任何其他参数被拒绝。config.json 中的 compactionModel 是 enabled、provider、model 和可选的 thinkingEffort。省略对象表示关闭,enabled: false 保留已存储的提供商、模型和档位但不使用。关闭时,摘要请求使用会话客户端并省略推理。打开时,宿主打开单独的客户端,并以与审批模型相同的方式映射该模型的档位:没有思考则省略推理,模型允许时 off 禁用它,default 或不支持的档位使用提供商默认值且不改变已保存的档位。更改会话模型不替换该客户端。必须先总结的附带问题打开自己的压缩客户端并释放它;答案仍使用会话模型。触发条件、保留尾部和 CTX 百分比留在会话窗口上。摘要提示预算是该窗口与压缩模型声明窗口中的较小者。放不下的摘要走现有的不写入摘要的路径。/status 只在开关打开时增加 Compaction model 行。crystal、crystal space 和 crystal run 为一个进程接受 --compaction-model on|off、--compaction-provider、--compaction-model-id 和 --compaction-thinking。这些标志不写入 config.json。on 需要已保存的选择,或同一条命令上的提供商和模型 id。被折叠头部中的用户和助手文本被摘要替换;它们不留在摘要旁边。屏幕保留较早的行。showCompactionSummary 打开时(默认;打开时从 config.json 省略,关闭时为 false),手动 /compact 在这些行下方的圆角面板中打印已存储的摘要,标题为 Earlier context。自动压缩只打印 Compacted context,除非 showAutomaticCompactionSummary 打开。该开关默认关闭,启用前从 config.json 省略,并使用同一面板。它不改变 /compact 本身。没有摘要文本的压缩不打印摘要。总结私有副本的附带问题不打印它。

每个完成的回合之后、成功的 /compact 之后,以及有序退出且记录有用户消息或压缩摘要时,会话写入 ~/.crystal/sessions/<id>.json。文件存储压缩后的模型记录(活动系统提示、一份摘要、最近尾部,以及带可读文本和不透明提供商状态的推理项)、上次用量快照和累计提供商用量。crystal --resume(-r)为此工作区打开终端选择器。crystal --resume <id> 加载该文件并留在进程工作区。crystal --resume <path> 列出该目录,在选择器前询问信任,并在选定会话后进入该目录。Escape 让进程工作区保持不变。crystal --resume all 列出每个工作区,显示每条路径,并在信任后进入所选会话的工作区。同时设置 --workspace 和 --resume <path> 时,它们必须指向同一目录。缺失或空的会话退出且不进入 TTY。/resume、/resume <path> 和 /resume all 在运行中的会话内使用相同规则。/resume <id> 恢复该记录并留在当前工作区。词 all 被保留。既是已存在目录又是会话 id 的值被拒绝。工作区更改后,活动系统提示从该目录的 Plan/Work 文本刷新;摘要和尾部保留。选择器按更新时间列出可恢复会话,最新的在前,支持按 id、预览或工作区路径键入过滤,Escape 时不触碰当前会话。用量被恢复,使状态栏、/status 和下一次压缩决定有基线。引入累计用量之前保存的会话保留未知的累计值,而不是把上次请求当作整个会话。/clear 开始一个新 id。

/sessions 按更新时间降序列出当前工作区可恢复的会话;/sessions all 包括每个工作区。当前 id 被标记,每行保留完整 id,以便用于 /resume <id> 或 /fork <id>。空的和不可读的会话文件被省略。

/fork 先持久化当前对话,把它的记录、压缩摘要、待办、模式、计数和用量基线复制到新 id,并在该 id 上继续。源快照在其原 id 下仍然可用,不被分支覆盖。/fork <id> 改为分支一个已保存的会话。分支使用当前工作区和刷新后的活动系统提示。分叉在拍快照前停止正在运行的回合;列出会话不会。