ouroboros-memory 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ouroboros_memory-1.0.0/.gitignore +44 -0
- ouroboros_memory-1.0.0/CHANGELOG.md +95 -0
- ouroboros_memory-1.0.0/LICENSE +26 -0
- ouroboros_memory-1.0.0/PKG-INFO +436 -0
- ouroboros_memory-1.0.0/README.md +371 -0
- ouroboros_memory-1.0.0/docs/api_reference.md +189 -0
- ouroboros_memory-1.0.0/docs/architecture.md +136 -0
- ouroboros_memory-1.0.0/docs/benchmark_report.md +346 -0
- ouroboros_memory-1.0.0/docs/privacy.md +187 -0
- ouroboros_memory-1.0.0/docs/user_guide.md +919 -0
- ouroboros_memory-1.0.0/examples/01_minimal_chat.py +44 -0
- ouroboros_memory-1.0.0/examples/02_switch_providers.py +51 -0
- ouroboros_memory-1.0.0/examples/03_persistence.py +52 -0
- ouroboros_memory-1.0.0/examples/04_privacy_levels.py +38 -0
- ouroboros_memory-1.0.0/examples/05_http_client.py +44 -0
- ouroboros_memory-1.0.0/examples/06_pipeline_inspection.py +58 -0
- ouroboros_memory-1.0.0/examples/07_dream_and_stats.py +45 -0
- ouroboros_memory-1.0.0/examples/README.md +33 -0
- ouroboros_memory-1.0.0/gui/README.md +67 -0
- ouroboros_memory-1.0.0/pyproject.toml +226 -0
- ouroboros_memory-1.0.0/src/ouroboros/__init__.py +36 -0
- ouroboros_memory-1.0.0/src/ouroboros/__main__.py +27 -0
- ouroboros_memory-1.0.0/src/ouroboros/api/__init__.py +11 -0
- ouroboros_memory-1.0.0/src/ouroboros/api/middleware/__init__.py +4 -0
- ouroboros_memory-1.0.0/src/ouroboros/api/routes/__init__.py +5 -0
- ouroboros_memory-1.0.0/src/ouroboros/api/server.py +553 -0
- ouroboros_memory-1.0.0/src/ouroboros/cli/__init__.py +23 -0
- ouroboros_memory-1.0.0/src/ouroboros/cli/main.py +455 -0
- ouroboros_memory-1.0.0/src/ouroboros/config/__init__.py +29 -0
- ouroboros_memory-1.0.0/src/ouroboros/config/defaults.py +69 -0
- ouroboros_memory-1.0.0/src/ouroboros/config/loader.py +103 -0
- ouroboros_memory-1.0.0/src/ouroboros/config/schema.py +161 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/__init__.py +7 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/assembler.py +195 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/chain_of_thought.py +112 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/clustering.py +80 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/concept.py +223 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/config.py +292 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/crystal.py +804 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/curiosity.py +172 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/dream.py +134 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/entity.py +176 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/expectation.py +84 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/generative.py +110 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/humor.py +98 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/immune.py +124 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/inference.py +740 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/math_engine.py +215 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/narrative.py +134 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/other_mind.py +176 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/parser.py +806 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/quality.py +132 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/query_analyzer.py +163 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/ranker.py +154 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/resonance.py +153 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/synthesizer.py +102 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/tension.py +242 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/utils.py +140 -0
- ouroboros_memory-1.0.0/src/ouroboros/core/working_memory.py +135 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/__init__.py +30 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/anthropic.py +108 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/base.py +105 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/factory.py +66 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/gemini.py +108 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/llamacpp.py +122 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/ollama.py +127 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/openai.py +118 -0
- ouroboros_memory-1.0.0/src/ouroboros/llm/vllm.py +117 -0
- ouroboros_memory-1.0.0/src/ouroboros/mind.py +1318 -0
- ouroboros_memory-1.0.0/src/ouroboros/privacy/__init__.py +17 -0
- ouroboros_memory-1.0.0/src/ouroboros/privacy/bridge.py +244 -0
- ouroboros_memory-1.0.0/src/ouroboros/py.typed +1 -0
- ouroboros_memory-1.0.0/src/ouroboros/storage/__init__.py +31 -0
- ouroboros_memory-1.0.0/src/ouroboros/storage/backends.py +345 -0
- ouroboros_memory-1.0.0/src/ouroboros/version.py +9 -0
- ouroboros_memory-1.0.0/tests/__init__.py +1 -0
- ouroboros_memory-1.0.0/tests/api/test_server.py +416 -0
- ouroboros_memory-1.0.0/tests/cli/test_cli.py +295 -0
- ouroboros_memory-1.0.0/tests/config/__init__.py +1 -0
- ouroboros_memory-1.0.0/tests/config/test_defaults.py +40 -0
- ouroboros_memory-1.0.0/tests/config/test_loader.py +132 -0
- ouroboros_memory-1.0.0/tests/config/test_schema.py +144 -0
- ouroboros_memory-1.0.0/tests/conftest.py +34 -0
- ouroboros_memory-1.0.0/tests/core/__init__.py +1 -0
- ouroboros_memory-1.0.0/tests/core/test_assembler.py +100 -0
- ouroboros_memory-1.0.0/tests/core/test_chain_of_thought.py +48 -0
- ouroboros_memory-1.0.0/tests/core/test_clustering.py +61 -0
- ouroboros_memory-1.0.0/tests/core/test_concept.py +74 -0
- ouroboros_memory-1.0.0/tests/core/test_crystal.py +329 -0
- ouroboros_memory-1.0.0/tests/core/test_curiosity.py +119 -0
- ouroboros_memory-1.0.0/tests/core/test_dream.py +53 -0
- ouroboros_memory-1.0.0/tests/core/test_entity.py +121 -0
- ouroboros_memory-1.0.0/tests/core/test_entity_aliases.py +46 -0
- ouroboros_memory-1.0.0/tests/core/test_expectation.py +89 -0
- ouroboros_memory-1.0.0/tests/core/test_generative.py +49 -0
- ouroboros_memory-1.0.0/tests/core/test_humor.py +84 -0
- ouroboros_memory-1.0.0/tests/core/test_immune.py +86 -0
- ouroboros_memory-1.0.0/tests/core/test_inference.py +169 -0
- ouroboros_memory-1.0.0/tests/core/test_math_engine.py +153 -0
- ouroboros_memory-1.0.0/tests/core/test_narrative.py +109 -0
- ouroboros_memory-1.0.0/tests/core/test_other_mind.py +92 -0
- ouroboros_memory-1.0.0/tests/core/test_parser.py +234 -0
- ouroboros_memory-1.0.0/tests/core/test_quality.py +100 -0
- ouroboros_memory-1.0.0/tests/core/test_quality_trace.py +52 -0
- ouroboros_memory-1.0.0/tests/core/test_query_analyzer.py +48 -0
- ouroboros_memory-1.0.0/tests/core/test_ranker.py +136 -0
- ouroboros_memory-1.0.0/tests/core/test_resonance.py +105 -0
- ouroboros_memory-1.0.0/tests/core/test_synthesizer.py +88 -0
- ouroboros_memory-1.0.0/tests/core/test_tension.py +124 -0
- ouroboros_memory-1.0.0/tests/core/test_utils.py +175 -0
- ouroboros_memory-1.0.0/tests/core/test_working_memory.py +146 -0
- ouroboros_memory-1.0.0/tests/live/__init__.py +1 -0
- ouroboros_memory-1.0.0/tests/live/test_ollama_live.py +232 -0
- ouroboros_memory-1.0.0/tests/llm/test_anthropic.py +110 -0
- ouroboros_memory-1.0.0/tests/llm/test_factory.py +149 -0
- ouroboros_memory-1.0.0/tests/llm/test_gemini.py +101 -0
- ouroboros_memory-1.0.0/tests/llm/test_llamacpp_vllm.py +184 -0
- ouroboros_memory-1.0.0/tests/llm/test_openai.py +165 -0
- ouroboros_memory-1.0.0/tests/paper/__init__.py +1 -0
- ouroboros_memory-1.0.0/tests/paper/test_paper_conformance.py +781 -0
- ouroboros_memory-1.0.0/tests/privacy/test_bridge.py +127 -0
- ouroboros_memory-1.0.0/tests/storage/test_backends.py +272 -0
- ouroboros_memory-1.0.0/tests/test_mind.py +335 -0
- ouroboros_memory-1.0.0/tests/test_public_api.py +67 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Build artifacts
|
|
2
|
+
build/
|
|
3
|
+
dist/
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.pyc
|
|
8
|
+
*.pyo
|
|
9
|
+
|
|
10
|
+
# Coverage / pytest
|
|
11
|
+
.coverage
|
|
12
|
+
.coverage-data/
|
|
13
|
+
.coverage.*
|
|
14
|
+
htmlcov/
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.mypy_cache/
|
|
17
|
+
.ruff_cache/
|
|
18
|
+
|
|
19
|
+
# Virtualenvs / secrets
|
|
20
|
+
.venv/
|
|
21
|
+
venv/
|
|
22
|
+
.env
|
|
23
|
+
.envrc
|
|
24
|
+
|
|
25
|
+
# OS
|
|
26
|
+
.DS_Store
|
|
27
|
+
Thumbs.db
|
|
28
|
+
|
|
29
|
+
# Editor
|
|
30
|
+
.vscode/
|
|
31
|
+
.idea/
|
|
32
|
+
*.swp
|
|
33
|
+
|
|
34
|
+
# Node (GUI)
|
|
35
|
+
gui/node_modules/
|
|
36
|
+
gui/dist/
|
|
37
|
+
gui/.vite/
|
|
38
|
+
|
|
39
|
+
# Data
|
|
40
|
+
*.db
|
|
41
|
+
*.sqlite
|
|
42
|
+
*.sqlite3
|
|
43
|
+
*.enc.json
|
|
44
|
+
data/
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [1.0.0] - 2026-06-10
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
#### Phase 1 — Paper Feature Completeness
|
|
13
|
+
- **Crystal knowledge graph** — dual-layer (personal/general) typed triple store with bidirectional relations, contradiction detection, transitive BFS inference, and crystallization threshold.
|
|
14
|
+
- **Resonance Field** — hash-based concept vectors, decay/activation/self-expansion (24→120 dim), dissonance metric.
|
|
15
|
+
- **Tension Engine** — 7 tension types (contradiction, dissonance, novelty, prediction_error, ambiguity, gap, obsession) with lifecycle, priority scoring, and resolution strategies that perform real system actions (weaken_belief, tick+decay, add_question, etc.).
|
|
16
|
+
- **Semantic Parser** — 20+ regex intents with entity extraction.
|
|
17
|
+
- **Working Memory** — 5-item bounded scratchpad with decay.
|
|
18
|
+
- **Narrative Self** — temporal event log with temporal_phrase().
|
|
19
|
+
- **Entity Resolution** — pronoun/alias tracking via EntityResolver.
|
|
20
|
+
- **Immune Layer** — obsession suppression with configurable threshold.
|
|
21
|
+
- **Curiosity Drive** — proactive open-question generation with triggerable()/mark_asked() lifecycle.
|
|
22
|
+
- **Humor** — 6-dim mood gradients (curiosity, attachment, surprise, boredom, anxiety, confidence) with drift, quip(), and mood-driven responses.
|
|
23
|
+
- **Expectation Engine** — Markov-chain intent prediction.
|
|
24
|
+
- **Other-Mind** — user model tracking interaction statistics.
|
|
25
|
+
- **Response Quality Controller** — output filter with repetition detection.
|
|
26
|
+
- **Math Reasoning Engine** — symbolic arithmetic solver.
|
|
27
|
+
- **Chain-of-Thought Engine** — 7-step structured reasoning.
|
|
28
|
+
- **Generative Synthesis Engine** — template answer generation.
|
|
29
|
+
- **Concept Clustering Engine** — group by is_a parents.
|
|
30
|
+
- **Intelligent Inference Engine** — 9-strategy cascade (personal_lookup, relation, cluster, transitive, recent_episodic, schema_fallback, etc.) with shared-neighbour and schema-fallback strategies.
|
|
31
|
+
- **Answer Synthesizer** — final formatting.
|
|
32
|
+
- **Dream Engine** — idle processing with BFS-based insight generation from most_active() concepts.
|
|
33
|
+
- **Query Analyzer** — high-level query classification.
|
|
34
|
+
- **OuroborosMind orchestrator** — 8-step chat pipeline (parse, activate, rank, assemble, generate, validate, learn).
|
|
35
|
+
- **Mood injection into LLM prompt** — dominant mood + gradients appended before user question.
|
|
36
|
+
- **Proactive curiosity questioning** — top triggerable question appended to non-query responses.
|
|
37
|
+
|
|
38
|
+
#### Phase 2 — LLM Adapter Layer
|
|
39
|
+
- **LLMAdapter ABC** — sync + async + streaming base class.
|
|
40
|
+
- **OllamaAdapter** — local (default), with cloud model support.
|
|
41
|
+
- **OpenAIAdapter** — cloud (OpenAI-compatible APIs).
|
|
42
|
+
- **AnthropicAdapter** — cloud (Claude models).
|
|
43
|
+
- **GeminiAdapter** — Google Gemini models.
|
|
44
|
+
- **LlamaCppAdapter** — GGUF inference (no server required).
|
|
45
|
+
- **VLLMAdapter** — local vLLM server.
|
|
46
|
+
- **AdapterFactory** — auto-detection from provider name.
|
|
47
|
+
- **CRYSTAL_ENABLE_SUBSTRING_FALLBACK** — config toggle for O(N) substring fallback (default on for backward compat, off for guaranteed O(1) lookup).
|
|
48
|
+
|
|
49
|
+
#### Phase 3 — Privacy & Storage
|
|
50
|
+
- **DigiKabaz privacy bridge** — 5-level graduated privacy (None→Maximum) for cloud LLM adapters, PII tokenization, synthetic noise injection.
|
|
51
|
+
- **Storage layer** — SQLite + JSONL serializers under `~/.ouroboros/` with AES-256-GCM at rest.
|
|
52
|
+
- **Auto-backup** with configurable retention.
|
|
53
|
+
- **Version migration** — schema versioning with automatic upgrade.
|
|
54
|
+
- **Export** — JSONL, GraphViz DOT, RDF/TTL, CSV formats.
|
|
55
|
+
- **Import** — JSONL and TTL formats.
|
|
56
|
+
- **Round-trip integrity** — full serialization/deserialization fidelity.
|
|
57
|
+
|
|
58
|
+
#### Phase 4 — API, CLI & GUI
|
|
59
|
+
- **FastAPI server** — REST endpoints for chat, memory, graph, config, status, export, import, privacy, session; WebSocket streaming at `/ws/chat`.
|
|
60
|
+
- **Typer CLI** — `start`, `chat`, `config`, `export`, `import`, `backup`, `restore`, `status`, `inspect` subcommands.
|
|
61
|
+
- **Svelte + Vite + three.js web GUI** — dark theme, glassmorphism design, chat panel with streaming, 3D memory constellation (force-directed graph), settings panel, privacy dashboard.
|
|
62
|
+
- **Dockerfile + docker-compose** — containerized deployment.
|
|
63
|
+
- **SBOM generation** — cyclonedx.
|
|
64
|
+
|
|
65
|
+
#### Phase 5 — Production Hardening
|
|
66
|
+
- **Unit + integration tests** — 756 tests passing, 85% branch coverage.
|
|
67
|
+
- **mypy --strict** — full type coverage clean.
|
|
68
|
+
- **ruff check + ruff format** — lint clean.
|
|
69
|
+
- **Documentation** — architecture, user guide, API reference, privacy model.
|
|
70
|
+
- **Paper validation** — verify_paper.py: 94/95 checks pass.
|
|
71
|
+
- **Stress test validation** — 200K nodes stored in 3.3s, queries in <0.01ms, serialization <1s, 500K node extrapolation < 500MB (paper claim validated).
|
|
72
|
+
- **CI pipeline** — GitHub Actions matrix (4 Python versions), parallel coverage job with 85% threshold enforcement.
|
|
73
|
+
- **Security policy** — vulnerability reporting, threat model, crypto parameters.
|
|
74
|
+
- **Contributing guide** — setup, quality gates, code style, commit conventions.
|
|
75
|
+
- **Pre-commit hooks** — ruff lint+format, mypy --strict.
|
|
76
|
+
- **Issue + PR templates**.
|
|
77
|
+
|
|
78
|
+
### Fixed
|
|
79
|
+
- **Tension resolution strategies** now perform real system actions (weaken_belief, add_question, resonance tick+decay) instead of no-op.
|
|
80
|
+
- **Insight generation** replaced hardcoded `find_transitive("self")` with BFS from `most_active()` concepts.
|
|
81
|
+
- **Transitive inference** prefers deeper paths over shallow results for more meaningful chains.
|
|
82
|
+
- **Exception swallowing** (`contextlib.suppress`) replaced with `logger.exception()` in tension engine.
|
|
83
|
+
- **Prompt context** improved: personal pronoun detection ensures user node is always included in rank candidates; LLM prompt explicitly maps "The user" → person asking questions.
|
|
84
|
+
- **Proactive curiosity** correctly uses `triggerable()` topic (not rendered question string) for `mark_asked()`.
|
|
85
|
+
- **Proactive curiosity guard** prevents appending to question answers.
|
|
86
|
+
|
|
87
|
+
### Performance
|
|
88
|
+
- Storage: ~170K edges stored in 3.3s (0.03ms per fact).
|
|
89
|
+
- Query: exact-match lookup <0.01ms average.
|
|
90
|
+
- Transitive inference: <0.05ms at depth 5.
|
|
91
|
+
- Serialization: <1s for 200K nodes, dict size 55 MB.
|
|
92
|
+
- Memory: 362 MB extrapolated for 500K nodes (under 500 MB paper claim).
|
|
93
|
+
|
|
94
|
+
[Unreleased]: https://github.com/Open-ouroboros/ouroboros-memory/compare/v1.0.0...HEAD
|
|
95
|
+
[1.0.0]: https://github.com/Open-ouroboros/ouroboros-memory/releases/tag/v1.0.0
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright 2026 Sandesh Bastola and the Ouroboros Research Collective
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
18
|
+
|
|
19
|
+
=======================================================================
|
|
20
|
+
|
|
21
|
+
This license applies to both packages in this workspace:
|
|
22
|
+
|
|
23
|
+
- ouroboros-digikabaz (the privacy layer)
|
|
24
|
+
- ouroboros-memory (the lifelong memory system)
|
|
25
|
+
|
|
26
|
+
Both packages are released under the Apache License, Version 2.0.
|
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ouroboros-memory
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Lifelong, contradiction-aware, curiosity-driven memory infrastructure for large language models. Local-first, LLM-agnostic, symbolic.
|
|
5
|
+
Project-URL: Homepage, https://github.com/Open-ouroboros/ouroboros-memory
|
|
6
|
+
Project-URL: Documentation, https://ouroboros-memory.readthedocs.io
|
|
7
|
+
Project-URL: Repository, https://github.com/Open-ouroboros/ouroboros-memory
|
|
8
|
+
Project-URL: Issues, https://github.com/Open-ouroboros/ouroboros-memory/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/Open-ouroboros/ouroboros-memory/blob/main/CHANGELOG.md
|
|
10
|
+
Project-URL: Discussions, https://github.com/Open-ouroboros/ouroboros-memory/discussions
|
|
11
|
+
Author: Ouroboros Research Collective
|
|
12
|
+
Author-email: Sandesh Bastola <sandeshbastola19@gmail.com>
|
|
13
|
+
License: Apache-2.0
|
|
14
|
+
License-File: LICENSE
|
|
15
|
+
Keywords: agent,ai,knowledge-graph,llm,local-first,memory,neuro-symbolic,privacy,rag,symbolic
|
|
16
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: Intended Audience :: Science/Research
|
|
19
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
20
|
+
Classifier: Operating System :: OS Independent
|
|
21
|
+
Classifier: Programming Language :: Python :: 3
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
27
|
+
Classifier: Typing :: Typed
|
|
28
|
+
Requires-Python: >=3.10
|
|
29
|
+
Requires-Dist: anthropic>=0.28.0
|
|
30
|
+
Requires-Dist: cryptography>=42.0.0
|
|
31
|
+
Requires-Dist: fastapi>=0.110.0
|
|
32
|
+
Requires-Dist: google-generativeai>=0.5.0
|
|
33
|
+
Requires-Dist: httpx>=0.27.0
|
|
34
|
+
Requires-Dist: llama-cpp-python>=0.2.70; platform_machine != 'arm64' or sys_platform != 'darwin'
|
|
35
|
+
Requires-Dist: openai>=1.30.0
|
|
36
|
+
Requires-Dist: platformdirs>=4.2.0
|
|
37
|
+
Requires-Dist: pydantic>=2.6.0
|
|
38
|
+
Requires-Dist: python-multipart>=0.0.9
|
|
39
|
+
Requires-Dist: pyyaml>=6.0
|
|
40
|
+
Requires-Dist: rich>=13.7.0
|
|
41
|
+
Requires-Dist: typer>=0.12.0
|
|
42
|
+
Requires-Dist: uvicorn[standard]>=0.27.0
|
|
43
|
+
Requires-Dist: watchfiles>=0.21.0
|
|
44
|
+
Requires-Dist: websockets>=12.0
|
|
45
|
+
Provides-Extra: all
|
|
46
|
+
Requires-Dist: ouroboros-digikabaz[ner]; extra == 'all'
|
|
47
|
+
Requires-Dist: spacy>=3.7.0; extra == 'all'
|
|
48
|
+
Provides-Extra: dev
|
|
49
|
+
Requires-Dist: hatch>=1.9.0; extra == 'dev'
|
|
50
|
+
Requires-Dist: ipython>=8.20.0; extra == 'dev'
|
|
51
|
+
Requires-Dist: mypy>=1.8.0; extra == 'dev'
|
|
52
|
+
Requires-Dist: pre-commit>=3.6.0; extra == 'dev'
|
|
53
|
+
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
54
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
|
|
55
|
+
Requires-Dist: pytest-mock>=3.12.0; extra == 'dev'
|
|
56
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
57
|
+
Requires-Dist: respx>=0.21.0; extra == 'dev'
|
|
58
|
+
Requires-Dist: ruff>=0.3.0; extra == 'dev'
|
|
59
|
+
Requires-Dist: types-pyyaml; extra == 'dev'
|
|
60
|
+
Requires-Dist: types-requests; extra == 'dev'
|
|
61
|
+
Provides-Extra: gui
|
|
62
|
+
Provides-Extra: privacy
|
|
63
|
+
Requires-Dist: ouroboros-digikabaz>=0.1.0; extra == 'privacy'
|
|
64
|
+
Description-Content-Type: text/markdown
|
|
65
|
+
|
|
66
|
+
# Ouroboros Memory
|
|
67
|
+
|
|
68
|
+
> *"The LLM is the voice. Ouroboros is the mind."*
|
|
69
|
+
|
|
70
|
+
**Symbolic, contradiction-aware, lifelong memory infrastructure for large language models.**
|
|
71
|
+
|
|
72
|
+
Ouroboros Memory is a production-ready local-first system that brings **persistent, coherent, auditable memory** to any LLM. Unlike embeddings-based approaches, it uses transparent symbolic knowledge graphs that detect contradictions, infer missing facts, and organize autonomously—without cloud lock-in or GPU requirements.
|
|
73
|
+
|
|
74
|
+
[](https://pypi.org/project/ouroboros-memory/)
|
|
75
|
+
[](https://www.python.org/)
|
|
76
|
+
[](LICENSE)
|
|
77
|
+
[](tests/)
|
|
78
|
+
[](tests/)
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## The Problem
|
|
83
|
+
|
|
84
|
+
Current LLMs suffer from **three critical memory failures**:
|
|
85
|
+
|
|
86
|
+
| Problem | Impact |
|
|
87
|
+
|---------|--------|
|
|
88
|
+
| **No persistent memory** | Each conversation starts blank. Context windows can't hold real history. |
|
|
89
|
+
| **No contradiction detection** | Conflicting information silently overwrites; coherence degrades over time. |
|
|
90
|
+
| **Cloud lock-in** | Embeddings/vectors require expensive APIs; local alternatives are unauditable. |
|
|
91
|
+
|
|
92
|
+
**Ouroboros solves all three:** persistent symbolic memory, contradiction detection, full auditability, runs on consumer hardware.
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Key Features
|
|
97
|
+
|
|
98
|
+
✨ **Symbolic Knowledge Graph**
|
|
99
|
+
- Transparent `(subject, relation, object)` triples with confidence weights
|
|
100
|
+
- No opaque embeddings—every fact is human-readable and auditable
|
|
101
|
+
- Contradictions detected and flagged, never silently blended
|
|
102
|
+
|
|
103
|
+
🧠 **Curiosity-Driven Autonomous Learning**
|
|
104
|
+
- Automatic tension detection: contradictions, prediction errors, novelty, information gaps
|
|
105
|
+
- System autonomously formulates clarifying questions
|
|
106
|
+
- Self-organizing fact consolidation and reorganization
|
|
107
|
+
|
|
108
|
+
🔌 **LLM-Agnostic**
|
|
109
|
+
- Drop-in support for 6 providers: Ollama, llama.cpp, vLLM, OpenAI, Anthropic, Google Gemini
|
|
110
|
+
- Switch providers without losing a single memory
|
|
111
|
+
- Identical API across all backends
|
|
112
|
+
|
|
113
|
+
💻 **Local-First**
|
|
114
|
+
- Runs on laptops and consumer hardware
|
|
115
|
+
- No GPU required for the memory layer
|
|
116
|
+
- Optional local LLM support (Ollama, llama.cpp) for fully offline operation
|
|
117
|
+
|
|
118
|
+
🔐 **Privacy-Respecting**
|
|
119
|
+
- Optional 5-level privacy bridge (PII tokenization, synthetic noise injection, cloud-disable mode)
|
|
120
|
+
- Powered by [DigiKabaz](https://github.com/Open-ouroboros/ouroboros-digikabaz)
|
|
121
|
+
- All privacy layers are transparent and configurable
|
|
122
|
+
|
|
123
|
+
📊 **Production Ready**
|
|
124
|
+
- **88.79% test coverage** (85+ passing tests across core, llm, api, cli, storage, privacy)
|
|
125
|
+
- **Strict code quality**: ruff linting + mypy --strict type checking
|
|
126
|
+
- **Proven scalability**: 1M-fact benchmarks with constant throughput (29,469 facts/sec)
|
|
127
|
+
- **Paper-conformant**: 28 architecture claims validated against empirical data
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 30-Second Example
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
from ouroboros import OuroborosMind
|
|
135
|
+
|
|
136
|
+
# Create a mind (first-run wizard writes ~/.ouroboros/config.yaml)
|
|
137
|
+
mind = OuroborosMind()
|
|
138
|
+
|
|
139
|
+
# Add a fact
|
|
140
|
+
mind.chat("My name is Tony. I like dark mode.")
|
|
141
|
+
# → "Noted, Tony. I have crystallized your preference for dark mode."
|
|
142
|
+
|
|
143
|
+
# Switch LLM provider (memory transfers instantly)
|
|
144
|
+
mind.switch_llm("openai", "gpt-4o")
|
|
145
|
+
|
|
146
|
+
# Query the memory
|
|
147
|
+
mind.chat("What do I like?")
|
|
148
|
+
# → "Based on my memory, you enjoy dark mode, Tony."
|
|
149
|
+
|
|
150
|
+
# Inspect what was stored
|
|
151
|
+
print(mind.crystal.facts)
|
|
152
|
+
# → [Fact(subject='Tony', relation='has_name', object='Tony', confidence=1.0),
|
|
153
|
+
# Fact(subject='Tony', relation='prefers', object='dark mode', confidence=0.95)]
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Installation
|
|
159
|
+
|
|
160
|
+
### PyPI (Recommended)
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
pip install ouroboros-memory
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### From Source
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
git clone https://github.com/Open-ouroboros/ouroboros-memory
|
|
170
|
+
cd ouroboros-memory
|
|
171
|
+
pip install -e .[dev,all]
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### LLM Setup
|
|
175
|
+
|
|
176
|
+
By default, Ouroboros uses **Ollama** with `gemma3:4b-cloud`. No setup needed; the app will guide you.
|
|
177
|
+
|
|
178
|
+
To use OpenAI, Anthropic, or other providers:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# Configure via interactive setup
|
|
182
|
+
ouroboros config
|
|
183
|
+
|
|
184
|
+
# Or edit directly
|
|
185
|
+
nano ~/.ouroboros/config.yaml
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Architecture at a Glance
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
┌─────────────────────────────────────────────────────┐
|
|
194
|
+
│ LLM Agent (OpenAI · Anthropic · Ollama · etc.) │
|
|
195
|
+
└────────────────┬────────────────────────────────────┘
|
|
196
|
+
│ System Prompt + Injected Facts
|
|
197
|
+
▼
|
|
198
|
+
┌─────────────────────────────────────────────────────┐
|
|
199
|
+
│ 8-Step Chat Pipeline │
|
|
200
|
+
│ Query Analysis → Crystal Ranker → Context Inject │
|
|
201
|
+
│ → LLM Response → Fact Extract → Tension │
|
|
202
|
+
│ Detection → Infer → Consolidate │
|
|
203
|
+
└────────────────┬────────────────────────────────────┘
|
|
204
|
+
│
|
|
205
|
+
┌────────┼────────┐
|
|
206
|
+
▼ ▼ ▼
|
|
207
|
+
┌────────────────────────────────────────────────┐
|
|
208
|
+
│ Ouroboros Memory Core │
|
|
209
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
210
|
+
│ │ Crystal (Dual-layer Knowledge Graph) │ │
|
|
211
|
+
│ │ • 28 semantic relation types │ │
|
|
212
|
+
│ │ • Contradiction detection │ │
|
|
213
|
+
│ │ • Fact confidence tracking │ │
|
|
214
|
+
│ └─────────────────────────────────────────┘ │
|
|
215
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
216
|
+
│ │ Resonance (Dynamic Attention Field) │ │
|
|
217
|
+
│ │ • 24→120 dimensional embedding space │ │
|
|
218
|
+
│ │ • Concept ranking and relevance │ │
|
|
219
|
+
│ │ • O(1) query performance │ │
|
|
220
|
+
│ └─────────────────────────────────────────┘ │
|
|
221
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
222
|
+
│ │ Tension Engine (Curiosity System) │ │
|
|
223
|
+
│ │ • 7 tension types (contradictions, │ │
|
|
224
|
+
│ │ prediction errors, novelty, gaps) │ │
|
|
225
|
+
│ │ • Autonomous question formulation │ │
|
|
226
|
+
│ │ • Self-directed learning │ │
|
|
227
|
+
│ └─────────────────────────────────────────┘ │
|
|
228
|
+
│ ┌─────────────────────────────────────────┐ │
|
|
229
|
+
│ │ Storage Backend (PostgreSQL, SQLite) │ │
|
|
230
|
+
│ │ • Persistent fact storage │ │
|
|
231
|
+
│ │ • Scalable to millions of facts │ │
|
|
232
|
+
│ │ • ACID transactions │ │
|
|
233
|
+
│ └─────────────────────────────────────────┘ │
|
|
234
|
+
└────────────────────────────────────────────────┘
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Full architectural detail:** [docs/architecture.md](./docs/architecture.md)
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Privacy & Security
|
|
242
|
+
|
|
243
|
+
Ouroboros integrates **DigiKabaz**, a privacy bridge with five graduated levels:
|
|
244
|
+
|
|
245
|
+
| Level | Description |
|
|
246
|
+
|-------|-------------|
|
|
247
|
+
| **1 (None)** | Memory sent to cloud as-is (default for local-only LLMs) |
|
|
248
|
+
| **2 (Minimal)** | Regex PII (email, phone, SSN) tokenized before cloud transmission |
|
|
249
|
+
| **3 (Balanced, default)** | Names, companies, locations, financial data, health info tokenized |
|
|
250
|
+
| **4 (High)** | All personal facts tokenized + synthetic noise injection |
|
|
251
|
+
| **5 (Maximum)** | Cloud LLMs disabled entirely; local models only |
|
|
252
|
+
|
|
253
|
+
**Transparent, configurable, auditable.** No hidden encryption; you control exactly what leaves your device.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Getting Started
|
|
258
|
+
|
|
259
|
+
### Basic Usage
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# Start interactive mode
|
|
263
|
+
ouroboros chat
|
|
264
|
+
|
|
265
|
+
# Start REST API server (http://localhost:8765)
|
|
266
|
+
ouroboros start
|
|
267
|
+
|
|
268
|
+
# GUI dashboard
|
|
269
|
+
# → Open browser to http://localhost:8765 after `ouroboros start`
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Python API
|
|
273
|
+
|
|
274
|
+
```python
|
|
275
|
+
from ouroboros import OuroborosMind
|
|
276
|
+
|
|
277
|
+
# Initialize
|
|
278
|
+
mind = OuroborosMind()
|
|
279
|
+
|
|
280
|
+
# Chat and learn
|
|
281
|
+
response = mind.chat("Tell me about reinforcement learning.")
|
|
282
|
+
print(response)
|
|
283
|
+
|
|
284
|
+
# Access raw facts
|
|
285
|
+
for fact in mind.crystal.facts:
|
|
286
|
+
print(f"{fact.subject} {fact.relation} {fact.object} [{fact.confidence}]")
|
|
287
|
+
|
|
288
|
+
# Inspect tensions (curiosity)
|
|
289
|
+
for tension in mind.tensions:
|
|
290
|
+
print(f"Tension: {tension.type} — {tension.description}")
|
|
291
|
+
|
|
292
|
+
# Run a dream pass (self-directed learning)
|
|
293
|
+
mind.dream()
|
|
294
|
+
|
|
295
|
+
# Save and restore
|
|
296
|
+
mind.backup("my_memory.backup")
|
|
297
|
+
mind.restore("my_memory.backup")
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### REST API
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
# Start server
|
|
304
|
+
ouroboros start
|
|
305
|
+
|
|
306
|
+
# In another terminal:
|
|
307
|
+
curl -X POST http://localhost:8765/api/chat \
|
|
308
|
+
-H "Content-Type: application/json" \
|
|
309
|
+
-d '{"message": "My birthday is May 15th"}'
|
|
310
|
+
# → {"response": "Noted. I have crystallized your birthday as May 15th.", "facts_learned": 1}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Examples
|
|
316
|
+
|
|
317
|
+
Seven runnable end-to-end examples in [examples/](examples/):
|
|
318
|
+
|
|
319
|
+
| # | Example | Purpose |
|
|
320
|
+
|---|---------|---------|
|
|
321
|
+
| 1 | `01_minimal_chat.py` | Two-turn conversation with crystallized concept inspection |
|
|
322
|
+
| 2 | `02_switch_providers.py` | One mind, three LLM providers (seamless switching) |
|
|
323
|
+
| 3 | `03_persistence.py` | Save, wipe, restore—facts survive across sessions |
|
|
324
|
+
| 4 | `04_privacy_levels.py` | Walk through all 5 privacy bridge levels |
|
|
325
|
+
| 5 | `05_http_client.py` | Drive REST API from Python with `httpx` |
|
|
326
|
+
| 6 | `06_pipeline_inspection.py` | Inspect each of the 8 chat pipeline steps |
|
|
327
|
+
| 7 | `07_dream_and_stats.py` | Run a dream pass and read component stats |
|
|
328
|
+
|
|
329
|
+
**Run an example:**
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
python examples/01_minimal_chat.py
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Documentation
|
|
338
|
+
|
|
339
|
+
- **[User Guide](./docs/user_guide.md)** — Installation, configuration, CLI commands, Python API
|
|
340
|
+
- **[Architecture](./docs/architecture.md)** — Deep dive into Crystal, Resonance, Tension Engine, Parser, Ranker, Assembler
|
|
341
|
+
- **[API Reference](./docs/api_reference.md)** — REST endpoints, WebSocket schema, async patterns
|
|
342
|
+
- **[Privacy Model](./docs/privacy.md)** — DigiKabaz integration, PII detection, noise injection
|
|
343
|
+
- **[PLAN.md](./PLAN.md)** — Development roadmap, design rationale, future research directions
|
|
344
|
+
- **[Benchmark Report](./docs/benchmark_report.md)** — Scalability to 1M facts, latency profiles, storage efficiency
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Testing & Development
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
# Install dev dependencies
|
|
352
|
+
pip install -e .[dev,all]
|
|
353
|
+
|
|
354
|
+
# Run full test suite (85+ tests)
|
|
355
|
+
pytest tests/
|
|
356
|
+
|
|
357
|
+
# Run with coverage
|
|
358
|
+
pytest --cov=src/ouroboros tests/
|
|
359
|
+
|
|
360
|
+
# Linting & type checking
|
|
361
|
+
ruff check .
|
|
362
|
+
mypy src/ --strict
|
|
363
|
+
|
|
364
|
+
# Benchmark scalability (up to 1M facts)
|
|
365
|
+
python scripts/bench_scalability_1m.py
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Performance
|
|
371
|
+
|
|
372
|
+
**Ingestion:** 29,469 facts/second (constant across all scales)
|
|
373
|
+
**Storage:** 78.5 bytes/fact (1M facts = 74.9 MB)
|
|
374
|
+
**Query Latency:** 0.2ms p50 (O(1) behavior despite 1M facts)
|
|
375
|
+
**Recall Accuracy:** 87–92% (consistent across all scales)
|
|
376
|
+
|
|
377
|
+
See [docs/benchmark_report.md](./docs/benchmark_report.md) for detailed results.
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Contributing
|
|
382
|
+
|
|
383
|
+
Ouroboros is community-driven. We welcome:
|
|
384
|
+
|
|
385
|
+
- **Bug reports** — Use [GitHub Issues](https://github.com/Open-ouroboros/ouroboros-memory/issues)
|
|
386
|
+
- **Feature requests** — Include reference to the research paper or design docs
|
|
387
|
+
- **Code contributions** — See [CONTRIBUTING.md](CONTRIBUTING.md)
|
|
388
|
+
- **Research & papers** — New relation types, tension algorithms, inference strategies
|
|
389
|
+
|
|
390
|
+
See [DEVELOPMENT.md](DEVELOPMENT.md) for contributor setup and git workflow.
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## License
|
|
395
|
+
|
|
396
|
+
Apache License 2.0. See [LICENSE](LICENSE) for details.
|
|
397
|
+
|
|
398
|
+
**Commercial use is permitted.** No warranty. Use at your own risk.
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## Citation
|
|
403
|
+
|
|
404
|
+
If you use Ouroboros Memory in research, please cite:
|
|
405
|
+
|
|
406
|
+
```bibtex
|
|
407
|
+
@software{ouroboros2024,
|
|
408
|
+
title = {Ouroboros Memory: Symbolic, Contradiction-Aware, Lifelong Memory for LLMs},
|
|
409
|
+
author = {Open-ouroboros Contributors},
|
|
410
|
+
year = {2024},
|
|
411
|
+
url = {https://github.com/Open-ouroboros/ouroboros-memory},
|
|
412
|
+
note = {v1.0.0, Apache 2.0 License}
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Acknowledgments
|
|
419
|
+
|
|
420
|
+
Inspired by neuroscience, knowledge representation, and symbolic AI. Built on proven research in:
|
|
421
|
+
|
|
422
|
+
- **Contradiction detection** — Automated inconsistency resolution in knowledge graphs
|
|
423
|
+
- **Curiosity-driven learning** — Tension and novelty as learning drivers
|
|
424
|
+
- **Local-first architecture** — Privacy-respecting inference without cloud lock-in
|
|
425
|
+
- **Symbolic memory** — Transparent, auditable knowledge storage
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
## Questions?
|
|
430
|
+
|
|
431
|
+
- **Documentation:** Start with [User Guide](./docs/user_guide.md)
|
|
432
|
+
- **Issues:** [GitHub Issues](https://github.com/Open-ouroboros/ouroboros-memory/issues)
|
|
433
|
+
- **Discussions:** [GitHub Discussions](https://github.com/Open-ouroboros/ouroboros-memory/discussions)
|
|
434
|
+
- **Paper & Theory:** [PLAN.md](./PLAN.md)
|
|
435
|
+
|
|
436
|
+
**Made with ❤️ by the Ouroboros community.**
|