Skip to content

Step 5: Memory — SQLite persistence, embeddings, hybrid retrieval, summarization #4

Description

@hackertron

Context

Steps 1-4 are complete (types, config, providers, tools, runtime). The agent can think and act but forgets everything when it stops. Step 5 adds persistent memory.

Scope

SQLite schema + migrations

  • Sessions table (id, name, created_at, updated_at, archived)
  • Conversation events table (session_id, role, content, tool_calls, created_at)
  • Memory chunks table (id, content, source, tags, embedding blob, created_at)
  • FTS5 virtual table on chunks
  • Session state table (summary, summary_epoch, scratchpad)
  • Schema version tracking

Embedding backends

  • EmbeddingBackend interface implementation
  • OpenAI embeddings (text-embedding-3-small)
  • Ollama embeddings (local, free — nomic-embed-text)
  • Configured via memory.embedding_backend in config

Hybrid retrieval pipeline

  • Vector search via sqlite-vec (cosine similarity)
  • FTS5 search (BM25 scoring)
  • Normalize scores (min-max within each result set)
  • Weighted merge (configurable vector_weight + fts_weight)
  • Return top_k results

Rolling summarization

  • Detect when context budget is approaching limit (chars/4 estimate already in runtime)
  • Summarize unsummarized messages since last epoch
  • Call provider with summarization prompt
  • Update session state with new summary + epoch
  • Replace old messages with summary in context

Memory tools

  • memory_search (ReadOnly) — search persistent memory
  • memory_save (SideEffecting) — save information to memory

Conversation persistence

  • Store conversation events as they happen
  • Load conversation history when resuming a session
  • Session create/get/list/update/archive via SessionStore interface

Scratchpad

  • Per-session key-value scratchpad for agent working notes
  • Persisted in session_state table

Interfaces already defined

  • internal/types/memory.goMemory, MemoryRetrieval, EmbeddingBackend
  • internal/types/session.goSessionStore, SessionRecord

Files to create

internal/memory/
├── sqlite.go          # SQLiteMemory implementing MemoryRetrieval
├── schema.go          # DDL + migrations
├── embedding_openai.go
├── embedding_ollama.go
├── hybrid.go          # Hybrid retrieval pipeline
├── summarizer.go      # Rolling summarization
└── memory_test.go

internal/tool/
├── memory_search.go   # memory_search tool
└── memory_save.go     # memory_save tool

Dependencies

  • modernc.org/sqlite (pure Go SQLite)
  • github.com/nicholasgasior/govec or similar for sqlite-vec

Not included

  • Multi-user isolation
  • Audit logging
  • Cost tracking per memory operation

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions