agentmem

io.github.oxgeneral由 GitHub 帳號 oxgeneral 發布v0.3.0更新於 Oct 25, 2026

Lightweight persistent memory for AI agents. Hybrid search. 16 tools. One SQLite file.

已驗證STDIO僅桌面資料庫知識與記憶

概覽

AI 產生的概覽

為 AI 代理提供本機持久記憶的伺服器,將記憶存進單一 SQLite 檔案,提供關鍵字與語意混合檢索及 16 個工具。

可以做什麼
儲存、檢索、更新與封存記憶,支援關鍵字與語意混合搜尋、命名空間與版本歷程。在上下文壓縮前儲存工作狀態,並取回當天的記憶。管理行為規則(程序性記憶),並從對話歷史自動擷取事實、決策與待辦事項。檢視自動擷取的實體(例如 IP、URL、電子郵件與環境變數名稱),並找出與實體相關的記憶。執行維護:統計、壓縮低價值記憶、合併近似重複的記憶。
適用情境
適合需要讓助理跨工作階段記住事實、決策與任務狀態、又不想依賴雲端服務的情況,也適合希望在本機擁有小型自足記憶庫的使用者。
執行需求
以本機 Python 程序執行(Python 3.10 至 3.12),透過 agentmem 模組與資料庫檔案路徑啟動。選用相依套件 sqlite-vec 與 model2vec 可提升語意搜尋效果;僅用標準函式庫的模式不需任何相依套件。不需要帳號、API 金鑰或網路存取。
安裝前請注意
記憶會寫入本機 SQLite 檔案並跨工作階段保留,因此存入的內容(包括對話中提到的密鑰)會留在磁碟上,直到被封存或刪除。刪除只是軟封存,壓縮與合併操作會改動已存資料。對話擷取可能把 API 金鑰或資料庫連線字串等憑證寫入記憶。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 agentmem,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

agentmem

mcp-name: io.github.oxgeneral/agentmem

Lightweight persistent memory for AI agents. One SQLite file. Hybrid search (keywords + semantics). Zero to 12MB install.

No PyTorch. No cloud. No server. Just memory.

206 unit tests. 107 quality tests on real data. Typed API (16 TypedDict). Production-ready.

Built by an AI agent that wakes up with no memory every session — and needed a way to remember.

Why

Every AI agent session starts from zero. Context windows compress, conversations end, memory vanishes. agentmem gives agents persistent memory that survives across sessions — in a single SQLite file.

  • Hybrid search: FTS5 full-text keywords + vector semantic search, fused with adaptive ranking
  • 4 operational modes: from zero dependencies (stdlib only) to best quality (12MB)
  • 16 MCP tools: recall, remember, save_state, compact, consolidate, entities, and more
  • HTTP REST API: 14 endpoints, zero-dependency server, CORS-ready
  • 5 memory tiers: core, learned, episodic, working (auto-expires), procedural (behavioral rules)
  • Namespaces: multi-user, multi-agent memory isolation
  • Temporal versioning: fact evolution chains with supersedes tracking
  • Entity extraction: auto-extracts @mentions, URLs, IPs, env vars, money amounts
  • Conversation extraction: auto-extracts facts, decisions, TODOs from chat history
  • Importance scoring: auto-scores memories by tier, length, specificity, structure
  • Memory consolidation: finds and merges near-duplicate memories
  • Recency boost: newer memories rank higher with configurable decay
  • Multilingual: Russian keywords via FTS5, English semantics via embeddings
  • Fast: <1ms/query hybrid search, <5ms cold start, <0.2ms/chunk import

Install

bash
# Best quality (sqlite-vec + model2vec, 12MB total)pip install agentmem-lite[all]
# Minimal (sqlite-vec + hash embeddings, 151KB)pip install agentmem-lite
# Zero dependencies (pure Python, stdlib only)pip install agentmem-lite --no-deps
# From sourcegit clone https://github.com/oxgeneral/agentmem && cd agentmempip install -e ".[all]"

Quick Start

Python API

