一次排查里,你可能花了一个小时才理清为何要改动解析器;换到下一个 agent 或开启新任务后,这些关键上下文却往往随之消失。Funes 会在本地索引 agent 会话,带着来源信息返回原始证据,并可让 Claude Code、Codex、pi 和 Hermes 共用一份 memory。但有一点必须明确:Funes 负责找回历史,至于旧决策是否仍适用于当前情况,仍需由你的 agent 判断。
本文以 Claude Code → Codex 的实际配置为主线,同时介绍纯本地 memory、可选的 Hugging Face 同步、通用 MCP 客户端,以及如何确保召回的历史真正可靠可用。
先划定 memory 的边界,再开始安装
如果你正在评估 Funes,或处理敏感仓库,建议先从本地 memory 开始。只有在需要跨机器或团队共享同一份历史时,再绑定 Hugging Face dataset。
| 模式 | 存储位置 | 适合的起步场景 | 主要注意事项 |
|---|---|---|---|
local | 本地 Lance dataset | 一位开发者、一台机器 | memory 不会自动跟随你迁移到另一台主机 |
<org>/<repo> | 本地 Lance 数据加一个 Hugging Face Dataset repository | 在不同 agent 或机器之间切换 | 会话轨迹中可能包含敏感代码、prompt、路径或凭据 |
Funes security policy 表示,默认情况下,解析、分块、embedding 和 reranking 都在本地完成。只有运行 funes push,或使用会在会话边界发布数据的 shared-memory integration 时,数据才会离开机器。由 Hub 支持的 memory 本质上是一个 dataset repository,因此首次 push 前务必确认其可见性设置。
首次试用建议选择 local。之后如需切换绑定,只要重新运行 funes add <agent> <memory> 即可。
安装 Funes,并建立第一份索引
官方 Funes repository 提供了 shell 安装脚本:它会识别平台、下载带标签的二进制文件、校验发布 checksum,并默认把可执行文件放到 PATH 中的 ~/.local/bin:
curl -fsSL https://huggingface.co/buckets/huggingface/funes/resolve/install.sh | sh
如果系统暂时找不到 funes,请打开一个新 shell,然后检查安装状态:
funes status
该 repository 提供 Linux x86_64、Linux aarch64 和 macOS Apple Silicon 的带标签二进制文件。若你的平台不在列表中,请使用项目的从源码构建说明,不要默认预编译安装脚本一定适用。
五分钟完成首次初始化
在需要保留历史的 agent 会话已经存在的机器上,运行:
funes add claude
对于 Claude Code,这一步可以建立首个索引、注册读取工具、安装 integration automation,并持续索引已完成的 turn。首次处理采用 text-first 策略,文档称确认后约需一分钟。它会优先处理文本与推理内容,再处理体积庞大的工具输出。(Funes setup documentation)
随后查看当前状态:
funes status
如果需要手动初始化或刷新 Claude 会话,请使用:
funes index --harness claude
未指定路径时,funes index 会搜索 Claude、Codex、pi 与 Hermes 的标准会话目录,其中包括 ~/.claude/projects 和 ~/.codex/sessions。指定 --harness claude 后,扫描范围会限制为 Claude Code。indexing guide 还说明,未指定路径的刷新约有 60 秒的 text-first 处理预算;较早的会话和大型工具结果可能需要后续处理才能补齐。
Funes 的索引是增量式的,因此重复运行不会再次对已写入的 chunk 执行 embedding。显式指定的 transcript 路径与 Hub trace repositories 会完整建立索引,不受无路径模式处理预算的限制。(Indexing details)
为 Claude Code 接入 Funes
要为 Claude Code 使用本地 memory,请运行:
funes add claude local
funes status
local 是默认值,因此也可以省略。如果终端中可用 HF token,Funes 可能会询问是否配置一个归你所有的 <user>/funes-memory repository;如果只是进行纯本地试用,请拒绝该提示。
Claude integration 使用仅含 hooks 的 plugin,并另行注册 MCP。Funes 不会修改 Claude Code 的 settings.json;它的 automation 会索引已完成的 turn,而 shared-memory configuration 则会在会话边界增加发布操作。(Automation behavior)
打开 Claude Code 后,不要只看安装是否成功,应使用一个已知的历史决策进行测试:
Find the previous decision about the streaming parser. Use Funes recall if the repository history does not explain it, and cite the session you used.
理想结果应当指向较早的一段内容,标明对应的 session,并能区分旧实验与当前仓库状态。
若想移除 integration 而不删除已存数据,运行:
funes remove claude
removal documentation 说明,这会移除 Funes 的接入配置,但会保留本地 memory、原始 transcripts、缓存以及已发布的 memory。
让 Codex 读取同一份 memory
Claude Code 工作正常后,将 Codex 接入相同的本地 memory:
funes add codex local
funes status
如果要使用由 Hub 支持的 shared memory,两个 agent 都应使用同一个 repository identifier:
funes add claude <org>/<repo>
funes add codex <org>/<repo>
Codex 有一个很容易遗漏的信任步骤。Funes 会将 hooks 写入 ~/.codex/hooks.json;进入 Codex 后,运行 /hooks,检查 Funes 条目并将其设为 trusted。在 hooks 被信任之前,Codex 会跳过它们,因此新 turn 不会被索引,memory 也不会发布。文档中的 bound-memory workflow 要求 Codex 版本为 0.151.0。(Codex automation requirements)
做一次真正的跨 agent 交接测试
选择一个只在其中一个 session 出现过、且足够有辨识度的决策:
- 在 Claude Code 中找到解析器决策,并记下讨论里的一个独特术语。
- 结束该 session,让索引与边界 automation 有机会运行。
- 在 Codex 中询问这个术语,并要求给出此前的推理过程。
- 确认响应将 Claude 标识为 source harness,并指向原始 session 或 turn。
你也可以直接在终端中检查证据:
funes recall "why did we switch away from the streaming parser"
recall 返回的是排序后的原始段落,而不是生成式摘要。每个命中结果都会包含来源信息和一条生成的 get 命令;若要查看周边 turn,请复制并执行该命令。
如果 Codex 没有返回任何结果,请检查版本、/hooks 的 trust 状态、funes status,以及 Claude session 是否早于 integration 的配置时间。随后使用原始讨论中的独特术语再次尝试。
接入 pi、Hermes 或其他 MCP 客户端
除 Claude Code 和 Codex 外,Funes 还直接支持 pi 与 Hermes。Pi 使用 extension events;Hermes 使用 shell hooks,其按 turn 索引的功能在文档中仍标注为 beta。(Supported-agent details)
对于这四种之外兼容 MCP 的客户端,可将 Funes 作为本地 stdio server 运行:
{
"mcpServers": {
"funes": {
"command": "funes",
"args": ["mcp"]
}
}
}
如需将 server 绑定到 shared memory,请在 mcp 后加入 repository:
{
"mcpServers": {
"funes": {
"command": "funes",
"args": ["mcp", "<org>/<repo>"]
}
}
}
MCP documentation 提供 recall、get 和 status。funes mcp 为只读模式:它不会索引会话,也不会发布数据。这些工作需要通过 funes index、funes push 或受支持的 funes add integration 完成。
单次 MCP 调用中指定的 memory 会覆盖 server 层级的绑定。两者都未指定时,Funes 使用本地 memory。
用 recall 找回历史,但不要放弃核验依据
Funes 提供三种不同的使用方式:
| 命令 | 输出 | 适用场景 |
|---|---|---|
funes recall "…" | 带 provenance 的原始段落排序结果 | 需要自行检查证据 |
funes get … | 被引用的 turn 及其周边上下文 | 命中内容相关,但信息仍不完整 |
funes ask <agent> "…" | 一条有依据的自然语言答案 | 希望从 Claude 或 Codex 快速得到答案,但不想安装 integration |
文档列出的 recall 默认参数包括:8 个命中结果、30 条结果的 reranked candidate pool、30 天的 recency half-life,以及 1 个相邻 chunk。(Recall flags and defaults)
一套可靠的调试流程如下:
- 使用错误信息、组件名称或决策短语运行
funes recall。 - 根据生成的
get命令查看完整 turn。 - 将找回的决策与当前 branch 对照。
- 进行改动或运行实验。
- 用实验结果再次 recall,方便下一次 session 找到它。
funes ask 的范围更窄。它会先执行检索,再把选中的段落和你的问题交给 Claude 或 Codex,生成一条答案。子 agent 不会获得 tools、stdin 或 MCP servers,也无法在首次匹配不佳后重新检索。虽然检索在本地完成,但问题与召回段落会发送给所选 agent 配置的 provider。因此,ask documentation 建议:对于不希望发送给该 provider 的内容,应使用 funes recall。
让 memory 保持可信,也便于长期维护
Funes 会保留原始段落和 provenance,但无法替你判断每一个历史 workaround 是否依然适用。
“当 memory 只是朴素的基础设施——本地索引、精确 provenance、默认私有——coding agents 就会少很多奇怪行为。” — @TheArtemisHunts on X
一份简短的生产环境检查清单
| 情况 | 检查项 | 处理方式 |
|---|---|---|
| Codex 没有召回结果 | Hook trust 与版本 | 运行 /hooks,信任 Funes 条目,并确认 Codex 为 0.151.0 |
| 旧会话缺失 | 索引范围与处理层级 | 运行 funes index --harness claude 或 --harness codex;允许后续处理补齐大型输出 |
| 远程 push 被阻止 | TruffleHog 与 token scope | 安装 TruffleHog 或设置 FUNES_TRUFFLEHOG;仅在 push 机器上使用细粒度 write token |
| 结果中包含 secret | 本地 scrub 状态 | 运行 funes scrub,然后再次 push;源 transcripts 不会被修改 |
| 远程 memory 已共享 | 可见性与信任边界 | 除非明确打算公开共享,否则保持 dataset 为私有;将召回的第三方文本视为不受信任的 agent input |
| 最后一个 session 尚未上传 Hub | 边界时机 | 淘汰机器前运行 funes push <org>/<repo> |
Funes 会在索引期间清除凭据,并在发布前执行 fail-closed 的 TruffleHog 扫描。push documentation 指出,缺少 scanner 会阻止发布;如果有效凭据已进入远程 dataset,应立即轮换,因为对后续 commit 进行 scrub 无法抹除 repository history。
Hugging Face token 应遵循最小权限原则:负责发布的机器使用 write scope,仅用于 recall 的团队成员或主机使用 read-only scope。两台机器同时向同一个 remote memory 发布也可能产生竞争;automation documentation 并未承诺提供跨机器 serialization。
实际该怎么选
不必一开始就安装所有 integration,可以按以下场景选择起步配置:
| 工作流 | 推荐配置 | 原因 |
|---|---|---|
| 一位开发者评估持久化 memory | funes add claude local | 数据共享风险最低,回退也最简单 |
| Claude Code 负责规划,Codex 负责实现或 review | 将两者绑定到同一份 local memory | 在单台主机上保留跨 agent 的推理过程 |
| 多台机器上的 agents | 将两者绑定到同一个私有 <org>/<repo> memory | 通过 Hub dataset 让 memory 跟随开发者流转 |
| 团队项目历史 | 私有 dataset,加上供读取者使用的 read-only tokens | 将发布权限与 recall 访问权限分开 |
| 不受支持的 MCP agent | funes mcp [memory] | 增加只读访问,同时让索引操作保持显式 |
| 敏感源材料 | 本地 memory 加 recall | 避免远程发布,以及向 provider 进行一次性传输 |
Funes coding agent memory FAQ
Funes 是本地运行的吗?
Funes 默认在本地处理和存储 memory。它采用 local-first,而不是自动 local-only:push、shared-memory hooks 和 ask 都可能将数据发送到本地进程之外。
Funes 支持 Claude Code 和 Codex 吗?
支持。funes add 支持 Claude Code、Codex、pi 和 Hermes。Codex 的 memory binding 需要版本 0.151.0,并且 hooks 已被信任。
Funes 会自动索引会话吗?
运行 funes add 后,受支持的 integrations 会安装按 turn 索引的 automation。首次初始化有处理上限,因此旧会话和大型工具结果可能需要后续处理。
如何在 Claude Code 和 Codex 之间共享一份 memory?
为 funes add claude 和 funes add codex 传入相同的 <org>/<repo> 参数即可。Funes 会在本地保留工作索引,并在会话边界发布共享 dataset。
如果 Funes 召回了过时的决策怎么办?
先用 funes recall 检查内容,再通过生成的 get 命令展开上下文,并在采取行动前与当前 branch 对照。如果首次检索未命中,请换一种说法重新查询。
funes ask 会让数据留在我的机器上吗?
检索和 reranking 在本地完成,但 ask 会把问题和召回段落发送给已配置的 Claude 或 Codex provider。敏感证据请使用 recall。
不删除 memory 的情况下,能移除 Funes 吗?
可以。funes remove claude、funes remove codex、funes remove pi 和 funes remove hermes 会移除 integration wiring,同时保留已索引的 memory 和 source transcripts。