@galdor/memory-sqlite
v0.3.1
Published
Embedded SQLite long-term memory store for galdor-bun: FTS5 lexical (BM25) + brute-force cosine vector search.
Readme
@galdor/memory-sqlite
An embedded SQLite long-term memory store for
galdor. Implements the core
memory.Store interface, so it drops in behind a Retriever like the bundled
InMemoryStore — but persists chunks in a local SQLite file with FTS5 lexical
(BM25) search and brute-force cosine vector search.
Zero external services: it runs on the runtime's built-in SQLite (bun:sqlite
on Bun, node:sqlite on Node ≥ 22.5).
Install
bun add @galdor/memory-sqlite # or: npm install @galdor/memory-sqliteUsage
import { openSqlite } from "@galdor/memory-sqlite";
const store = openSqlite("memory.db"); // or ":memory:" for a transient store
await store.add([
{ id: "c1", documentId: "d1", index: 0, text: "Quito is the capital of Ecuador.", embedding: vec, metadata: { lang: "en" } },
]);
// Vector search
const byVector = await store.retrieve({ embedding: queryVec, k: 5, filter: { lang: "en" } });
// Lexical (FTS5 BM25) search
const byText = await store.retrieve({ text: "capital of Ecuador", k: 5 });
await store.delete("d1"); // removes every chunk of document d1
store.close();Compose it with an embedder via Retriever for text-only queries backed by
vector search:
import { Retriever } from "@galdor/core/memory";
const retriever = new Retriever({ store, embedder, defaultK: 5 });
const hits = await retriever.retrieve({ text: "capital of Ecuador" });Behavior
- add upserts by chunk
id(idempotent), storingdocumentId/index/text- metadata. Rejects empty ids and vector-dimension mismatches.
- retrieve supports either a
textquery (FTS5 BM25) or anembeddingquery (cosine over stored vectors);filteris an exact-match AND over metadata. - delete removes every chunk whose
documentIdmatches.
License
Apache-2.0
