alaya
Alaya
El único motor de memoria con dinámicas de memoria basadas en la neurociencia —olvido de doble fuerza de Bjork, supresión inducida por la recuperación y coactivación hebbiana— en una biblioteca de Rust integrable sin dependencias.
Alaya (sánscrito: alaya-vijnana, "conciencia de almacén") es una biblioteca de Rust integrable. Un solo archivo SQLite. Sin servicios externos. Tu agente almacena conversaciones, recupera lo que importa y deja que el resto se desvanezca. El grafo se remodela con el uso, como la memoria biológica.
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 + tombstonesEl problema
La mayoría de los agentes de IA tratan la memoria como archivos planos. OpenClaw escribe en MEMORY.md. Claudesidian escribe en Obsidian. Los sistemas creados manualmente escriben en JSON o Markdown. Funciona al principio.
Luego los archivos crecen. Las ventanas de contexto se llenan. El agente vuelca todo en el prompt y espera que el LLM encuentre lo que importa.
El coste es medible. OpenClaw inyecta ~35,600 tokens de archivos de espacio de trabajo en cada mensaje, el 93.5% de los cuales es irrelevante (#9157). Los usuarios intensivos reportan $3,600/mes en costes de tokens. Herramientas comunitarias como QMD y memsearch reducen entre el 70% y el 96% de ese desperdicio al reemplazar la inyección de contexto completo con recuperación clasificada (Levine, 2026).
El problema de la estructura agrava el coste. MEMORY.md confunde decisiones, preferencias y conocimiento en una sola masa no estructurada. Los usuarios inventan de forma independiente archivos decision.md, instantáneas de working-context.md y arquitecturas de memoria de 12 capas para compensar. El lunes mencionas "Alice gestiona el equipo de autenticación". El miércoles preguntas "¿quién maneja los permisos de autenticación?". El agente recupera ambos recuerdos por similitud de texto pero no puede conectarlos (Chawla, 2026).
Cómo lo resuelve Alaya
Problema | Memoria basada en archivos | Alaya |
Desperdicio de tokens | Inyección de contexto completo (~35K tokens/mensaje) | La recuperación clasificada devuelve solo las top-k memorias relevantes |
Sin estructura | Todo en un archivo (los usuarios inventan soluciones | Tres almacenes tipados: episodios, conocimiento, preferencias |
Sin olvido | Los archivos crecen hasta que los curas manualmente | El decaimiento de doble fuerza de Bjork separa la fuerza de almacenamiento de la fuerza de recuperación; el olvido inducido por la recuperación (RIF) suprime activamente las memorias competidoras |
Sin asociaciones | Archivos planos, sin enlaces entre memorias | Fortalecimiento de correcuperación hebbiana (LTP/LTD): las memorias recuperadas juntas fortalecen las conexiones; la activación por propagación encuentra asociaciones indirectas |
Preferencias frágiles | Resumen escrito por el agente, deriva fácilmente | Las preferencias implícitas emergen de impresiones acumuladas vía vasana (perfumado), no requiere LLM; se cristalizan en un umbral |
Requiere LLM | No puede funcionar sin uno | Degradación elegante en cada nivel. ¿Sin embeddings? Solo BM25. ¿Sin LLM? Los episodios se acumulan. Cada capacidad es opcional de forma independiente |
Primeros pasos
Servidor MCP (recomendado para agentes)
La forma más rápida de añadir la memoria de Alaya a cualquier agente compatible con MCP (Claude Desktop, Claude Code, Cursor, Cline, etc.):
Vía npm (no se necesita cadena de herramientas de Rust)
Añadir a tu configuración de Claude Code (~/.claude/claude_code_config.json):
{
"mcpServers": {
"alaya": {
"command": "npx",
"args": ["-y", "alaya-mcp"]
}
}
}O para Claude Desktop / otros clientes MCP (con auto-consolidación LLM opcional):
{
"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"
}
}
}
}Desde el código fuente (requiere Rust 1.75+)
git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo build --release --features "mcp llm"Luego añadir a tu configuración MCP:
{
"mcpServers": {
"alaya": {
"command": "/path/to/alaya/target/release/alaya-mcp"
}
}
}Las variables de entorno ALAYA_LLM_* son opcionales; sin ellas, el servidor funciona en modo prompt (recuerda al agente llamar a learn después de 10 episodios). Con una clave API y la característica llm, realiza la auto-consolidación.
Eso es todo. Tu agente ahora tiene 13 herramientas de memoria:
Herramienta | Qué hace |
| Almacena un mensaje de conversación (sugiere consolidación después de 10 episodios) |
| Busca en la memoria con recuperación híbrida (+ impulso de categoría) |
| Enseña conocimiento extraído directamente: el agente extrae hechos y llama a esto |
| Estadísticas ricas de memoria: episodios, desglose de conocimiento, categorías, grafo, embeddings |
| Obtiene las preferencias de usuario aprendidas |
| Obtiene hechos semánticos destilados (+ filtro de categoría) |
| Ejecuta limpieza de memoria (deduplicación, decaimiento) |
| Elimina memorias por sesión, antigüedad o todas |
| Lista categorías emergentes con filtro de estabilidad |
| Vecinos del grafo mediante activación por propagación |
| A qué categoría pertenece un nodo |
| Importa observaciones de una base de datos claude-mem |
| Importa historial de conversación de archivos JSONL de Claude Code |
Consulta docs/mcp-quickstart.md para un tutorial completo con interacciones de ejemplo y el prompt del sistema recomendado.
Los datos se almacenan en ~/.alaya/memory.db (se puede sobrescribir con la variable de entorno ALAYA_DB). Un solo archivo SQLite, sin servicios externos.
Ejemplo de interacción — lo que ve tu agente al usar Alaya:
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%)Variables de entorno:
Variable | Predeterminado | Descripción |
|
| Ruta a la base de datos SQLite |
| (ninguna) | Clave API para auto-consolidación (habilita |
|
| Endpoint de completado de chat compatible con OpenAI |
|
| Nombre del modelo. Cualquier modelo pequeño/rápido funciona (GPT-4o-mini, Haiku, Gemini Flash, etc.) |
Biblioteca de Rust
Para integrar Alaya directamente en una aplicación de Rust:
[dependencies]
alaya = "0.2.2"Inicio rápido (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()?;Ejecutar la demo
La demo recorre las once capacidades con salida anotada y sin dependencias externas:
git clone https://github.com/SecurityRonin/alaya.git
cd alaya
cargo run --example demoArquitectura
Alaya es una biblioteca, no un framework. Tu agente posee el bucle de conversación, el LLM y el modelo de embedding. Alaya posee la memoria.
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 + tombstonesTres almacenes
Almacén | Análogo | Propósito |
Episódico | Hipocampo | Eventos de conversación crudos con contexto completo |
Semántico | Neocórtex | Conocimiento destilado extraído mediante consolidación |
Implícito | Alaya-vijnana | Preferencias y hábitos que emergen mediante el perfumado |
Pipeline de recuperación
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]Procesos del ciclo de vida
Proceso | Inspiración | Qué hace |
Consolidación | Teoría CLS (McClelland et al.) | Destila episodios en conocimiento semántico |
Perfumado | Vasana (psicología budista Yogacara) | Acumula impresiones, cristaliza preferencias |
Transformación | Asraya-paravrtti | Deduplica, decaimiento de enlaces LTD, poda, descubre categorías |
Olvido | Bjork & Bjork (1992) | Decae la fuerza de recuperación, archiva nodos débiles |
RIF | Anderson et al. (1994) | El olvido inducido por la recuperación suprime memorias competidoras |
Ontología emergente | Vikalpa (construcción conceptual) | Categorías jerárquicas emergen del clustering; se dividen automáticamente cuando son demasiado amplias |
Guía de integración
Implementación de ConsolidationProvider
El trait ConsolidationProvider conecta Alaya a tu LLM para la extracción de conocimiento:
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!()
}
}Usa NoOpProvider sin un LLM. Los episodios se acumulan y la recuperación BM25 funciona sin consolidación.
Implementación de ExtractionProvider (auto-consolidación)
El trait ExtractionProvider permite la extracción automática de conocimiento sin llamadas manuales a consolidate(). Cuando está configurado, el servidor MCP realiza la auto-consolidación después de 10 episodios no consolidados:
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()?;La bandera de característica llm proporciona un LlmExtractionProvider listo para usar que llama a cualquier API compatible con OpenAI:
use alaya::LlmExtractionProvider;
let provider = LlmExtractionProvider::builder()
.api_key("sk-...")
.model("gpt-4o-mini") // default; any small model works
.build()?;Programación del ciclo de vida
Método | Cuándo llamar | Qué hace |
| Después de acumular 10+ episodios | Extrae conocimiento semántico de los episodios |
| En cada interacción del usuario | Extrae impresiones conductuales, cristaliza preferencias |
| Diaria o semanalmente | Deduplica, decaimiento de enlaces LTD, poda enlaces débiles, descubre categorías |
| Diaria o semanalmente | Decae la fuerza de recuperación, archiva nodos verdaderamente olvidados |
| A petición del usuario | Elimina en cascada por sesión/antigüedad con seguimiento de lápidas |
Referencia de API
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>>;
}Principios de diseño
La memoria es un proceso, no una base de datos. Cada recuperación cambia lo que se recuerda. El grafo se remodela con el uso.
El olvido es una característica. El decaimiento de doble fuerza de Bjork separa la fuerza de almacenamiento de la fuerza de recuperación. El olvido inducido por la recuperación (RIF) suprime activamente las memorias competidoras. Ambos mejoran la calidad de la recuperación con el tiempo.
Las preferencias emergen, no se declaran. Los patrones conductuales se cristalizan a partir de impresiones acumuladas vía vasana (perfumado), no requiere LLM.
El agente posee la identidad. Alaya almacena semillas. El agente decide qué semillas importan y cómo presentarlas.
Degradación elegante. ¿Sin embeddings? Solo BM25. ¿Sin LLM? Los episodios se acumulan. Cada característica funciona de forma independiente.
Fundamentos de investigación
Arquitectura basada en la neurociencia, la psicología budista y la recuperación de información. Para mapeos detallados, consulta docs/theoretical-foundations.md.
Neurociencia: LTP/LTD hebbiana (Hebb 1949, Bliss & Lomo 1973), Sistemas de Aprendizaje Complementarios (McClelland et al. 1995), activación por propagación (Collins & Loftus 1975), especificidad de codificación (Tulving & Thomson 1973), olvido de doble fuerza (Bjork & Bjork 1992), olvido inducido por la recuperación (Anderson et al. 1994), límites de la memoria de trabajo (Cowan 2001).
Psicología budista Yogacara: Alaya-vijnana (conciencia de almacén), bija (semillas), vasana (perfumado), asraya-paravrtti (transformación), vijnaptimatrata (memoria relativa a la perspectiva).
Recuperación de información: Fusión de rango recíproco (Cormack et al. 2009), BM25 vía FTS5, búsqueda vectorial de similitud de coseno.
Comparación con alternativas
graph LR
AGENT["AI Agent"]
subgraph SIMPLE["Simple"]
FILE["File-Based<br/><i>MEMORY.md<br/>OpenClaw</i>"]
end
subgraph INTEGRATED["Integrated"]
FW["Framework Memory<br/><i>LangChain · CrewAI<br/>Letta</i>"]
CODE["Coding Agent<br/><i>Beads · Engram<br/>via MCP</i>"]
end
subgraph ENGINES["Memory Engines"]
DED["Dedicated Systems<br/><i><b>Alaya</b> · Vestige<br/>mem0 · Zep</i>"]
end
subgraph INFRA["Infrastructure"]
VDB["Vector DBs<br/><i>Pinecone · Chroma<br/>Weaviate</i>"]
end
RESEARCH["Research<br/><i>Generative Agents<br/>SYNAPSE · HippoRAG</i>"]
AGENT <--> FILE
AGENT <--> FW
AGENT <--> CODE
AGENT <--> DED
DED -.->|storage| VDB
FW -.->|storage| VDB
RESEARCH -.->|ideas| DED
RESEARCH -.->|ideas| FWAlaya es un motor de memoria dedicado con dinámicas de memoria basadas en la neurociencia. Lo que lo diferencia de cualquier otro sistema: olvido de doble fuerza de Bjork (separando el almacenamiento de la fuerza de recuperación), olvido inducido por la recuperación (recuperar A suprime a los competidores B y C), fortalecimiento de correcuperación hebbiana (LTP/LTD) y emergencia de preferencias implícitas sin un LLM, todo en una sola biblioteca integrable de Rust + SQLite. Pares más cercanos: Vestige (Rust, FSRS-6, activación por propagación) y SYNAPSE (grafo episódico-semántico unificado, inhibición lateral).
Por qué Alaya sobre...
Alternativa | Qué hace bien | Qué añade Alaya |
** |
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