以前每个会话从零开始,funes 让 AI 编程代理记住上次的决定
funes 是一个本地记忆工具,解决的是 AI 编程代理的失忆问题。每个新会话都从零开始,上一个会话里的内容和做过的决定不会自动带过来。Claude Code、Codex、pi、Hermes 这四种代理的历史会话轨迹,会被它索引进一个 Lance 数据集。之后代理可以直接从这个数据集里取用记忆。
安装
安装走命令行。一条 curl 命令装好二进制,然后运行 funes add codex,也可以换成 claude、pi、hermes。这条命令会构建第一个索引、注册工具并安装钩子,之后新对话轮次会被自动索引。
用法
查询记忆有两个命令。funes recall "why did we switch off the streaming parser" 返回来自真实会话的排名段落,每个命中都标了出处。用 funes get <session_id> --from 40 --to 60 可以打开对应上下文。funes ask claude "what did we decide about the storage layout" 先在本地检索,再把检索段落交给选定的代理回答。
数据边界
funes 在数据安全上做了几层防护。索引流程是确定性的:解析转录、分块、本地嵌入、存成 Lance 数据集。这条路径上没有 LLM。嵌入模型固定并记录在数据集里,查询时遇到不兼容模型会直接拒绝。push 时有一个始终开启的 fail-closed 扫描,含秘密的块不会离开机器。本机装了 TruffleHog 的话,索引阶段还会先给检测到的凭据脱敏。
有一个边界需要分开说。ask 的检索在本地完成,但生成回答要调用所选代理。这个环节是否离线取决于代理本身。funes 能保证的是索引和存储路径的确定性,不是整条推理链的隔离。
存储与检索
存储用 Lance 格式。一个 Lance 数据集目录装下全部内容。chunks.lance 里是文本、出处和向量,_indices 里是 BM25 和向量索引,_versions 里是已提交版本。不需要为同一份记忆维护多套数据库。
检索是混合的。向量搜索抓语义,BM25 抓精确的名称、错误、标识符和路径。候选结果重排后再按新近度加权,较新的决定权重更高。已完成轮次会产生确定性的块 ID,重新索引时不会重复嵌入已经写过的块。记忆是一个可重建的产物,源转录才是事实来源。
定位
funes 把自己定位成本地召回层,不改写历史,只把代理做过的事变成可查询的索引。