Skip to content

持久記憶

Triggerfish 代理具有持久的跨工作階段記憶。代理可以儲存事實、偏好和上下文,在對話、重啟甚至觸發器喚醒之間存活。記憶具有分類閘控——代理無法讀取超過其工作階段 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 版本。

儲存

記憶透過 StorageProvider 介面儲存(與工作階段、排程任務和待辦事項使用的相同抽象)。全文搜尋使用 SQLite FTS5 進行快速的自然語言查詢和詞幹分析。

安全性

  • 分類始終在 PRE_TOOL_CALL hook 中強制設定為 session.taint——LLM 無法選擇較低的分類
  • 所有讀取都由 canFlowTo 過濾——永遠不會回傳超過工作階段 taint 的記憶
  • 刪除是軟刪除——記錄被隱藏但為稽核保留
  • 代理無法透過讀取高分類資料並在較低等級重新儲存來提升記憶分類(降級寫入防護適用)

安全性 LLM 永遠不會選擇記憶分類。它始終由策略層強制設定為目前工作階段的 taint 等級。這是一個無法透過配置移除的硬邊界。 :::