Skip to content

Commit 487f6e6

Browse files
kosmoliclaude
andcommitted
Week 11: Archival Memory Implementation
Implemented long-term memory storage with embedding generation, text-based search, and comprehensive archival memory management for Project O. Features: - Archival memory manager with LLM embedding support - Entry creation with importance scores and tags - Text-based search with importance sorting - Tag-based and importance-based search - Pagination for large result sets - Entry update and deletion operations - Embedding generation (single and batch) - Export/Import (JSON and text formats) - Comprehensive statistics and caching - Full test suite (400+ lines) - Updated documentation with examples Files: - gerbil/memory/archival.ss (650 lines) - Archival memory operations - gerbil/memory/archival-test.ss (400 lines) - Test suite - gerbil/memory/README.md (updated) - Documentation Phase 4 (Advanced Memory System) - Week 11 complete 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 86dee8d commit 487f6e6

3 files changed

Lines changed: 1371 additions & 0 deletions

File tree

gerbil/memory/README.md

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,171 @@ No installation required - part of Project O's Gerbil codebase.
367367
(core-memory-prepend! core-manager "persona" "Prefix: " separator: " ")
368368
```
369369

370+
### Archival Memory Operations
371+
372+
#### Creating an Archival Manager
373+
374+
```scheme
375+
(import :gerbil/memory/archival
376+
:gerbil/database/client)
377+
378+
;; Connect to database
379+
(db-connect!)
380+
381+
;; Create archival manager with embedding support
382+
(def archival-mgr (make-archival-manager agent-id
383+
llm-provider: :openai
384+
llm-model: "text-embedding-3-small"
385+
cache-enabled: #t))
386+
```
387+
388+
#### Inserting Archival Entries
389+
390+
```scheme
391+
;; Insert entry with embedding generation
392+
(archival-insert! archival-mgr
393+
"User prefers dark mode and technical documentation."
394+
importance: 0.8
395+
tags: '("preferences" "ui")
396+
generate-embedding?: #t)
397+
398+
;; Insert without embedding (faster)
399+
(archival-insert! archival-mgr
400+
"User mentioned liking coffee."
401+
importance: 0.5
402+
tags: '("personal")
403+
generate-embedding?: #f)
404+
405+
;; Insert batch entries
406+
(archival-insert-batch! archival-mgr
407+
(list (hash 'content "Entry 1"
408+
'importance 0.7
409+
'tags '("batch")
410+
'generate_embedding #t)
411+
(hash 'content "Entry 2"
412+
'importance 0.6
413+
'tags '("batch")
414+
'generate_embedding #f)))
415+
```
416+
417+
#### Retrieving Archival Entries
418+
419+
```scheme
420+
;; Get entry by ID
421+
(def entry (archival-get archival-mgr entry-id))
422+
423+
;; Get all entries with pagination
424+
(def all-entries (archival-get-all archival-mgr limit: 100 offset: 0))
425+
426+
;; Get recent entries
427+
(def recent (archival-get-recent archival-mgr 10))
428+
```
429+
430+
#### Searching Archival Memory
431+
432+
```scheme
433+
;; Text-based search
434+
(def results (archival-search archival-mgr "dark mode" limit: 5))
435+
(displayln (format "Found ~a entries" (length results)))
436+
437+
;; Search by tags
438+
(def tagged (archival-search-by-tags archival-mgr '("preferences" "ui") limit: 10))
439+
440+
;; Search by importance threshold
441+
(def important (archival-search-by-importance archival-mgr 0.7 limit: 10))
442+
```
443+
444+
#### Archival Pagination
445+
446+
```scheme
447+
;; Get paginated results
448+
(def page (archival-get-page archival-mgr 0 20))
449+
(displayln (format "Page ~a of ~a total entries"
450+
(archival-page-page page)
451+
(archival-page-total page)))
452+
453+
(displayln (format "Has next: ~a" (archival-page-has-next? page)))
454+
(displayln (format "Has prev: ~a" (archival-page-has-prev? page)))
455+
456+
;; Navigate pages
457+
(when (archival-page-has-next? page)
458+
(def next-page-num (archival-get-next-page page))
459+
(def next-page (archival-get-page archival-mgr next-page-num 20)))
460+
```
461+
462+
#### Updating Archival Entries
463+
464+
```scheme
465+
;; Update entry content
466+
(archival-update! archival-mgr entry-id
467+
(hash 'content "Updated content"
468+
'importance 0.9))
469+
470+
;; Update importance only
471+
(archival-update-importance! archival-mgr entry-id 0.95)
472+
473+
;; Add tags to entry
474+
(archival-add-tags! archival-mgr entry-id '("new-tag" "another-tag"))
475+
```
476+
477+
#### Deleting Archival Entries
478+
479+
```scheme
480+
;; Delete single entry
481+
(archival-delete! archival-mgr entry-id)
482+
483+
;; Delete batch entries
484+
(archival-delete-batch! archival-mgr (list id1 id2 id3))
485+
486+
;; Clear all archival memory
487+
(archival-clear! archival-mgr)
488+
```
489+
490+
#### Archival Statistics
491+
492+
```scheme
493+
;; Count entries
494+
(def count (archival-count archival-mgr))
495+
496+
;; Calculate total size
497+
(def size (archival-total-size archival-mgr))
498+
499+
;; Get comprehensive statistics
500+
(def stats (archival-get-stats archival-mgr))
501+
(displayln (format "Total entries: ~a" (hash-ref stats 'total_entries)))
502+
(displayln (format "Average importance: ~a" (hash-ref stats 'avg_importance)))
503+
(displayln (format "Entries with embeddings: ~a" (hash-ref stats 'entries_with_embeddings)))
504+
(displayln (format "Unique tags: ~a" (hash-ref stats 'unique_tags)))
505+
```
506+
507+
#### Archival Export/Import
508+
509+
```scheme
510+
;; Export to JSON (without embeddings for smaller size)
511+
(def json-export (archival-export archival-mgr
512+
format: 'json
513+
include-embeddings?: #f))
514+
515+
;; Export to text
516+
(def text-export (archival-export archival-mgr format: 'text))
517+
518+
;; Import from exported data
519+
(def export-data (string->json-object json-export))
520+
(archival-import! archival-mgr export-data)
521+
```
522+
523+
#### Embedding Generation
524+
525+
```scheme
526+
;; Generate single embedding
527+
(def embedding (generate-embedding archival-mgr "Text to embed"))
528+
(displayln (format "Embedding dimensions: ~a" (length embedding)))
529+
530+
;; Generate batch embeddings
531+
(def embeddings (generate-embeddings-batch archival-mgr
532+
'("Text 1" "Text 2" "Text 3")))
533+
```
534+
370535
### Searching Memory Blocks
371536

372537
```scheme
@@ -514,6 +679,80 @@ No installation required - part of Project O's Gerbil codebase.
514679
- `(core-memory-clear-block! manager block-label)` - Clear block
515680
- `(core-memory-prepend! manager block-label text #!key ...)` - Prepend text
516681

682+
### Archival Memory Manager
683+
684+
#### Constructor
685+
686+
- `(make-archival-manager agent-id #!key ...)` - Create archival manager
687+
- `llm-provider` - LLM provider for embeddings (default: :openai)
688+
- `llm-model` - Embedding model (default: "text-embedding-3-small")
689+
- `cache-enabled` - Enable caching (default: #t)
690+
691+
#### Entry Creation
692+
693+
- `(archival-insert! manager content #!key ...)` - Insert archival entry
694+
- `importance` - Importance score 0.0-1.0 (default: 0.5)
695+
- `tags` - List of tags (default: empty)
696+
- `generate-embedding?` - Generate embedding (default: #t)
697+
698+
- `(archival-insert-batch! manager entries)` - Insert multiple entries
699+
700+
#### Entry Retrieval
701+
702+
- `(archival-get manager entry-id)` - Get entry by ID
703+
- `(archival-get-all manager #!key (limit 100) (offset 0))` - Get all entries
704+
- `(archival-get-recent manager n)` - Get N recent entries
705+
706+
#### Search Operations
707+
708+
- `(archival-search manager query #!key (limit 10))` - Text-based search
709+
- `(archival-search-by-tags manager tags #!key (limit 10))` - Search by tags
710+
- `(archival-search-by-importance manager min-importance #!key (limit 10))` - Search by importance
711+
712+
#### Pagination
713+
714+
- `(archival-get-page manager page-number page-size)` - Get paginated entries
715+
- `(archival-get-next-page page-result)` - Get next page number
716+
- `(archival-get-prev-page page-result)` - Get previous page number
717+
718+
#### Entry Update
719+
720+
- `(archival-update! manager entry-id updates)` - Update entry
721+
- `(archival-update-importance! manager entry-id importance)` - Update importance
722+
- `(archival-add-tags! manager entry-id new-tags)` - Add tags
723+
724+
#### Entry Deletion
725+
726+
- `(archival-delete! manager entry-id)` - Delete entry
727+
- `(archival-delete-batch! manager entry-ids)` - Delete multiple entries
728+
- `(archival-clear! manager)` - Clear all entries
729+
730+
#### Statistics
731+
732+
- `(archival-count manager)` - Count entries
733+
- `(archival-total-size manager)` - Calculate total size
734+
- `(archival-get-stats manager)` - Get comprehensive statistics
735+
736+
#### Caching
737+
738+
- `(archival-cache-get manager entry-id)` - Get from cache
739+
- `(archival-cache-put! manager entry-id entry)` - Put in cache
740+
- `(archival-cache-invalidate! manager entry-id)` - Invalidate cache
741+
- `(archival-cache-clear! manager)` - Clear cache
742+
743+
#### Export/Import
744+
745+
- `(archival-export manager #!key ...)` - Export archival memory
746+
- `format` - Export format (json or text)
747+
- `include-embeddings?` - Include embeddings (default: #f)
748+
749+
- `(archival-import! manager data)` - Import archival memory
750+
751+
#### Embedding Generation
752+
753+
- `(generate-embedding manager content)` - Generate single embedding
754+
- `(generate-embeddings-batch manager contents)` - Generate batch embeddings
755+
517756
### Block Manager
518757

519758
#### Constructor

0 commit comments

Comments
 (0)