python
from agentmem import MemoryStore, get_embedding_model
# Auto-selects best available backendembed = get_embedding_model()store = MemoryStore("memory.db", embedding_dim=embed.dim)store.set_embed_fn(embed)
# Store memories with namespacesstore.remember("Server costs $50/month", tier="core", namespace="infra")store.remember("API returns 403 without auth", tier="learned", namespace="api")store.remember("Deployed v2.1 at 15:30", tier="episodic")
# Search — hybrid keyword + semantic, with recency boostresults = store.recall("server costs", recency_weight=0.15)
# Namespace isolationresults = store.recall("server", namespace="infra")
# Save working state before context compressionstore.save_state("Working on auth fix, step 3/5, blocked by CORS")
# Add behavioral rules (procedural memory)store.add_procedure("Always use HTTPS in production")store.add_procedure("Never expose debug endpoints")rules = store.get_procedures()  # → formatted for system prompt
# Update facts with version chainstore.update_memory(old_id=1, new_content="Server costs $75/month")history = store.history(memory_id=2)  # → trace fact evolution
# Find related memories by entityrelated = store.related("10.0.0.1")  # → all memories mentioning this IPentities = store.entities(entity_type="ip")  # → list all known IPs
# Auto-extract from conversationsmessages = [    {"role": "user", "content": "Set API_KEY to sk-abc123. Always validate input."},    {"role": "assistant", "content": "Noted. I decided to use pydantic for validation."},]result = store.process_conversation(messages, namespace="project")# → extracts config, preferences, decisions automatically
# Maintenancestore.compact(max_age_days=90)  # archive old low-value memoriesstore.consolidate(similarity_threshold=0.85)  # merge near-duplicates
# Import markdown filesstore.import_markdown("MEMORY.md", tier="core")

CLI

bash
# Initialize databaseagentmem init --db memory.db
# Import markdown filesagentmem import MEMORY.md --tier core -n my-agentagentmem import-dir ./daily-logs/ --tier episodic
# Search with namespace filteragentmem search "deployment process" --limit 5 -n infra
# Manage proceduresagentmem add-procedure "Always use markdown formatting"agentmem procedures
# View entities and relationsagentmem entities --type ipagentmem related 10.0.0.1
# Maintenanceagentmem compact --max-age-days 90 --dry-runagentmem consolidate --threshold 0.85
# Process conversationagentmem process chat.json -n project
# Stats and exportagentmem statsagentmem export --tier core

MCP Server (stdio)

bash
python -m agentmem --db memory.db

Add to your MCP client config:

json
{  "mcpServers": {    "memory": {      "command": "python",      "args": ["-m", "agentmem", "--db", "/path/to/memory.db"]    }  }}

HTTP REST API

bash
# Start HTTP serveragentmem serve-http --port 8422
# Or directlyagentmem-http --port 8422 --db memory.db
bash
# Store a memorycurl -X POST http://localhost:8422/remember \  -H "Content-Type: application/json" \  -d '{"content": "Server IP is 10.0.0.1", "tier": "core", "namespace": "infra"}'
# Searchcurl "http://localhost:8422/recall?query=server+IP&namespace=infra"
# Health checkcurl http://localhost:8422/health

16 MCP tools / 14 HTTP endpoints:

ToolHTTPDescription
recallGET /recallHybrid keyword + semantic search
rememberPOST /rememberStore a new memory
save_statePOST /save_stateEmergency save before context compression
todayGET /todayGet all memories from today
forgetPOST /forgetArchive a memory (soft delete)
unarchivePOST /unarchiveRestore an archived memory
statsGET /statsMemory statistics and health
compactPOST /compactArchive low-value memories
consolidatePOST /consolidateMerge near-duplicate memories
update_memoryPOST /update_memoryReplace a memory with version chain
historyGET /historyTrace fact version history
relatedGET /relatedFind memories by entity
entitiesGET /entitiesList all extracted entities
get_procedures—Get behavioral rules for system prompt
add_procedure—Add a behavioral rule
process_conversation—Auto-extract from chat history

Memory Tiers

TierPurposeAuto-compactedExample
corePermanent factsNever"Server IP is 10.0.0.1"
proceduralBehavioral rulesNever"Always use HTTPS"
learnedDiscovered knowledgeAfter 90 days"API returns 403 without auth"
episodicEventsAfter 90 days"Deployed v2.1 at 15:30"
workingCurrent task stateAfter 24 hours"Working on step 3/5"

Namespaces

Isolate memories per user, agent, or project:

python
# Store in namespacesstore.remember("Alice's API key", namespace="user/alice")store.remember("Bob's config", namespace="user/bob")store.remember("Shared fact", namespace="team")
# Search within namespace (prefix matching)store.recall("API", namespace="user/alice")  # only Alice's memoriesstore.recall("API", namespace="user")  # Alice + Bob (prefix match)store.recall("API")  # everything

