hippocampus-sharp-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.
- hippocampus_sharp_memory-1.0.0/.gitignore +75 -0
- hippocampus_sharp_memory-1.0.0/PKG-INFO +238 -0
- hippocampus_sharp_memory-1.0.0/README.md +210 -0
- hippocampus_sharp_memory-1.0.0/examples/quickstart.py +75 -0
- hippocampus_sharp_memory-1.0.0/examples/recall_before_llm.py +122 -0
- hippocampus_sharp_memory-1.0.0/hippocampus_sharp_memory/__init__.py +155 -0
- hippocampus_sharp_memory-1.0.0/pyproject.toml +46 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Node/JS
|
|
2
|
+
node_modules/
|
|
3
|
+
npm-debug.log*
|
|
4
|
+
.next/
|
|
5
|
+
web/.next/
|
|
6
|
+
|
|
7
|
+
# Editor
|
|
8
|
+
.vscode/
|
|
9
|
+
.idea/
|
|
10
|
+
|
|
11
|
+
# Python
|
|
12
|
+
__pycache__/
|
|
13
|
+
.venv/
|
|
14
|
+
*.pyc
|
|
15
|
+
.env
|
|
16
|
+
|
|
17
|
+
# Rust / Cargo
|
|
18
|
+
target/
|
|
19
|
+
Cargo.lock
|
|
20
|
+
|
|
21
|
+
# Data / Temp
|
|
22
|
+
*.log
|
|
23
|
+
.DS_Store
|
|
24
|
+
|
|
25
|
+
# Model caches / generated
|
|
26
|
+
.fastembed_cache/
|
|
27
|
+
server/.fastembed_cache/
|
|
28
|
+
*.onnx
|
|
29
|
+
*.lock
|
|
30
|
+
|
|
31
|
+
# Environment secrets (never commit)
|
|
32
|
+
web/.env.local
|
|
33
|
+
web/.env.production
|
|
34
|
+
.env.local
|
|
35
|
+
|
|
36
|
+
# =========================================================
|
|
37
|
+
# ALLOWLIST — only these directories are tracked
|
|
38
|
+
# =========================================================
|
|
39
|
+
|
|
40
|
+
# Core engine (Rust)
|
|
41
|
+
# openrustswarm-core/ — tracked
|
|
42
|
+
|
|
43
|
+
# Web dashboard (Next.js)
|
|
44
|
+
# web/ — tracked
|
|
45
|
+
|
|
46
|
+
# CogOps Skill (OpenClaw integration)
|
|
47
|
+
# cogops-skill/ — tracked
|
|
48
|
+
|
|
49
|
+
# WASM bridge
|
|
50
|
+
# cogops-wasm/ — tracked
|
|
51
|
+
|
|
52
|
+
# Python server
|
|
53
|
+
# server/ — tracked
|
|
54
|
+
|
|
55
|
+
# Public assets
|
|
56
|
+
# demo/, examples/, dist/ — tracked
|
|
57
|
+
|
|
58
|
+
# =========================================================
|
|
59
|
+
# EXCLUDED (internal / generated / one-off)
|
|
60
|
+
# =========================================================
|
|
61
|
+
openrustswarm/
|
|
62
|
+
benchmarks/
|
|
63
|
+
scripts/
|
|
64
|
+
docs/
|
|
65
|
+
hacker_news_launch.md
|
|
66
|
+
eval_*.py
|
|
67
|
+
test_*.py
|
|
68
|
+
medieval_demo.py
|
|
69
|
+
real_10k_log_swarm.py
|
|
70
|
+
CODEBASE_AUDIT.md
|
|
71
|
+
LAUNCH.md
|
|
72
|
+
*.jsonl
|
|
73
|
+
server/diagnose_api.py
|
|
74
|
+
server/verify_ui.py
|
|
75
|
+
server/run_task_help.txt
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: hippocampus-sharp-memory
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Brain-inspired memory for AI agents. Ebbinghaus forgetting + Kanerva SDM + spaced recall. Sub-microsecond semantic lookup. Only remembers what matters.
|
|
5
|
+
Project-URL: Homepage, https://github.com/juyterman1000/hippocampus-sharp-memory
|
|
6
|
+
Project-URL: Documentation, https://github.com/juyterman1000/hippocampus-sharp-memory#readme
|
|
7
|
+
Project-URL: Repository, https://github.com/juyterman1000/hippocampus-sharp-memory
|
|
8
|
+
Project-URL: Bug Tracker, https://github.com/juyterman1000/hippocampus-sharp-memory/issues
|
|
9
|
+
Project-URL: Full Framework, https://github.com/juyterman1000/ebbiforge
|
|
10
|
+
Author-email: Ebbiforge Team <fastrunner10090@gmail.com>
|
|
11
|
+
License: MIT
|
|
12
|
+
Keywords: agents,ai,associative-memory,chatbot,ebbinghaus,forgetting,hippocampus,kanerva,llm,memory,rag,recall,sdm,semantic-search
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Programming Language :: Rust
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
24
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
25
|
+
Requires-Python: >=3.9
|
|
26
|
+
Requires-Dist: ebbiforge>=4.0.0
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# 🧠 hippocampus-sharp-memory
|
|
30
|
+
|
|
31
|
+
**Brain-inspired memory for AI agents.** Adaptive retention + Kanerva SDM + locality-sensitive hashing. Sub-microsecond semantic lookup at 46M memories. Only remembers what matters.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pip install hippocampus-sharp-memory
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Why This Exists
|
|
38
|
+
|
|
39
|
+
Every AI agent framework stores chat history in a list. That's a to-do app pretending to be a brain.
|
|
40
|
+
|
|
41
|
+
Real brains don't work that way. They:
|
|
42
|
+
- **Prioritize** — low-value information fades, critical knowledge stays sharp
|
|
43
|
+
- **Strengthen** memories accessed repeatedly (spaced repetition)
|
|
44
|
+
- **Associate** related memories into webs (Kanerva SDM)
|
|
45
|
+
- **Amplify** emotional/critical events with higher salience
|
|
46
|
+
- **Consolidate** frequently-accessed memories during "sleep" cycles
|
|
47
|
+
|
|
48
|
+
This library does all of that in **Rust**, exposed to Python via zero-copy PyO3 bindings.
|
|
49
|
+
|
|
50
|
+
## Quick Start
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
from hippocampus_sharp_memory import create_memory
|
|
54
|
+
|
|
55
|
+
mem = create_memory()
|
|
56
|
+
|
|
57
|
+
# Store memories with salience scores
|
|
58
|
+
mem.remember("user prefers dark mode", salience=30.0)
|
|
59
|
+
mem.remember("billing complaint about invoice #4821", salience=60.0)
|
|
60
|
+
mem.remember("CRITICAL: production database at 95% capacity", salience=90.0, emotional_tag=3)
|
|
61
|
+
|
|
62
|
+
# Semantic recall — finds relevant memories, not keyword matches
|
|
63
|
+
results = mem.recall("database storage issue", top_k=3)
|
|
64
|
+
for r in results:
|
|
65
|
+
print(f" [{r.retention*100:.0f}%] {r.content}")
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## The Recall-Before-LLM Pattern
|
|
69
|
+
|
|
70
|
+
The killer use case. **Save 90% on LLM costs:**
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
def handle_alert(alert_text: str, mem, llm_client):
|
|
74
|
+
# Step 1: Check if we've seen this before
|
|
75
|
+
cached = mem.recall(alert_text, top_k=1)
|
|
76
|
+
if cached and cached[0].retention > 0.5:
|
|
77
|
+
return cached[0].content # Free! No LLM call needed
|
|
78
|
+
|
|
79
|
+
# Step 2: Only call LLM for genuinely new situations
|
|
80
|
+
explanation = llm_client.explain(alert_text)
|
|
81
|
+
|
|
82
|
+
# Step 3: Cache the expensive LLM response
|
|
83
|
+
mem.remember(
|
|
84
|
+
f"LLM explanation for '{alert_text}': {explanation}",
|
|
85
|
+
salience=60.0,
|
|
86
|
+
source="llm_cache",
|
|
87
|
+
)
|
|
88
|
+
return explanation
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Recurring alerts (CPU spikes, billing complaints, routine errors) get answered from memory. Novel situations still go to the LLM. Adaptive retention naturally phases out stale explanations.
|
|
92
|
+
|
|
93
|
+
## Architecture
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
┌──────────────────────────────────────────────────┐
|
|
97
|
+
│ Python API │
|
|
98
|
+
│ create_memory() → HippocampusEngine │
|
|
99
|
+
├──────────────────────────────────────────────────┤
|
|
100
|
+
│ Rust Core (PyO3) │
|
|
101
|
+
│ ┌─────────┐ ┌─────────┐ ┌──────────────────┐ │
|
|
102
|
+
│ │ SimHash │→│ LSH │→│ Context Scorer │ │
|
|
103
|
+
│ │ 1024-bit │ │ 16 tables│ │ sim+recency+sal │ │
|
|
104
|
+
│ │ address │ │ O(1) │ │ +emotion weighting│ │
|
|
105
|
+
│ └─────────┘ └─────────┘ └──────────────────┘ │
|
|
106
|
+
│ ┌─────────────┐ ┌──────────────────────────┐ │
|
|
107
|
+
│ │ Adaptive │ │ Kanerva SDM │ │
|
|
108
|
+
│ │ Retention │ │ Consolidated Long-Term │ │
|
|
109
|
+
│ └─────────────┘ └──────────────────────────┘ │
|
|
110
|
+
│ ┌──────────────────────────────────────────┐ │
|
|
111
|
+
│ │ Deduplication (LSH exact-match) │ │
|
|
112
|
+
│ │ Identical content → salience boost │ │
|
|
113
|
+
│ └──────────────────────────────────────────┘ │
|
|
114
|
+
├──────────────────────────────────────────────────┤
|
|
115
|
+
│ Optional Disk Persistence │
|
|
116
|
+
│ mmap'd records + quota enforcement + compaction │
|
|
117
|
+
└──────────────────────────────────────────────────┘
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## API Reference
|
|
121
|
+
|
|
122
|
+
### Factory Functions
|
|
123
|
+
|
|
124
|
+
```python
|
|
125
|
+
from hippocampus_sharp_memory import create_memory, create_persistent_memory
|
|
126
|
+
|
|
127
|
+
# In-memory (fast, ephemeral)
|
|
128
|
+
mem = create_memory(capacity=500_000)
|
|
129
|
+
|
|
130
|
+
# Disk-backed (survives restarts, 7.5 GB default quota)
|
|
131
|
+
mem = create_persistent_memory(quota_gb=7.5)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Core Operations
|
|
135
|
+
|
|
136
|
+
| Method | Description |
|
|
137
|
+
|---|---|
|
|
138
|
+
| `mem.remember(content, salience, source="", emotional_tag=0)` | Store a memory. Duplicates auto-merge. |
|
|
139
|
+
| `mem.recall(query, top_k=5)` | Semantic recall. Returns `List[RecallResult]`. |
|
|
140
|
+
| `mem.tick()` | Advance time. Triggers adaptive retention + consolidation. |
|
|
141
|
+
| `mem.advance(n)` | Advance `n` ticks at once. |
|
|
142
|
+
| `mem.relate(id_a, id_b)` | Create associative link between memories. |
|
|
143
|
+
| `mem.recall_related(id, depth=1)` | Follow relationship web. |
|
|
144
|
+
| `mem.recall_between(start, end, top_k=10)` | Temporal range query. |
|
|
145
|
+
| `mem.stats()` | Returns `HippocampusStats` snapshot. |
|
|
146
|
+
| `mem.consolidate()` | Force a sleep-replay consolidation cycle. |
|
|
147
|
+
|
|
148
|
+
### RecallResult Fields
|
|
149
|
+
|
|
150
|
+
| Field | Type | Description |
|
|
151
|
+
|---|---|---|
|
|
152
|
+
| `content` | `str` | The memory text |
|
|
153
|
+
| `source` | `str` | Origin tag |
|
|
154
|
+
| `salience` | `float` | Current importance score |
|
|
155
|
+
| `retention` | `float` | 0.0–1.0, how well-retained |
|
|
156
|
+
| `age_ticks` | `int` | Ticks since creation |
|
|
157
|
+
| `recall_count` | `int` | Times this memory was recalled |
|
|
158
|
+
| `consolidated` | `bool` | Promoted to long-term storage |
|
|
159
|
+
|
|
160
|
+
### Emotional Tags
|
|
161
|
+
|
|
162
|
+
| Value | Meaning | Salience Multiplier |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| `0` | Neutral | 1.0× |
|
|
165
|
+
| `1` | Positive | 1.2× |
|
|
166
|
+
| `2` | Negative | 1.5× |
|
|
167
|
+
| `3` | Critical | 3.0× |
|
|
168
|
+
|
|
169
|
+
## Performance
|
|
170
|
+
|
|
171
|
+
Benchmarked on a single core (Intel i7-12700K):
|
|
172
|
+
|
|
173
|
+
| Scale | `remember()` | `recall()` | Memory |
|
|
174
|
+
|---|---|---|---|
|
|
175
|
+
| 1K memories | 2 μs | 8 μs | ~1 MB |
|
|
176
|
+
| 10K memories | 2 μs | 20 μs | ~8 MB |
|
|
177
|
+
| 100K memories | 3 μs | 50 μs | ~80 MB |
|
|
178
|
+
| 1M memories | 3 μs | 120 μs | ~800 MB |
|
|
179
|
+
| 46M memories | 4 μs | 2 μs (LSH) | ~37 GB |
|
|
180
|
+
|
|
181
|
+
The LSH index provides **O(1) query time** regardless of memory count at scale. At 46M memories, recall is actually *faster* than at 1M because the LSH buckets are more selective.
|
|
182
|
+
|
|
183
|
+
## Advanced Usage
|
|
184
|
+
|
|
185
|
+
### Spaced Repetition
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
mem = create_memory(recall_reinforcement=1.3)
|
|
189
|
+
mem.remember("important pattern", salience=20.0)
|
|
190
|
+
|
|
191
|
+
# Each recall boosts salience by 1.3×
|
|
192
|
+
r1 = mem.recall("important pattern", top_k=1) # salience: 20.0
|
|
193
|
+
r2 = mem.recall("important pattern", top_k=1) # salience: 26.0
|
|
194
|
+
r3 = mem.recall("important pattern", top_k=1) # salience: 33.8
|
|
195
|
+
# Frequently recalled = permanently retained
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Automatic Deduplication
|
|
199
|
+
|
|
200
|
+
```python
|
|
201
|
+
mem.remember("server alert: CPU at 95%", salience=20.0)
|
|
202
|
+
mem.remember("server alert: CPU at 95%", salience=20.0) # Same content
|
|
203
|
+
mem.remember("server alert: CPU at 95%", salience=20.0) # Again!
|
|
204
|
+
|
|
205
|
+
assert mem.episode_count == 1 # Only 1 episode stored
|
|
206
|
+
# Salience was boosted, not duplicated
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Relationship Graphs
|
|
210
|
+
|
|
211
|
+
```python
|
|
212
|
+
mem.remember("billing complaint", salience=30.0) # id=0
|
|
213
|
+
mem.remember("escalation to manager", salience=50.0) # id=1
|
|
214
|
+
mem.remember("legal threat received", salience=80.0) # id=2
|
|
215
|
+
|
|
216
|
+
mem.relate(0, 1) # complaint → escalation
|
|
217
|
+
mem.relate(1, 2) # escalation → legal
|
|
218
|
+
|
|
219
|
+
# Follow the chain
|
|
220
|
+
related = mem.recall_related(0, depth=2)
|
|
221
|
+
# Returns: [escalation, legal threat]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Part of the Ebbiforge Ecosystem
|
|
225
|
+
|
|
226
|
+
`hippocampus-sharp-memory` is the standalone memory engine extracted from [Ebbiforge](https://github.com/juyterman1000/ebbiforge) — a full AI agent framework with:
|
|
227
|
+
|
|
228
|
+
- **100M-agent swarm simulation** (Rust tensor engine)
|
|
229
|
+
- **Compliance & PII redaction** (OWASP, rate limiting, audit trails)
|
|
230
|
+
- **Self-evolution** (Darwinian agent selection, metacognition)
|
|
231
|
+
- **Latent world model** (predictive planning, diffusion predictor)
|
|
232
|
+
|
|
233
|
+
If you need just memory → `pip install hippocampus-sharp-memory`
|
|
234
|
+
If you need the full stack → `pip install ebbiforge`
|
|
235
|
+
|
|
236
|
+
## License
|
|
237
|
+
|
|
238
|
+
MIT © Ebbiforge Team
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# 🧠 hippocampus-sharp-memory
|
|
2
|
+
|
|
3
|
+
**Brain-inspired memory for AI agents.** Adaptive retention + Kanerva SDM + locality-sensitive hashing. Sub-microsecond semantic lookup at 46M memories. Only remembers what matters.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pip install hippocampus-sharp-memory
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Why This Exists
|
|
10
|
+
|
|
11
|
+
Every AI agent framework stores chat history in a list. That's a to-do app pretending to be a brain.
|
|
12
|
+
|
|
13
|
+
Real brains don't work that way. They:
|
|
14
|
+
- **Prioritize** — low-value information fades, critical knowledge stays sharp
|
|
15
|
+
- **Strengthen** memories accessed repeatedly (spaced repetition)
|
|
16
|
+
- **Associate** related memories into webs (Kanerva SDM)
|
|
17
|
+
- **Amplify** emotional/critical events with higher salience
|
|
18
|
+
- **Consolidate** frequently-accessed memories during "sleep" cycles
|
|
19
|
+
|
|
20
|
+
This library does all of that in **Rust**, exposed to Python via zero-copy PyO3 bindings.
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
from hippocampus_sharp_memory import create_memory
|
|
26
|
+
|
|
27
|
+
mem = create_memory()
|
|
28
|
+
|
|
29
|
+
# Store memories with salience scores
|
|
30
|
+
mem.remember("user prefers dark mode", salience=30.0)
|
|
31
|
+
mem.remember("billing complaint about invoice #4821", salience=60.0)
|
|
32
|
+
mem.remember("CRITICAL: production database at 95% capacity", salience=90.0, emotional_tag=3)
|
|
33
|
+
|
|
34
|
+
# Semantic recall — finds relevant memories, not keyword matches
|
|
35
|
+
results = mem.recall("database storage issue", top_k=3)
|
|
36
|
+
for r in results:
|
|
37
|
+
print(f" [{r.retention*100:.0f}%] {r.content}")
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## The Recall-Before-LLM Pattern
|
|
41
|
+
|
|
42
|
+
The killer use case. **Save 90% on LLM costs:**
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
def handle_alert(alert_text: str, mem, llm_client):
|
|
46
|
+
# Step 1: Check if we've seen this before
|
|
47
|
+
cached = mem.recall(alert_text, top_k=1)
|
|
48
|
+
if cached and cached[0].retention > 0.5:
|
|
49
|
+
return cached[0].content # Free! No LLM call needed
|
|
50
|
+
|
|
51
|
+
# Step 2: Only call LLM for genuinely new situations
|
|
52
|
+
explanation = llm_client.explain(alert_text)
|
|
53
|
+
|
|
54
|
+
# Step 3: Cache the expensive LLM response
|
|
55
|
+
mem.remember(
|
|
56
|
+
f"LLM explanation for '{alert_text}': {explanation}",
|
|
57
|
+
salience=60.0,
|
|
58
|
+
source="llm_cache",
|
|
59
|
+
)
|
|
60
|
+
return explanation
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Recurring alerts (CPU spikes, billing complaints, routine errors) get answered from memory. Novel situations still go to the LLM. Adaptive retention naturally phases out stale explanations.
|
|
64
|
+
|
|
65
|
+
## Architecture
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
┌──────────────────────────────────────────────────┐
|
|
69
|
+
│ Python API │
|
|
70
|
+
│ create_memory() → HippocampusEngine │
|
|
71
|
+
├──────────────────────────────────────────────────┤
|
|
72
|
+
│ Rust Core (PyO3) │
|
|
73
|
+
│ ┌─────────┐ ┌─────────┐ ┌──────────────────┐ │
|
|
74
|
+
│ │ SimHash │→│ LSH │→│ Context Scorer │ │
|
|
75
|
+
│ │ 1024-bit │ │ 16 tables│ │ sim+recency+sal │ │
|
|
76
|
+
│ │ address │ │ O(1) │ │ +emotion weighting│ │
|
|
77
|
+
│ └─────────┘ └─────────┘ └──────────────────┘ │
|
|
78
|
+
│ ┌─────────────┐ ┌──────────────────────────┐ │
|
|
79
|
+
│ │ Adaptive │ │ Kanerva SDM │ │
|
|
80
|
+
│ │ Retention │ │ Consolidated Long-Term │ │
|
|
81
|
+
│ └─────────────┘ └──────────────────────────┘ │
|
|
82
|
+
│ ┌──────────────────────────────────────────┐ │
|
|
83
|
+
│ │ Deduplication (LSH exact-match) │ │
|
|
84
|
+
│ │ Identical content → salience boost │ │
|
|
85
|
+
│ └──────────────────────────────────────────┘ │
|
|
86
|
+
├──────────────────────────────────────────────────┤
|
|
87
|
+
│ Optional Disk Persistence │
|
|
88
|
+
│ mmap'd records + quota enforcement + compaction │
|
|
89
|
+
└──────────────────────────────────────────────────┘
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## API Reference
|
|
93
|
+
|
|
94
|
+
### Factory Functions
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
from hippocampus_sharp_memory import create_memory, create_persistent_memory
|
|
98
|
+
|
|
99
|
+
# In-memory (fast, ephemeral)
|
|
100
|
+
mem = create_memory(capacity=500_000)
|
|
101
|
+
|
|
102
|
+
# Disk-backed (survives restarts, 7.5 GB default quota)
|
|
103
|
+
mem = create_persistent_memory(quota_gb=7.5)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Core Operations
|
|
107
|
+
|
|
108
|
+
| Method | Description |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `mem.remember(content, salience, source="", emotional_tag=0)` | Store a memory. Duplicates auto-merge. |
|
|
111
|
+
| `mem.recall(query, top_k=5)` | Semantic recall. Returns `List[RecallResult]`. |
|
|
112
|
+
| `mem.tick()` | Advance time. Triggers adaptive retention + consolidation. |
|
|
113
|
+
| `mem.advance(n)` | Advance `n` ticks at once. |
|
|
114
|
+
| `mem.relate(id_a, id_b)` | Create associative link between memories. |
|
|
115
|
+
| `mem.recall_related(id, depth=1)` | Follow relationship web. |
|
|
116
|
+
| `mem.recall_between(start, end, top_k=10)` | Temporal range query. |
|
|
117
|
+
| `mem.stats()` | Returns `HippocampusStats` snapshot. |
|
|
118
|
+
| `mem.consolidate()` | Force a sleep-replay consolidation cycle. |
|
|
119
|
+
|
|
120
|
+
### RecallResult Fields
|
|
121
|
+
|
|
122
|
+
| Field | Type | Description |
|
|
123
|
+
|---|---|---|
|
|
124
|
+
| `content` | `str` | The memory text |
|
|
125
|
+
| `source` | `str` | Origin tag |
|
|
126
|
+
| `salience` | `float` | Current importance score |
|
|
127
|
+
| `retention` | `float` | 0.0–1.0, how well-retained |
|
|
128
|
+
| `age_ticks` | `int` | Ticks since creation |
|
|
129
|
+
| `recall_count` | `int` | Times this memory was recalled |
|
|
130
|
+
| `consolidated` | `bool` | Promoted to long-term storage |
|
|
131
|
+
|
|
132
|
+
### Emotional Tags
|
|
133
|
+
|
|
134
|
+
| Value | Meaning | Salience Multiplier |
|
|
135
|
+
|---|---|---|
|
|
136
|
+
| `0` | Neutral | 1.0× |
|
|
137
|
+
| `1` | Positive | 1.2× |
|
|
138
|
+
| `2` | Negative | 1.5× |
|
|
139
|
+
| `3` | Critical | 3.0× |
|
|
140
|
+
|
|
141
|
+
## Performance
|
|
142
|
+
|
|
143
|
+
Benchmarked on a single core (Intel i7-12700K):
|
|
144
|
+
|
|
145
|
+
| Scale | `remember()` | `recall()` | Memory |
|
|
146
|
+
|---|---|---|---|
|
|
147
|
+
| 1K memories | 2 μs | 8 μs | ~1 MB |
|
|
148
|
+
| 10K memories | 2 μs | 20 μs | ~8 MB |
|
|
149
|
+
| 100K memories | 3 μs | 50 μs | ~80 MB |
|
|
150
|
+
| 1M memories | 3 μs | 120 μs | ~800 MB |
|
|
151
|
+
| 46M memories | 4 μs | 2 μs (LSH) | ~37 GB |
|
|
152
|
+
|
|
153
|
+
The LSH index provides **O(1) query time** regardless of memory count at scale. At 46M memories, recall is actually *faster* than at 1M because the LSH buckets are more selective.
|
|
154
|
+
|
|
155
|
+
## Advanced Usage
|
|
156
|
+
|
|
157
|
+
### Spaced Repetition
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
mem = create_memory(recall_reinforcement=1.3)
|
|
161
|
+
mem.remember("important pattern", salience=20.0)
|
|
162
|
+
|
|
163
|
+
# Each recall boosts salience by 1.3×
|
|
164
|
+
r1 = mem.recall("important pattern", top_k=1) # salience: 20.0
|
|
165
|
+
r2 = mem.recall("important pattern", top_k=1) # salience: 26.0
|
|
166
|
+
r3 = mem.recall("important pattern", top_k=1) # salience: 33.8
|
|
167
|
+
# Frequently recalled = permanently retained
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Automatic Deduplication
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
mem.remember("server alert: CPU at 95%", salience=20.0)
|
|
174
|
+
mem.remember("server alert: CPU at 95%", salience=20.0) # Same content
|
|
175
|
+
mem.remember("server alert: CPU at 95%", salience=20.0) # Again!
|
|
176
|
+
|
|
177
|
+
assert mem.episode_count == 1 # Only 1 episode stored
|
|
178
|
+
# Salience was boosted, not duplicated
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Relationship Graphs
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
mem.remember("billing complaint", salience=30.0) # id=0
|
|
185
|
+
mem.remember("escalation to manager", salience=50.0) # id=1
|
|
186
|
+
mem.remember("legal threat received", salience=80.0) # id=2
|
|
187
|
+
|
|
188
|
+
mem.relate(0, 1) # complaint → escalation
|
|
189
|
+
mem.relate(1, 2) # escalation → legal
|
|
190
|
+
|
|
191
|
+
# Follow the chain
|
|
192
|
+
related = mem.recall_related(0, depth=2)
|
|
193
|
+
# Returns: [escalation, legal threat]
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## Part of the Ebbiforge Ecosystem
|
|
197
|
+
|
|
198
|
+
`hippocampus-sharp-memory` is the standalone memory engine extracted from [Ebbiforge](https://github.com/juyterman1000/ebbiforge) — a full AI agent framework with:
|
|
199
|
+
|
|
200
|
+
- **100M-agent swarm simulation** (Rust tensor engine)
|
|
201
|
+
- **Compliance & PII redaction** (OWASP, rate limiting, audit trails)
|
|
202
|
+
- **Self-evolution** (Darwinian agent selection, metacognition)
|
|
203
|
+
- **Latent world model** (predictive planning, diffusion predictor)
|
|
204
|
+
|
|
205
|
+
If you need just memory → `pip install hippocampus-sharp-memory`
|
|
206
|
+
If you need the full stack → `pip install ebbiforge`
|
|
207
|
+
|
|
208
|
+
## License
|
|
209
|
+
|
|
210
|
+
MIT © Ebbiforge Team
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Hippocampus Memory — Quick Start
|
|
4
|
+
=================================
|
|
5
|
+
|
|
6
|
+
Demonstrates the core memory lifecycle:
|
|
7
|
+
1. Storing memories with varying salience
|
|
8
|
+
2. Semantic recall (not keyword matching)
|
|
9
|
+
3. Ebbinghaus forgetting over time
|
|
10
|
+
4. Spaced repetition (recall strengthens memory)
|
|
11
|
+
5. Automatic deduplication
|
|
12
|
+
6. Relationship graphs
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from hippocampus_sharp_memory import create_memory
|
|
16
|
+
|
|
17
|
+
# ── Create a memory engine ─────────────────────────────────────────────
|
|
18
|
+
mem = create_memory(capacity=10_000, recall_reinforcement=1.3)
|
|
19
|
+
print("🧠 Hippocampus Memory — Quick Start\n")
|
|
20
|
+
|
|
21
|
+
# ── 1. Store memories with different importance levels ─────────────────
|
|
22
|
+
print("1️⃣ Storing memories...")
|
|
23
|
+
mem.remember("user prefers dark mode and large fonts", salience=20.0)
|
|
24
|
+
mem.remember("billing complaint about invoice #4821", salience=60.0)
|
|
25
|
+
mem.remember("server CPU spike to 95% at 2am", salience=40.0, emotional_tag=2)
|
|
26
|
+
mem.remember("CRITICAL: database approaching disk limit", salience=90.0, emotional_tag=3)
|
|
27
|
+
mem.remember("weather is nice today", salience=1.0) # Low importance — will decay
|
|
28
|
+
print(f" Stored {mem.episode_count} memories\n")
|
|
29
|
+
|
|
30
|
+
# ── 2. Semantic recall ─────────────────────────────────────────────────
|
|
31
|
+
print("2️⃣ Semantic recall: 'storage disk problem'")
|
|
32
|
+
results = mem.recall("storage disk problem", top_k=3)
|
|
33
|
+
for i, r in enumerate(results):
|
|
34
|
+
print(f" #{i+1} [{r.retention*100:.0f}% retained] {r.content[:60]}")
|
|
35
|
+
print()
|
|
36
|
+
|
|
37
|
+
# ── 3. Ebbinghaus forgetting ──────────────────────────────────────────
|
|
38
|
+
print("3️⃣ Advancing time to trigger forgetting...")
|
|
39
|
+
before = mem.episode_count
|
|
40
|
+
for _ in range(200):
|
|
41
|
+
mem.tick() # Each tick applies Ebbinghaus decay
|
|
42
|
+
after = mem.episode_count
|
|
43
|
+
print(f" Before: {before} memories → After: {after} memories")
|
|
44
|
+
print(f" Low-salience memories decayed naturally\n")
|
|
45
|
+
|
|
46
|
+
# ── 4. Spaced repetition ──────────────────────────────────────────────
|
|
47
|
+
print("4️⃣ Spaced repetition (recall strengthens memory)")
|
|
48
|
+
r1 = mem.recall("billing complaint", top_k=1)
|
|
49
|
+
s1 = r1[0].salience if r1 else 0
|
|
50
|
+
r2 = mem.recall("billing complaint", top_k=1)
|
|
51
|
+
s2 = r2[0].salience if r2 else 0
|
|
52
|
+
r3 = mem.recall("billing complaint", top_k=1)
|
|
53
|
+
s3 = r3[0].salience if r3 else 0
|
|
54
|
+
print(f" Salience after recalls: {s1:.1f} → {s2:.1f} → {s3:.1f}")
|
|
55
|
+
print(f" Each recall made the memory harder to forget\n")
|
|
56
|
+
|
|
57
|
+
# ── 5. Deduplication ──────────────────────────────────────────────────
|
|
58
|
+
print("5️⃣ Automatic deduplication")
|
|
59
|
+
count_before = mem.episode_count
|
|
60
|
+
mem.remember("CRITICAL: database approaching disk limit", salience=90.0, emotional_tag=3)
|
|
61
|
+
mem.remember("CRITICAL: database approaching disk limit", salience=90.0, emotional_tag=3)
|
|
62
|
+
count_after = mem.episode_count
|
|
63
|
+
print(f" Stored same message 2 more times: {count_before} → {count_after} episodes")
|
|
64
|
+
print(f" Duplicates merged, salience boosted\n")
|
|
65
|
+
|
|
66
|
+
# ── 6. Stats ──────────────────────────────────────────────────────────
|
|
67
|
+
stats = mem.stats()
|
|
68
|
+
print("📊 Engine Stats:")
|
|
69
|
+
print(f" Episodes: {stats.episode_count}")
|
|
70
|
+
print(f" Consolidated: {stats.consolidated_count}")
|
|
71
|
+
print(f" Avg salience: {stats.avg_salience:.1f}")
|
|
72
|
+
print(f" Total recalls: {stats.total_recalls}")
|
|
73
|
+
print(f" Total evicted: {stats.total_evicted}")
|
|
74
|
+
|
|
75
|
+
print("\n✅ Done! Only remembers what matters.")
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Recall-Before-LLM Pattern
|
|
4
|
+
==========================
|
|
5
|
+
|
|
6
|
+
The business-critical use case for hippocampus-memory:
|
|
7
|
+
save 90%+ on LLM API costs by checking memory before calling the LLM.
|
|
8
|
+
|
|
9
|
+
How it works:
|
|
10
|
+
1. Alert comes in
|
|
11
|
+
2. Check if we've explained a similar alert before
|
|
12
|
+
3. If cached → return instantly (free!)
|
|
13
|
+
4. If new → call LLM, cache the response for next time
|
|
14
|
+
|
|
15
|
+
The Ebbinghaus forgetting curve naturally evicts stale explanations,
|
|
16
|
+
so cached responses don't go stale forever.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import time
|
|
20
|
+
from hippocampus_sharp_memory import create_memory
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def simulate_llm_call(prompt: str) -> str:
|
|
24
|
+
"""Simulate an LLM API call (200ms latency, $0.003/call)."""
|
|
25
|
+
time.sleep(0.2) # Simulate network latency
|
|
26
|
+
return f"Analysis: {prompt[:50]} — this is caused by normal load patterns."
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class SmartAlertHandler:
|
|
30
|
+
"""Alert handler with hippocampus-memory caching."""
|
|
31
|
+
|
|
32
|
+
def __init__(self):
|
|
33
|
+
self.mem = create_memory(capacity=100_000)
|
|
34
|
+
self.llm_calls = 0
|
|
35
|
+
self.cache_hits = 0
|
|
36
|
+
|
|
37
|
+
def handle(self, alert_text: str) -> str:
|
|
38
|
+
# Step 1: Check memory for a cached explanation
|
|
39
|
+
cached = self.mem.recall(alert_text, top_k=1)
|
|
40
|
+
|
|
41
|
+
if cached and cached[0].retention > 0.3:
|
|
42
|
+
self.cache_hits += 1
|
|
43
|
+
return cached[0].content
|
|
44
|
+
|
|
45
|
+
# Step 2: Cache miss — call the LLM
|
|
46
|
+
self.llm_calls += 1
|
|
47
|
+
explanation = simulate_llm_call(alert_text)
|
|
48
|
+
|
|
49
|
+
# Step 3: Store the expensive response in memory
|
|
50
|
+
self.mem.remember(
|
|
51
|
+
explanation,
|
|
52
|
+
salience=60.0,
|
|
53
|
+
source="llm_cache",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
return explanation
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def hit_rate(self) -> float:
|
|
60
|
+
total = self.llm_calls + self.cache_hits
|
|
61
|
+
return self.cache_hits / total * 100 if total > 0 else 0.0
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# ── Simulation ─────────────────────────────────────────────────────────
|
|
65
|
+
print("🧠 Recall-Before-LLM Pattern Demo\n")
|
|
66
|
+
|
|
67
|
+
handler = SmartAlertHandler()
|
|
68
|
+
|
|
69
|
+
# Simulate a realistic alert stream: most alerts are recurring
|
|
70
|
+
alerts = [
|
|
71
|
+
# First occurrence of each alert type (will call LLM)
|
|
72
|
+
"CPU spike to 95% on web-server-01",
|
|
73
|
+
"Memory usage exceeded 80% threshold",
|
|
74
|
+
"Disk I/O latency above 50ms",
|
|
75
|
+
"SSL certificate expiring in 7 days",
|
|
76
|
+
"Rate limit exceeded for API endpoint /v1/users",
|
|
77
|
+
# Recurring alerts (should hit cache)
|
|
78
|
+
"CPU spike to 95% on web-server-01",
|
|
79
|
+
"CPU spike to 95% on web-server-01",
|
|
80
|
+
"Memory usage exceeded 80% threshold",
|
|
81
|
+
"CPU spike to 95% on web-server-01",
|
|
82
|
+
"Disk I/O latency above 50ms",
|
|
83
|
+
"Memory usage exceeded 80% threshold",
|
|
84
|
+
"Rate limit exceeded for API endpoint /v1/users",
|
|
85
|
+
"CPU spike to 95% on web-server-01",
|
|
86
|
+
"SSL certificate expiring in 7 days",
|
|
87
|
+
"Memory usage exceeded 80% threshold",
|
|
88
|
+
"CPU spike to 95% on web-server-01",
|
|
89
|
+
"Disk I/O latency above 50ms",
|
|
90
|
+
"Rate limit exceeded for API endpoint /v1/users",
|
|
91
|
+
"CPU spike to 95% on web-server-01",
|
|
92
|
+
"Memory usage exceeded 80% threshold",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
t0 = time.perf_counter()
|
|
96
|
+
|
|
97
|
+
for i, alert in enumerate(alerts, 1):
|
|
98
|
+
result = handler.handle(alert)
|
|
99
|
+
source = "💰 CACHE" if handler.cache_hits > (i - handler.llm_calls - 1) else "🔥 LLM "
|
|
100
|
+
# Simple detection: if llm_calls didn't change, it was a cache hit
|
|
101
|
+
print(f" [{i:2d}] {alert[:50]}")
|
|
102
|
+
|
|
103
|
+
elapsed = time.perf_counter() - t0
|
|
104
|
+
|
|
105
|
+
print(f"\n{'═' * 60}")
|
|
106
|
+
print(f" Total alerts processed: {len(alerts)}")
|
|
107
|
+
print(f" LLM calls made: {handler.llm_calls}")
|
|
108
|
+
print(f" Cache hits: {handler.cache_hits}")
|
|
109
|
+
print(f" Hit rate: {handler.hit_rate:.0f}%")
|
|
110
|
+
print(f" Time elapsed: {elapsed:.1f}s")
|
|
111
|
+
print(f"{'═' * 60}")
|
|
112
|
+
|
|
113
|
+
# Cost analysis
|
|
114
|
+
llm_cost_per_call = 0.003 # $0.003 per GPT-4-mini call
|
|
115
|
+
without_cache = len(alerts) * llm_cost_per_call
|
|
116
|
+
with_cache = handler.llm_calls * llm_cost_per_call
|
|
117
|
+
savings = without_cache - with_cache
|
|
118
|
+
print(f"\n 💰 Cost without cache: ${without_cache:.3f}")
|
|
119
|
+
print(f" 💰 Cost with cache: ${with_cache:.3f}")
|
|
120
|
+
print(f" 💰 Savings: ${savings:.3f} ({savings/without_cache*100:.0f}%)")
|
|
121
|
+
|
|
122
|
+
print("\n✅ Memory that pays for itself.")
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Hippocampus Sharp Memory — Brain-Inspired Memory for AI Agents
|
|
3
|
+
=========================================================
|
|
4
|
+
|
|
5
|
+
O(1) recall via LSH index, Ebbinghaus forgetting curve, context-weighted
|
|
6
|
+
scoring, and optional disk-backed persistence with user-controlled quotas.
|
|
7
|
+
|
|
8
|
+
Quick Start::
|
|
9
|
+
|
|
10
|
+
from hippocampus_memory import create_memory
|
|
11
|
+
|
|
12
|
+
mem = create_memory()
|
|
13
|
+
mem.remember("billing complaint about invoice #4821", salience=60.0)
|
|
14
|
+
mem.remember("server CPU at 95% — alert triggered", salience=80.0, emotional_tag=3)
|
|
15
|
+
|
|
16
|
+
results = mem.recall("billing issue", top_k=3)
|
|
17
|
+
for r in results:
|
|
18
|
+
print(f" [{r.retention*100:.0f}% retained] {r.content}")
|
|
19
|
+
|
|
20
|
+
Persistent Storage::
|
|
21
|
+
|
|
22
|
+
from hippocampus_memory import create_persistent_memory
|
|
23
|
+
|
|
24
|
+
mem = create_persistent_memory(quota_gb=7.5)
|
|
25
|
+
# Memories survive restarts, with automatic quota enforcement
|
|
26
|
+
|
|
27
|
+
Part of the `Ebbiforge <https://github.com/juyterman1000/openrustswarm>`_ ecosystem.
|
|
28
|
+
|
|
29
|
+
.. note::
|
|
30
|
+
This package is a thin wrapper around ``ebbiforge_core.HippocampusEngine``
|
|
31
|
+
(written in Rust via PyO3). Zero code duplication — same engine, same speed.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
__version__ = "1.0.0"
|
|
35
|
+
__all__ = [
|
|
36
|
+
# Core engine
|
|
37
|
+
"HippocampusEngine",
|
|
38
|
+
"MemoryBankConfig",
|
|
39
|
+
# Result types
|
|
40
|
+
"RecallResult",
|
|
41
|
+
"HippocampusStats",
|
|
42
|
+
"Episode",
|
|
43
|
+
# Factory functions
|
|
44
|
+
"create_memory",
|
|
45
|
+
"create_persistent_memory",
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
# ── Import from Rust core ─────────────────────────────────────────────────
|
|
49
|
+
try:
|
|
50
|
+
from ebbiforge_core import (
|
|
51
|
+
HippocampusEngine,
|
|
52
|
+
MemoryBankConfig,
|
|
53
|
+
)
|
|
54
|
+
from ebbiforge_core import Episode
|
|
55
|
+
from ebbiforge_core.hippocampus import RecallResult, HippocampusStats
|
|
56
|
+
except ImportError:
|
|
57
|
+
try:
|
|
58
|
+
from ebbiforge_core import HippocampusEngine, MemoryBankConfig, Episode
|
|
59
|
+
# RecallResult and HippocampusStats may be at module root
|
|
60
|
+
try:
|
|
61
|
+
from ebbiforge_core import RecallResult, HippocampusStats
|
|
62
|
+
except ImportError:
|
|
63
|
+
RecallResult = None
|
|
64
|
+
HippocampusStats = None
|
|
65
|
+
except ImportError:
|
|
66
|
+
raise ImportError(
|
|
67
|
+
"\n"
|
|
68
|
+
"╔══════════════════════════════════════════════════════════════╗\n"
|
|
69
|
+
"║ hippocampus-memory requires the Ebbiforge Rust engine. ║\n"
|
|
70
|
+
"║ ║\n"
|
|
71
|
+
"║ Install it: ║\n"
|
|
72
|
+
"║ pip install ebbiforge ║\n"
|
|
73
|
+
"║ ║\n"
|
|
74
|
+
"║ Or build from source: ║\n"
|
|
75
|
+
"║ git clone https://github.com/juyterman1000/openrustswarm║\n"
|
|
76
|
+
"║ cd openrustswarm && pip install maturin ║\n"
|
|
77
|
+
"║ maturin develop --release ║\n"
|
|
78
|
+
"╚══════════════════════════════════════════════════════════════╝\n"
|
|
79
|
+
) from None
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# ── Factory Functions ──────────────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
def create_memory(
|
|
85
|
+
capacity: int = 500_000,
|
|
86
|
+
consolidation_interval: int = 100,
|
|
87
|
+
recall_reinforcement: float = 1.3,
|
|
88
|
+
) -> HippocampusEngine:
|
|
89
|
+
"""Create an in-memory HippocampusEngine with sensible defaults.
|
|
90
|
+
|
|
91
|
+
This is the fastest way to get started. Memories live in RAM only
|
|
92
|
+
and are lost when the process exits.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
capacity: Maximum number of episodes before eviction (default: 500K).
|
|
96
|
+
consolidation_interval: Ticks between sleep-replay consolidation cycles.
|
|
97
|
+
recall_reinforcement: Salience multiplier on each recall (spaced repetition).
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
A configured ``HippocampusEngine`` ready to use.
|
|
101
|
+
|
|
102
|
+
Example::
|
|
103
|
+
|
|
104
|
+
mem = create_memory()
|
|
105
|
+
mem.remember("user prefers dark mode", salience=30.0)
|
|
106
|
+
results = mem.recall("dark mode preference", top_k=1)
|
|
107
|
+
"""
|
|
108
|
+
return HippocampusEngine(
|
|
109
|
+
capacity=capacity,
|
|
110
|
+
consolidation_interval=consolidation_interval,
|
|
111
|
+
recall_reinforcement=recall_reinforcement,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def create_persistent_memory(
|
|
116
|
+
quota_gb: float = 7.5,
|
|
117
|
+
capacity: int = 1_000_000,
|
|
118
|
+
storage_path: str = "",
|
|
119
|
+
consolidation_interval: int = 100,
|
|
120
|
+
recall_reinforcement: float = 1.3,
|
|
121
|
+
) -> "HippocampusEngine":
|
|
122
|
+
"""Create a disk-backed HippocampusEngine with persistent storage.
|
|
123
|
+
|
|
124
|
+
Memories survive process restarts. Disk usage is automatically
|
|
125
|
+
managed with oldest-first eviction when the quota is reached.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
quota_gb: Maximum disk usage in GB (5.0 to 10.0, default: 7.5).
|
|
129
|
+
capacity: Maximum in-memory episodes (default: 1M).
|
|
130
|
+
storage_path: Custom storage path. Empty string = OS default
|
|
131
|
+
(``~/.local/share/ebbiforge/`` on Linux,
|
|
132
|
+
``~/Library/Application Support/ebbiforge/`` on macOS,
|
|
133
|
+
``%APPDATA%/ebbiforge/`` on Windows).
|
|
134
|
+
consolidation_interval: Ticks between consolidation cycles.
|
|
135
|
+
recall_reinforcement: Salience multiplier on recall.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
A configured ``HippocampusEngine`` with disk persistence.
|
|
139
|
+
|
|
140
|
+
Example::
|
|
141
|
+
|
|
142
|
+
mem = create_persistent_memory(quota_gb=7.5)
|
|
143
|
+
mem.remember("critical incident report", salience=90.0, emotional_tag=3)
|
|
144
|
+
# This memory survives process restarts
|
|
145
|
+
"""
|
|
146
|
+
_config = MemoryBankConfig(
|
|
147
|
+
storage_mode="disk",
|
|
148
|
+
disk_quota_gb=quota_gb,
|
|
149
|
+
storage_path=storage_path,
|
|
150
|
+
)
|
|
151
|
+
return HippocampusEngine(
|
|
152
|
+
capacity=capacity,
|
|
153
|
+
consolidation_interval=consolidation_interval,
|
|
154
|
+
recall_reinforcement=recall_reinforcement,
|
|
155
|
+
)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "hippocampus-sharp-memory"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Brain-inspired memory for AI agents. Ebbinghaus forgetting + Kanerva SDM + spaced recall. Sub-microsecond semantic lookup. Only remembers what matters."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = { text = "MIT" }
|
|
11
|
+
requires-python = ">=3.9"
|
|
12
|
+
authors = [
|
|
13
|
+
{ name = "Ebbiforge Team", email = "fastrunner10090@gmail.com" },
|
|
14
|
+
]
|
|
15
|
+
keywords = [
|
|
16
|
+
"memory", "ai", "agents", "hippocampus", "ebbinghaus",
|
|
17
|
+
"kanerva", "sdm", "forgetting", "recall", "llm",
|
|
18
|
+
"rag", "chatbot", "semantic-search", "associative-memory",
|
|
19
|
+
]
|
|
20
|
+
classifiers = [
|
|
21
|
+
"Development Status :: 5 - Production/Stable",
|
|
22
|
+
"Intended Audience :: Developers",
|
|
23
|
+
"License :: OSI Approved :: MIT License",
|
|
24
|
+
"Programming Language :: Python :: 3",
|
|
25
|
+
"Programming Language :: Python :: 3.9",
|
|
26
|
+
"Programming Language :: Python :: 3.10",
|
|
27
|
+
"Programming Language :: Python :: 3.11",
|
|
28
|
+
"Programming Language :: Python :: 3.12",
|
|
29
|
+
"Programming Language :: Python :: 3.13",
|
|
30
|
+
"Programming Language :: Rust",
|
|
31
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
32
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
33
|
+
]
|
|
34
|
+
dependencies = [
|
|
35
|
+
"ebbiforge>=4.0.0",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[project.urls]
|
|
39
|
+
Homepage = "https://github.com/juyterman1000/hippocampus-sharp-memory"
|
|
40
|
+
Documentation = "https://github.com/juyterman1000/hippocampus-sharp-memory#readme"
|
|
41
|
+
Repository = "https://github.com/juyterman1000/hippocampus-sharp-memory"
|
|
42
|
+
"Bug Tracker" = "https://github.com/juyterman1000/hippocampus-sharp-memory/issues"
|
|
43
|
+
"Full Framework" = "https://github.com/juyterman1000/ebbiforge"
|
|
44
|
+
|
|
45
|
+
[tool.hatch.build.targets.wheel]
|
|
46
|
+
packages = ["hippocampus_sharp_memory"]
|