Hindsight for OpenCode:给每个项目装上专属记忆库

前言

用过 AI 编程工具的人大概都有这种体会:明明上一个会话还聊得好好的,换个项目再回来,它又把你当陌生人。

OpenCode 也不例外,每次新会话都是一片空白。

Hindsight 就是来解决这个问题的。
这是一个开源的长效记忆系统,它为 AI 工具装上”脑子”——之前聊过的项目上下文、代码决策、踩坑经验,之后都能自动回想起来。

更实用的是,Hindsight 的 OpenCode 插件支持为每个项目创建独立的记忆库,项目 A 的记忆不会污染项目 B。

插件安装

Hindsight for OpenCode 以 npm 包形式发布,直接在 opencode.json 中声明即可。

打开项目根目录的 opencode.json(或全局配置 ~/.config/opencode/opencode.json),在 plugin 数组里加上插件配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"$schema": "https://opencode.ai/config.json",
"plugin": [
["@vectorize-io/opencode-hindsight", {
"hindsightApiUrl": "http://<your-server-ip>:8888",
"autoRecall": true,
"autoRetain": true,
"recallBudget": "mid",
"retainEveryNTurns": 3,
"debug": false
}]
]
}

OpenCode 启动时会自动从 npm 安装插件,不需要手动执行 npm install
插件安装后直接连接到你指定的 Hindsight 服务器地址。

如果你用的是 Hindsight Cloud 云服务,需要更换 hindsightApiUrl 并加上 API Token:

1
2
3
4
5
6
7
8
9
["@vectorize-io/opencode-hindsight", {
"hindsightApiUrl": "https://api.hindsight.vectorize.io",
"hindsightApiToken": "your-api-key",
"autoRecall": true,
"autoRetain": true,
"recallBudget": "mid",
"retainEveryNTurns": 3,
"debug": false
}]

API Key 在 ui.hindsight.vectorize.io/connect 注册获取。

每个项目独立记忆库

这是整个插件最实用的特性:动态记忆库 ID。

默认情况下,所有项目共享同一个记忆库(bankId 固定为 opencode)。
这就意味着 A 项目的记忆会在 B 项目的会话中被召回,两个项目的上下文互相干扰。

开启动态记忆库后就不一样了:

1
export HINDSIGHT_DYNAMIC_BANK_ID=true

Hindsight 会根据当前项目的特征自动推导一个唯一的 bankId,默认的组合规则是 agent::project
A 项目启动的会话自动关联 A 项目的记忆库,B 项目启动的会话自动关联 B 项目的记忆库,互不干扰。

支持的特征字段包括 agent(角色名)、project(项目目录名)、channel(渠道名)和 user(用户标识)。
如果你需要更细的隔离粒度,可以自定义组合,但默认的 agent::project 已经覆盖了最常见的场景。

插件提供的三个工具

安装并连接成功后,Hindsight 会注册三个工具给 OpenCode 的 AI Agent:

  • hindsight_retain,主动存储信息到长期记忆,适合记录重要的架构决策、踩坑经验
  • hindsight_recall,搜索长期记忆中的相关信息,跨会话检索之前讨论过的内容
  • hindsight_reflect,综合多条记忆给出一个回答,适合需要总结归纳的场景

这些工具 AI Agent 可以在会话中直接调用。
但多数情况下你不需要手动触发它们,插件有自动机制。

自动记忆与召回

Hindsight 的两个自动行为让记忆真正”无感”。

auto-retain:当会话进入空闲状态时,插件自动把当前对话内容存入记忆。
你可以通过 retainEveryNTurns 控制存储频率。
默认每 3 轮交互保存一次。

auto-recall:每次新会话启动时,插件自动检索与该项目相关的历史记忆。
这些记忆会被注入到系统提示词中。
AI Agent 加载后就拥有了之前会话的上下文,不需要你主动”提醒”。

当 OpenCode 压缩上下文窗口时,插件也会先保存当前会话内容再压缩,确保记忆在上下文截断后不会丢失。

持久配置

如果不想在每个项目里重复配,可以创建 ~/.hindsight/opencode.json 文件,这里面的配置对所有项目生效:

1
2
3
4
{
"hindsightApiUrl": "http://<your-server-ip>:8888",
"recallBudget": "mid"
}

配置的优先级从低到高依次是:

默认值 < ~/.hindsight/opencode.json < opencode.json 插件选项

后面的会覆盖前面的,灵活度很高。

完整配置参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"$schema": "https://opencode.ai/config.json",
"plugin": [
["@vectorize-io/opencode-hindsight", {
"hindsightApiUrl": "https://api.hindsight.vectorize.io",
"hindsightApiToken": "your-api-key",
"bankId": "my-project",
"autoRecall": true,
"autoRetain": true,
"recallBudget": "mid",
"recallTags": [],
"retainTags": [],
"retainEveryNTurns": 3,
"debug": false
}]
]
}

几个关键选项说明:

  • bankId:静态记忆库 ID,不开启动态模式时使用
  • recallBudget:召回量,可选 low / mid / high,默认 mid
  • recallTags / retainTags:按标签过滤存储或召回
  • retainEveryNTurns:自动保存频率,每 N 轮交互存一次

写在最后

Hindsight 给 OpenCode 补上了最关键的一环:记忆。

安装只需要在配置里加一行插件声明,连接 Hindsight 服务器后,每个项目就有了自己独立的记忆空间。
之前讨论过的架构、发现过的 bug、做过的决策,新会话直接继承,不需要重复交代。