Generated banner for MIRIX
Generated logo for MIRIX

MIRIX

Memory server

Created by Mirix AI

Published in Mirix-AI/MIRIX. Publisher page

3,460 GitHub stars

What it is

Mirix is a multi-agent personal assistant designed to track on-screen activities and answer user questions intelligently. By capturing real-time visual data and consolidating it into structured memories, Mirix transforms raw inputs into a rich knowledge base that adapts to your digital experiences.
— the description by Mirix AI

AutoGineer overview, from the brain’s own files

Mirix is a memory server designed to provide AI agents with persistent, multi-modal memory. It functions by observing screen activity and processing natural language conversations, consolidating these inputs into six distinct memory components: Core, Episodic, Semantic, Procedural, Resource, and Knowledge Vault. The system uses a hybrid storage approach, leveraging PostgreSQL with pgvector for search and an optional Neo4j graph database for provenance tracking. Mirix includes an 'Auto-Dream' feature for periodic memory consolidation, deduplication, and refinement, ensuring that the agent's knowledge base remains structured and relevant over time.

How it works

Memory model: Hybrid

AutoGineer overview, from the brain’s own files

Mirix operates as a backend server that orchestrates six specialized sub-agents to manage different memory types. It captures user interactions and visual screen data, which are then processed and stored in a PostgreSQL database. The system supports full-text search via BM25 and vector similarity search. An optional graph memory layer can be enabled to map relationships between entities using Neo4j. The Auto-Dream functionality allows the system to review and merge memory entries, while the provided Python client enables agents to read from and write to these memory stores.

Folders
FolderRoleFiles
.githubagent-config1
assetsattachments3
docsdocs5
samplesexamples16
scriptsscripts34
teststests132
.vscodefolder2
dashboardfolder35
dockerfolder3
evalsfolder53
mirixfolder341

The agent writes

Requirements

Apps: Docker

Runtimes: Python >=3.10,<4.0

Databases: Neo4j, PostgreSQL, Redis, SQLite

API keys (by name): MIRIX_API_KEY

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Google Antigravity, Kiro, OpenCode, Amp, Roo Code, Cline, JetBrains Junie, Devin (ex-Windsurf)

Set it up

  1. This brain runs code automatically: 2 scripts. Review Makefile, setup.py before opening the folder in Claude Code. No step below turns a hook on for you.

    • Makefile: $(POETRY) install
    • setup.py: python setup.py
  2. Not scanned by AutoGineerThe author’s README also describes installing it with Docker Compose. Read its install section: AutoGineer did not scan that path. https://github.com/Mirix-AI/MIRIX/blob/9077e4b229dd8f61c5703b431a97788c6b61acfb/README.md#quick-start
  3. Not scanned by AutoGineerAutoGineer could not scan everything it runs. https://pypi.org/project/mirix/
  4. Created by Mirix AI. Published in Mirix-AI/MIRIX. Licence: Apache License 2.0.

Usage

AutoGineer overview, from the brain’s own files

  • Initialize a meta-agent with specific memory components.
  • Add conversation turns or tool-use logs to the memory store.
  • Retrieve context-aware memories based on user queries.
  • Trigger memory consolidation using the Auto-Dream endpoint.
  • Enable graph-based provenance for complex entity relationships.
“What did we discuss on MirixDB in last 4 days?”
The agent retrieves relevant conversation history and memory blocks from the last four days to answer the user's question.
“Deploy the service.”
The agent records the tool call, captures any resulting errors or successful fixes, and stores this as procedural memory for future reference.

Documentation by Mirix AI

Image: Mirix Logo

MIRIX - Multi-Agent Personal Assistant with an Advanced Memory System

Your personal AI that builds memory through screen observation and natural conversation

| 🌐 Website | 📚 Documentation | 📄 Paper | 💬 Discord

