A plastic memory well for coding agents.
Project description
Mimir
A plastic memory well for coding agents.
Unlike vector notebooks, Mimir reshapes its own embedding space as you work. One matrix. Zero cloud. Always local.
Why Mimir?
Most agent memory tools are filing cabinets: they store text, then search it. They don't learn. They don't adapt. They just retrieve.
Mimir is different.
It maintains a small, fixed-size prototype matrix that is updated with every interaction via Hebbian-style local learning. The same embedding model keeps its base weights, but Mimir overlays a fast, plastic layer that bends toward your domain, your project, and your habits.
The result: a memory system that feels less like a database and more like a second brain that gets sharper the more you use it.
What makes Mimir unique
| Other memory tools | Mimir | |
|---|---|---|
| Core model | Store and retrieve discrete facts | Learn a plastic prototype matrix |
| Learning | Heuristic scoring, TTL decay, or no learning at all | Hebbian / Oja local updates + Markov prediction |
| State size | Often grows with history (SQLite/vector DB) | Fixed [k × dim] matrix, typically < 100 MB |
| Offline | Needs cloud API or hosted vector DB | Runs locally with llama-server, sentence-transformers, or fake backend |
| Inference | Calls DB/index on every recall | Pure matrix operation, no locks, predictable latency |
Quick Start
pip install mimir-core
Use it from Python
from mimir import Mimir, MimirConfig
config = MimirConfig(
base_model="all-MiniLM-L6-v2",
num_prototypes=64,
top_k=4,
)
mimir = Mimir(config)
# Encode
emb = mimir.encode("hello world")
print(emb.shape) # (1, 384)
# Learn
report = mimir.learn("hello world", importance=1.0)
print(report)
# Save / load
mimir.save("checkpoint.pt")
mimir.load("checkpoint.pt")
Plug it into your coding agent
Mimir exposes an MCP server and Agent CLI hooks for Kimi Code, Claude Code,
Codex, and OpenCode. Each workspace is isolated under ~/.mimir/workspaces/.
Start the MCP server
# Local embedding backend (recommended)
llama-server \
--model Qwen3-Embedding-8B-Q4_K_M.gguf \
--embeddings \
--port 11435
# Or use sentence-transformer if you don't have llama-server
mimir mcp --backend sentence-transformer
Configure Kimi Code / Claude Code / Codex (.mcp.json)
{
"mcpServers": {
"mimir": {
"command": "mimir",
"args": ["mcp", "--backend", "sentence-transformer"]
}
}
}
Configure OpenCode (.opencode/opencode.jsonc)
{
"mcp": {
"mimir": {
"type": "local",
"command": ["mimir", "mcp", "--backend", "sentence-transformer"]
}
}
}
Auto-recall and auto-learn with hooks
# ~/.kimi-code/config.toml
[[hooks]]
event = "UserPromptSubmit"
command = "python3 -m mimir.hooks.mimir_turn"
timeout = 10
[[hooks]]
event = "Stop"
command = "python3 -m mimir.hooks.mimir_turn"
timeout = 10
See docs/mcp-user-guide.md for the full hook guide.
How It Works
Text
│
▼
[Base embedding model] ───────┐
│ │
▼ │
Base embedding │
│ │
▼ │
[Prototype matrix lookup] │
│ │
▼ │
Sparse prototype activation │
│ │
▼ │
Residual modulation ◄─────────┘
│
▼
Mimir embedding
- Slow weights: the frozen base embedding model gives stable semantic priors.
- Fast weights: a fixed-capacity prototype matrix encodes your local domain.
- Learning: each input activates the nearest prototypes and nudges them toward the new observation.
- Prediction: a first-order Markov transition matrix predicts the next
prototype and emits a
surprise_score. - Forgetting: prototype strength decays exponentially; weak prototypes are overwritten when capacity is full.
This design is inspired by Prototype Theory in cognitive psychology and Predictive Coding in neuroscience: memory is not a pile of events, but a compressed set of typical examples that continuously updates itself.
MCP Tools
| Tool | Purpose |
|---|---|
store(text, importance=1.0) |
Store and learn from text |
recall(query, top_k=5, min_score=0.0) |
Retrieve relevant memories |
consolidate() |
Consolidate the working memory buffer |
forget() |
Clear the current session's working memory |
checkpoint(name) |
Save a named checkpoint |
restore(name) |
Restore to a named checkpoint |
status() |
Show session stats |
Programming Interface
If you want to use Mimir inside your own Python code:
from mimir.adapters.agents import InMemoryAgentAdapter, Message
from mimir.core.config import MimirConfig
adapter = InMemoryAgentAdapter(
config=MimirConfig(base_model="all-MiniLM-L6-v2", top_k=4),
)
adapter.observe([
Message(role="user", content="请用 Python 写快排"),
Message(role="assistant", content="..."),
])
adapter.consolidate()
memories = adapter.recall("Python 排序", top_k=3)
print(adapter.memory_count)
adapter.clear_memories()
See docs/agent-integration.md for the adapter API.
CLI
# Encode
mimir encode --backend sentence-transformer "hello world"
# Learn
mimir learn --backend llama-server "重要上下文"
# Evaluate
python -m mimir.eval --backend llama-server --top-k 4
Status & Roadmap
Mimir is currently v0.2.0.dev2.
- MVP: encode / learn / save / load
- Top-k sparse prototype activation
- EventBus + PredictionPolicy + surprise score
- MCP server + Agent CLI hooks
- BM25/keyword fallback for recall
- Async embedding queue
- SQLite-backed memory metadata
- Project context discovery
See docs/roadmap.md and docs/comparison.md
for the full roadmap and how Mimir compares to other agent memory systems.
License
Apache-2.0
Mimir is named after the Norse guardian of the well of wisdom — a source of knowledge that deepens with every visit.
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 mimir_core-0.2.0.tar.gz.
File metadata
- Download URL: mimir_core-0.2.0.tar.gz
- Upload date:
- Size: 62.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a7d60553b3b6c1c304d694d139ef17fdfe6ea34108f39ee7e5d3220ea6ad5b5
|
|
| MD5 |
e29f2cd4fa3ff267d93c72e46d72e5a1
|
|
| BLAKE2b-256 |
9c5e9994d4c3e61fc24140c0fa9060b53cade70f7814b2c11d45fb831d3d65b4
|
File details
Details for the file mimir_core-0.2.0-py3-none-any.whl.
File metadata
- Download URL: mimir_core-0.2.0-py3-none-any.whl
- Upload date:
- Size: 78.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa3623ce261d28125aa6d8b5505a953b86f09db865884e7bcf360171d89e1434
|
|
| MD5 |
c63c6d2b031b8683a96fcedb29f6d564
|
|
| BLAKE2b-256 |
fa1c229e61100ecd5010159da32457cd4f2fc1862d2354281501e362a3af0089
|