Skip to main content
Glama

Alaya

DOI License: MIT Rust crates.io docs.rs npm MCP alaya MCP server GitHub stars GitHub Sponsors CI

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 + tombstones

Das 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 decision.md-Workarounds)

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

remember

Speichert eine Konversationsnachricht (auto-promptet Konsolidierung nach 10 Episoden)

recall

Durchsucht das Gedächtnis mit hybrider Suche (+ Kategorie-Boost)

learn

Bringt extrahiertes Wissen direkt bei — Agent extrahiert Fakten und ruft dies auf

status

Umfangreiche Gedächtnisstatistiken: Episoden, Wissensaufschlüsselung, Kategorien, Graph, Embeddings

preferences

Ruft gelernte Benutzerpräferenzen ab

knowledge

Ruft destillierte semantische Fakten ab (+ Kategorie-Filter)

maintain

Führt Gedächtnisbereinigung durch (Deduplizierung, Zerfall)

purge

Löscht Erinnerungen nach Sitzung, Alter oder alles

categories

Listet aufkommende Kategorien mit Stabilitätsfilter auf

neighbors

Graph-Nachbarn via Ausbreitungsaktivierung

node_category

Zu welcher Kategorie ein Knoten gehört

import_claude_mem

Importiert Beobachtungen aus einer claude-mem-Datenbank

import_claude_code

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

ALAYA_DB

~/.alaya/memory.db

Pfad zur SQLite-Datenbank

ALAYA_LLM_API_KEY

(keine)

API-Schlüssel für Auto-Konsolidierung (aktiviert ExtractionProvider). Erfordert llm-Feature.

ALAYA_LLM_API_URL

https://api.openai.com/v1/chat/completions

OpenAI-kompatibler Chat-Completions-Endpunkt

ALAYA_LLM_MODEL

gpt-4o-mini

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 demo

Architektur

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 + tombstones

Drei 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

consolidate()

Nach Akkumulation von 10+ Episoden

Extrahiert semantisches Wissen aus Episoden

perfume()

Bei jeder Benutzerinteraktion

Extrahiert verhaltensbezogene Eindrücke, kristallisiert Präferenzen

transform()

Täglich oder wöchentlich

Dedupliziert, LTD-Link-Zerfall, beschneidet schwache Links, entdeckt Kategorien

forget()

Täglich oder wöchentlich

Lässt Abrufstärke zerfallen, archiviert wirklich vergessene Knoten

purge()

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

  1. Gedächtnis ist ein Prozess, keine Datenbank. Jeder Abruf verändert, was erinnert wird. Der Graph formt sich durch die Nutzung neu.

  2. 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.

  3. Präferenzen entstehen, sie werden nicht deklariert. Verhaltensmuster kristallisieren aus akkumulierten Eindrücken via Vasana (Parfümierung), keine LLM erforderlich.

  4. Der Agent besitzt die Identität. Alaya speichert Samen. Der Agent entscheidet, welche Samen wichtig sind und wie sie präsentiert werden.

  5. 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

Install Server
A
security – no known vulnerabilities
A
license - permissive license
-
quality - not tested

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