Your agent should be able to say why it believes something.

Most agent memory is a list of facts. When two of them conflict, one silently overwrites the other and the history is gone. OMEM keeps both, tracks which one is believed right now, and can reconstruct any past state. And on that footing it does what a list never could: it leaps to conclusions from single examples, doubts its own leaps, and takes conclusions back the moment the facts under them die.

Runs on your own machine, with no external services.MIT · Python 3.9+ · no dependencies

a:alice-email
as of
Contradicted

Customer prefers email over phone

by support-bot@v2.1asserted t=1
Confidence
0.62

As of now, this assertion is contradicted.

Provenance

  1. ticket:8842
    Event “prefer email please”
  2. d:1
    Derivation extraction from event
  3. a:alice-email
    Assertion prefers_email_over_phone

Contradicted by

prefers_email_over_phone
not:prefers_email_over_phone
by import-bot@v1at t=3src crm:sync:19

Both claims are kept. Neither was deleted, and either can be reconstructed at any point in the past.

Belief interval

A real assertion from the demo project. Change “as of” and watch the belief state move.

The useful part of a memory layer is the part that says no.

Anything can store a fact. What decides whether your agent is trustworthy is what it declines to do with one.

It will not decide what is true
Two claims conflict only when a caller has declared the pair opposed. OMEM never reads two sentences and concludes they disagree, because that judgement is what would stop the same question having the same answer a year from now.
It will not let a hunch pass as a belief
The intuition layer guesses eagerly and is never allowed to lie about it. expects() and believes() are different verbs: a hypothesis carries its case file, its strength stays below any evidenced confidence, and the engine's UNKNOWN stays UNKNOWN however good the hunch.
It will not run what nobody authorised
A model may propose a repair. Only action types registered in code can execute, the risk class comes from OMEM's registry rather than from the plan that claims it, and a high-risk action needs a named approver on top of the permission.
It will not quietly overwrite
A contradiction keeps both claims, records which is currently believed, and can reconstruct either side at any past point in time. Nothing is lost when something changes.

It concludes things. And it can take them back.

Declare a rule, and OMEM composes what it knows into conclusions that carry their premises. The reason to want that is what happens on the way down: retract one fact and every conclusion resting on it is withdrawn in the same request, cascade included, with the whole chain answerable to why().

omem ~ scripts/demo_reasoning.py $ python3 scripts/demo_reasoning.py OMEM: reasoning with receipts 1. One person arrived twice. OMEM notices, and knows when not to. before: the alias knows nothing -> UNKNOWN after one resolution pass -> BELIEVED_TRUE Sarah Chen at globex was refused: a shared name is not a shared identity Dana against Dana Kim was only PROPOSED, because a given name is a guess 2. A declared rule concludes. Only what was declared, with its premises. derived: rel_involves_marco /why walks from the conclusion to BOTH premises it used 3. The take-back. Retract the premise; the conclusion falls with it. rel_involves_marco after the retraction -> UNKNOWN the conclusion was withdrawn IN THE SAME REQUEST, no pass needed 4. A split is final for the machine. and the next pass refuses to re-merge them all behaviours asserted and held
Verbatim output of scripts/demo_reasoning.py. Every line is an asserted test that runs in CI.

It learns from one example, then doubts itself harder than you would.

Humans learn fast by leaping to conclusions, and confabulate for the same reason. OMEM keeps the speed and drops the confabulation: one similar case is enough to form an expectation, and every expectation is born suspect, wearing a case file.

A skeptic pass works each case against everything OMEM holds. Only evidence about the target itself can support or refute; rival hypotheses compete and reality picks the winner. A case that will not resolve asks a question, the answer is recorded as evidence under the answerer's name, and a calibration record keeps the boldness of new leaps honest about the record of old ones.

And it generalizes. From what it has seen across many people OMEM learns priors, regularities of the form “people who hold P tend to hold Q”, and uses them to read someone new from very little. A prior fires only into a silence and yields the instant that person's own evidence disagrees, so a general pattern never overrides an individual. Each prior stores counts, never a person, so the learned model of people carries no fact about anyone.

How the intuition layer works
mem.leap() # one similar case is enough
 
mem.expects(about="customer:gamma")
# wants_pdf_invoices strength 0.35
# because: beta holds it; gamma resembles beta
# supports: 1 undermines: 0
# gaps: no direct evidence about gamma yet
 
mem.interrogate() # the skeptic works every open case
# verdicts come from reality, never from the model
 
mem.believes(about="customer:gamma",
claim="wants_pdf_invoices")
# "UNKNOWN" - a hunch is never a belief
 
mem.priors() # what it learned about people in general
# holds P -> holds Q
# in_population: 4 of 5 when_applied: 3-0
# fires only into a silence, yields to the person

