@galdor/memory-s3vectors
v0.3.1
Published
Amazon S3 Vectors long-term memory store for galdor-bun, implementing the core memory.Store interface.
Readme
@galdor/memory-s3vectors
An Amazon S3 Vectors
long-term memory store for galdor. It implements the core memory.Store
interface, so it drops in behind a Retriever exactly like the bundled
InMemoryStore — but persists vectors in an S3 Vectors index.
Credentials
Resolved by the AWS SDK's default provider chain (environment variables →
shared ~/.aws config → ECS container credentials → EC2 IMDS / task role). No
static keys are accepted here; configure AWS the standard way.
Usage
import { openS3Vectors } from "@galdor/memory-s3vectors";
import { Retriever } from "@galdor/core/memory";
// Probes the index and creates it if missing.
const store = await openS3Vectors({
bucket: "my-vectors", // an existing S3 Vectors bucket
index: "galdor-chunks", // optional; default "galdor-chunks", created if absent
region: "us-east-1", // optional; default from the AWS chain
dim: 1024, // embedding dimensionality
// distance: "cosine", // optional; default cosine (ignored if the index exists)
});
await store.add([
{ id: "c1", documentId: "d1", index: 0, text: "…", embedding: vec, metadata: { lang: "es" } },
]);
const hits = await store.retrieve({ embedding: queryVec, k: 5, filter: { lang: "es" } });
// hits: Result[] in descending relevance (higher score = more relevant)
await store.delete("d1"); // removes every chunk of document d1
await store.close();Compose it with an embedder via Retriever for text queries:
const retriever = new Retriever({ store, embedder, defaultK: 5 });
const hits = await retriever.retrieve({ text: "capital of Ecuador" });Behavior
- Open — validates
bucket/dim/index name, then probes the index; if missing, creates it asfloat32, the configureddimand distance metric, with__textdeclared non-filterable. - add — upserts each chunk keyed by its
id(idempotent). Stores the embedding plusdocumentId,index,textand any chunk metadata. Rejects empty ids, dimension mismatches, and metadata keys using the reserved__prefix. Batched at 500 vectors per call. - retrieve — top-K nearest by the query embedding;
filteris an exact-match AND over metadata (single key bare, multiple keys via$and). Cosine distance becomes1 - distance(anti-correlated hits dropped); Euclidean becomes1 / (1 + distance). - delete — scans the index and removes every vector whose
documentIdmetadata matches; batched at 500 keys per call. - close — destroys the underlying client.
Notes
- Vector-only:
retrieverequiresquery.embedding. - The metadata keys
__document_id,__index,__textare reserved.
