如何让 AI 编码 Agent 记住过去的所有会话?Agent-Historian 跨 Agent 历史搜索实战
你有没有遇到过这种情况:AI 编码 Agent 刚在上一轮会话中找到了某个棘手 Bug 的根因、跑了三组调试命令、最终定位到配置文件的一行错误——然后新开一个会话,它又从零开始,重新读文件、重新跑命令、重新推导结论?
如果你同时使用多个 Agent(OpenCode 写代码、Claude Code 做 Code Review、Codex CLI 跑实验),情况更糟——每个 Agent 只记得自己当前的会话,彼此之间完全是信息孤岛。
这个问题不是配置失误,而是当前几乎所有 AI 编码 Agent 的设计限制:它们大多会话间无状态。每次新会话都是一张白纸。
为什么这是个大问题?
以一串真实工作流为例:
- 早上你在 OpenCode 中排查了一个
go.sum合并冲突,找到了go mod tidy的正确命令 - 下午换到 Claude Code 做 Code Review,又遇到同样的
go.sum冲突 - Claude Code 不知道你早上已经解决过——它重新分析、重新尝试、甚至可能给出错误的手动合并方案
这就浪费了:重复的 Token 费用(重新读文件+重新推理)+ 你的时间(等待 Agent 重复工作)+ 出错风险(不同 Agent 给出不同方案)。
现有的解决方案都不够好
| 方案 | 原理 | 问题 |
|---|---|---|
--resume / --continue | 加载一个完整会话 | 一次性全塞进上下文,没有搜索能力;只能恢复单个 Agent |
| 记忆层(mem0, OpenMemory 等) | Agent 自行摘要并存储关键事实 | Agent 只保存它认为重要的东西,大量的命令、错误日志、调试过程被遗漏;摘要可能有损耗 |
| RAG / 向量数据库 | 将对话分块+嵌入,语义搜索 | 需要额外搭建基础设施(嵌入模型+向量库+索引管道),成本高 |
| 手动翻日志 | grep ~/.claude/projects/* | 格式不统一,不同 Agent 的日志结构不同 |
有没有一种方案:开箱即用、零基础设施、只读不写、跨 Agent、精确回溯真实文本?
有——Agent-Historian。
Agent-Historian:给 AI Agent 装上一个「历史搜索引擎」
Agent-Historian 是一个 MIT 许可的 CLI 工具,核心能力就一句话:通过命令行搜索和读取过去所有 Agent 的会话记录——不分 Agent、不需要索引、不修改任何数据。
它的设计哲学非常清晰:
不给 Agent 装「记忆」,而是让它读自己已经写下的真实记录。
因为每次 Agent 会话的所有命令、输出、错误、决策已经原原本本地保存在磁盘上了(OpenCode 的 SQLite 库、Claude Code 的 JSONL 文件、Codex 的会话目录),Agent-Historian 只是提供了一层统一搜索接口。
安装
npm install -g agent-historian # 安装后得到 ochist 命令
或者用 Homebrew:
brew install adlternative/tap/agent-historian
或者不安装直接运行:
npx agent-historian sources
要求 Node ≥ 18。如果你要搜索 OpenCode 的会话,需要 Node ≥ 22.5(内置 node:sqlite);不满足时 OpenCode 源会被自动禁用,其他 Agent 源不受影响。
快速上手:先看看 Agent-Historian 能「看到」什么
安装后第一个命令:
ochist sources
它会自动检测本地安装了哪些 AI 编码 Agent,并报告每个源的状态:
- OpenCode(
opencode.db) - Claude Code(
~/.claude/projects/*.jsonl) - Qoder(
~/.qoder/projects/**/*.jsonl) - Codex CLI(
~/.codex/sessions/**/rollout-*.jsonl)
目前支持 4 种主流 Agent,架构设计上支持扩展新 Agent——只需实现一个 HistorySource 接口,注册到注册表即可。
核心用法:四种搜索模式
Agent-Historian 设计了渐进式披露(progressive disclosure)的工作流,目的是让 Agent 只把真正需要的行拉入上下文窗口,而不是一股脑倾倒整份会话记录。
1. 搜索——找到候选会话
ochist grep "ssh authorized_keys" --limit 5
返回匹配的会话 ID、片段、以及匹配行所在的 part_id。支持正则和子串匹配,默认只在当前项目目录搜索(--global 扩大到所有项目)。
2. 确认——查看元信息
ochist meta
返回可靠的结构化元数据:会话时间、工作目录、使用的 Agent、总消息数。不依赖 LLM 摘要,直接从存储层读取。
3. 定位——浏览消息概览
ochist show| grep -i "ssh-copy-id"
每行一条消息的概要(角色 + 前几个字),方便快速定位目标消息。可配合 grep / head / wc 做过滤。
4. 读取——获取完整内容
ochist part
只读取某一条消息的完整文本——所有命令、输出和决策记录原样呈现,没有摘要、没有重写、没有损耗。
让 Agent 自动使用历史搜索:安装 Agent Skill
Agent-Historian 最实用的功能之一,是附带了 Agent Skill——教 AI 编码 Agent「在开始新研究之前,先检查历史记录」。
安装方式有三种:
推荐方式(跨 Agent):
npx skills add adlternative/agent-historian -g
这会安装到 OpenCode、Claude Code、Cursor、Codex 等所有支持 Skills 的 Agent 中。
版本锁定方式(与 CLI 版本同步):
ochist skill install --global --all
安装后,当你对 Agent 说「我之前改过哪里」「上次的命令是什么」「看看我们之前怎么解决的」,Agent 就会自动调用 ochist 搜索本地会话历史,而不是从零开始重新研究。
实际案例:合并冲突不再重复解决
README 中有一个真实案例:
一个
go.sum冲突——正确的修复方式是go mod tidy而非手动编辑。上一轮会话中 Agent 已经执行过这个命令。新一轮会话它忘了,试图手动合并并出错。让它查 Agent-History 后,它找到了之前的命令,立即做了正确的事。
为什么记忆层没有捕获这个?因为 Agent 只保存它决定要记住的东西——除非你明确告诉它「记住这个修复命令」,否则这个细节永远不会进入记忆库。而本地会话文件永远有每一条命令和输出,Agent-Historian 读取的是这个「地真」。
Agent-Historian vs 其他方案:什么时候用什么
| 场景 | 推荐方案 |
|---|---|
| 需要找到之前_确切执行过_的命令和结果 | Agent-Historian(精确回溯) |
| 想让 Agent 记住「用户偏爱 pnpm」「部署走 staging」等持久偏好 | 记忆层(mem0 等,携带结构化知识) |
| 需要在大规模语料库上做语义搜索 | RAG/向量库(需要额外基础设施) |
| 只想恢复最近一个会话 | --resume / --continue(免费、无搜索) |
Agent-Historian 和记忆层是互补的——前者回答「给我看上次到底做了什么」,后者回答「帮我记住用户喜欢什么」。
为什么选择 CLI + Skill 而非 MCP 服务器?
这个设计决策值得一提:Agent-Historian 最初是 MCP 服务器,后来主动转向 CLI + Skill。原因很有启发性:
- Agent 已经有 Shell 了:CLI 方式下 Agent 可以自然地组合
ochist grep ... | head -5 | grep -i error | jq,而 MCP 需要预先定义每个过滤参数 - 零常驻成本:CLI 按需运行,MCP 服务器在整个会话期间占用上下文(工具 Schema 每轮都在)
- Skill 教「何时用」「怎么用」:MCP 只暴露能力,Skill 承载了
locate → orient → scan → read的完整工作流 - 人类和 Agent 用同样的方式:人直接在终端跑
ochist,Agent 在 Shell 里跑完全相同的命令,输出也一样
隐私与透明度
Agent-Historian 只读取本地会话文件,不会联网。它有一个可选的用量统计(~/.agent-historian/usage.log),只记录时间戳、子命令、是否有查询,不记录查询文本、结果、路径。可以通过 AGENT_HISTORIAN_NO_TELEMETRY=1 或 DO_NOT_TRACK=1 完全关闭。
局限与未来
需要诚实地说:Agent-Historian 读取的是各 Agent 的本地存储格式,而这些格式大多未经正式文档化。Agent 版本更新可能导致读取器需要适配。并且它是纯文本搜索(词法匹配),不支持语义理解——如果你想搜索「修复了性能问题」但会话中用的是「优化了查询速度」,词法搜索就帮不上忙了。
开发者自己也坦言:
最理想的终局是 Agent 自身内置这个能力——OpenCode 的
session show、Claude Code 的--resume进化成可读可搜的原生命令。如果那样,Agent-Historian 就不再需要了——而那是好事。
在那之前,Agent-Historian 填补了一个真实且迫切的空白:跨 Agent、只读、零基础设施的会话历史搜索。
总结
如果你同时使用多个 AI 编码 Agent,或者即使只用其中一个但经常跨会话工作,Agent-Historian 值得一试。它的安装成本几乎为零(npm install -g agent-historian),带来的价值却可能帮你节省大量的重复 Token 和时间。
核心要点:
- 安装:
npm install -g agent-historian - 主要命令:
ochist grep(搜索)、ochist show(浏览)、ochist part(读取) - 安装 Agent Skill:
npx skills add adlternative/agent-historian -g - 开源许可:MIT
- GitHub:https://github.com/adlternative/agent-historian