
agentmemory 架構深度解析基于 iii 引擎的編碼代理持久化內存服務【免費下載鏈接】agentmemory#1 Persistent memory for AI coding agents based on real-world benchmarks項目地址: https://gitcode.com/GitHub_Trending/age/agentmemoryagentmemory 是一個面向 AI 編碼代理coding agents的本地持久化內存服務器它捕獲代理工作過程中的觀測observations建立混合檢索索引再通過 REST 與 MCP 兩種面surface把記憶回放給代理。它不自己發明一套運行時而是完整構建在 iii 引擎之上一切能力都以函數 觸發器的形式存在。讀完本文你將掌握 agentmemory 的整體架構骨架、iii 原語的工作方式、三流混合檢索的實現原理、端口布局規則以及記憶從捕獲到遺忘的完整生命周期。agentmemory 是什么一個本地內存服務器從架構定位看agentmemory 是一個常駐本地的內存服務器memory server運行鏈路由三部分組成iii 引擎iii-engine——提供進程內狀態KV、隊列、發布訂閱、定時任務、HTTP 服務器與可觀測性等運行時原語agentmemory worker——由引擎拉起的一個 Node 進程node dist/index.mjs它向引擎注冊全部內存函數對外接口——REST API默認:3111錨定端口與 MCP 工具面供 Claude Code、Cursor、Gemini CLI 等編碼代理接入。worker 啟動時會把~/.agentmemory/.env折疊進進程環境僅當對應鍵未設置時保證真實環境變量優先然后讀取配置并完成全部函數注冊見 src/index.ts 與 src/config.ts。啟動日志會打印引擎地址、provider、embedding 維度、REST 端點與 streams 地址便于確認各組件就緒狀態。iii 原語函數、觸發器與 worker 狀態agentmemory 架構上最重要的一條原則是它沒有獨立的插件系統。所有能力都建立在 iii 引擎的三個原語之上函數functionsworker 通過sdk.registerFunction(mem::xxx, handler)注冊的具名能力例如mem::observe、mem::remember、mem::search、mem::consolidate觸發器triggersHTTP 觸發器api::*把 REST 請求路由到函數內部調用則通過sdk.trigger({ function_id: mem::xxx, payload })觸發另一個函數worker 狀態worker 啟動時用registerWorker(engineUrl, {...})連接引擎聲明自己的 worker 身份與遙測元數據project_name: agentmemory、language: node、framework: iii-sdk此后所有 KV 讀寫都經由引擎狀態層完成。新增一項能力就等于新增一個函數 一個觸發器而不需要任何注冊中心之外的設施。例如注冊mem::observe后REST 側由registerApiTriggers暴露/agentmemory/observe二者共用同一個 handler。函數注冊清單見 src/index.ts。引擎側的 worker 拓撲iii-config.yamlagentmemory 的引擎配置由倉庫根目錄的 iii-config.yaml 描述它定義了引擎內部的一組 worker 拓撲worker 名稱職責iii-httpHTTP 服務默認監聽127.0.0.1:3111配置了 CORS 白名單默認放行 localhost:3111 / localhost:3113與 180s 默認超時iii-stateKV 狀態適配器file_based存儲落盤到./data/state_store.dbiii-queue內置隊列適配器iii-pubsub本地發布訂閱iii-cron基于 KV 的定時任務iii-stream實時流默認監聽:3112file_based落盤./data/stream_storeiii-observability可觀測性采集采樣率0.1避免高負載下日志訂閱積壓形成正反饋指標與日志默認開啟iii-exec執行器監聽src/**/*.ts變更執行node dist/index.mjs拉起 worker這里有兩個值得注意的工程細節其一iii-observability的sampling_ratio: 0.1是為了防止日志訂閱 lag 告警重新進入同一條日志流形成放大循環代碼注釋記錄了某個用戶在幾天內寫出 137GB 日志的真實事故其二iii-exec的 watch 配置是開發態模型運行時 config 會被 CLI 復制到數據目錄并改寫file_path確保狀態庫落在用戶指定的數據目錄而非倉庫內。檢索模型BM25 向量 圖的三流混合召回Recall 是 agentmemory 架構的核心。它采用的是混合檢索BM25 關鍵詞檢索 向量相似度檢索 基于關聯概念的圖擴展三者融合后再做會話級去重與排序。其實現位于 src/state/hybrid-search.ts核心入口tripleStreamSearch依次執行BM25 流對查詢做詞法檢索取limit * 2條候選BM25 索引在啟動時重建或從持久化快照恢復見 src/state/search-index.ts向量流若配置了 embedding provider 且向量索引非空先對查詢生成 embedding再做向量近鄰檢索失敗時優雅降級為純 BM25圖流從查詢中抽取實體extractEntitiesFromQuery經GraphRetrieval.searchByEntities檢索關聯概念再取 Top-5 向量結果通過expandFromChunks做圖擴展形成第二條圖證據路徑圖檢索是 best-effort失敗不影響前兩流。三流結果按RRFReciprocal Rank Fusion融合每條結果記錄其在各流中的排名加權得分w * 1/(RRF_K rank)RRF_K 60再用各流實際產生結果的權重之和做歸一化避免某條流靜默時產生懲罰結果同時命中多條流的會獲得AGREEMENT_BONUS0.05加成——這正體現了圖擴展存在的價值即使關鍵詞或向量命中的不是同一篇文檔只要它們在圖譜上相鄰也能互相增強。融合之后還有兩道后處理diversifyBySession限制同一會話最多貢獻 3 條結果防止單一會話刷屏enrichResults回查 KV 補齊觀測的完整內容。若開啟RERANK_ENABLEDtrue還會對 Top-20 結果做一次重排src/state/reranker.ts。零 API Key 設計默認安裝不需要任何 API key向量 embedding 在本地運行on-device見 src/providers/embedding/local.tsBM25 本身無需外部依賴。此時 boot 日志會明確提示Provider: noop (noop) Embedding provider: local ... Ready. Triple-stream (BM25VectorGraph) search active.LLM provider 只用于兩項可選增強更豐富的摘要LLM compression與上下文自動注入context injection二者都默認關閉需顯式開啟見 src/config.ts 的AGENTMEMORY_AUTO_COMPRESS/AGENTMEMORY_INJECT_CONTEXT。因此記憶檢索的核心鏈路在零成本、零密鑰的前提下即可工作。檢索權重配置混合檢索的三流權重可在~/.agentmemory/.env中調節解析邏輯見 src/config.ts 與 src/index.ts環境變量默認值說明BM25_WEIGHT0.4BM25 流權重非法值回退 0.4上限 1VECTOR_WEIGHT0.6向量流權重非法值回退 0.6上限 1AGENTMEMORY_GRAPH_WEIGHT0.3圖流權重RERANK_ENABLEDfalse是否開啟 LLM 重排EMBEDDING_PROVIDER自動檢測顯式指定 embedding provider未設置時按 GEMINI → OPENAI → VOYAGE → COHERE → OPENROUTER 的鍵順序自動推斷存儲模型與記憶生命周期數據模型記憶memories由以下字段構成內容content、概念concepts、關聯文件files、重要度strength/importance與時間戳createdAt/updatedAt。它們被組織進會話sessions可選地與 git 提交commits關聯。KV 的 scope 劃分定義在 src/state/schema.tsmem:sessions—— 會話元數據project、cwd、observationCount、firstPrompt 等mem:obs:sessionId—— 按會話組織的觀測mem:memories—— 長期記憶含isLatest、version、parentId、supersedes等版本字段mem:summaries、mem:relations、mem:graph:nodes、mem:graph:edges—— 摘要、關聯、知識圖譜其他高級 scopemem:lessons、mem:insights、mem:slots、mem:retention等。生命周期capture → compress → consolidate → forget記憶庫不會無限增長而是由一套捕獲、壓縮、整合、遺忘的生命周期維持越用越有用的狀態1. Capture捕獲mem::observesrc/functions/observe.ts接收來自各類 hook 的載荷pre_tool_use/post_tool_use/post_tool_failure/prompt_submit校驗sessionId、hookType、timestamp后先做去重DedupMap 對 sessionId toolName toolInput 計算哈希再做隱私清洗stripPrivateData隨后按會話級 keyed-mutex 串行寫入 KV 并推送到實時流stream::set/stream::send供 viewer 與訂閱方消費。每條觀測受MAX_OBS_PER_SESSION默認 500上限約束。2. Compress壓縮默認走zero-LLM 合成壓縮路徑buildSyntheticCompression無需 API key 即可把原始觀測提煉成可檢索的標題、敘述與概念并同步寫入 BM25 與向量索引只有顯式開啟AGENTMEMORY_AUTO_COMPRESStrue時才改為調用 LLM 生成摘要代價是 token 消耗與工具調用頻率成正比啟動時會打出醒目告警。3. Consolidate整合mem::consolidatesrc/functions/consolidate.ts把同一項目內達到閾值默認 10 條觀測的會話聚合成長期記憶由 LLM 按系統提示輸出 XML 結構type/title/content/concepts/files/strength隨后寫入mem:memories。此外還有更完整的mem::consolidate-pipeline與每小時/每日定時器CONSOLIDATION_INTERVAL_MS默認 7200000ms即 2 小時驅動自動整合。4. Forget遺忘mem::forgetsrc/functions/remember.ts支持按 memoryId、按 observationIds 或整會話刪除刪除會同步移除 BM25/向量索引條目、圖片引用計數與訪問日志并記錄審計mem::audit。自動遺忘由mem::auto-forgetsrc/functions/auto-forget.ts每小時執行AUTO_FORGET_INTERVAL_MS默認 3600000ms處理三類對象TTL 過期記憶remember時設置ttlDays的記憶到期后自動刪除矛盾記憶同一 concept 桶內 Jaccard 相似度超過 0.9 的成對記憶刪除較舊的一條并保留審計記錄低價值觀測超過 180 天且 importance ≤ 2 的觀測被回收。dryRun參數支持只預覽不執行方便評估影響面。另外mem::remember還內置了記憶版本化與取代機制src/functions/remember.ts保存新記憶時用 BM25 索引召回候選與新內容做 Jaccard 相似度比較相似度 0.7 則新記憶取代舊記憶舊版本保留在 KV 中供 viewer 查看版本鏈但移出檢索索引相似度 0.4~0.7 的命中會以similarTo提示返回供調用方決定是否整合。不同 project 的記憶不會被跨項目取代。端口布局以 REST 為錨點的四端口組agentmemory 的端口分配遵循一個固定公式REST 是錨點服務端口公式默認值REST APIN3111Streams實時流N 13112Viewer網頁查看器N 23113iii engine內部總線N 4602349134--instance N會把整組端口右移N * 100--instance 1得到 3211 / 3212 / 3213 / 49234--instance 0保持規范的四件套。--instance取值范圍 0~50實現見 src/cli.ts。此外--port N可單獨覆蓋 REST 端口streams/viewer/engine 依然自動派生避免二次碰撞。端口解析的完整優先級見 src/config.ts 與 src/cli.tsRESTAGENTMEMORY_URL中的端口 III_REST_PORT 默認 3111StreamsIII_STREAM_PORTIII_STREAMS_PORT舊名兼容REST 1EngineIII_ENGINE_PORTIII_ENGINE_URL中的端口 REST 46023ViewerAGENTMEMORY_VIEWER_URL 運行時通過/agentmemory/livez探測到的實際端口 REST 2。/agentmemory/livez是一個關鍵的探活端點CLI 的status、doctor與 viewer 地址發現都依賴它返回的viewerPort字段。iii-config.yaml中iii-http的 CORS 白名單默認放行 3111 與 3113 兩個來源正是為了 REST 與 viewer 之間的跨端口協作。Viewer實時觀測記憶構建過程agentmemory 自帶一個實時網頁查看器默認地址http://localhost:3113由startViewerServer在 REST2 端口啟動見 src/viewer/server.ts。它訂閱mem-live實時流viewer group隨著會話運行觀測與壓縮結果會實時流入頁面因此特別適合演示向他人展示記憶正在被構建的過程驗證捕獲是否生效跑一輪 hook 后立刻在頁面上看到新增的 raw/compressed 觀測。Viewer 還承擔了版本鏈查看superseded 記憶的歷史版本與 REST 代理的職責。安全方面它內置了多重防護Host 頭白名單防 DNS rebinding 攻擊、Origin 白名單VIEWER_ALLOWED_ORIGINS、綁定地址默認 127.0.0.1AGENTMEMORY_VIEWER_HOST可改以及可選的AGENTMEMORY_SECRET鑒權。延伸閱讀圍繞本文涉及的架構模塊倉庫內還有更深入的配套文檔agentmemory-mcp-tools 技能參考 與 agentmemory-rest-api 技能參考兩種對外訪問面的完整工具/端點清單agentmemory-hooks 技能參考hook 如何自動捕獲觀測、何時寫入mem::observeagentmemory-config 技能參考端口與全部 feature flag 的權威說明iii 引擎配置文件 與 CLI 入口引擎 worker 拓撲與端口派生的實現依據。理解這套架構后無論是排查為什么搜索返回為空可沿 BM25 索引重建 → 向量維度校驗 → 三流權重順序排查還是規劃新增一種記憶能力新函數 觸發器而非新建插件系統都有了清晰的著手點。【免費下載鏈接】agentmemory#1 Persistent memory for AI coding agents based on real-world benchmarks項目地址: https://gitcode.com/GitHub_Trending/age/agentmemory創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考