The whole memory of your agents, as a service — with the reasoning built in

AI agents forget. Notes scatter. One memory that remembers why.

The pieces sit in meeting notes, a support thread, a ticket, and whatever your agents wrote down. ReasonGraph joins them and answers the triage questions: why did this happen, and what did this change affect.

One memory for every source that writes something down — a person's notes as readily as an agent's. It stores each as a plain sentence, links them by the names they share and by what caused what, reasons over them backwards to causes and forwards to effects, and puts exactly what the next reply needs in front of your model, inside its context window. Every answer comes with the facts it used and where each came from. Small open models on servers we run, in the EU by default or the region you need.

MIT library. Hosted service from €0. Python, JavaScript, LangChain, LangGraph and MCP.

Why did Northwind cancel their contract?

Northwind cancelled because their invoices went to an old address after the billing move, the unpaid invoices got their account suspended, and their complaint was never answered before the suspension.

How this answer was built
1

After the billing system move in June, Northwind's invoices were sent to their old office address.

root cause · finance
leads to
2

Because two invoices went unpaid, Northwind's account was suspended on 14 August.

billing
leads to
3

Northwind cancelled their contract on 20 August, citing the suspension.

sales
Northwindbilling moveinvoices

Finance, billing and sales each wrote one sentence at different times. Nobody wrote the answer.

Answers with their reasonsThe answer is assembled from remembered facts, not guessed. On our own eval, memory tripled the share of right answers from a small model. When the facts form a causal chain, you see the chain; when they do not, you still see every fact behind the answer.
Built for triage"Why did this happen" and "what did this change affect" are the questions it is built around: it walks backwards to causes and forwards to effects, and shows every step and its source so you can check the reasoning rather than trust it.
Small models, your regionSmall open models on servers we run, in the EU by default. Other regions, other model providers or your own infrastructure on request. A large model is used only for chat and written answers, and only when you ask.

One question, one answer, and where it came from

Three agents each wrote one note, at different times, in different repositories. Nobody wrote the answer.

Coding agent · Claude Code
Why is checkout slow every morning?
AnswerBecause Elasticsearch rebuilds its index at 09:00 every day, which saturates the CPU of the node it shares with Redis, and checkout keeps its shopping carts in that Redis. The root cause is the 09:00 rebuild.
How this answer was built
  • repo: search Because Elasticsearch rebuilds its index at 09:00 every day, the node's CPU is saturated for twenty minutes each morning.
  • repo: infra Redis runs on the same node as Elasticsearch.
  • repo: shop The checkout service stores shopping carts in Redis since the March release.
checkout service → Redis → Elasticsearch → 09:00 rebuild
cause: Elasticsearch rebuilds its index at 09:00 → the node's CPU is saturated

The agent working in shop never opened the other two repositories. The memory walked from the question through the names they share, and found the cause.

Why did Maria Lopez cancel? → Anything I should know about Friday's pricing page rollout? → How does the Arizona water crisis affect Apple? →

More worked examples, ready to run, in the console's starter topics.

Run a pilot on your own text

Every number on this page comes from our own evaluation set. The honest next step is one real use case, yours: a week, one team, support or operations or research. We will tell you plainly whether your notes contain the chains this is built to follow. Your data stays in a database we run, in the EU by default or the region you need, and the core is open source, so you are never locked in.

Talk to us about a pilot

Where teams use this

Situations rather than industries, so you can recognise your own.

Several sources, one shared memoryA coding agent, a support agent, a colleague's meeting notes, last week's incident thread. Each holds a piece, none of them talk to each other, and the memory sits between them so one answer can draw on all four. This is the case we are strongest on.
People, not only agentsA source is anything that can send a sentence. Paste the notes from a meeting, forward the summary of a thread, or have your own tooling push them. Six months later the answer to "why did we decide that" cites the note and the person it came from.
Triage and root-cause workTickets, incidents, billing events, where the daily question is why something happened and the answer has to be traceable to the notes it came from, because someone will ask you to justify it.
Impact analysis, the other directionA fact changed. What did it affect? Trace forward through the causes you recorded, or ask what breaks if a fact turns out to be false.
Work that accumulates for monthsResearch and analysis where the question is what a conclusion rested on. Correct a fact and the old one stays for history; ask a question as of any past date.
Probably not a fit if

For builders: three calls, any stack

Remember a fact, discover what connects, and chat with the relevant memory placed in front of the model automatically. LangChain and LangGraph in one import (pip install "reasongraph[langchain]": a memory class, a retriever, a remembering model, agent tools). JavaScript and TypeScript through a dependency-free client. No code at all: open the console, pick a topic or paste a document, and ask.

from reasongraph.client import MemoryClient   # pip install reasongraph

mem = MemoryClient(api_key="rgm_...")
mem.remember("scout", "TSMC is building a chip fab in Phoenix, Arizona.")
mem.remember("scout", "Arizona declared a water emergency after a drought.")
mem.remember("analyst", "Apple depends on TSMC for its M-series processors.")

