如何在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 更多。
Recall 版本 0.4.0 于 18 July 2026 发布。截至 October 2026,它仍是最新版本,项目采用 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。
钩子写入什么内容,以及何时写入
Recall 会注册 3 个 Claude Code 钩子。每个钩子都会从插件目录运行一个 Python 脚本。
SessionStart在启动、恢复和清除时触发。它会显示context.md,让会话打开时即可看到摘要。Stop在 Claude 每次完成响应时触发。它会将本轮内容追加到日志。SessionEnd在会话关闭时触发,并可重新生成摘要。
这些钩子会生成 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?
这取决于它替代了什么。在会话开始时加载摘要的成本很低。但它替代的操作可能成本很高,因为没有项目记忆的模型需要通过读取文件重新了解项目。
此图表背后的数据
[
{
"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 行用于提供参照:它内容较短且固定,因此成本更低;它告诉模型需要长期遵守的规则,而不是昨晚发生了什么。
请测量你自己的数值。英语 prose 中,1 个 token 大约对应 4 个字符;代码通常略少一些。如果你还将摘要提供给同一台 VPS 上的本地模型,请先确认摘要进入的上下文窗口大小,再依赖恢复功能,因为 Ollama 的默认上下文长度取决于可用的 VRAM。
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。如果系统中两者都不存在,命令会向 stderr 输出错误,并以退出状态 127 结束。Claude Code 会显示非阻塞式钩子错误通知,其中包含 stderr 的第一行。
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 也不提供实时协作:同一项目中的两个会话共享日志文件,但 Recall 不会将新的日志条目推送到另一个会话的上下文中。因此,当一个会话需要了解另一个会话正在执行的操作时,会话可以在运行期间直接互相传递文本。
Recall 不会解决会话内部的问题。会话进行到一半时上下文窗口耗尽,是另一个问题,需要使用不同的解决方法;管理单个会话内的上下文窗口是本指南的配套文章。
摘要在设计上会被视为不可信输入。context.md 会以带围栏并标注的形式注入,Claude 在依赖它之前会先询问。这样设计是因为,已提交的 .recall/ 目录中,任何拥有提交权限的人都可以写入代理将要读取的文本。代理在读取内容时会多频繁地询问,取决于会话启动时使用的权限模式。使用 Claude Code v2.1.283 或更高版本时,在所有计划和提供商的交互式终端及 VS Code 会话中,自动模式已经是内置的启动模式,因此大多数操作由分类器而不是您进行审查;采用 HIPAA 配置的组织仍会以手动模式启动。请先决定 .recall/ 是个人数据还是共享数据:个人记忆应将其加入 .gitignore;如果要提交,则应像审查其他贡献一样审查它。如果代理无人值守运行,在 VPS 上安全运行 Claude Code介绍了更广泛的安全边界。
脱敏只能尽力而为。它会处理 API 密钥、令牌、PEM 块和 .env 赋值等常见模式。提交前请阅读 .recall/。
版本号如实反映了项目的成熟度。0.4.0 仍是 2026 年 10 月的最新版本,配置键和文件布局在不同版本之间仍可能变化,因此升级依赖的配置前,请先阅读变更日志。
FAQ
Recall 会将我的代码或会话记录发送到其他地方吗?
不会。捕获钩子和摘要程序都是在您自己的计算机上运行的 Python 脚本。该插件不保存 API 密钥,也不会发起网络请求。摘要使用 TF-IDF 和 TextRank,而不是模型,因此不产生额外费用,并且可在计算机离线时运行。代价是摘要采用抽取式方式:它会从日志中选择句子,而不是生成新的句子。
为什么找不到我的 .recall/context.md,或者它不是最新内容?
auto_save_context 默认为 off,因此只有运行 /recall:save 时才会重新生成摘要。在 recall.config.json 中设置 "auto_save_context": "on_end",即可在每个会话结束时重写摘要。如果 history.md 也不存在,请检查 capture_history、.capture-paused 标记,以及是否有可用的会话记录:在这些情况下,运行中的钩子会跳过历史记录写入。使用 /recall:show 确认插件已加载,然后确认该主机上的 python3 -V 可以正常响应,因为这些钩子是 Python 脚本。
Recall 每个会话可以节省多少内容?
加载摘要大约需要 1,200 个令牌;相比之下,如果模型需要重新读取您的代码仓库来确定当前进度,通常需要 30,000 个令牌。这些只是典型数值。请在会话中使用 wc -c .recall/context.md 和 /context 命令,对比冷启动与从摘要恢复的会话,测量您自己的数据。
我仍然需要 CLAUDE.md 文件吗?
需要。这两者的用途不同。CLAUDE.md 是您有意编写的内容,包括长期规则和构建命令。context.md 根据上一个会话中实际发生的情况生成,因此会记录那些您通常不会想到要写下来的未完成迁移。请同时保留两者。
一台 VPS 可以为多个项目保存记忆吗?
可以。Recall 会在每个项目目录中的 .recall/ 内保存记忆,因此同一台服务器上的两个项目会保留相互独立的日志和摘要。每次都从项目根目录启动 Claude Code,因为这些文件跟随工作目录,而不是用户账户。