OmniMemory
Memory persistence, recall, and semantic retrieval for the OmniNode platform. OmniMemory provides ONEX (OmniNode eXecution)-compliant nodes and handlers for storing agent context, indexing embeddings, querying intent graphs, and managing the full memory lifecycle across distributed omni agents.
Where This Fits
OmniMemory holds three distinct ownership roles in the ONEX platform:
-
Domain owner for memory persistence and retrieval semantics. OmniMemory defines the authoritative models, protocols, and lifecycle rules for all memory operations: what a memory item is, how it is stored, how it is retrieved, and how it ages. These primitives do not move to other packages.
-
Runtime plugin owner for memory nodes.
PluginMemory(registered as theonex.domain_pluginsentry point) is the kernel lifecycle hook for the memory domain. It wires message types, verifies handler imports, initializes the dispatch engine, and subscribes to Kafka topics at runtime. -
Storage integration owner for Qdrant, Memgraph, Valkey, and Kreuzberg adapters. The concrete adapter implementations for all memory-layer storage backends live in
omnimemory. These adapters implement the domain protocols and are injected at runtime via the DI container.
What is migrating to omnimarket: The runnable ONEX node handler implementations (those with contract.yaml) are moving to omnimarket. Protocols, models, adapters, and the runtime plugin stay here. See OmniMemory → OmniMarket Node Migration Boundary.
What This Repo Owns
- Domain models — all memory, crawl, persona, intent, and intelligence Pydantic models in
src/omnimemory/models/ - Protocol interfaces —
ProtocolEmbeddingClient,ProtocolEmbeddingProvider,ProtocolIntentGraphAdapter,ProtocolSecretsProvider, and all base protocols insrc/omnimemory/protocols/ - Storage adapters — Qdrant, Memgraph, Valkey, and filesystem adapter implementations in
handlers/adapters/andnodes/*/adapters/ - Runtime plugin —
PluginMemoryinsrc/omnimemory/runtime/registered asonex.domain_plugins - Memory-layer data services — Qdrant, Memgraph, Valkey, Kreuzberg (owned via
docker-compose.yml) - Node handlers — 13 contract-carrying nodes in
src/omnimemory/nodes/(migrating to omnimarket)
What This Repo Does Not Own
| Resource | Owner |
|---|---|
| Kafka / Redpanda (platform event bus) | omnibase_infra |
| PostgreSQL (platform relational DB) | omnibase_infra |
| ONEX kernel, node execution, contracts | omnibase_core |
| Protocol interfaces for platform boundaries | omnibase_spi |
| Portable workflow packages and node runtime (post-migration) | omnimarket |
| Dashboard projections and read-model surfaces | omnidash |
Architecture
Follows the ONEX Four-Node Architecture (EFFECT, COMPUTE, REDUCER, ORCHESTRATOR) applied to memory operations.
Node inventory
- Effect nodes —
memory_storage_effect,memory_retrieval_effect,agent_learning_retrieval_effect,intent_storage_effect,intent_query_effect,kreuzberg_parse_effect,persona_storage_effect - Compute nodes —
semantic_analyzer_compute,similarity_compute,persona_builder_compute - Reducer nodes —
navigation_history_reducer,memory_consolidator_reducer(stub — no contract.yaml) - Orchestrator nodes —
memory_lifecycle_orchestrator,agent_coordinator_orchestrator
node_persona_lifecycle_orchestratorandnode_persona_retrieval_effectwere decommissioned in an earlier cleanup pass; they never had acontract.yamland are no longer present in the repository.node_filesystem_crawler_effectandnode_intent_event_consumer_effecthave since been removed as well, once theiromnimarketcounterparts became canonical.
Verified against
src/omnimemory/nodes/on 2026-08-26: 14 node directories, 13 withcontract.yaml;node_memory_consolidator_reduceris the contract-less stub.
Memory evolution (planned phases)
The architecture plan (omni_home/docs/plans/2026-04-07-plan-omnimemory-architecture.md) describes five enhancement phases: surprise gating on the write path, activation decay for retrieval ranking, memory cube isolation for multi-agent boundaries, Hebbian association strengthening, and hybrid vector+FTS search. These are planned, not yet implemented.
Infrastructure Ownership
OmniMemory's docker-compose.yml owns the memory-layer data services:
| Service | Container | Default Port | Purpose |
|---|---|---|---|
| Qdrant | omnimemory-qdrant |
6333 (HTTP), 6334 (gRPC) | Vector database for semantic memory |
| Memgraph | omnimemory-memgraph |
7687 (Bolt), 7444 (HTTP) | Graph database for relationship/intent queries |
| Valkey | omnimemory-valkey |
6379 | In-memory cache and session storage |
| Kreuzberg | omnimemory-kreuzberg-parser |
8090 | Document text extraction service |
Not owned here — these services are managed by other repositories:
| Service | Owner Repository | Why |
|---|---|---|
| Kafka / Redpanda | omnibase_infra |
Platform-wide event bus, shared by all services |
| PostgreSQL | omnibase_infra |
Platform-wide relational database, shared by all services |
See OmniMemory Memory Data Ownership for detailed service boundaries and adapter ownership.
Quick Start
Memory services only
git clone https://github.com/OmniNode-ai/omnimemory.git
cd omnimemory
# Start platform infra first (Kafka + PostgreSQL — owned by omnibase_infra)
infra-up
# Start memory data services
docker compose up -d
# Verify all services are healthy
docker compose ps
Default service ports (all configurable via .env):
- Qdrant REST:
localhost:6333 - Memgraph Bolt:
localhost:7687 - Valkey:
localhost:6379 - Kreuzberg parser:
localhost:8090
See Starting OmniMemory Services in the knowledge base for the full startup runbook including health checks and troubleshooting.
Install and run tests
uv sync --group dev
uv run pytest tests/ -m unit
For configuration options see OmniMemory Environment Variables.
Minimal usage example
import asyncio
from uuid import uuid4
from omnibase_core.container import ModelONEXContainer
from omnimemory.handlers.adapters.models import ModelIntentClassificationOutput
from omnimemory.handlers.handler_intent import HandlerIntent
async def main() -> None:
container = ModelONEXContainer()
handler = HandlerIntent(container)
await handler.initialize(connection_uri="bolt://localhost:7687")
result = await handler.store_intent(
session_id="session_123",
intent_data=ModelIntentClassificationOutput(
intent_category="debugging",
confidence=0.92,
keywords=["error", "traceback"],
),
correlation_id=str(uuid4()),
)
query_result = await handler.query_session(
session_id="session_123",
min_confidence=0.5,
)
await handler.shutdown()
asyncio.run(main())
Directory Structure
src/omnimemory/
├── audit/ # I/O audit logging
├── enums/ # Domain enumerations (memory types, operation types, lifecycle states)
├── errors/ # Structured error types
├── handlers/ # HandlerIntent, HandlerSubscription + adapters
├── models/ # Pydantic models (memory, crawl, persona, intent, intelligence)
├── nodes/ # EFFECT, COMPUTE, REDUCER, ORCHESTRATOR node implementations
│ └── <node>/
│ ├── adapters/ # Stays in omnimemory (protocol implementations)
│ └── handlers/ # Migrating to omnimarket
├── adapters/ # Shared utilities with adapter_* prefix (PII detection, retry, health, metrics)
├── protocols/ # Protocol interfaces (embedding, intent graph, secrets)
├── runtime/ # PluginMemory, DI container wiring, dispatch, introspection
└── tools/ # Contract linter and validators
Development and Test Commands
# Install all dependencies
uv sync --group dev
# Format and lint
uv run ruff format src/ tests/
uv run ruff check --fix src/ tests/
# Type checking
uv run mypy src/omnimemory/ --strict
# Run all tests
uv run pytest tests/ -v
# Unit tests only (no external services required)
uv run pytest tests/ -m unit
# Pre-commit validation
pre-commit run --all-files
Migration Status
Nodes are migrating to omnimarket. The migration preserves the protocol-adapter-handler split: handlers move, adapters stay.
See OmniMemory → OmniMarket Node Migration Boundary.
Documentation
OmniMemory's documentation lives in the OmniNode knowledge base. This README is the repository's landing page; everything below is the full index of OmniMemory pages there. Every path under docs/ that was migrated is now a pointer stub to its page — with three deliberate exceptions listed under Kept in this repository below, which remain full documents because they are out of scope for the public knowledge base.
Architecture
- ONEX Four-Node Architecture — the EFFECT / COMPUTE / REDUCER / ORCHESTRATOR archetypes applied to memory
- ARCH-002: Kafka Abstraction Rule — why nodes never speak to a broker directly
Reference
- Environment Variables — every setting, type, default and constraint
- Memory Data Ownership — which repository owns which storage service
- Runtime Plugin System — how
PluginMemorywires into the ONEX kernel - Handler Reuse Matrix — which
omnibase_infrahandler each memory node reuses
Guides
- PII Handling — detection, sanitization and storage-path integration
- Performance Testing — SLA targets, benchmarks and how to read them
- Market Migration Boundary — what moves to
omnimarketand what stays
Runbooks
- Starting OmniMemory Services — bringing the storage layer up, health checks, troubleshooting
Kept in this repository — operating context and platform-convention files that must ship beside the code: CLAUDE.md · AGENT.md · CONTRIBUTING.md · SECURITY.md · CODE_OF_CONDUCT.md · LICENSE · CHANGELOG.md
The three full documents still under docs/ — CI/agent-config and point-in-time records that the public knowledge base does not carry:
docs/ci/CI_MONITORING_GUIDE.md · docs/stub_protocols.md · docs/db-split/fk-audit.md
Security, Contributing, and License
Open an issue or email contact@omninode.ai.
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 omninode_memory-0.18.1.tar.gz.
File metadata
- Download URL: omninode_memory-0.18.1.tar.gz
- Upload date:
- Size: 1.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd49dfb0f506e10029a83993650316061f243a30c1e36c64a15d8b4263c0fea2
|
|
| MD5 |
6771aa13c30552f45c662402a9b67b32
|
|
| BLAKE2b-256 |
774c4546e6bb22c3d6275e4de43347f2ac4331f3d25afb74c33c4dd95e001a35
|
File details
Details for the file omninode_memory-0.18.1-py3-none-any.whl.
File metadata
- Download URL: omninode_memory-0.18.1-py3-none-any.whl
- Upload date:
- Size: 660.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
043c601951a9007c118260e29aeb48d99de91451fcafc21a01cd55879cc06e02
|
|
| MD5 |
f0776b3ed9f96cc4eb5c1493677f05a1
|
|
| BLAKE2b-256 |
807c0b186f467960ae7ea660d9264ee7b49a4297f09f4d38a71e33504b69023a
|