AI agent memory system — sub-millisecond hybrid search (FAISS vector + FTS5 keyword + RRF fusion), knowledge graph traversal, cognitive retention modeling, and auto-deduplication. Zero infrastructure.
Project description
Ariadne
Memory for AI agents. Local-first hybrid search + knowledge graph. Zero infrastructure.
Quick Start
pip install "arriadne[embeddings]"
from arriadne import AriadneMemory
from arriadne.embeddings import SentenceTransformerEmbedder
# An embedder turns text into vectors so semantic recall works automatically.
embedder = SentenceTransformerEmbedder("all-MiniLM-L6-v2") # 384-dim
mem = AriadneMemory(db_path="memory.db", embedding_dim=embedder.dim, embedder=embedder)
mem.remember("VPS has 4 cores, 8GB RAM", importance=0.8)
# Semantic match — "server specs" finds the memory despite sharing no keywords.
results = mem.recall("server specs", k=5)
Without the [embeddings] extra (or without an embedder), Ariadne still works
as a fast keyword store — pass your own vectors to remember/recall for
semantic search, or omit them for FTS-only matching:
from arriadne import AriadneMemory
mem = AriadneMemory(db_path="memory.db") # no embedder
mem.remember("deploy script lives in infra/deploy.sh")
mem.recall("deploy script", k=5) # keyword match
Why
Most "agent memory" options make you choose: a bare vector store (Chroma, sqlite-vec), or a hosted service (Mem0). Ariadne bundles vector + keyword + graph retrieval, deduplication, and a retention model into one local SQLite file — no daemon, no server, no API keys.
| Capability | Ariadne | Chroma | sqlite-vec | Mem0 |
|---|---|---|---|---|
| Vector search | ✅ FAISS (auto Flat→IVF) | ✅ | ✅ | ✅ |
| Keyword search (BM25/FTS5) | ✅ | ❌ | ❌ | ⚠️ |
| Hybrid fusion (RRF) | ✅ | ⚠️ basic | ❌ | ⚠️ |
| Knowledge graph (multi-hop) | ✅ | ❌ | ❌ | ⚠️ |
| Near-duplicate dedup (MinHash) | ✅ | ❌ | ❌ | ⚠️ |
| Retention / forgetting curve | ✅ | ❌ | ❌ | ⚠️ |
| Runs fully local, no daemon | ✅ | ✅ | ✅ | ❌ |
| Single file, zero infra | ✅ | ⚠️ | ✅ | ❌ |
Capability comparison, not a benchmark — for latency, measure on your own hardware (see Performance). ✅ built-in · ⚠️ partial/varies · ❌ not available.
Features
Vector search (FAISS)
In-process FAISS index. Starts as exact IndexFlatIP and auto-upgrades to
IndexIVFFlat once the dataset grows past ivf_threshold. Vectors are keyed by
the memory's own id (IndexIDMap2) and rebuilt from the database on open, so the
index can never drift out of sync after deletes or restarts.
Hybrid retrieval
Vector similarity + BM25 keywords (SQLite FTS5), fused with Reciprocal Rank Fusion. Keyword matching tries AND first (precise) and falls back to OR (recall).
results = mem.recall("how to deploy to production", k=5)
# Runs keyword + vector search and fuses the rankings
Knowledge graph
Typed entities and relationships with multi-hop traversal via SQLite recursive CTEs. Edges are walked in both directions:
mem.add_edge("WebApp", "API", edge_type="depends_on")
mem.add_edge("API", "Database", edge_type="depends_on")
mem.graph("WebApp", hops=2) # → API, Database
Cognitive retention
Ebbinghaus forgetting curve R = e^(-t/S). Stability S grows each time a
memory is recalled (retention_growth_factor, capped) — memories strengthen
with use and fade without it. Priority-weighted scoring from importance,
recency, access count, and retention drives eviction.
Auto-deduplication
MinHash LSH catches near-duplicates before they enter the store; the index is rebuilt from the database on open so it survives restarts. Exact duplicates are caught by a SHA-256 content hash.
Built for agents
Thread-safe (a single AriadneMemory can be shared across threads), reads are
side-effect-free, and housekeeping (evict / consolidate / prune_access_log
/ purge_deleted, or maintenance() for all four) keeps the store bounded.
Performance
Latency depends on your hardware, embedding dimension, and dataset size, so Ariadne ships no canned numbers — measure on your own box:
pip install "arriadne[embeddings]"
import time, numpy as np
from arriadne import AriadneMemory, AriadneConfig
mem = AriadneMemory(config=AriadneConfig(db_path="bench.db", embedding_dim=384))
vecs = np.random.randn(10_000, 384).astype("float32")
for i, v in enumerate(vecs):
mem.remember(f"memory {i}", embedding=v)
q = np.random.randn(384).astype("float32")
t = time.perf_counter()
for _ in range(1000):
mem.recall("query", embedding=q, k=10)
print(f"recall avg: {(time.perf_counter() - t):.3f} ms/query")
mem.close()
Architecturally: FAISS does similarity as a single BLAS matrix multiply (and switches to an inverted-file index at scale), keyword search rides SQLite's FTS5 BM25 index, and graph traversal is a recursive CTE — all in-process, no network hops. See the benchmarks guide for a fuller harness.
Hermes Agent Integration
Ariadne works as a drop-in memory provider for Hermes Agent.
# Copy plugin
git clone https://github.com/kyssta-exe/Ariadne.git /tmp/ariadne-repo
cp -r /tmp/ariadne-repo/plugin ~/.hermes/plugins/ariadne
# Switch provider
hermes config set memory.provider ariadne
hermes restart
Full guide: ariadne.mantes.net/guide/hermes
Configuration
from arriadne import AriadneConfig, AriadneMemory
config = AriadneConfig(
db_path="memory.db",
embedding_dim=384,
faiss_type="auto", # auto | flat_ip | ivf_flat
dedup_threshold=0.8,
retention_half_life=86400, # 1 day
)
mem = AriadneMemory(config=config)
Documentation
License
MIT — see LICENSE.
Powered by Mantes
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file arriadne-0.9.1.tar.gz.
File metadata
- Download URL: arriadne-0.9.1.tar.gz
- Upload date:
- Size: 213.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58ff38e685fecc90fa3b3d03493c799fbeaefc7d9cc97a7ad4b00da868142a2c
|
|
| MD5 |
2262c6ead438ff37201f368b215cfee0
|
|
| BLAKE2b-256 |
8bb0a881adf97a1d1b4f44e333e5914e8ff47fe0da551cf78549c2a627b2d92c
|
File details
Details for the file arriadne-0.9.1-py3-none-any.whl.
File metadata
- Download URL: arriadne-0.9.1-py3-none-any.whl
- Upload date:
- Size: 34.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8da206af3192cf4be92d2368a5f2c7606281ea734c5d172e1539152347f4e16f
|
|
| MD5 |
a8aee899004d540b73cfbccb5c7a69ae
|
|
| BLAKE2b-256 |
df6c9373bd65ba308c03cc6a308030d1168b67ae34c84dc918de25679822b209
|