SQLite-backed memory.MemoryStore for
github.com/go-kratos/blades.
The store is designed for local agent runtimes and Agent Layouts:
- persists Blades memories to a single SQLite database file
- persists session history with
SaveSession - uses SQLite FTS5 for text search when available
- falls back to case-insensitive
LIKEsearch when FTS5 is disabled or unavailable - uses the cgo-free
modernc.org/sqlitedriver - implements
memory.MemoryStore
go get github.com/terminus-io/blades-sqlitepackage main
import (
"context"
sqlitememory "github.com/terminus-io/blades-sqlite"
"github.com/go-kratos/blades"
"github.com/go-kratos/blades/memory"
)
func main() {
ctx := context.Background()
store, err := sqlitememory.Open("agent-memory.db")
if err != nil {
panic(err)
}
defer store.Close()
if err := store.AddMemory(ctx, &memory.Memory{
Content: blades.UserMessage("The user prefers concise Chinese answers."),
Metadata: map[string]any{
"memory_type": "preference",
},
}); err != nil {
panic(err)
}
results, err := store.SearchMemory(ctx, "Chinese answers")
if err != nil {
panic(err)
}
_ = results
session := blades.NewSession()
_ = session.Append(ctx, blades.UserMessage("Remember this session message."))
if err := store.SaveSession(ctx, session); err != nil {
panic(err)
}
}To expose memory search as a Blades tool:
memoryTool, err := memory.NewMemoryTool(store)
if err != nil {
panic(err)
}store, err := sqlitememory.Open(
"agent-memory.db",
sqlitememory.WithLimit(5),
sqlitememory.WithFTS(true),
)WithFTS(true) is the default. If SQLite FTS5 initialization fails, the store
continues with LIKE search.
The current Blades memory API stores:
type MemoryStore interface {
AddMemory(context.Context, *memory.Memory) error
SaveSession(context.Context, blades.Session) error
SearchMemory(context.Context, string) ([]*memory.Memory, error)
}Blades messages contain interface-typed parts, so this store persists the
searchable text from Content.Text() plus message role, author, status,
message metadata, and memory metadata. Search results reconstruct a text
message with those fields.
SaveSession stores each non-empty text message from session.History(ctx) as
a memory with metadata:
session_id
message_index
memory_type=session_message
Saving the same session repeatedly updates existing rows for the same
session_id and message id instead of duplicating them.
go test ./...