Cognitive memory for AI agents — W5H-structured, contradiction-aware, internationalized, token-efficient
Project description
Cortex
Read this in Português.
A cognitive memory system for AI agents — structured, internationalized, contradiction-aware, and token-efficient.
Cortex gives an LLM agent a long-term memory that is structured rather than a flat vector store. Every memory is decomposed into a W5H record (who, what, why, when, where, how), validated against what is already known so the agent does not silently store contradictions, and recalled through a deterministic structural parser that returns a compact context string instead of a wall of raw chunks.
It is a pure Python library with zero required dependencies, local-first, and designed to plug into an agent loop as a transparent memory layer (recall before the turn, store after it).
from cortext import CortexV5
cortex = CortexV5(namespace="myapp")
# Store a structured memory (W5H)
cortex.remember(
who=["Maria"],
what="reportou erro de pagamento",
why="cartão expirado",
where="suporte",
how="orientada a atualizar dados",
lang="pt",
)
# Recall — returns (compact_context, RecallResult)
context, result = cortex.recall("O que Maria pediu?")
print(context)
# Maria | reportou erro de pagamento
Why structured memory
Most agent memory is "embed the turn, retrieve top-k chunks." That works until
it doesn't: chunks are bulky, retrieval mixes unrelated facts, and nothing stops
the store from holding X and not X at the same time.
Cortex takes a different stance — memory is encoded information, not mere correlation. It is built around five structural properties (discrete schema, syntax, an arbitrary-but-stable mapping to external referents, an independent interpreter, and functional semantics driven by usage). In practice that buys you four concrete things:
| Property | What it means in practice |
|---|---|
| Structured (W5H) | Recall returns Maria | reportou erro → orientada a atualizar dados, not a 90-token chunk. |
| Normative | A CanonicalValidator detects contradictions at write time (3 levels: heuristic → embedding → LLM-as-judge) and can warn or block. |
| Internationalized | The W5H schema is language-neutral; only extraction is language-specific, and it is pluggable (PT/EN/ES regex + optional LLM fallback). |
| Self-pruning | Ebbinghaus decay + a forget gate + an optional background DreamAgent that replays, consolidates duplicates, and prunes what is no longer used. |
Benchmarks
Reproducible on this repo (python bench/run_benchmark.py), comparing Cortex
against an unstructured top-k baseline across 2 scenarios:
| Scenario | Tokens (baseline → Cortex) | Savings | P@5 (baseline → Cortex) | Contradiction detection |
|---|---|---|---|---|
| customer_support | 540 → 123 | 77.2% | 0.367 → 0.778 | 100% |
| personal_assistant | 380 → 111 | 70.8% | 0.840 → 0.860 | 67% |
| Average | — | 74.0% | 0.603 → 0.819 | 83.5% |
- ~74% fewer context tokens for the same retrieved information.
- Precision@5 up from 0.60 to 0.82 — recall returns the right memories.
- Zero false positives in contradiction detection across both scenarios.
- ~0.1 ms average recall latency (pure Python, in-memory graph).
Token savings directly cut prompt cost and free context budget for the actual task; higher precision means the agent sees fewer irrelevant memories.
Install
pip install cortext-memory
Optional extras:
pip install "cortext-memory[embeddings]" # sentence-transformers for embedding-level validation
pip install "cortext-memory[dev]" # pytest, ruff
Cortex runs with no extra dependencies by default. The embedding and LLM-as-judge contradiction levels are opt-in.
How it works
WRITE text/W5H ──▶ CanonicalValidator (3-level) ──▶ Memory Graph
(warn or block contradictions)
RECALL query ──▶ LangDetector ──▶ HybridExtractor ──▶ QueryIntent (W5H)
│
Memory Graph ──▶ StructuralQueryParser ──▶ pack_for_context
│
compact context string
DECAY Ebbinghaus retrievability + ForgetGate, with an optional background
DreamAgent that replays, consolidates duplicates, and prunes.
Internationalization
The W5H schema is universal; extraction is the only language-specific part, and it is pluggable:
from cortext import RegexExtractor, HybridExtractor, LLMExtractor
extractor = HybridExtractor(
primary=RegexExtractor(default_lang="auto"), # PT, EN, ES — detected per query
fallback=LLMExtractor(model_fn=my_llm_call), # any language, when regex misses
)
Recall is matched within the language of the stored content — store and query in the same language for best results, or wire an LLM extractor for arbitrary languages.
Using it inside an agent
Cortext is framework-agnostic — it has zero dependency on any agent
framework. CortextV5 (shown above) is the universal entry point: call
remember() / recall() from anywhere.
For the common "recall before the call, store after it" loop there is an
optional, framework-neutral AgentMemoryBridge:
from cortext.integration import AgentMemoryBridge
bridge = AgentMemoryBridge(namespace="session-1")
context = bridge.recall_context(user_input) # before the LLM call
system_prompt = (context + "\n\n" + base_prompt) if context else base_prompt
bridge.store_turn(user_message=user_input, assistant_message=reply) # after the turn
LangChain / LangGraph / any framework
from cortext import CortextV5
cortex = CortextV5(namespace="user-42")
# In a LangGraph node (or a LangChain Runnable / tool):
def memory_node(state):
context, _ = cortex.recall(state["input"])
state["system"] = f"{context}\n\n{state['system']}" if context else state["system"]
return state
# After the model replies, persist the turn:
cortex.remember(what=state["input"], how=reply, who=["user-42"])
Hermes
A ready-made plug-and-play Hermes memory plugin ships inside the package — one command installs and configures it:
pip install cortext-memory
cortext-memory setup # detects Hermes, installs the plugin, configures
The setup wizard detects Hermes, drops the plugin into ~/.hermes/plugins/,
and writes the config. If Hermes isn't present it just shows you the library
usage above. See integrations/hermes/README.md.
See docs/INTEGRATION.md for full per-framework wiring and docs/ARCHITECTURE.md for the design.
Development
python -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
pytest # 190+ tests
python bench/run_benchmark.py # reproduce the benchmarks
License
MIT — see LICENSE.
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 cortext_memory-0.3.1.tar.gz.
File metadata
- Download URL: cortext_memory-0.3.1.tar.gz
- Upload date:
- Size: 58.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf0598810601cbf456c3c9b5d37be77a930dd1f591986a38f9631af984e45847
|
|
| MD5 |
9f456440e285adbb3221c0498e290a44
|
|
| BLAKE2b-256 |
c335874dafd90f73b52346b4ff12a07080f984667eac3cc17ecf913bbddda44e
|
Provenance
The following attestation bundles were made for cortext_memory-0.3.1.tar.gz:
Publisher:
publish.yml on jhonymiler/Cortex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cortext_memory-0.3.1.tar.gz -
Subject digest:
bf0598810601cbf456c3c9b5d37be77a930dd1f591986a38f9631af984e45847 - Sigstore transparency entry: 1866014540
- Sigstore integration time:
-
Permalink:
jhonymiler/Cortex@4448388cf46228f1bd644e2b0e275755670e5fe2 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/jhonymiler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4448388cf46228f1bd644e2b0e275755670e5fe2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cortext_memory-0.3.1-py3-none-any.whl.
File metadata
- Download URL: cortext_memory-0.3.1-py3-none-any.whl
- Upload date:
- Size: 60.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e7d9bf4fa96ed33bd4adcb06c95e6c0cd592299404dae34f1dbc87c3a4fc9e0c
|
|
| MD5 |
a9ac68739e440fa2e3b799378b86ae78
|
|
| BLAKE2b-256 |
74fdc7ad73521d3e1c1b0fc34a8a1490d09ff76d619197df4a42dbef620e1944
|
Provenance
The following attestation bundles were made for cortext_memory-0.3.1-py3-none-any.whl:
Publisher:
publish.yml on jhonymiler/Cortex
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cortext_memory-0.3.1-py3-none-any.whl -
Subject digest:
e7d9bf4fa96ed33bd4adcb06c95e6c0cd592299404dae34f1dbc87c3a4fc9e0c - Sigstore transparency entry: 1866014656
- Sigstore integration time:
-
Permalink:
jhonymiler/Cortex@4448388cf46228f1bd644e2b0e275755670e5fe2 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/jhonymiler
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@4448388cf46228f1bd644e2b0e275755670e5fe2 -
Trigger Event:
push
-
Statement type: