如何在VPS上为Claude Code添加Recall记忆
Recall 0.4.0是完全本地运行的Claude Code插件,记录每次会话并生成可恢复摘要。本文介绍VPS安装、Python 3.9要求及实际节省的token。
Claude Code 记忆功能中的 Recall
Recall 是一个 Claude Code 插件,可让每个项目跨会话保留记忆。它会在项目中的 .recall/ 文件夹内写入两个 Markdown 文件:一个只追加的事件日志,以及一份简短的进度摘要。这两份文件都由本地 Python 摘要程序在当前工作机器上生成,因此记忆本身不会消耗 API token。
它解决的是一个持续存在但范围很小的问题。您在周二关闭 VPS 上的会话。到了周三,Claude Code 对周二发生的内容一无所知。您可以手动重新说明项目,也可以让模型再次读取半个代码库来推断上下文。这两种方式都会消耗 token,后者消耗的 token 更多。
截至 2026 年 7 月,Recall 的当前版本是 0.4.0,项目采用 MIT 许可证。它是一个插件。其中没有任何代码会发起网络请求。
VPS 上的环境要求
Recall 的捕获钩子是随插件发布的 Python 脚本。它不依赖第三方组件,因此唯一的实际要求是 Python 解释器。
python3 -VUbuntu 24.04 的回答是 Python 3.12.3。Recall 支持 Python 3.9 及更高版本。最小容器镜像有时完全不包含解释器,此时 shell 会返回 python3: command not found。继续操作前,请先安装解释器。
sudo apt update && sudo apt install -y python3NumPy 可作为摘要器其中一个步骤的可选加速组件。您不需要安装它。
python3 -c "import numpy"ModuleNotFoundError: No module named 'numpy' 在这里是可接受的回答。摘要器包含纯 Python 执行路径,项目测试套件会检查两条路径是否选择相同的句子。
会话记忆对服务器比对笔记本电脑更重要,因为服务器上的工作通常分散在数天内,每次只进行短时间操作。如果您已经在 VPS 的 tmux 中运行 Claude Code,Recall 就能将昨天的会话带入今天的工作中。
从插件市场安装 Recall
在 Claude Code 会话中输入以下两个命令:
/plugin marketplace add raiyanyahya/recall
/plugin install recall@recall第二个命令会读取 plugin@marketplace。此处两个名称都是 recall,看起来像是复制粘贴错误,但实际并不是。
运行插件自带的命令,检查安装是否成功:
/recall:show/recall:show 会输出当前摘要。对于全新的项目,目前还没有可输出的内容,因此实际检查的是该命令是否存在。如果 Claude Code 无法识别 /recall:show,则表示插件未加载,也不会触发任何 hook。
如果要从检出目录运行,请先克隆仓库并进行验证:
git clone https://github.com/raiyanyahya/recall ~/recall
cd ~/recall && claude plugin validate .claude plugin validate . 会读取 .claude-plugin/ 中的清单,并报告插件格式是否正确。然后在项目目录中使用 claude --plugin-dir ~/recall 启动 Claude Code。
Hook 写入的内容和写入时机
Recall 会注册 3 个 Claude Code hook。每个 hook 都会从插件目录运行一个 Python 脚本。
SessionStart在启动、恢复和清除时触发。它会显示context.md,让会话打开时直接看到摘要。Stop在 Claude 每次完成响应时触发。它会将本轮内容追加到日志。SessionEnd在会话关闭时触发,并可重新生成摘要。
这些 hook 会生成 2 个文件,均位于 .recall/ 中。
history.md是只追加的记录,包含提示、响应、涉及的文件和执行的命令。context.md是生成的摘要,包含目标、摘要、后续步骤、涉及的文件、执行的命令和 git 上下文。
完成一次实际会话后,查看该目录。
ls -la .recall/你应该能看到其中包含内容的 history.md。你可能完全看不到 context.md,这是默认行为,不表示发生故障。auto_save_context 是 off,除非你设置了它,因此只有在明确要求时才会写入摘要:
/recall:save该命令会对 history.md 运行本地摘要程序,并重写 context.md。算法先使用 TF-IDF(词频、逆文档频率)评分,再使用 TextRank 对句子排序。该算法具有确定性,并采用抽取式方式,也就是说,它只会选择日志中已有的句子。该步骤不会调用模型,因此无需付费,并且可在计算机离线时运行。
配置单个项目的 Recall
配置位于项目根目录的 recall.config.json 文件中。以下是软件提供的默认配置:
{
"output_dir": ".recall",
"capture_history": true,
"summary_sentences": 8,
"redact": true,
"include_git": true,
"max_input_chars": 200000
}output_dir设置两个文件的存储位置。请将其保留在项目内。capture_history用于开启或关闭history.md日志。auto_save_context接受off或on_end,默认值为off。summary_sentences设置保留到context.md中的句子数量。增大该值会生成更长的摘要,并略微增加会话启动时的负载。redact会在任何内容写入磁盘前,删除常见的密钥模式。include_git会将当前差异和最近的提交添加到摘要中。max_input_chars限制摘要程序单次读取的history.md数量。
对于运行在 VPS 上的项目,建议启用自动保存。服务器上的会话通常会因终端断开而结束,而不是在您决定停止时结束。
{
"auto_save_context": "on_end",
"summary_sentences": 12
}如果暂时不想捕获内容,又不想修改配置,请创建暂停标记。删除该标记后即可恢复捕获。
touch .recall/.capture-paused在处理生产环境凭据的会话前执行此操作,因为脱敏只是过滤器,并不能提供保证。一般而言,也应避免让 AI 代理接触密钥:最安全的密钥是代理从未见过的密钥。
Recall 可节省多少 token?
这取决于替代方案是什么。在会话开始时加载摘要,成本很低。但被替代的操作可能成本很高,因为不了解项目的模型必须通过读取文件重新了解项目。
The data behind this chart
[
{
"label": "Recall context.md",
"char_count": "4,800",
"est_tokens": "1,200"
},
{
"label": "Hand-written CLAUDE.md",
"char_count": "3,200",
"est_tokens": "800"
},
{
"label": "Re-reading the repo",
"char_count": "120,000",
"est_tokens": "30,000"
},
{
"label": "Full transcript replay",
"char_count": "340,000",
"est_tokens": "85,000"
}
]以下是中型项目的典型数据,不是对您的项目进行的测量。加载 Recall 摘要大约需要 1,200 个 token,这与项目发布的 1000 到 2000 个 token 的恢复成本估算一致。重新载入完整的历史记录会加载整个对话,约为 85,000 个 token。让模型通过读取文件重新了解项目,成本介于两者之间,约为 30,000 个 token;随着代码仓库增大,该数值也会增加。CLAUDE.md 行用于提供尺度参考:它更便宜,因为内容简短且固定,并且它告诉模型您一贯遵循的规则,而不是昨晚发生了什么。
请测量您自己的数据。1 个 token 大约对应 4 个英文散文字符,代码通常略少。如果您还在同一台 VPS 上将摘要提供给本地模型,请先检查摘要进入的上下文窗口,再信任恢复结果,因为 Ollama 会在较小的默认上下文长度下截断过长的提示,而不是告知您末尾内容已被丢弃。
wc -c .recall/context.md .recall/history.md
echo $(( $(wc -c < .recall/context.md) / 4 ))在会话中,/context 显示当前加载到上下文窗口的内容,/cost 报告会话总量。先冷启动一个会话,再启动下一个已加载摘要的会话,然后进行比较。若要完整了解会话 token 的实际消耗位置,请参阅 Claude Code 如何消耗 token,其中提供了详细分解。
有一点需要注意,才能准确理解这一结论。摘要会在每次会话开始时加载,因此,您从未使用过的摘要不是节省,而是一项小额开销。如果会话运行时间不长,请让 summary_sentences 保持默认值附近。较安静的会话可以减少另一部分开销,因为 将代理引导到可行的最小修改 会生成更短的日志,供摘要器排序。
无会话时重新生成摘要
如果您克隆了该代码仓库,摘要生成器提供了独立的命令行入口。在 VPS 上,如果终端会话意外断开,但您仍需要摘要,这个入口很有用。
python3 ~/recall/scripts/make_context.py --help帮助输出会列出它支持的选项:--cwd 用于指定项目根目录,--transcript 用于指定明确的会话记录文件,--quiet 用于禁止输出,--harness 用于在 claude 和 opencode 之间进行选择。将其指向一个项目:
python3 ~/recall/scripts/make_context.py --cwd /srv/projects/api它会读取会话记录并执行 history.md,然后将 context.md 写入您指定的目录。如果您通过 marketplace 安装,插件会位于由 Claude Code 管理的目录中,而 /recall:save 是执行相同操作的受支持方式。
为何没有写入任何内容
完整会话结束后没有 .recall/ 目录。 钩子从未运行。输入 /recall:show 确认插件已加载,然后运行 python3 -V。钩子命令会先尝试 python3,再尝试 python;因此,如果两者都不存在,系统不会写入任何内容,也不会提示错误。
history.md 在增长,但 context.md 从未变化。 auto_save_context 默认设置为 off。运行 /recall:save,或将该键设置为 on_end,让 SessionEnd 钩子执行此操作。
文件出现在错误的项目下。 Recall 会相对于 Claude Code 的启动目录写入文件,因此从主目录启动会话时,记忆文件会写入主目录。从项目根目录启动,并使用 ls -la .recall/ 查找文件实际写入的位置。
采集已停止,但没有任何提示。 使用 ls -a .recall/ 检查暂停标记。您上周创建的 .capture-paused 文件仍在生效。
长会话结束后,摘要内容很少。 max_input_chars 会将摘要生成器的输入限制为 200000 个字符,因此很长的日志会被截断。请轮换该日志。
mv .recall/history.md .recall/history-2026-07-30.md随后运行一个简短会话,并再次检查 ls -la .recall/,确认已生成新的 history.md。
Recall 的局限
Recall 由日志和摘要器组成。需要明确它不会处理哪些问题。
摘要器采用抽取式方法。TextRank 会从 history.md 中选择已有句子,因此不会判断某个决策是否正确。周二记录的错误方向,到了周三看起来与正确决策完全一样。遇到重要事项时,请阅读 context.md 并手动修正。它是一个 Markdown 文件,您可以直接编辑。
Recall 不提供搜索功能。每个项目只有一份当前摘要和一份持续增长的日志,无法跨项目查询记忆。如果您想知道三周前对数据库做了什么决定,就需要在 history.md 中使用 grep。Recall 也不会在会话之间传递信息:两个会话同时打开同一台 VPS 时,无法看到彼此的日志。因此,一个会话需要了解另一个会话正在做什么时,可以在运行过程中直接在会话之间传递文本。
Recall 不会帮助处理会话内部的问题。会话进行到一半时上下文窗口被填满,是另一个问题,需要采用不同的解决方法;管理单个会话中的上下文窗口是本指南的配套文章。
摘要在设计上始终被视为不可信输入。context.md 会以带围栏并标注的形式注入,Claude 在依赖它之前会先询问。这样设计是因为,已提交的 .recall/ 目录中,任何拥有提交权限的人都可以写入代理将要读取的文本。代理在读取内容时会询问多少问题,由会话启动时使用的权限模式决定;自动模式将于 14 August 2026 成为 Claude Code 的默认模式。请一次性决定 .recall/ 是个人使用还是共享使用:用于个人记忆时,将其添加到 .gitignore;用于共享时,提交它,并像审查其他贡献一样进行审查。如果代理在无人值守的情况下运行,请参阅在 VPS 上安全运行 Claude Code,了解更广泛的安全边界。
脱敏只能尽力而为。它会针对 API 密钥、令牌、PEM 块和 .env 赋值等常见模式。提交前请阅读 .recall/。
版本号准确反映了项目的成熟度。2026 年 7 月的版本为 0.4.0,配置键和文件布局在不同版本之间仍可能发生变化。因此,升级所依赖的配置前,请先阅读变更日志。
FAQ
Recall 会将我的代码或会话记录发送到其他地方吗?
不会。捕获钩子和摘要器都是在您自己的计算机上运行的 Python 脚本,插件不包含 API key,也不会发起网络请求。摘要使用 TF-IDF 和 TextRank,而不是模型,因此该步骤不产生任何费用,并且可在离线状态下运行。代价是摘要采用抽取式方式:它会从日志中选择句子,而不是生成新的句子。
为什么我的 .recall/context.md 缺失或不是最新版本?
auto_save_context 默认为 off,因此只有运行 /recall:save 时才会重新生成摘要。在 recall.config.json 中设置 "auto_save_context": "on_end",即可在每个会话结束时重写摘要。如果 history.md 也缺失,说明钩子根本没有运行:使用 /recall:show 确认插件已加载,然后确认该计算机上的 python3 -V 能够返回结果,因为这些钩子是 Python 脚本。
Recall 每个会话可以节省多少内容?
加载摘要大约需要 1,200 个 token,而让模型重新读取代码库并确定当前进度,通常需要 30,000 个 token。以上是典型数值。请在会话中使用 wc -c .recall/context.md 和 /context 命令,比较冷启动与从摘要恢复的会话,测量您自己的实际数值。
我仍然需要 CLAUDE.md 文件吗?
需要,而且两者用途不同。CLAUDE.md 是您有意编写的内容,包括持续适用的规则和构建命令。context.md 根据上一个会话中实际发生的内容生成,因此会记录您通常不会主动写下来的未完成迁移。请同时保留两者。
一台 VPS 可以为多个项目保存记忆吗?
可以。Recall 会将记忆保存在每个项目目录中的 .recall/ 内,因此同一台服务器上的两个项目会使用相互独立的日志和摘要。每次都从项目根目录启动 Claude Code,因为这些文件跟随工作目录,而不是用户账户。