@mastra/core
Version:
1 lines • 15.6 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","names":["MastraBase","MastraError","ErrorDomain","ErrorCategory","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory"],"sources":["../../src/vector/vector.ts","../../src/vector/validation.ts"],"sourcesContent":["import type {\n EmbeddingModel as EmbeddingModelV1,\n ProviderOptions as ProviderOptionsV1,\n TelemetrySettings as TelemetrySettingsV1,\n} from '@internal/ai-sdk-v4';\nimport type {\n EmbeddingModel,\n TelemetrySettings as TelemetrySettingsV5,\n ProviderOptions as ProviderOptionsV5,\n} from '@internal/ai-sdk-v5';\n\ntype EmbeddingModelV2<T> = Exclude<EmbeddingModel<T>, string>;\nimport type {\n EmbeddingModelV3,\n TelemetrySettings as TelemetrySettingsV6,\n ProviderOptions as ProviderOptionsV6,\n} from '@internal/ai-v6';\nimport { MastraBase } from '../base';\nimport { MastraError, ErrorDomain, ErrorCategory } from '../error';\nimport type { VectorFilter } from './filter';\nimport type {\n CreateIndexParams,\n UpsertVectorParams,\n QueryVectorParams,\n IndexStats,\n QueryResult,\n UpdateVectorParams,\n DeleteVectorParams,\n DeleteVectorsParams,\n DescribeIndexParams,\n DeleteIndexParams,\n} from './types';\n\n/** Legacy embedding model (V1) - use embedV1 function */\nexport type MastraLegacyEmbeddingModel<T> = EmbeddingModelV1<T>;\n\n/** Modern embedding model (V2/V3) - use embedV2 for V2 models, embedV3 for V3 models */\nexport type MastraSupportedEmbeddingModel<T> = EmbeddingModelV2<T> | EmbeddingModelV3;\n\n/** All supported embedding model types */\nexport type MastraEmbeddingModel<T> = MastraLegacyEmbeddingModel<T> | MastraSupportedEmbeddingModel<T>;\n\nexport type MastraEmbeddingOptions = {\n maxRetries?: number;\n\n headers?: Record<string, string>;\n /**\n * Optional telemetry configuration (experimental).\n */\n telemetry?: TelemetrySettingsV1 | TelemetrySettingsV5 | TelemetrySettingsV6;\n\n providerOptions?: ProviderOptionsV1 | ProviderOptionsV5 | ProviderOptionsV6;\n\n maxParallelCalls?: number;\n};\n\n/** Specification versions for supported (modern) embedding models */\nexport const supportedEmbeddingModelSpecifications = ['v2', 'v3'] as const;\n\n/**\n * Type guard to check if an embedding model is a supported modern version (V2 or V3).\n * Use embedV2 for V2 models, embedV3 for V3 models, and embedV1 for legacy V1 models.\n */\nexport const isSupportedEmbeddingModel = <T>(\n model: MastraEmbeddingModel<T>,\n): model is MastraSupportedEmbeddingModel<T> => {\n return supportedEmbeddingModelSpecifications.includes(\n model.specificationVersion as (typeof supportedEmbeddingModelSpecifications)[number],\n );\n};\n\nexport abstract class MastraVector<Filter = VectorFilter> extends MastraBase {\n id: string;\n disableInit: boolean = false;\n\n constructor({ id, disableInit }: { id: string; disableInit?: boolean }) {\n if (!id || typeof id !== 'string' || id.trim() === '') {\n throw new MastraError({\n id: 'VECTOR_INVALID_ID',\n text: 'Vector id must be provided and cannot be empty',\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n });\n }\n super({ name: 'MastraVector', component: 'VECTOR' });\n this.id = id;\n this.disableInit = disableInit ?? false;\n }\n\n get indexSeparator(): string {\n return '_';\n }\n\n abstract query(params: QueryVectorParams<Filter>): Promise<QueryResult[]>;\n // Adds type checks for positional arguments if used\n abstract upsert(params: UpsertVectorParams): Promise<string[]>;\n // Adds type checks for positional arguments if used\n abstract createIndex(params: CreateIndexParams): Promise<void>;\n\n abstract listIndexes(): Promise<string[]>;\n\n abstract describeIndex(params: DescribeIndexParams): Promise<IndexStats>;\n\n abstract deleteIndex(params: DeleteIndexParams): Promise<void>;\n\n abstract updateVector(params: UpdateVectorParams<Filter>): Promise<void>;\n\n abstract deleteVector(params: DeleteVectorParams): Promise<void>;\n\n /**\n * Delete multiple vectors by IDs or metadata filter.\n *\n * This enables bulk deletion and source-based vector management.\n * Implementations should throw MastraError with appropriate error code\n * if the operation is not supported.\n *\n * @param params - Parameters including indexName and either ids or filter (mutually exclusive)\n * @throws {MastraError} If operation is not supported or parameters are invalid\n *\n * @example\n * ```ts\n * // Delete all chunks from a document\n * await vectorStore.deleteVectors({\n * indexName: 'docs',\n * filter: { source_id: 'manual.pdf' }\n * });\n *\n * // Delete multiple vectors by ID\n * await vectorStore.deleteVectors({\n * indexName: 'docs',\n * ids: ['vec_1', 'vec_2', 'vec_3']\n * });\n *\n * // Delete old temporary documents\n * await vectorStore.deleteVectors({\n * indexName: 'docs',\n * filter: {\n * $and: [\n * { bucket: 'temp' },\n * { indexed_at: { $lt: '2025-01-01' } }\n * ]\n * }\n * });\n * ```\n */\n abstract deleteVectors(params: DeleteVectorsParams<Filter>): Promise<void>;\n\n protected async validateExistingIndex(indexName: string, dimension: number, metric: string) {\n let info: IndexStats;\n try {\n info = await this.describeIndex({ indexName });\n } catch (infoError) {\n const mastraError = new MastraError(\n {\n id: 'VECTOR_VALIDATE_INDEX_FETCH_FAILED',\n text: `Index \"${indexName}\" already exists, but failed to fetch index info for dimension check.`,\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.SYSTEM,\n details: { indexName },\n },\n infoError,\n );\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n const existingDim = info?.dimension;\n const existingMetric = info?.metric;\n if (existingDim === dimension) {\n this.logger?.info(\n `Index \"${indexName}\" already exists with ${existingDim} dimensions and metric ${existingMetric}, skipping creation.`,\n );\n if (existingMetric !== metric) {\n this.logger?.warn(\n `Attempted to create index with metric \"${metric}\", but index already exists with metric \"${existingMetric}\". To use a different metric, delete and recreate the index.`,\n );\n }\n } else if (info) {\n const mastraError = new MastraError({\n id: 'VECTOR_VALIDATE_INDEX_DIMENSION_MISMATCH',\n text: `Index \"${indexName}\" already exists with ${existingDim} dimensions, but ${dimension} dimensions were requested`,\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: { indexName, existingDim, requestedDim: dimension },\n });\n this.logger?.trackException(mastraError);\n throw mastraError;\n } else {\n const mastraError = new MastraError({\n id: 'VECTOR_VALIDATE_INDEX_NO_DIMENSION',\n text: `Index \"${indexName}\" already exists, but could not retrieve its dimensions for validation.`,\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.SYSTEM,\n details: { indexName },\n });\n this.logger?.trackException(mastraError);\n throw mastraError;\n }\n }\n}\n","/**\n * Shared validation helpers for vector store implementations\n *\n * These helpers provide consistent validation across all vector stores,\n * reducing code duplication and ensuring uniform error handling.\n */\n\nimport { MastraError, ErrorDomain, ErrorCategory } from '../error';\nimport { createVectorErrorId } from '../storage';\n\n/**\n * Validates upsert input parameters\n *\n * @param storeName - Name of the vector store (e.g., 'PG', 'CHROMA')\n * @param vectors - Array of vectors to upsert\n * @param metadata - Optional metadata array\n * @param ids - Optional ids array\n * @throws MastraError if validation fails\n */\nexport function validateUpsertInput(\n storeName: string,\n vectors: number[][] | undefined | null,\n metadata?: Record<string, any>[] | null,\n ids?: string[] | null,\n): void {\n // Validate vectors array is not empty\n if (!vectors || vectors.length === 0) {\n throw new MastraError({\n id: createVectorErrorId(storeName, 'UPSERT', 'EMPTY_VECTORS'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n message: 'Vectors array cannot be empty',\n },\n });\n }\n\n // Validate metadata length matches vectors length (skip if metadata is empty/not provided)\n if (metadata && metadata.length > 0 && metadata.length !== vectors.length) {\n throw new MastraError({\n id: createVectorErrorId(storeName, 'UPSERT', 'METADATA_LENGTH_MISMATCH'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n message: 'Metadata array length must match vectors array length',\n vectorsLength: vectors.length,\n metadataLength: metadata.length,\n },\n });\n }\n\n // Validate ids length matches vectors length\n if (ids && ids.length !== vectors.length) {\n throw new MastraError({\n id: createVectorErrorId(storeName, 'UPSERT', 'IDS_LENGTH_MISMATCH'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n message: 'IDs array length must match vectors array length',\n vectorsLength: vectors.length,\n idsLength: ids.length,\n },\n });\n }\n}\n\n/**\n * Validates topK parameter for queries\n *\n * @param storeName - Name of the vector store (e.g., 'PG', 'CHROMA')\n * @param topK - Number of results to return\n * @throws MastraError if topK is not a positive integer\n */\nexport function validateTopK(storeName: string, topK: number): void {\n if (!Number.isInteger(topK) || topK <= 0) {\n throw new MastraError({\n id: createVectorErrorId(storeName, 'QUERY', 'INVALID_TOP_K'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n message: 'topK must be a positive integer',\n topK,\n },\n });\n }\n}\n\n/**\n * Validates vector components for NaN/Infinity values\n *\n * @param storeName - Name of the vector store (e.g., 'PG', 'CHROMA')\n * @param vectors - Array of vectors to validate\n * @throws MastraError if any vector contains NaN, Infinity, null, or undefined\n */\nexport function validateVectorValues(storeName: string, vectors: number[][]): void {\n for (let i = 0; i < vectors.length; i++) {\n const vector = vectors[i];\n\n if (!vector) {\n throw new MastraError({\n id: createVectorErrorId(storeName, 'UPSERT', 'INVALID_VECTOR'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n message: `Vector at index ${i} is null or undefined`,\n vectorIndex: i,\n },\n });\n }\n\n for (let j = 0; j < vector.length; j++) {\n const value = vector[j];\n\n if (value === null || value === undefined || !Number.isFinite(value)) {\n throw new MastraError({\n id: createVectorErrorId(storeName, 'UPSERT', 'INVALID_VECTOR_VALUE'),\n domain: ErrorDomain.MASTRA_VECTOR,\n category: ErrorCategory.USER,\n details: {\n message: `Vector contains invalid value (null, undefined, NaN, or Infinity) at position [${i}][${j}]`,\n vectorIndex: i,\n componentIndex: j,\n value: String(value),\n },\n });\n }\n }\n }\n}\n\n/**\n * Validates all upsert inputs including vector values\n * Combines validateUpsertInput and validateVectorValues\n *\n * @param storeName - Name of the vector store (e.g., 'PG', 'CHROMA')\n * @param vectors - Array of vectors to upsert\n * @param metadata - Optional metadata array\n * @param ids - Optional ids array\n * @param validateValues - Whether to validate vector values for NaN/Infinity (default: false)\n * @throws MastraError if validation fails\n */\nexport function validateUpsert(\n storeName: string,\n vectors: number[][] | undefined | null,\n metadata?: Record<string, any>[] | null,\n ids?: string[] | null,\n validateValues = false,\n): void {\n validateUpsertInput(storeName, vectors, metadata, ids);\n\n if (validateValues && vectors) {\n validateVectorValues(storeName, vectors);\n }\n}\n"],"mappings":"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"}