alaya
Alaya
Die einzige Memory-Engine mit neurowissenschaftlich fundierter Gedächtnisdynamik — Bjork-Dual-Strength-Vergessen, abruf-induzierte Unterdrückung und Hebb’sche Ko-Aktivierung — in einer einbettbaren Rust-Bibliothek ohne Abhängigkeiten.
Alaya (Sanskrit: alaya-vijnana, „Speicherbewusstsein“) ist eine einbettbare Rust-Bibliothek. Eine SQLite-Datei. Keine externen Dienste. Ihr Agent speichert Konversationen, ruft ab, was wichtig ist, und lässt den Rest verblassen. Der Graph formt sich durch die Nutzung neu, genau wie ein biologisches Gedächtnis.
let alaya = Alaya::open("memory.db")?;
alaya.episodes().store(&episode)?; // store
let results = alaya.knowledge().query(&query)?; // retrieve
alaya.lifecycle().consolidate(&provider)?; // distill knowledge
alaya.lifecycle().transform()?; // dedup, LTD, discover categories
alaya.lifecycle().forget()?; // decay what's stale
let cats = alaya.admin().categories(None)?; // emergent ontology
alaya.admin().purge(PurgeFilter::Session("s1"))?; // cascade delete + tombstonesDas Problem
Die meisten KI-Agenten behandeln das Gedächtnis wie flache Dateien. OpenClaw schreibt in MEMORY.md. Claudesidian schreibt in Obsidian. Selbstgebaute Systeme schreiben in JSON oder Markdown. Am Anfang funktioniert das.
Dann wachsen die Dateien. Kontextfenster füllen sich. Der Agent wirft alles in den Prompt und hofft, dass die LLM findet, was wichtig ist.
Die Kosten sind messbar. OpenClaw injiziert ca. 35.600 Token an Arbeitsbereichsdateien in jede Nachricht, von denen 93,5 % irrelevant sind (#9157). Vielnutzer berichten von 3.600 $/Monat an Token-Kosten. Community-Tools wie QMD und memsearch reduzieren diese Verschwendung um 70-96 %, indem sie die Vollkontext-Injektion durch einen gerankten Abruf ersetzen (Levine, 2026).
Das Strukturproblem verschärft die Kosten. MEMORY.md vermischt Entscheidungen, Präferenzen und Wissen in einem unstrukturierten Klumpen. Benutzer erfinden unabhängig voneinander decision.md-Dateien, working-context.md-Snapshots und 12-schichtige Gedächtnisarchitekturen, um dies auszugleichen. Am Montag erwähnen Sie: „Alice leitet das Auth-Team.“ Am Mittwoch fragen Sie: „Wer kümmert sich um Auth-Berechtigungen?“ Der Agent ruft beide Erinnerungen aufgrund von Textähnlichkeit ab, kann sie aber nicht miteinander verknüpfen (Chawla, 2026).
Wie Alaya das löst
Problem | Dateibasiertes Gedächtnis | Alaya |
Token-Verschwendung | Vollkontext-Injektion (~35K Token/Nachricht) | Gerankter Abruf liefert nur die top-k relevanten Erinnerungen |
Keine Struktur | Alles in einer Datei (Benutzer erfinden | Drei typisierte Speicher: Episoden, Wissen, Präferenzen |
Kein Vergessen | Dateien wachsen, bis man sie manuell kuratiert | Bjork-Dual-Strength-Zerfall trennt Speicherstärke von Abrufstärke; abruf-induziertes Vergessen (RIF) unterdrückt aktiv konkurrierende Erinnerungen |
Keine Assoziationen | Flache Dateien, keine Links zwischen Erinnerungen | Hebb’sche Ko-Abruf-Stärkung (LTP/LTD): Gemeinsam abgerufene Erinnerungen stärken Verbindungen; Ausbreitungsaktivierung findet indirekte Assoziationen |
Spröde Präferenzen | Vom Agenten verfasste Zusammenfassung, driftet leicht ab | Implizite Präferenzen entstehen aus akkumulierten Eindrücken via Vasana (Parfümierung), keine LLM erforderlich; kristallisieren bei Schwellenwert |
LLM erforderlich | Funktioniert nicht ohne | Elegante Degradierung auf jeder Ebene. Keine Embeddings? Nur BM25. Keine LLM? Episoden akkumulieren. Jede Fähigkeit ist unabhängig optional |
Erste Schritte
MCP-Server (empfohlen für Agenten)
Der schnellste Weg, Alaya-Gedächtnis zu jedem MCP-kompatiblen Agenten (Claude Desktop, Claude Code, Cursor, Cline, etc.) hinzuzufügen:
Via npm (keine Rust-Toolchain erforderlich)
Fügen Sie dies zu Ihrer Claude Code-Konfiguration (~/.claude/claude_code_config.json) hinzu:
{
"mcpServers": {
"alaya": {
"command": "npx",
"args": ["-y", "alaya-mcp"]
}
}
}Oder für Claude Desktop / andere MCP-Clients (mit optionaler LLM-Auto-Konsolidierung):
{
"mcpServers": {
"alaya": {
"command": "npx",
"args": ["-y", "alaya-mcp"],
"env": {
"ALAYA_LLM_API_KEY": "sk-...",
"ALAYA_LLM_API_URL": "https://api.openai.com/v1/chat/completions",
"ALAYA_LLM_MODEL": "gpt-4o-mini"
}
}
}
}Aus dem Quellcode (erfordert Rust 1.75+)
git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo build --release --features "mcp llm"Fügen Sie es dann zu Ihrer MCP-Konfiguration hinzu:
{
"mcpServers": {
"alaya": {
"command": "/path/to/alaya/target/release/alaya-mcp"
}
}
}Die ALAYA_LLM_* Umgebungsvariablen sind optional — ohne sie arbeitet der Server im Prompt-Modus (erinnert den Agenten daran, nach 10 Episoden learn aufzurufen). Mit einem API-Schlüssel und dem llm-Feature konsolidiert er stattdessen automatisch.
Das war's. Ihr Agent verfügt nun über 13 Gedächtnis-Tools:
Tool | Was es tut |
| Speichert eine Konversationsnachricht (auto-promptet Konsolidierung nach 10 Episoden) |
| Durchsucht das Gedächtnis mit hybrider Suche (+ Kategorie-Boost) |
| Bringt extrahiertes Wissen direkt bei — Agent extrahiert Fakten und ruft dies auf |
| Umfangreiche Gedächtnisstatistiken: Episoden, Wissensaufschlüsselung, Kategorien, Graph, Embeddings |
| Ruft gelernte Benutzerpräferenzen ab |
| Ruft destillierte semantische Fakten ab (+ Kategorie-Filter) |
| Führt Gedächtnisbereinigung durch (Deduplizierung, Zerfall) |
| Löscht Erinnerungen nach Sitzung, Alter oder alles |
| Listet aufkommende Kategorien mit Stabilitätsfilter auf |
| Graph-Nachbarn via Ausbreitungsaktivierung |
| Zu welcher Kategorie ein Knoten gehört |
| Importiert Beobachtungen aus einer claude-mem-Datenbank |
| Importiert Konversationsverlauf aus Claude Code JSONL-Dateien |
Siehe docs/mcp-quickstart.md für eine vollständige Anleitung mit Beispielinteraktionen und empfohlenem System-Prompt.
Die Daten werden in ~/.alaya/memory.db gespeichert (überschreibbar mit der ALAYA_DB Umgebungsvariable). Einzelne SQLite-Datei, keine externen Dienste.
Beispielinteraktion — was Ihr Agent sieht, wenn er Alaya verwendet:
Agent: [calls remember(content="User prefers dark mode", role="user", session_id="s1")]
Alaya: Stored episode 1 in session 's1'
Agent: [calls recall(query="user preferences")]
Alaya: Found 1 memories:
1. [user] (score: 0.847) User prefers dark mode
Agent: [calls status()]
Alaya: Memory Status:
Episodes: 1 (1 this session, 1 unconsolidated)
Knowledge: none
Categories: 0
Preferences: 0 crystallized, 0 impressions accumulating
Graph: 0 links
Embedding coverage: 0/1 nodes (0%)Umgebungsvariablen:
Variable | Standard | Beschreibung |
|
| Pfad zur SQLite-Datenbank |
| (keine) | API-Schlüssel für Auto-Konsolidierung (aktiviert |
|
| OpenAI-kompatibler Chat-Completions-Endpunkt |
|
| Modellname. Jedes kleine/schnelle Modell funktioniert (GPT-4o-mini, Haiku, Gemini Flash, etc.) |
Rust-Bibliothek
Um Alaya direkt in eine Rust-Anwendung einzubetten:
[dependencies]
alaya = "0.2.2"Schnellstart (Rust)
use alaya::{Alaya, NewEpisode, Role, EpisodeContext, Query, NoOpProvider};
// Open a persistent database (or use open_in_memory() for tests)
let alaya = Alaya::open("memory.db")?;
// Store a conversation episode
alaya.episodes().store(&NewEpisode {
content: "I've been learning Rust for about six months now".into(),
role: Role::User,
session_id: "session-1".into(),
timestamp: 1740000000,
context: EpisodeContext::default(),
embedding: None, // pass Some(vec![...]) if you have embeddings
})?;
// Query with hybrid retrieval (BM25 + vector + graph + RRF)
let results = alaya.knowledge().query(&Query::simple("Rust experience"))?;
for mem in &results {
println!("[{:.2}] {}", mem.score, mem.content);
}
// Get crystallized preferences
let prefs = alaya.admin().preferences(Some("communication_style"))?;
// Run lifecycle (NoOpProvider works without an LLM)
alaya.lifecycle().consolidate(&NoOpProvider)?;
alaya.lifecycle().transform()?;
alaya.lifecycle().forget()?;Demo ausführen
Die Demo führt durch alle elf Fähigkeiten mit annotierter Ausgabe und ohne externe Abhängigkeiten:
git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo run --example demoArchitektur
Alaya ist eine Bibliothek, kein Framework. Ihr Agent besitzt die Konversationsschleife, die LLM und das Embedding-Modell. Alaya besitzt das Gedächtnis.
Your Agent Alaya
───────── ─────
Via MCP (stdio): alaya-mcp binary
remember(content, role, session) ──▶ episodic store + graph links
recall(query, boost_category?) ──▶ BM25 + vector + graph → RRF → rerank
learn(facts, session_id?) ──▶ agent-driven knowledge extraction
status() ──▶ rich stats (episodes, knowledge, graph, embeddings)
preferences(domain?) ──▶ crystallized behavioral patterns
knowledge(type?, category?) ──▶ consolidated semantic nodes
maintain() ──▶ dedup + decay
purge(scope) ──▶ selective or full deletion
categories(min_stability?) ──▶ emergent ontology with hierarchy
neighbors(node, depth?) ──▶ graph spreading activation
node_category(node_id) ──▶ category assignment lookup
import_claude_mem(path?) ──▶ import from claude-mem.db
import_claude_code(path) ──▶ import from Claude Code JSONL
Via Rust library: Alaya coordinator
alaya.episodes().store(ep) ──▶ episodic store + graph links
alaya.knowledge().query(q) ──▶ BM25 + vector + graph → RRF → rerank
alaya.admin().preferences(domain?) ──▶ crystallized behavioral patterns
alaya.knowledge().filter(f?) ──▶ consolidated semantic nodes
alaya.admin().categories(min?) ──▶ emergent ontology with hierarchy
alaya.admin().subcategories(id) ──▶ children of a parent category
alaya.graph().neighbors(node, d) ──▶ graph spreading activation
alaya.admin().node_category(id) ──▶ category assignment lookup
alaya.set_embedding_provider(p) ──▶ auto-embed in store + query
alaya.set_extraction_provider(p) ──▶ enable auto-consolidation
alaya.lifecycle().consolidate(p) ──▶ episodes → semantic knowledge
alaya.knowledge().learn(nodes) ──▶ provider-less knowledge injection
alaya.lifecycle().auto_consolidate() ──▶ extract + learn (needs ExtractionProvider)
alaya.lifecycle().perfume(i, p) ──▶ impressions → preferences
alaya.lifecycle().transform() ──▶ dedup, LTD, prune, split categories
alaya.lifecycle().forget() ──▶ Bjork strength decay + archival
alaya.admin().purge(scope) ──▶ cascade deletion + tombstonesDrei Speicher
Speicher | Analog | Zweck |
Episodisch | Hippocampus | Rohe Konversationsereignisse mit vollem Kontext |
Semantisch | Neocortex | Destilliertes Wissen, extrahiert durch Konsolidierung |
Implizit | Alaya-vijnana | Präferenzen und Gewohnheiten, die durch Parfümierung entstehen |
Abruf-Pipeline
flowchart LR
Q[Query] --> BM25[BM25 / FTS5]
Q --> VEC[Vector / Cosine]
Q --> GR[Graph Neighbors]
BM25 --> RRF[Reciprocal Rank Fusion]
VEC --> RRF
GR --> RRF
RRF --> RR[Context-Weighted Reranking]
RR --> SA[Spreading Activation + Enrichment]
SA --> RIF[Retrieval-Induced Forgetting]
RIF --> OUT[Top 3-5 Results<br/>Episodes + Semantic + Preferences]Lebenszyklus-Prozesse
Prozess | Inspiration | Was es tut |
Konsolidierung | CLS-Theorie (McClelland et al.) | Destilliert Episoden in semantisches Wissen |
Parfümierung | Vasana (Yogacara-buddhistische Psychologie) | Akkumuliert Eindrücke, kristallisiert Präferenzen |
Transformation | Asraya-paravrtti | Dedupliziert, LTD-Link-Zerfall, beschneidet, entdeckt Kategorien |
Vergessen | Bjork & Bjork (1992) | Lässt Abrufstärke zerfallen, archiviert schwache Knoten |
RIF | Anderson et al. (1994) | Abruf-induziertes Vergessen unterdrückt konkurrierende Erinnerungen |
Emergente Ontologie | Vikalpa (konzeptionelle Konstruktion) | Hierarchische Kategorien entstehen durch Clustering; automatische Aufteilung bei zu großer Breite |
Integrationsleitfaden
Implementierung von ConsolidationProvider
Der ConsolidationProvider-Trait verbindet Alaya mit Ihrer LLM für die Wissensextraktion:
use alaya::*;
struct MyProvider { /* your LLM client */ }
impl ConsolidationProvider for MyProvider {
fn extract_knowledge(&self, episodes: &[Episode]) -> Result<Vec<NewSemanticNode>> {
// Ask your LLM: "What facts/relationships can you extract?"
todo!()
}
fn extract_impressions(&self, interaction: &Interaction) -> Result<Vec<NewImpression>> {
// Ask your LLM: "What behavioral signals does this contain?"
todo!()
}
fn detect_contradiction(&self, a: &SemanticNode, b: &SemanticNode) -> Result<bool> {
// Ask your LLM: "Do these two facts contradict each other?"
todo!()
}
}Verwenden Sie NoOpProvider ohne LLM. Episoden akkumulieren und der BM25-Abruf funktioniert ohne Konsolidierung.
Implementierung von ExtractionProvider (Auto-Konsolidierung)
Der ExtractionProvider-Trait ermöglicht automatische Wissensextraktion ohne manuelle consolidate()-Aufrufe. Wenn konfiguriert, konsolidiert der MCP-Server automatisch nach 10 unkonsolidierten Episoden:
use alaya::*;
struct MyExtractor { /* your LLM client */ }
impl ExtractionProvider for MyExtractor {
fn extract(&self, episodes: &[Episode]) -> Result<Vec<NewSemanticNode>> {
// Ask your LLM: "Extract facts from these conversations"
todo!()
}
}
let mut alaya = Alaya::open("memory.db")?;
alaya.set_extraction_provider(Box::new(MyExtractor { /* ... */ }));
// Now auto_consolidate() works without a ConsolidationProvider
let report = alaya.lifecycle().auto_consolidate()?;Das llm-Feature-Flag bietet einen gebrauchsfertigen LlmExtractionProvider, der jede OpenAI-kompatible API aufruft:
use alaya::LlmExtractionProvider;
let provider = LlmExtractionProvider::builder()
.api_key("sk-...")
.model("gpt-4o-mini") // default; any small model works
.build()?;Lebenszyklus-Planung
Methode | Wann aufrufen | Was es tut |
| Nach Akkumulation von 10+ Episoden | Extrahiert semantisches Wissen aus Episoden |
| Bei jeder Benutzerinteraktion | Extrahiert verhaltensbezogene Eindrücke, kristallisiert Präferenzen |
| Täglich oder wöchentlich | Dedupliziert, LTD-Link-Zerfall, beschneidet schwache Links, entdeckt Kategorien |
| Täglich oder wöchentlich | Lässt Abrufstärke zerfallen, archiviert wirklich vergessene Knoten |
| Auf Benutzeranfrage | Kaskadierendes Löschen nach Sitzung/Alter/alle mit Tombstone-Tracking |
API-Referenz
impl Alaya {
// Open / create
pub fn open(path: impl AsRef<Path>) -> Result<Self>;
pub fn open_in_memory() -> Result<Self>;
// Providers (on coordinator)
pub fn set_embedding_provider(&mut self, provider: Box<dyn EmbeddingProvider>);
pub fn set_extraction_provider(&mut self, provider: Box<dyn ExtractionProvider>);
// Sub-manager accessors
pub fn episodes(&self) -> Episodes<'_>;
pub fn knowledge(&self) -> Knowledge<'_>;
pub fn lifecycle(&self) -> Lifecycle<'_>;
pub fn graph(&self) -> Graph<'_>;
pub fn admin(&self) -> Admin<'_>;
}
impl Episodes<'_> {
pub fn store(&self, episode: &NewEpisode) -> Result<EpisodeId>;
pub fn by_session(&self, session_id: &str) -> Result<Vec<Episode>>;
pub fn unconsolidated(&self, limit: u32) -> Result<Vec<Episode>>;
}
impl Knowledge<'_> {
pub fn query(&self, q: &Query) -> Result<Vec<ScoredMemory>>;
pub fn learn(&self, nodes: Vec<NewSemanticNode>) -> Result<ConsolidationReport>;
pub fn filter(&self, filter: Option<KnowledgeFilter>) -> Result<Vec<SemanticNode>>;
}
impl Lifecycle<'_> {
pub fn consolidate(&self, provider: &dyn ConsolidationProvider) -> Result<ConsolidationReport>;
pub fn auto_consolidate(&self) -> Result<ConsolidationReport>;
pub fn transform(&self) -> Result<TransformationReport>;
pub fn forget(&self) -> Result<ForgettingReport>;
pub fn perfume(&self, interaction: &Interaction, provider: &dyn ConsolidationProvider) -> Result<PerfumingReport>;
pub fn dream(&self, provider: &dyn ConsolidationProvider, interaction: Option<&Interaction>) -> Result<DreamReport>;
}
impl Admin<'_> {
pub fn status(&self) -> Result<MemoryStatus>;
pub fn purge(&self, filter: PurgeFilter) -> Result<PurgeReport>;
pub fn preferences(&self, domain: Option<&str>) -> Result<Vec<Preference>>;
pub fn categories(&self, min_stability: Option<f32>) -> Result<Vec<Category>>;
pub fn subcategories(&self, parent_id: CategoryId) -> Result<Vec<Category>>;
pub fn node_category(&self, node_id: NodeId) -> Result<Option<Category>>;
}Designprinzipien
Gedächtnis ist ein Prozess, keine Datenbank. Jeder Abruf verändert, was erinnert wird. Der Graph formt sich durch die Nutzung neu.
Vergessen ist ein Feature. Bjork-Dual-Strength-Zerfall trennt Speicherstärke von Abrufstärke. Abruf-induziertes Vergessen (RIF) unterdrückt aktiv konkurrierende Erinnerungen. Beides verbessert die Abrufqualität im Laufe der Zeit.
Präferenzen entstehen, sie werden nicht deklariert. Verhaltensmuster kristallisieren aus akkumulierten Eindrücken via Vasana (Parfümierung), keine LLM erforderlich.
Der Agent besitzt die Identität. Alaya speichert Samen. Der Agent entscheidet, welche Samen wichtig sind und wie sie präsentiert werden.
Elegante Degradierung. Keine Embeddings? Nur BM25. Keine LLM? Episoden akkumulieren. Jedes Feature funktioniert unabhängig.
Forschungsgrundlagen
Architektur fundiert in Neurowissenschaften, buddhistischer Psychologie und Information Retrieval. Für detaillierte Zuordnungen siehe docs/theoretical-foundations.md.
Neurowissenschaften: Hebb’sche LTP/LTD (Hebb 1949, Bliss & Lomo 1973), Complementary Learning Systems (McClelland et al. 1995), Ausbreitungsaktivierung (Collins & Loftus 1975), Enkodierungsspezifität (Tulving & Thomson 1973), Dual-Strength-Vergessen (Bjork & Bjork 1992), abruf-induziertes Vergessen (Anderson et al. 1994), Arbeitsgedächtnisgrenzen (Cowan 2001).
Yogacara-buddhistische Psychologie: Alaya-vijnana (Speicherbewusstsein), Bija (Samen), Vasana (Parfümierung), Asraya-paravrtti (Transformation), Vijnaptimatrata (perspektivrel
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/SecurityRonin/alaya'
If you have feedback or need assistance with the MCP directory API, please join our Discord server