<!-- | [Twitter/X](https://twitter.com/mirix_ai) | [Discord](https://discord.gg/S6CeHNrJ) | -->


Key Features 🔥
  • Multi-Agent Memory System: Six specialized memory components (Core, Episodic, Semantic, Procedural, Resource, Knowledge Vault) managed by dedicated agents

  • Screen Activity Tracking: Continuous visual data capture and intelligent consolidation into structured memories

  • Privacy-First Design: All long-term data stored locally with user-controlled privacy settings

  • Advanced Search: PostgreSQL-native BM25 full-text search with vector similarity support

  • Graph Memory (optional): A provenance hypergraph over episodic and semantic memories in Neo4j, with n-ary facts that link entities through named roles and cite the memory rows they came from

  • Multi-Modal Input: Text, images, voice, and screen captures processed seamlessly

Results

Image: MIRIX-2.0 compared with other memory systems on user-centric and agent-centric tasks

MIRIX-2.0 compared with other memory systems. Each axis label gives the MIRIX-2.0 score; the value in parentheses is its lead over the strongest baseline on that axis, shown where MIRIX-2.0 leads.

  • (a) User-centric tasks (accuracy, %): conversational recall on LoCoMo and LongMemEval-S, and the document QA tracks of MemoryAgentBench (SHDocQA, MHDocQA, DetectiveQA). Baselines are A-Mem, Graphiti, MemoryBank, mem0 and HyperMem. LoCoMo uses graph memory with AutoDream; LongMemEval-S and document QA use graph memory alone.

  • (b) Agent-centric tasks (success rate, %): the six ALFWorld task types (Pick, Look, Clean, Heat, Cool, Pick Two) and five WebShop product categories (Fashion, Beauty, Electronics, Garden, Grocery), with GPT-6 Luna as the agent model. Baselines are no memory, AWM and ReasoningBank.

Quick Start

Step 1: Backend & Dashboard (Docker):

docker compose up -d --pull always

Step 2: Create an API key in the dashboard (http://localhost:5173) and set as the environmental variable MIRIX_API_KEY.

Step 3: Client (Python, mirix-client, https://pypi.org/project/mirix-client/):

pip install mirix-client

Now you are ready to go! See the example below:

from mirix import MirixClient

client = MirixClient(
    api_key="your-api-key",
    base_url="http://localhost:8531",
)

client.initialize_meta_agent(
    config={
        "llm_config": {
            "model": "gemini-3.6-flash",
            "model_endpoint_type": "google_ai",
            "api_key": "your-api-key-here",
            "model_endpoint": "https://generativelanguage.googleapis.com",
            "context_window": 1_000_000,
        },
        "embedding_config": {
            "embedding_model": "gemini-embedding-001",
            "embedding_endpoint_type": "google_ai",
            "api_key": "your-api-key-here",
            "embedding_endpoint": "https://generativelanguage.googleapis.com",
            "embedding_dim": 768,
        },
        "meta_agent_config": {
            "agents": [
                {
                    "core_memory_agent": {
                        "blocks": [
                            {"label": "human", "value": ""},
                            {"label": "persona", "value": "I am a helpful assistant."},
                        ]
                    }
                },
                "resource_memory_agent",
                "semantic_memory_agent",
                "episodic_memory_agent",
                "procedural_memory_agent",
                "knowledge_vault_memory_agent",
            ],
        },
    }
)

client.add(
    user_id="demo-user",
    messages=[
        {"role": "user", "content": [{"type": "text", "text": "The moon now has a president."}]},
        {"role": "assistant", "content": [{"type": "text", "text": "Noted."}]},
    ],
    session_id="sess-demo-001",
)

# Include tool activity when you want skills learned from the WORK PROCESS:
# tool errors, retries, and the fix that finally worked are the distiller's
# strongest signals. Pass tool results as role="tool" turns and/or a
# "tool_calls" list on assistant messages (OpenAI shape) — both are preserved
# in the session conversation store.
client.add(
    user_id="demo-user",
    messages=[
        {"role": "user", "content": [{"type": "text", "text": "Deploy the service."}]},
        {"role": "assistant", "content": "", "tool_calls": [
            {"function": {"name": "kubectl_apply", "arguments": "{\"file\": \"deploy.yaml\"}"}}
        ]},
        {"role": "tool", "name": "kubectl_apply", "content": "error: forbidden (missing RBAC)"},
        {"role": "assistant", "content": [{"type": "text", "text": "Fixed the RBAC role and redeployed successfully."}]},
    ],
    session_id="sess-demo-001",
)

memories = client.retrieve_with_conversation(
    user_id="demo-user",
    messages=[
        {"role": "user", "content": [{"type": "text", "text": "What did we discuss on MirixDB in last 4 days?"}]},
    ],
    limit=5,
)
print(memories)

For more API examples, see samples/run_client.py.

Auto-Dream Memory Consolidation

MIRIX also exposes an auto-dream endpoint for explicit memory cleanup and consolidation. Auto-dream reviews existing memories, merges duplicates, resolves stale/conflicting entries where possible, and writes the result back through the memory tools.

REST endpoint:

POST /memory/auto_dream?user_id=demo-user
Content-Type: application/json

{
  "mode": "experience",
  "dry_run": false
}

Supported mode values:

ModeMemory component(s) reviewed
coreCore memory blocks
episodicEpisodic memories
semanticSemantic memories
resourceResource memories
proceduralProcedural memories
knowledgeKnowledge Vault memories
experienceEpisodic, Semantic, and Knowledge Vault memories together

Use dry_run: true to fetch counts and inspect what would be processed without applying updates. The optional model field can override the auto-dream agent model for that request. For procedural mode, pass the target meta_agent_id and optionally last_n_sessions to distill recent session experiences.

Python client example:

result = client.auto_dream(
    user_id="demo-user",
    mode="procedural",
    meta_agent_id=meta_agent.id,
    last_n_sessions=3,
    dry_run=False,
)
print(result)
Graph Memory

MIRIX can index episodic and semantic memories into a provenance hypergraph stored in Neo4j. Entities become anchors, each extracted fact becomes an n-ary frame whose edges name the role each anchor plays, and every frame cites the memory rows it came from. With graph memory on, episodic and semantic retrieval enters through the graph, and Auto-Dream merges duplicate anchors on the graph instead of rewriting stored memories.

Graph memory is off by default. To turn it on:

  1. Start Neo4j 5.23 or later. docker compose --profile graph up -d starts Neo4j 5.26 with APOC; first set MIRIX_NEO4J_PASSWORD (at least 8 characters) in .env, because there is no default password.

  2. Install the Neo4j driver. It is in requirements.txt; after pip install -e ., run pip install "neo4j>=5.20,<6".

  3. Set MIRIX_ENABLE_GRAPH_MEMORY=true and MIRIX_NEO4J_PASSWORD to the password your Neo4j uses. MIRIX_NEO4J_URI and MIRIX_NEO4J_USER default to bolt://localhost:7687 and neo4j.

With graph memory on, POST /memory/auto_dream refines the graph only unless the request sets graph_only to false. Evaluation settings and commands are in evals/GRAPH_MEMORY.md.

Upgrading an Existing Database

Fresh databases get their full schema automatically at startup. Existing databases require manual migrations when upgrading to a version that alters tables — startup creates missing tables but never adds columns to existing ones. If migrations are pending, the server refuses to start and names the exact scripts to run.

For the skill-based procedural memory release, run against your database (in this order):

psql "$MIRIX_PG_URI" -f scripts/migrate_procedural_to_skill.sql
psql "$MIRIX_PG_URI" -f scripts/migrate_add_message_session_id.sql
psql "$MIRIX_PG_URI" -f scripts/migrate_add_message_session_id_phase2.sql   # outside a transaction (CREATE INDEX CONCURRENTLY)
psql "$MIRIX_PG_URI" -f scripts/migrate_add_conversation_message.sql
psql "$MIRIX_PG_URI" -f scripts/migrate_add_conversation_message_phase2.sql # outside a transaction
psql "$MIRIX_PG_URI" -f scripts/migrate_add_skill_experience.sql
psql "$MIRIX_PG_URI" -f scripts/migrate_add_agent_trigger_state.sql
psql "$MIRIX_PG_URI" -f scripts/migrate_backfill_procedural_scope.sql   # backfill filter_tags['scope'] from each skill's owning client

For the graph-memory release, which adds five provenance columns, also run:

psql "$MIRIX_PG_URI" -f scripts/migrate_add_graph_provenance_columns.sql

Each script is idempotent where possible and documents its own preconditions in its header. Run them once, then restart the server.

License

Mirix is released under the Apache License 2.0. See the LICENSE file for more details.

Contact

For questions, suggestions, or issues, please open an issue on the GitHub repository or contact us at [e-mail address on the upstream page](https://github.com/Mirix-AI/MIRIX/blob/9077e4b229dd8f61c5703b431a97788c6b61acfb/README.md)

Join Our Community

Connect with other Mirix users, share your thoughts, and get support:

💬 Discord Community

Join our Discord server for real-time discussions, support, and community updates: https://discord.gg/S6CeHNrJ

🎯 Weekly Discussion Sessions

We host weekly discussion sessions where you can:

  • Discuss issues and bugs

  • Share ideas about future directions

  • Get general consultations and support

  • Connect with the development team and community

📅 Schedule: Friday nights, 8-9 PM PST 🔗 Zoom Link: https://ucsd.zoom.us/j/96278791276

📱 WeChat Group

You can add the account ari_asm so that I can add you to the group chat.

Acknowledgement

We would like to thank Letta for open-sourcing their framework, which served as the foundation for the memory system in this project.

docs/ARCHITECTURE.md

MIRIX Architecture

System Overview

Three-tier architecture: Client SDK → REST API → AsyncServer

┌──────────────────────────────────┐
│  MirixClient                     │
│  mirix/client/remote_client.py   │
└─────────────┬────────────────────┘
              │ HTTP/HTTPS
              ▼
┌──────────────────────────────────┐
│  REST API (FastAPI, port 8531)   │
│  mirix/server/rest_api.py        │
│  get_server() → singleton        │
└─────────────┬────────────────────┘
              │ method calls
              ▼
┌──────────────────────────────────┐
│  AsyncServer                     │
│  mirix/server/server.py          │
└─────────────┬────────────────────┘
              │
              ▼
┌─────────────────────────────────────────┐
│  MetaAgent                              │
│  mirix/agent/meta_agent.py              │
└──┬──────┬──────┬──────┬──────┬──────┬──┘
   ▼      ▼      ▼      ▼      ▼      ▼
 Core  Episodic Semantic Proced Resource KnowledgeVault
Agent  Agent   Agent    Agent  Agent    Agent

Data Flow

Write path (add memories)
Client → POST /memory/add
       → AsyncServer.add()
       → MetaAgent.step()
       → Agent chaining loop (see Agent Execution below)
       → Sub-agents extract typed memories via tools
       → Managers (mirix/services/) persist via ORM
       → PostgreSQL
Read path (retrieve memories)
Client → POST /memory/retrieve/conversation
       → AsyncServer.retrieve()
       → Memory Managers query PostgreSQL
           - BM25 full-text search (pg_bm25)
           - Vector similarity search (pgvector)
           - Fuzzy match (rapidfuzz)
       → Results ranked and returned

Layer Responsibilities

LayerLocationResponsibility
ORM Modelsmirix/orm/SQLAlchemy table definitions
Schemasmirix/schemas/Pydantic request/response validation
Managersmirix/services/Business logic, DB access
Agentsmirix/agent/LLM orchestration, memory extraction
APImirix/server/rest_api.pyHTTP routing, auth
Client SDKmirix/client/remote_client.pyExternal API wrapper

Memory Types

TypeORMManagerAgentDescription
Coremirix/orm/block.pymirix/services/block_manager.pycore_memory_agentPersona + human profile blocks
Episodicmirix/orm/episodic_memory.pymirix/services/episodic_memory_manager.pyepisodic_memory_agentTime-stamped events
Semanticmirix/orm/semantic_memory.pymirix/services/semantic_memory_manager.pysemantic_memory_agentFacts and concepts
Proceduralmirix/orm/procedural_memory.pymirix/services/procedural_memory_manager.pyprocedural_memory_agentHow-to procedures
Resourcemirix/orm/resource_memory.pymirix/services/resource_memory_manager.pyresource_memory_agentFiles, links, assets
Knowledge Vaultmirix/orm/knowledge_vault.pymirix/services/knowledge_vault_manager.pyknowledge_vault_memory_agentSensitive/private facts

Agent Types

AgentAgentType EnumPurpose
core_memory_agentAgentType.core_memory_agentMaintains persona + human profile
episodic_memory_agentAgentType.episodic_memory_agentExtracts time-stamped events
semantic_memory_agentAgentType.semantic_memory_agentExtracts facts and concepts
procedural_memory_agentAgentType.procedural_memory_agentExtracts procedures
resource_memory_agentAgentType.resource_memory_agentExtracts files/links/assets
knowledge_vault_memory_agentAgentType.knowledge_vault_memory_agentExtracts sensitive facts
meta_memory_agentAgentType.meta_memory_agentCoordinates memory sub-agents
reflexion_agentAgentType.reflexion_agentSelf-reflection and learning
background_agentAgentType.background_agentBackground processing tasks
chat_agentAgentType.chat_agentUser-facing conversation
coder_agentAgentType.coder_agentSpecialized coding tasks

Agent Execution

step() method
async def step(
    self,
    input_messages,
    chaining: bool = True,       # enabled by default
    max_chaining_steps: Optional[int] = None,
    ...
) -> MirixUsageStatistics
Chaining loop

Agents loop through inner_step() calls until a terminal tool is called:

  • Chat agents terminate on send_message() — delivers response to user

  • Memory agents terminate on finish_memory_update() — signals memory write complete

Between steps, heartbeat messages are injected:

  • Normal continuation: "[System] Function called using continue_chaining=true, returning control"

  • After failure: "[System] Function call failed, returning control"

When max_chaining_steps is reached, agents are directed to call their terminal tool immediately.

Context window management
  • Warning threshold: 75% of context window (memory_warning_threshold = 0.75)

  • Target after summarization: 10% memory pressure (desired_memory_token_pressure = 0.1)

  • Summarization preserves the last 5 messages (keep_last_n_messages = 5)

  • Summary is prepended; old messages are trimmed

Tool Types

TypeExecution
MIRIX_COREget_function_from_module(MIRIX_CORE_TOOL_MODULE_NAME, name)
MIRIX_MEMORY_COREget_function_from_module(MIRIX_MEMORY_TOOL_MODULE_NAME, name)
MIRIX_EXTRAget_function_from_module(MIRIX_EXTRA_TOOL_MODULE_NAME, name)
USER_DEFINEDToolExecutionSandbox(...).run() — isolated sandbox
MCPModel Context Protocol — arguments passed as-is

REST API Endpoints

Health
MethodPath
GET/health
Agents
MethodPath
GET/agents
POST/agents
GET/agents/{agent_id}
DELETE/agents/{agent_id}
PATCH/agents/{agent_id}
PATCH/agents/{agent_id}/system
PATCH/agents/by-name/{agent_name}/system
POST/agents/meta/initialize
POST/agents/{agent_id}/messages
Memory
MethodPath
POST/memory/add
POST/memory/retrieve/conversation
GET/memory/retrieve/topic
GET/memory/search
GET/memory/search_all_users
POST/memory/search_raw
GET/memory/components
GET/memory/fields
POST/memory/raw
GET/memory/raw/{memory_id}
PATCH/memory/raw/{memory_id}
DELETE/memory/raw/{memory_id}
POST/memory/raw/cleanup
PATCH/memory/episodic/{memory_id}
DELETE/memory/episodic/{memory_id}
PATCH/memory/semantic/{memory_id}
DELETE/memory/semantic/{memory_id}
PATCH/memory/resource/{memory_id}
DELETE/memory/resource/{memory_id}
DELETE/memory/knowledge_vault/{memory_id}
Tools
MethodPath
GET/tools
POST/tools
GET/tools/{tool_id}
DELETE/tools/{tool_id}
Blocks
MethodPath
GET/blocks
POST/blocks
GET/blocks/{block_id}
DELETE/blocks/{block_id}
Users & Organizations
MethodPath
GET/users
GET/users/{user_id}
POST/users/create_or_get
DELETE/users/{user_id}
DELETE/users/{user_id}/memories
GET/organizations
POST/organizations
GET/organizations/{org_id}
POST/organizations/create_or_get
Clients & API Keys
MethodPath
GET/clients
POST/clients/create_or_get
GET/clients/{client_id}
PATCH/clients/{client_id}
DELETE/clients/{client_id}
POST/clients/{client_id}/api-keys
GET/clients/{client_id}/api-keys
DELETE/clients/{client_id}/api-keys/{api_key_id}
DELETE/clients/{client_id}/memories
Configuration
MethodPath
GET/config/llm
GET/config/embedding
Admin / Auth
MethodPath
POST/admin/auth/register
POST/admin/auth/login
GET/admin/auth/me
POST/admin/auth/change-password
GET/admin/auth/check-setup
GET/admin/dashboard-clients

Authentication

Two supported methods:

  • API Key: X-API-Key: <key> header — for programmatic clients

  • Bearer JWT: Authorization: Bearer <token> — for dashboard sessions

Client context passed via:

  • x-client-id header — identifies the client

  • x-org-id header — identifies the organization

Validated via get_client_and_org() helper in rest_api.py.

Infrastructure Services

ServiceImagePortUsed For
PostgreSQL + pgvectorankane/pgvector:v0.5.15432Primary storage, BM25, vector search
Redis Stackredis/redis-stack-server6379Caching, fast lookups
Kafka (via aiokafka)——Async memory extraction queue

Key Files

FilePurpose
mirix/server/rest_api.pyAll HTTP endpoints (FastAPI)
mirix/server/server.pyAsyncServer — core request handling logic
mirix/agent/meta_agent.pyOrchestrates all memory sub-agents
mirix/agent/agent.pyBase async agent: step(), chaining, tool execution
mirix/settings.pyAll env var configuration (Pydantic BaseSettings)
mirix/constants.pyHeartbeat messages, thresholds, shared constants
mirix/queue/manager.pyQueue orchestration
mirix/llm_api/LLM provider clients (OpenAI, Anthropic, Google, etc.)
mirix/client/remote_client.pyAsync HTTP client SDK (70+ methods)

Async Design

The full async rationale is documented in docs/Mirix_async_native_changes.md. All I/O uses async drivers: asyncpg, redis.asyncio, aiokafka, httpx.AsyncClient. Only 5 intentional sync touch-points exist — see that doc for details.

512 files · 499 not served here

Advantages

  • Supports multi-modal inputs including text, images, voice, and screen captures. evidence: README.md
  • Provides a provenance hypergraph to link entities and cite memory sources. evidence: README.md

Limitations

  • Existing databases require manual migration scripts when upgrading to versions that alter table schemas. evidence: README.md
  • Requires manual configuration and setup of external dependencies like PostgreSQL and optional Neo4j. evidence: README.md

Security

Risk level: Low risk

This brain runs

Agent instructions that run or fetch something (12)

  • .cursorrules: User-defined tools run in `ToolExecutionSandbox` for security
  • .cursorrules: Run tests with: `pytest tests/`
  • .cursorrules: Run linters before committing: `ruff check .` and `pyright`
  • .cursorrules: User-defined tools MUST run in `ToolExecutionSandbox`
  • CLAUDE.md: docker-compose up -d # starts PostgreSQL (5432), Redis (6379), API (8531), Dashboard (5173)
  • CLAUDE.md: docker-compose ps # verify all services healthy
  • CLAUDE.md: pip install -e .
  • CLAUDE.md: python scripts/start_server.py --port 8531
  • CLAUDE.md: python scripts/start_server.py --port 8899 # Terminal 1
  • CLAUDE.md: make format # ruff import sort + format
  • CLAUDE.md: make lint # ruff check + pyright
  • CLAUDE.md: make check # format + lint + test

Install scripts (2)

  • Makefile (make install): $(POETRY) install
  • setup.py: python setup.py
  • Low risk: network-instructions (CLAUDE.md:31)
  • Low risk: scripts-present (scripts/start_server.py)
  • Low risk: scripts-present (setup.py)

Attribution and licence

Created by
Mirix AI
First committed by
@wangyu-ustc
Declared authors
  • Mirix AI (declared in pyproject.toml)
Publisher
MIRIX-AI (Community)
Source
Mirix-AI/MIRIX · commit 9077e4b
Licence
Apache License 2.0 (files served here)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Mirix AI.

Install from source

499 of its files are not served here, so there is no ZIP. Mirix-AI/MIRIX at 9077e4b