持久记忆
Triggerfish 智能体具有持久的跨会话记忆。智能体可以保存事实、偏好和上下文,这些在对话、重启甚至触发器唤醒之间保持不变。记忆受分类门控——智能体不能读取高于其会话 taint 的内容,也不能以低于会话 taint 的级别写入。
工具
memory_save
将事实或信息保存到持久记忆中。
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
key | string | 是 | 唯一标识符(例如 user-name、project-deadline) |
content | string | 是 | 要记住的内容 |
tags | array | 否 | 用于分类的标签(例如 ["personal", "preference"]) |
分类自动设置为当前会话的 taint 级别。智能体不能选择记忆存储在什么级别。
memory_get
通过键检索特定记忆。
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
key | string | 是 | 要检索的记忆的键 |
如果记忆存在且在当前安全级别可访问则返回内容。更高分类的版本会遮蔽较低的版本。
memory_search
使用自然语言搜索所有可访问的记忆。
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
query | string | 是 | 自然语言搜索查询 |
max_results | number | 否 | 最大结果数(默认:10) |
使用 SQLite FTS5 全文搜索和词干提取。结果按当前会话的安全级别过滤。
memory_list
列出所有可访问的记忆,可选按标签过滤。
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
tag | string | 否 | 要过滤的标签 |
memory_delete
按键删除记忆。记录被软删除(隐藏但保留用于审计)。
| 参数 | 类型 | 必需 | 描述 |
|---|---|---|---|
key | string | 是 | 要删除的记忆的键 |
只能删除当前会话安全级别的记忆。
记忆工作原理
自动提取
智能体主动保存用户分享的重要事实——个人详情、项目上下文、偏好——使用描述性键。这是由 SPINE.md 引导的提示级行为。LLM 选择保存什么;策略层强制在什么级别保存。
分类门控
每条记忆记录携带一个等于保存时会话 taint 的分类级别:
- 在
CONFIDENTIAL会话期间保存的记忆被分类为CONFIDENTIAL PUBLIC会话不能读取CONFIDENTIAL记忆CONFIDENTIAL会话可以同时读取CONFIDENTIAL和PUBLIC记忆
这通过每次读取操作的 canFlowTo 检查来执行。LLM 不能绕过此检查。
记忆遮蔽
当同一个键存在于多个分类级别时,只返回对当前会话可见的最高分类版本。这防止跨分类边界的信息泄露。
示例: 如果 user-name 同时存在于 PUBLIC(在公开聊天中设置)和 INTERNAL(在私密会话中更新),INTERNAL 会话看到 INTERNAL 版本,而 PUBLIC 会话只看到 PUBLIC 版本。
安全
- 分类始终在
PRE_TOOL_CALLhook 中被强制设为session.taint——LLM 不能选择更低的分类 - 所有读取通过
canFlowTo过滤——高于会话 taint 的记忆永远不会被返回 - 删除是软删除——记录被隐藏但保留用于审计
- 智能体不能通过读取高分类数据并以更低级别重新保存来升级记忆分类(降级写入防护适用)
安全 LLM 永远不会选择记忆分类。它始终被策略层强制设为当前会话的 taint 级别。这是一个不能被配置掉的硬边界。 :::