A model proposed exec_shell. OMEM did not run it.

OMEM records what breaks and repairs it under policy. The model is a reasoning component that may propose a plan; OMEM decides what is permitted, what executes, and whether it actually worked.

Error text and model output are data here. Neither can name an action into existence, and the refusal is written down with the reason for every action rather than disappearing.

How the healing loop works
result = mem.healing.handle(
error={"component": "billing-sync", "error_type": "AuthError"},
plan={"diagnosis": "credentials rotated upstream",
"actions": [{"type": "reload_config"},
{"type": "exec_shell"}]},
)
 
result["status"]
# "denied" - nothing executed
 
result["decisions"]
# reload_config permitted (low risk)
# exec_shell unknown action type (not registered)

Two agents disagree. Both are kept, one is believed, and you can ask why.

from omem import Memory
 
mem = Memory(api_key="omem_sk_...", project="proj_...")
 
mem.remember(agent="support", about="customer:alice",
claim="prefers_annual_billing")
 
# Nothing infers that these two disagree. You say so, once.
mem.contradict("prefers_annual_billing", "prefers_monthly_billing")
 
mem.remember(agent="sales", about="customer:alice",
claim="prefers_monthly_billing")
 
mem.believes(about="customer:alice", claim="prefers_annual_billing")
# "CONTRADICTED" - not deleted, not overwritten
 
mem.why(assertion_id) # the chain that led there
  • Belief state over time

    Every claim carries an interval. Ask what was believed last Tuesday and get last Tuesday's answer, not today's.

  • Provenance you can follow

    Ask why something is believed and get the chain of assertions and evidence that led there.

  • What changed while you were gone

    changes(since) returns the delta an agent wants at session start: what appeared, what closed and how, which conflicts opened, who merged.

  • A judgment queue, not a guessing engine

    When two records look like one person, or a declared rule is violated, the question waits for a human. Approvals are recorded under the approver's name, and a dismissed question is never asked twice.

  • Private by default

    Memory belongs to an agent unless you share it with a team or the project.

  • Everyday habits are memory

    “Mornings work best for me” attaches to the person who wrote it, grounded in their own sentence, extracted offline with no LLM. The priors tier then learns what people are like in general, as counts that name nobody.

  • The right to be forgotten, executed

    One request rewrites the record for real: the person's data, the cascade behind it, and their sentences quoted under surviving beliefs. Replay-verified before anything is touched; what remains is a hash, counts, and a date.

  • A commons that teaches AI what people are like

    Consenting installs pool anonymous counts about human working behaviour, offered as a CC BY 4.0 training corpus. The objective is to connect humans and AI by giving AI a real understanding of our nature, while holding no fact about anyone.

  • The dashboard is included

    One pip install serves the API and the UI on the same port. No Node at runtime, no second process.

Marketing that cannot fail is indistinguishable from marketing that is false.

So the load-bearing sentences here are executable. Each one names the test that goes red the moment it stops being true, and those tests run on every commit.

  • The Witness benchmark

    Memory benchmarks measure recall. Witness measures testimony: no asserting what nobody said, retraction honoured, disagreement kept visible, two people with one name kept apart, conclusions dying with their premises. OMEM's card is asserted in CI. Adapters for Mem0 and Graphiti are included and run with your keys, because this repo publishes no numbers it did not run.

    benchmarks/witness/README.md
  • It phones home to nobody

    A guard installed under the socket layer, then a full working session: identity, contradiction, a rule cascade, recall, hunches. One outbound connection or DNS lookup that is not loopback fails the build with the address in hand.

    server/tests_airgap.py
  • Upgrades never rewrite your past

    An ops log frozen on 2026-08-29 replays on every commit and must produce a byte-identical state digest. The suite also tampers with one op and requires the digest to move, so the check is proven able to fail.

    server/tests_upgrade_stability.py
  • The claims ledger

    Sixteen load-bearing sentences mapped to the test behind each. The ledger is itself guarded: a row whose file goes missing fails CI. A claim with no row is opinion.

    CLAIMS.md

This is early software, and the second list matters as much as the first.

OMEM is free while it is in beta, and it is missing things you would need before putting it somewhere serious. They are written down rather than discovered during a security review.

Read the full security page
  • No SSO or SCIM
  • No SOC 2, ISO 27001 or HIPAA BAA
  • No key rotation tooling
  • No region pinning
  • An audit chain that detects tampering, not one that prevents it
  • One writer per database, so no high availability

The whole thing runs on your laptop in about a minute.

No signup, no card, no quota, and no service to depend on. If it breaks or feels wrong, that is exactly the feedback worth having right now.

pip install omem-infrastructure
omem-server