mem.discover("Why might Apple face shortages?", session="analyst")
# → paths through TSMC and Arizona, 2 of them from the scout's session

mem.chat([{"role": "user", "content": "Why might Apple face shortages?"}], session="analyst")
# → the reply and the facts it used, with their sources

What makes it different

A graph, not a pile of similar sentences

Small purpose-built models turn every sentence into the names it mentions and the causes it states. A question then walks those links across agents and sessions and comes back with the path it took, every step cited.

Knows what changed, and when

Correct a fact and the old one leaves default recall but stays for history. A new fact that contradicts an old one retires it rather than erasing it. Query as of any past date, trace a cause downstream, or ask what breaks if a fact were false.

Fits the context window

Each turn the model gets the facts that relate to the question, with sources, and the conversation folded to a token budget: the newest turns verbatim, the older ones as one rolling summary. Folding decides what the model sees and deletes nothing; a turn that left the window is still a fact and comes back when it is relevant.

Plain and portable

Facts are plain text you can export. The hosted service and the MIT library share one API, so you can move between them.

The models, and where your data goes

Everything that stores, links and finds your facts runs on servers we operate, on CPU, with small open models. Only chat and written answers use a large model from an outside provider, and only when you ask for them.

StepModelRuns
Split text into factsSaT sentence splitter (sat-3l-sm, 85 languages)our servers
Find entitiesGLiNER zero-shot tagger (gliner_small-v2.5, multilingual)our servers
Find cause → effectOur fine-tuned mDeBERTa span model (causal-span-pointer-v3, open weights, served as ONNX) with a small token-level MiniLM gate that keeps plain statements out of the causal graphour servers
Search and rankMultilingual MiniLM embeddings (paraphrase-multilingual-MiniLM-L12-v2) and an mMARCO cross-encoder rerankerour servers
Contradiction checkOur fine-tuned 1.7B judge (open weights, Qwen3 base) served with llama.cpp; a small pre-filter skips pairs that cannot conflictour servers
Chat and written answersOutside provider: currently gpt-oss-120b on Groq. Sent: your messages and the facts recalled for that question. Nothing is trained on it. We may add EU-hosted options.Groq (US)
Your facts, entities and embeddings live in a Postgres database on servers we run ourselves, currently in the EU. Storing, linking and querying memory never leaves those servers. The core is open source under MIT, so you can run the same models on your own machines. Details: privacy · model notes and evaluations.

How it works

RememberOne sentence per fact, into a named session. Paragraphs and documents are split for you.
LinkEntities and cause→effect spans become nodes and edges, in the background.
ReasonA question seeds by similarity, then walks the graph across sessions: backwards to causes, forwards to effects, as of any date, and returns the paths it took.
ServeThe relevant facts, with sources, go in front of your model, and a long conversation is folded to a token budget so it keeps fitting.
KeepCorrections supersede rather than erase; history stays queryable; a session is deleted when you say so, with its facts.
AnswerYour own model writes the reply, or the console's chat does, and either way you see the facts behind it.

Compared with a vector store

Show the comparison
Vector memoryReasonGraph
RetrievalNearest neighbours of the queryNeighbours, then a walk over shared entities and causal edges
"How does X affect Y?"Facts about X and facts about YThe path from X to Y, each hop cited
ContradictionsBoth versions returnedCorrections retire the old fact; optional check on write; history kept
ExtractionNone, or an LLM call per writeSmall models on our servers, no large model in the write path
Agents sharing memoryOne collection, no sessionsA session per agent; cross-session paths flagged

Questions

Is this a vector database?

It uses embeddings to find seeds, but the value is in what happens after: the walk over entities and causal links. You can run it on Postgres with pgvector or SQLite.

What counts as an entity?

People, organisations, places, events, products, software and services, as recognised by a zero-shot model. Names bridge sessions; generic phrases do not. Writing "Redis" or "Bulk Export" connects; "the cache" or "the feature" will not.

Do I need to write code?

No. The console has a chat: pick a starter topic or paste a document, teach it facts in plain words, and ask. The same memory is then available to your agents over MCP or HTTP.

Which languages?

English is best measured. German, Dutch, Spanish, French and Turkish work with the same models; the splitter, tagger, embeddings and reranker are all multilingual. Numbers per language are in the library README.

What does a request cost?

Nothing on the free plan up to 10,000 requests a month. Paid plans are flat monthly prices with higher limits; see pricing.

Can I export or leave?

Your facts are plain text; the API returns them as such. The library is MIT, so the same graph runs anywhere.

Who builds this?

PrimAxiom Labs, a small engineering company in the Netherlands. The founder has shipped AI systems for Klarna, Booking.com and ING and maintains the open-source library.

Give your agent a memory that connects the dots.

Free plan, 10,000 requests a month, no card.

Start free