> ## Documentation Index
> Fetch the complete documentation index at: https://docs.avibe.bot/llms.txt
> Use this file to discover all available pages before exploring further.

# Vibey 怎么记事

> 长任务里，较早的对话每次都要被压缩；Vibey 怎样在这个过程中记住目标、你的原话和下一步。

每个模型都有上下文窗口，长任务迟早会把它撑满：一整天的代码审阅、一串排队的任务、要走几百步的一次迁移。想继续做下去，agent 就得一次又一次地压缩前面的对话。这一页讲 [Vibey](https://docs.avibe.bot/zh/agents/vibey.md) 是怎么做的，以及为什么这样设计。效果如何，见[记忆评测](https://docs.avibe.bot/zh/agents/vibey-memory-benchmark.md)。

## 问题在哪

常见的做法是每次都让模型把到目前为止的一切重新写成一份摘要。每次重写丢一点，重写多了，损失就累积起来：

* **长期目标逐渐变淡。** 每次重写都要重新判断什么还重要。开头定下、最近没再提的目标，先是越写越短，然后就消失了。
* **子任务被当成"目标"。** 摘要抓住的是最近发生的事。眼前这个子任务一做完，摘要就写"任务已完成"，而它所属的那件大事其实还有好几项没做。
* **你的话被转述走样。** 你提的约束先被转述一遍，转述又被再转述。限制变松，授权被放大或丢掉；后台消息里一句"用户要求……"，也可能被当成你说的话。

一个典型的例子：你让 agent 把一串 PR 从旧到新挨个处理，只有需要你拍板时才来找你。压缩几轮之后，重写出来的摘要只记得眼前正在审的那个 PR，却忘了整个队列、处理到了哪里，也忘了你说过什么时候才来打扰你。

## 心智、备忘和现场

Vibey 的压缩叫作检查点（checkpoint）。它是整理，不是记账：就像人在睡眠中整理一天的经历，Vibey 回顾做过的事，逐层修订自己的理解，放下细节。原始对话一直保存着，放下的细节需要时可以查回来。

一个检查点分三部分，各有各的变法：

| 部分 | 装的是什么 | 怎么变 |
| - | - | - |
| **心智**（mind） | Vibey 对这件事的理解：为谁、为什么，目标，关键决策，经验 | 一处一处地修订，没变的地方一字不动。使命条目不能删除。 |
| **备忘**（memo） | 你的原话：你本人发的、仍在指引工作的那些消息 | Vibey 只勾选带上哪几条，原文由 Avibe 从记录里复制。 |
| **现场**（now） | 眼下这一步、进展、在等什么、下一步 | 每次整篇重写。 |

### 心智

心智分四段，越往前越稳定：

1. **我在这里：** 这件事为谁做、为什么做，Vibey 对什么负责、边界在哪，以及和你的约定：怎么汇报、什么时候问、什么可以自己决定、授权到什么范围。
2. **目标：** **使命**（Mission），用 Vibey 自己的话写这段对话的最终目的；以及为使命服务的各条**工作线**（Workstreams），每条写明状态，有队列的写明处理到哪、下一个是什么。
3. **关键决策，** 每条附上理由。
4. **经验，** 写成以后也用得上的原则。

每次压缩时，Vibey 回顾上一个检查点之后发生的事，用 edit 修订心智：只改有变化的地方，其余保持原样。这个文件只能修改，不能整个覆盖。记忆会不断收拢：做完的工作线收成一行，反复出现的经验合并成一条原则，被推翻的决策并进取代它的那条。如果 Vibey 对某一层的理解从根上变了，比如意识到你真正要的和它原来以为的不一样，它就重写那一段。

使命是锚。使命条目永远不会被删除：做完了、被你撤回或被替换时，就在条目本身标注状态。Avibe 会检查这一点：使命条目比之前少的心智会被拒绝。只有你明确改变时，使命才会变。眼下这一步做完，下一步回到它所属的工作线；工作线做完，回到使命，或者来问你。

每段都有篇幅上限：我在这里 1,000 token，目标 2,000，关键决策 1,500，经验 1,500。上下文窗口在 192,000 token 及以上的模型按这个上限，更小的窗口按比例缩小。

### 备忘

检查点要移出上下文的每一条你本人发的消息，都会成为候选。Vibey 看到的是一张清单：每行一条消息，带复选框、编号和一小段预览。它要做的只有勾选：

* **带上**定方向或改方向、提出约束或禁令、表达偏好、给出授权的消息。
* **放下**已被撤回、取代或已经完成的旧条目，或者含义已完整写进心智的条目。
* **不勾**只用于推进工作的指令（比如"继续"），以及单独看不懂的简短答复。

除了复选框，Avibe 不接受任何改动。随后它按勾选结果，从记录里把每条消息的原文复制进检查点。模型从不重新抄写你的话，所以它们不会走样。每条消息最多保留 300 token，更长的会被截短，并注明全文是第几条消息。勾选的消息合计最多 3,000 token；窗口小于 192,000 token 的模型按比例缩小。

没被勾选的消息下次不会再列出，但它仍以原编号留在记录里。

### 现场

现场是工作状态，每个检查点都重新写：

* 眼下这一步，以及它属于哪条工作线
* 进展：已完成、进行中、阻塞或待决
* 在等什么：后台命令、Watch、定时任务、委派出去的运行、在等你回答的问题，附上 id
* 下一步：紧扣你最近的明确请求，引用你的原话
* 踩过的坑：犯过的错、被证伪的假设、走不通的路，附上错误原文
* 精确引用：继续工作所需的路径、id、命令、链接和数值

## 一次检查点怎么走

```mermaid theme={null}
flowchart TD
    A["上下文接近模型的上限"] --> B["检查点回合（同一个模型）：<br/>修订心智、勾选备忘、写现场"]
    B --> C{"Avibe 校验<br/>三部分"}
    C -- "有问题" --> D["一次修复请求，<br/>之后按兜底规则处理"]
    D --> E
    C -- "合格" --> E["Avibe 拼装检查点：<br/>心智、从记录里取的你的原话、<br/>现场、文件、Skill"]
    E --> F["它替换较早的对话，<br/>Vibey 接着做同一件事"]
```

当下一次请求将超过模型上下文窗口的约 90% 时，检查点开始。如果给回复预留的空间和安全余量需要更多位置，或者模型在某个上下文长度以上单价变高，检查点会更早开始。

首先，Avibe 往会话的临时目录里写两个文件：上一份心智（第一次是空模板）和备忘清单。接着，检查点回合暂停手头的工作，在同一个模型上、基于当前的对话进行。Vibey 可以读文件，但只能修改这两个文件，最多五轮工具调用。请求会告诉 Vibey：这条请求来自 Avibe，不是你，不能被记成你说的话。

检查点之后，每次请求带着：

1. 系统提示词，每个回合重新生成：Vibey 的身份、规则、Skill 目录，以及你的 `AGENTS.md` 文件。检查点从不压缩它。
2. 检查点，以 Vibey 自己的回忆的口吻呈现，而不是新的指令。其中你的原话和约定仍然有效。
3. 最近的消息，原样保留，最多 20,000 token。在小模型上，上限是检查点阈值的四分之一。

如果检查点落在正在进行的回合中间，你在这个回合里发的消息保持原样。检查点会写明它们就是当前的请求，两者不一致时以你的消息为准。

## 谁说的话

并不是每条输入都来自你。Watch、定时任务、回调和其他 Agent 会话，也会往会话里发消息。每条不是人发的输入，开头都有一行来源标记，比如：

```text theme={null}
[Harness: Watch <watch-id> "<watch name>"]
[Harness: Task <task-id> "<task name>"]
[Harness: agent run <run-id> from #<session-id>]
[Harness: callback of run <run-id> from #<session-id>]
```

这一行由 Avibe 根据输入的投递方式写入，从不依据消息文字，所以一条写着"用户要求……"的后台消息，读起来仍是后台消息。如果你发的消息本身以 `[Harness:` 开头，Avibe 会在前面加上你的名字，所以这个标记无法伪造。来源标记对所有 Agent 后端生效，不只是 Vibey。

检查点两处都用到了它。压缩指令告诉 Vibey：只有你本人发的消息才是你的话。备忘更进一步：它的候选按记录里的消息类型来取，所以 Watch、定时任务、回调或其他会话的消息，不管写了什么，都不可能进入备忘。

## 检查点还带着什么

* **按最近使用放回的 Skill。** 加载过的内容即将离开上下文的 Skill，会按它现在的版本放回来。最近加载的排在前面，每个最多 5,000 token；合计不超过 25,000 token 和模型窗口十分之一中较小的那个，最多 20 个。放回不算重新加载，所以一直没再加载的 Skill 会逐渐被淘汰。被截短的 Skill 会注明怎样用 `vibe skill load` 加载全文。
* **一份简短的文件清单。** 只列路径：最近修改过的 10 个文件、最近读过的 5 个，更早的被挤出时会注明。重要的文件会写进现场的精确引用里。
* **完整记录在哪。** 较早的消息，也就是各条输入和 Vibey 的回复，保存在 Avibe 的数据库里。检查点会告诉 Vibey 它们在哪，以及怎样按时间顺序查你本人的消息。备忘条目的编号就指向那条消息。工具输出不保存在那里；需要时，Vibey 会重新运行工具。

你也可以自己查同一份记录：

```bash theme={null}
vibe data query --sql "SELECT context_seq, substr(content_text,1,300) FROM messages WHERE session_id='<session-id>' AND type='user' ORDER BY context_seq LIMIT 50" --format text
```

## 校验与兜底

每个检查点在使用前都要经过 Avibe 的校验：

* **现场：** 恰好一个检查点块，且达到最低长度。
* **心智：** 每个标题都完整、顺序不变，使命条目不比之前少，每段都在上限以内。
* **备忘：** 除了复选框什么都没改，勾选的消息在预算以内。

Avibe 会发一次修复请求，把发现的问题一次列全。修复之后仍不合格的，按兜底规则处理，宁可多留，不少留：

| 修复后仍有的问题 | Avibe 怎么处理 |
| - | - |
| 没有可用的现场 | 这次检查点失败，上下文保持原样。 |
| 心智结构坏了，或超过上限的两倍 | 保留上一份心智。 |
| 心智某段超出上限 | 完整的心智存进记录。检查点里这一段显示为截短，并指向 `~/.avibe` 下一份完整心智的只读副本。 |
| 备忘被改了复选框以外的内容，或者因为回合用完了工具轮数而原样未动 | 所有候选消息都带上：你的话只多不少。 |
| 勾选的消息超出预算 | 每条均匀缩短，并注明全文在哪。如果这样还放不下，就保留第一条和最新的几条，其余的以原编号留在记录里。 |

检查点失败不会改动任何东西：还放得下的请求照常发出，后面的请求会再试。如果对话大到放不进一个检查点回合，Vibey 会改为只对较早的一部分（最多约一半）做检查点，最多尝试两次。请求已经放不下、又做不成检查点时，Vibey 会不调用模型，直接把最早的约一半移出去。放得下的话，这一步会保留上一个检查点：它的心智、现场和 Skill，以及一份带上所有被移出的、你本人发的消息的备忘。同一次运行里有两次检查点失败或腾出的空间太少之后，这次运行不再做检查点，只靠这一步腾出空间。如果单是最新的工具输出就放不下，它会被截短，并注明这一点。

## 你会看到什么

什么都不会打断你。没有提示，也没有 `/compact`：Vibey 在回合中间做完检查点，接着做同一件事。这个回合会稍慢一点，因为检查点要向同一个模型多发几次请求，和其他请求一样消耗 token。检查点失败也是静默的，原因记在 Avibe 的日志里。

只有在已经没有东西可以移出时，你才会听到和上下文有关的消息。这时 Vibey 会停下，并说明是什么太大，比如：**本次对话已经太长，无法可靠地继续。请发送 /new 开始一个新会话。**

## 限制

* **压缩不等于完整。** 不在心智、备忘、现场或最近消息里的内容，就不在上下文里了。Vibey 需要到记录里去查；想再看某个工具的输出，要重新运行它。
* **心智和现场由模型来写。** 检查点的质量取决于写它的模型，不同模型的结果有差别，见[评测](https://docs.avibe.bot/zh/agents/vibey-memory-benchmark.md)。
* **预算有上限。** 很长的消息在备忘里会被截短，用编号指向全文。窗口小于 192,000 token 的模型，心智和备忘的预算按比例缩小。
* **只属于一个会话。** 检查点是它所在会话的记忆。
* **只用于 Vibey。** Claude Code、Codex、OpenCode 在 Avibe 里照原样运行，用它们自己的方式压缩上下文。后台输入的来源标记对它们同样生效。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.