Temporal Versioning

Track how facts evolve over time:

python
# Initial factr1 = store.remember("Server costs $50/month", tier="core")
# Fact changes — old version archived, linked via supersedesr2 = store.update_memory(r1["id"], "Server costs $75/month")
# Trace the historyhistory = store.history(r2["id"])# → [{"id": 2, "content": "...$75..."}, {"id": 1, "content": "...$50..."}]

Entity Extraction

Automatic regex-based NER on every remember() call:

TypePatternExample
mention@username@alice
urlhttps://...https://api.example.com
ipN.N.N.N10.0.0.1
port:NNNN:8080
emailuser@domain[email protected]
env_varALL_CAPSOPENAI_API_KEY
money$NNN$50
path/unix/path/etc/nginx/conf.d
hashtag#tag#deployment
python
# Find all memories mentioning an entitystore.related("10.0.0.1")store.related("@alice", entity_type="mention")
# List all known entitiesstore.entities()  # sorted by memory countstore.entities(entity_type="ip")

Conversation Auto-Extraction

Auto-extract memories from chat history (regex-only, no LLM):

python
messages = [    {"role": "user", "content": "Set DATABASE_URL to postgres://localhost/mydb"},    {"role": "assistant", "content": "I decided to use connection pooling. Important: max 20 connections."},    {"role": "user", "content": "Always validate input. TODO: add rate limiting."},]result = store.process_conversation(messages)# Extracts: config→core, decisions→episodic, preferences→procedural, todos→working, important→core

Operational Modes

agentmem automatically selects the best available mode:

ModeInstall SizeInit TimeQuery TimeDependencies
sqlite-vec + model2vec12 MB~5ms*~1mssqlite-vec, model2vec, numpy
sqlite-vec + hash151 KB~5ms~0.8mssqlite-vec
pure Python + hash0 KB~3ms~1.8msnone (stdlib only)
pure + int8 quantize0 KB~3ms~3msnone (stdlib only)

*With lazy loading — model2vec loads on first query, not on init

Architecture

┌──────────────────────────────────────────────┐│              MemoryStore                      ││  ┌──────────┐  ┌──────────┐  ┌────────────┐  ││  │  FTS5    │  │  Vector  │  │  Entity    │  ││  │ keywords │  │  Index   │  │  Index     │  ││  │ + BM25   │  │ cosine   │  │  regex NER │  ││  └────┬─────┘  └────┬─────┘  └─────┬──────┘  ││       └──────┬───────┘              │         ││    Adaptive Hybrid Scorer           │         ││  (query classify + recency +        │         ││   importance boost)                 │         ││  ┌──────────────────────────────────┴───────┐ ││  │            SQLite + WAL                  │ ││  │  memories │ memories_fts │ vecs │ entities│ ││  └──────────────────────────────────────────┘ ││            One file: memory.db                │└───────────────────────────────────────────────┘

Comparison

FeatureagentmemChromaDBLanceDBmem0Zep
Install size0-12 MB400+ MB100+ MB500+ MBCloud
Cold start3-5 mssecondssecondssecondsN/A
PyTorch requiredNoYesNoYesN/A
Cloud requiredNoNoNoYesYes
Zero-dep modeYesNoNoNoNo
Keyword searchFTS5 (BM25)NoNoNoYes
MCP server16 toolsNoNoYesNo
HTTP APIBuilt-inYesNoYesYes
Single file DBYesNoYesNoNo
NamespacesYesYesYesYesYes
Temporal versioningYesNoYesNoYes
Entity extractionAuto (regex)NoNoNoNo
Procedural memoryYesNoNoNoNo
Importance scoringAutoNoNoNoNo
Conversation extractionAuto (regex)NoNoYes (LLM)Yes (LLM)
Memory consolidationYesNoNoYes (LLM)No

Tested

  • 206 unit tests covering core CRUD, namespaces, temporal versioning, entity extraction, consolidation, WAL management, HTTP server, error handling
  • 107 quality tests against real-world agent memory data (100 search queries across 10 categories, all passing)
  • Benchmark suite with reproducible numbers: <1ms hybrid query, 10K+ inserts/sec, ~835 bytes/memory
  • Auto-translate for multilingual queries (Russian → English via deep-translator: 4/10 → 10/10)
  • Python 3.10, 3.11, 3.12

License

MIT

來源:README.md,提交 14a5b85

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.3.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分