packages/rag/src/tools/README.md
The createVectorQueryTool function now supports database-specific configurations to handle unique properties and optimizations for different vector databases.
import { createVectorQueryTool } from '@mastra/rag/tools';
const pineconeVectorTool = createVectorQueryTool({
id: 'pinecone-search',
indexName: 'my-index',
vectorStoreName: 'pinecone',
model: embedModel,
databaseConfig: {
pinecone: {
namespace: 'my-namespace', // Pinecone namespace
sparseVector: {
// For hybrid search
indices: [0, 1, 2],
values: [0.1, 0.2, 0.3],
},
},
},
});
const pgVectorTool = createVectorQueryTool({
id: 'pgvector-search',
indexName: 'my-index',
vectorStoreName: 'postgres',
model: embedModel,
databaseConfig: {
pgvector: {
minScore: 0.7, // Minimum similarity score
ef: 200, // HNSW search parameter
probes: 10, // IVFFlat probe parameter
},
},
});
const chromaTool = createVectorQueryTool({
id: 'chroma-search',
indexName: 'my-index',
vectorStoreName: 'chroma',
model: embedModel,
databaseConfig: {
chroma: {
where: {
// Metadata filtering
category: 'documents',
},
whereDocument: {
// Document content filtering
$contains: 'important',
},
},
},
});
You can also override database configurations at runtime using the runtime context:
import { RequestContext } from '@mastra/core/runtime-context';
const requestContext = new RequestContext();
// Override Pinecone namespace at runtime
requestContext.set('databaseConfig', {
pinecone: {
namespace: 'runtime-namespace',
},
});
await vectorTool.execute({
context: { queryText: 'search query' },
mastra,
requestContext,
});
The system is designed to be extensible. For new vector databases, you can:
export interface NewDatabaseConfig {
customParam1?: string;
customParam2?: number;
}
export type DatabaseConfig = {
pinecone?: PineconeConfig;
pgvector?: PgVectorConfig;
chroma?: ChromaConfig;
newdatabase?: NewDatabaseConfig; // Add your config here
[key: string]: any;
};
All database configurations are fully typed, providing IntelliSense and compile-time checking:
const config: DatabaseConfig = {
pinecone: {
namespace: 'valid-namespace',
sparseVector: {
indices: [1, 2, 3],
values: [0.1, 0.2, 0.3],
},
},
pgvector: {
minScore: 0.8,
ef: 100,
probes: 5,
},
};
For multi-tenant applications where each tenant has isolated data (e.g., separate PostgreSQL schemas), you can pass a resolver function instead of a static vector store:
import { createVectorQueryTool, VectorStoreResolver } from '@mastra/rag/tools';
import { PgVector } from '@mastra/pg';
// Resolver function receives requestContext and mastra instance
const vectorStoreResolver: VectorStoreResolver = async ({ requestContext }) => {
const tenantId = requestContext?.get('tenantId');
return new PgVector({
id: `pg-vector-${tenantId}`,
connectionString: process.env.POSTGRES_CONNECTION_STRING!,
schemaName: `tenant_${tenantId}`, // Each tenant has their own schema
});
};
const vectorQueryTool = createVectorQueryTool({
indexName: 'embeddings',
model: embedModel,
vectorStore: vectorStoreResolver, // Dynamic resolution!
});
// Usage with tenant context
const requestContext = new RequestContext();
requestContext.set('tenantId', 'acme-corp');
const result = await vectorQueryTool.execute({ queryText: 'search query', topK: 5 }, { requestContext });
The same pattern works with createGraphRAGTool:
import { createGraphRAGTool } from '@mastra/rag/tools';
const graphTool = createGraphRAGTool({
indexName: 'embeddings',
model: embedModel,
vectorStore: vectorStoreResolver,
});
Existing code will continue to work without changes. To add database-specific configurations:
const vectorTool = createVectorQueryTool({
indexName: 'my-index',
vectorStoreName: 'pinecone',
model: embedModel,
+ databaseConfig: {
+ pinecone: {
+ namespace: 'my-namespace'
+ }
+ }
});