Skip to content
Documentation

Docs

Everything you need to install rmbr, use Memory and Index, connect it over MCP, and run it fully offline.

Quickstart

Install rmbr from PyPI:

pip install rmbr

Three lines is the whole API for the common case:

from rmbr import Memory

mem = Memory("agents.db", namespace="assistant")
mem.remember("user prefers dark mode and short answers")
mem.recall("user preferences")

You don't need to create agents.db first. Memory(path, ...) creates the file, schema included, the moment you call it, as long as the directory already exists.

Add document search with Index. It shares the same .db file as Memory:

from rmbr import Index

idx = Index("agents.db")
idx.add_files("docs/")                     # .py, .md, and plain text each get an appropriate splitter
hits = idx.search("how does the policy engine work?", k=5)
hits[0].text, hits[0].score, hits.timings  # per-stage latency, always visible

Lock down multi-agent access with Policy. It denies by default, so two agents stay apart without any extra configuration:

from rmbr import Memory, Policy

policy = Policy()
policy.allow("supervisor", read="*")  # supervisor can read every namespace

mem = Memory("agents.db", namespace="coder", policy=policy)
# coder can only read/write its own namespace unless explicitly granted

Framework adapters each lazily import their target framework, only when you call them:

# LangChain (pip install langchain-core)
retriever = idx.as_langchain_retriever(k=5)
retriever.invoke("how do I deploy?")

# LlamaIndex (pip install llama-index-core)
retriever = idx.as_llamaindex_retriever(k=5)

# LangGraph BaseStore (pip install langgraph-checkpoint)
from rmbr.integrations.langgraph import as_store
store = as_store("agents.db")

# mem0-compatible drop-in, no mem0ai dependency
from rmbr.integrations.mem0_compat import Memory  # was: from mem0 import Memory

Or export tool definitions for a hand-rolled agent loop:

tool = idx.as_tool()
response = client.messages.create(..., tools=[tool.to_anthropic()])
result = tool.call(**tool_use_block.input)