
给你的编码代理一个你拥有的记忆

编码 agent 每次启动都像面对一个陌生项目:上个会话的推理、决策、踩过的坑,随会话结束一起消失。换一台机器、换一个 agent,一切从零开始。此前《Software Forgets: Agent Traces Are the Memory》指出,agent 的 trace 本身就是被丢失的记忆,但 trace 只是档案——上万轮日志没法靠 grep 回答「为什么我们放弃了 streaming parser」。
funes 把这个潜在记忆变成可用记忆。它是给 Claude Code、Codex、pi、Hermes 等编码 agent 用的持久记忆层,构建在你机器上已有的会话之上。一条命令安装(curl 安装脚本),再执行 funes add claude 即可:它会建首个索引、给 agent 添加 recall 和 get 工具,并安装自动化钩子,让每个完成的 turn 都被增量索引。旧内容以有界步骤回填,不需要每次全量重嵌。
使用上,你照常工作。任务涉及过去的决定、理由或发现时,agent 会在对话内主动调取记忆,并注明答案来自哪个会话。recall 返回的是原始文本而非摘要,包含 agent、时间戳、会话和 turn 的精确出处;每个结果附带 get 命令,可展开完整上下文。底层是一条确定性 pipeline:把各 agent 的 trace 解析成统一的 turn-and-block 结构,分块后用固定的本地模型嵌入,写入本地 Lance 数据集。查询时融合向量检索与 BM25,用 cross-encoder 重排,按时间衰减加权,再附上相邻 chunk。
这种设计带来三个关键特性:第一,多个 agent 共享同一种记忆格式,recall 可跨 Claude Code、Codex、pi、Hermes 的历史检索,并标明每条来源;第二,原始证据不被压缩成摘要,结果总能追溯回产生它的那个 turn;第三,默认本地运行,不需要账号或 Hub 仓库,嵌入和重排都在本机完成。
记忆不局限于单机。执行 funes add codex acme/funes-memory 可以把记忆绑定到你拥有的 Hugging Face 数据集(默认私有),本地索引每个 turn,在会话边界发布。另一台机器执行同样命令,记忆就跟随过去。发布前会再次扫描每条 chunk,拦截疑似密钥;认证信息在索引阶段已被脱敏,相关机制记录在 SECURITY.md。读取远端记忆时,funes 会缓存数据集文件,热查询依然接近本地速度。Hub 负责所有权、访问控制、版本和分发,你不需要把记忆交给一个独立的记忆服务。
除了 agent 自动调用,你还可以用 funes ask 直接向记忆提问,它只读、不改变 agent 配置,返回有来源的答案。检索不到时不会硬凑:agent 会明说。官方还发布了 funes 开发过程的记忆,任何人都可以提问「为什么 funes 是 append-only」这类问题。
在 handoff-vs-recall 基准上,作者对比了三种方式:会话压缩(compaction)、手写交接文档、recall。两个任务都需要会话先验知识才能作答。compaction 是默认方式,但结果分裂:一个任务成功,另一个失败——失败时摘要把关键发现压扁了。recall 直接返回原文,不需要经过摘要存活。成本上,recall 在两个任务上都是最便宜的,比手写 handoff 分别便宜 8x 和 4x。
适用场景包括:跨机器恢复历史、新队友第一天就能检索团队数月决策、开源维护者发布与 release 相关联的会话记录。funes 本身依赖开源组件:可在本地运行的嵌入模型、Lance 的 append-only 数据集、Hub 的缓存与去重。项目开源在 github.com/huggingface/funes。


