Your agent keeps making the same mistakes.
errlore makes that stop.

A memory layer for AI agents that learns from failures: every resolved error becomes a lesson, lessons are injected into future prompts, and Bayesian trust weights track which model to believe for which job.

$ pip install errlore
View on GitHub →
MIT · Python 3.12+ · 186 tests · CI passing · offline · no telemetry · JSONL, file-locked
We spent three months building a 324,000-line multi-LLM "brain" — ensembles, arbiters, cognitive phases. Then we benchmarked it honestly: the clever parts didn't work. One part did — the loop that turned failures into lessons and injected them back. errlore is that one part, extracted, fixed, and finished. — why this library exists
error  your fix  lesson  injected into next similar prompt  outcome feedback  trust update

Three loops, all closed

01Lessons

An error you resolve becomes a lesson. The next similar task gets it injected into the prompt. report_outcome() reinforces lessons that helped and decays ones that never do — errlore knows whether its own memory works.

02Known issues

Per-model weakness tracking. When gpt-x has failed date extraction four times, the fifth prompt says so: KNOWN ISSUES: TimeoutError (x4). Models get warned about their own history.

03Trust

Bayesian per-model, per-domain trust weights built from observed outcomes. mem.best_model("code") answers the routing question with data, not vibes.

Sixty seconds to a learning agent

from errlore import AgentMemory

mem = AgentMemory("./agent_memory")

# 1. agent failed — record it
err = mem.log_error("gpt-5.5", "extraction", error="hallucinated dates")

# 2. you fixed it — extract the lesson
mem.resolve(err, "added validation",
            lesson="For date extraction, demand ISO-8601 and verify against source")

# 3. next similar task — memory speaks up
inj = mem.inject_for("extract dates from contract", model="gpt-5.5")
prompt = task + inj.text
# [LESSONS FROM PAST FAILURES]
# - hallucinated dates -> For date extraction, demand ISO-8601...
# KNOWN ISSUES:
# - Past error on similar task: hallucinated dates

# 4. close the loop — did it help?
mem.report_outcome(inj, success=True)

Finds lessons by meaning, not keywords

Optional local embeddings (pip install errlore[embeddings], ~120 MB ONNX model, RU/EN and 50+ languages, no API keys). On a deliberately adversarial gold set — every query paraphrased so it shares zero words with its lesson:

metrickeyword overlaperrlore embeddings
recall@10.0000.375
recall@50.0000.675
MRR0.0000.488

Reproduce it yourself: python benchmarks/bench_retrieval.py — the gold set ships in the repo.

Drops into what you already run

Open WebUI

Two functions — a Filter that injects lessons into every chat and a feedback Action that closes the loop from a button under each message. Paste, enable, done.

Python SDKs

Working examples for the OpenAI SDK, Anthropic SDK, and LangChain in examples/ — each runnable offline, each showing the full learn-inject-reinforce cycle.

Why not just logs or vector memory?

plain logsvector memoryerrlore
stores failuresyessometimesyes
turns them into lessonsnonoyes
injects into future promptsnoretrieval onlyyes, with feedback loop
knows if a lesson helpednonoreinforce / decay
tracks per-model weaknessesnonoKNOWN ISSUES + trust
works offline, no serveryesdependsyes

Where it earns its keep

Coding agents

that keep re-introducing the same class of bug across sessions.

Extraction pipelines

that hallucinate dates, numbers and schema fields the same way every week.

Multi-model routing

pick the model per task from observed outcomes — mem.best_model("code") — not vibes.

Built for the privacy-first crowd

Files, not cloudsplain JSONL on your disk
fsync'd, file-locked, atomic
Zero calls homeno telemetry, no API keys
embeddings run locally
Survives anythingprocess restarts, concurrent
writers, corrupted lines
Honest by designno fake reinforcement —
outcomes only from real feedback