Skip to content

持久记忆

Triggerfish 智能体具有持久的跨会话记忆。智能体可以保存事实、偏好和上下文,这些在对话、重启甚至触发器唤醒之间保持不变。记忆受分类门控——智能体不能读取高于其会话 taint 的内容,也不能以低于会话 taint 的级别写入。

工具

memory_save

将事实或信息保存到持久记忆中。

参数类型必需描述
keystring唯一标识符(例如 user-nameproject-deadline
contentstring要记住的内容
tagsarray用于分类的标签(例如 ["personal", "preference"]

分类自动设置为当前会话的 taint 级别。智能体不能选择记忆存储在什么级别。

memory_get

通过键检索特定记忆。

参数类型必需描述
keystring要检索的记忆的键

如果记忆存在且在当前安全级别可访问则返回内容。更高分类的版本会遮蔽较低的版本。

使用自然语言搜索所有可访问的记忆。

参数类型必需描述
querystring自然语言搜索查询
max_resultsnumber最大结果数(默认:10)

使用 SQLite FTS5 全文搜索和词干提取。结果按当前会话的安全级别过滤。

memory_list

列出所有可访问的记忆,可选按标签过滤。

参数类型必需描述
tagstring要过滤的标签

memory_delete

按键删除记忆。记录被软删除(隐藏但保留用于审计)。

参数类型必需描述
keystring要删除的记忆的键

只能删除当前会话安全级别的记忆。

记忆工作原理

自动提取

智能体主动保存用户分享的重要事实——个人详情、项目上下文、偏好——使用描述性键。这是由 SPINE.md 引导的提示级行为。LLM 选择保存什么;策略层强制在什么级别保存。

分类门控

每条记忆记录携带一个等于保存时会话 taint 的分类级别:

  • CONFIDENTIAL 会话期间保存的记忆被分类为 CONFIDENTIAL
  • PUBLIC 会话不能读取 CONFIDENTIAL 记忆
  • CONFIDENTIAL 会话可以同时读取 CONFIDENTIALPUBLIC 记忆

这通过每次读取操作的 canFlowTo 检查来执行。LLM 不能绕过此检查。

记忆遮蔽

当同一个键存在于多个分类级别时,只返回对当前会话可见的最高分类版本。这防止跨分类边界的信息泄露。

示例: 如果 user-name 同时存在于 PUBLIC(在公开聊天中设置)和 INTERNAL(在私密会话中更新),INTERNAL 会话看到 INTERNAL 版本,而 PUBLIC 会话只看到 PUBLIC 版本。

安全

  • 分类始终在 PRE_TOOL_CALL hook 中被强制设为 session.taint——LLM 不能选择更低的分类
  • 所有读取通过 canFlowTo 过滤——高于会话 taint 的记忆永远不会被返回
  • 删除是软删除——记录被隐藏但保留用于审计
  • 智能体不能通过读取高分类数据并以更低级别重新保存来升级记忆分类(降级写入防护适用)

安全 LLM 永远不会选择记忆分类。它始终被策略层强制设为当前会话的 taint 级别。这是一个不能被配置掉的硬边界。 :::