Skip to Content
ReferenceRAGLibSQLVector

LibSQLVector Store

The LibSQL storage implementation provides a SQLite-compatible vector search LibSQL, a fork of SQLite with vector extensions, and Turso with vector extensions, offering a lightweight and efficient vector database solution. It’s part of the @mastra/core package and offers efficient vector similarity search with metadata filtering.

Installation

Default vector store is included in the core package:

npm install @mastra/core

Usage

import { LibSQLVector } from "@mastra/core/vector/libsql"; // Create a new vector store instance const store = new LibSQLVector({ connectionUrl: process.env.DATABASE_URL, // Optional: for Turso cloud databases authToken: process.env.DATABASE_AUTH_TOKEN, }); // Create an index await store.createIndex({ indexName: "myCollection", dimension: 1536, }); // Add vectors with metadata const vectors = [[0.1, 0.2, ...], [0.3, 0.4, ...]]; const metadata = [ { text: "first document", category: "A" }, { text: "second document", category: "B" } ]; await store.upsert({ indexName: "myCollection", vectors, metadata, }); // Query similar vectors const queryVector = [0.1, 0.2, ...]; const results = await store.query({ indexName: "myCollection", queryVector, topK: 10, // top K results filter: { category: "A" } // optional metadata filter });

Constructor Options

connectionUrl:

string
LibSQL database URL. Use ':memory:' for in-memory database, 'file:dbname.db' for local file, or a LibSQL-compatible connection string like 'libsql://your-database.turso.io'.

authToken?:

string
Authentication token for Turso cloud databases

syncUrl?:

string
URL for database replication (Turso specific)

syncInterval?:

number
Interval in milliseconds for database sync (Turso specific)

Methods

createIndex()

Creates a new vector collection. The index name must start with a letter or underscore and can only contain letters, numbers, and underscores. The dimension must be a positive integer.

indexName:

string
Name of the index to create

dimension:

number
Vector dimension size (must match your embedding model)

metric?:

'cosine' | 'euclidean' | 'dotproduct'
= cosine
Distance metric for similarity search. Note: Currently only cosine similarity is supported by LibSQL.

upsert()

Adds or updates vectors and their metadata in the index. Uses a transaction to ensure all vectors are inserted atomically - if any insert fails, the entire operation is rolled back.

indexName:

string
Name of the index to insert into

vectors:

number[][]
Array of embedding vectors

metadata?:

Record<string, any>[]
Metadata for each vector

ids?:

string[]
Optional vector IDs (auto-generated if not provided)

query()

Searches for similar vectors with optional metadata filtering.

indexName:

string
Name of the index to search in

queryVector:

number[]
Query vector to find similar vectors for

topK?:

number
= 10
Number of results to return

filter?:

Filter
Metadata filters

includeVector?:

boolean
= false
Whether to include vector data in results

minScore?:

number
= 0
Minimum similarity score threshold

describeIndex()

Gets information about an index.

indexName:

string
Name of the index to describe

Returns:

interface IndexStats { dimension: number; count: number; metric: "cosine" | "euclidean" | "dotproduct"; }

deleteIndex()

Deletes an index and all its data.

indexName:

string
Name of the index to delete

listIndexes()

Lists all vector indexes in the database.

Returns: Promise<string[]>

truncateIndex()

Removes all vectors from an index while keeping the index structure.

indexName:

string
Name of the index to truncate

updateIndexById()

Updates a specific vector entry by its ID with new vector data and/or metadata.

indexName:

string
Name of the index containing the vector

id:

string
ID of the vector entry to update

update:

object
Update data containing vector and/or metadata

update.vector?:

number[]
New vector data to update

update.metadata?:

Record<string, any>
New metadata to update

deleteIndexById()

Deletes a specific vector entry from an index by its ID.

indexName:

string
Name of the index containing the vector

id:

string
ID of the vector entry to delete

Response Types

Query results are returned in this format:

interface QueryResult { id: string; score: number; metadata: Record<string, any>; vector?: number[]; // Only included if includeVector is true }

Error Handling

The store throws specific errors for different failure cases:

try { await store.query({ indexName: "my-collection", queryVector: queryVector, }); } catch (error) { // Handle specific error cases if (error.message.includes("Invalid index name format")) { console.error( "Index name must start with a letter/underscore and contain only alphanumeric characters", ); } else if (error.message.includes("Table not found")) { console.error("The specified index does not exist"); } else { console.error("Vector store error:", error.message); } }

Common error cases include:

  • Invalid index name format
  • Invalid vector dimensions
  • Table/index not found
  • Database connection issues
  • Transaction failures during upsert