@mastra/qdrant 1.0.0-beta.4 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +98 -0
- package/README.md +66 -10
- package/dist/docs/README.md +1 -1
- package/dist/docs/SKILL.md +1 -1
- package/dist/docs/SOURCE_MAP.json +1 -1
- package/dist/docs/rag/01-vector-databases.md +3 -3
- package/dist/docs/vectors/01-reference.md +47 -0
- package/dist/index.cjs +196 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +197 -36
- package/dist/index.js.map +1 -1
- package/dist/vector/filter.d.ts +2 -1
- package/dist/vector/filter.d.ts.map +1 -1
- package/dist/vector/index.d.ts +110 -6
- package/dist/vector/index.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n LogicalOperator,\n OperatorSupport,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\ntype QdrantOperatorValueMap = Omit<OperatorValueMap, '$options' | '$elemMatch' | '$all'> & {\n /**\n * $count: Filter by array length or value count.\n * Example: { tags: { $count: { gt: 2 } } }\n */\n $count: {\n $gt?: number;\n $gte?: number;\n $lt?: number;\n $lte?: number;\n $eq?: number;\n };\n\n /**\n * $geo: Geospatial filter.\n * Example: { location: { $geo: { type: 'geo_radius', center: [lon, lat], radius: 1000 } } }\n */\n $geo: {\n type: string;\n [key: string]: any;\n };\n\n /**\n * $hasId: Filter by point IDs.\n * Allowed at root level.\n * Example: { $hasId: '123' } or { $hasId: ['123', '456'] }\n */\n $hasId: string | string[];\n\n /**\n * $nested: Nested object filter.\n * Example: { metadata: { $nested: { key: 'foo', filter: { $eq: 'bar' } } } }\n */\n $nested: {\n // Additional properties depend on the nested object structure\n [key: string]: any;\n };\n\n /**\n * $hasVector: Filter by vector existence or field.\n * Allowed at root level.\n * Example: { $hasVector: true } or { $hasVector: 'vector_field' }\n */\n $hasVector: boolean | string;\n\n /**\n * $datetime: RFC 3339 datetime range.\n * Example: { createdAt: { $datetime: { gte: '2024-01-01T00:00:00Z' } } }\n */\n $datetime: {\n key?: string;\n range?: {\n gt?: Date | string;\n gte?: Date | string;\n lt?: Date | string;\n lte?: Date | string;\n eq?: Date | string;\n };\n };\n\n /**\n * $null: Check if a field is null.\n * Example: { metadata: { $null: true } }\n */\n $null: boolean;\n\n /**\n * $empty: Check if an array or object field is empty.\n * Example: { tags: { $empty: true } }\n */\n $empty: boolean;\n};\n\ntype QdrantLogicalOperatorValueMap = Omit<LogicalOperatorValueMap, '$nor'>;\n\ntype QdrantBlacklistedRootOperators =\n | BlacklistedRootOperators\n | '$count'\n | '$geo'\n | '$nested'\n | '$datetime'\n | '$null'\n | '$empty';\n\nexport type QdrantVectorFilter = VectorFilter<\n keyof QdrantOperatorValueMap,\n QdrantOperatorValueMap,\n QdrantLogicalOperatorValueMap,\n QdrantBlacklistedRootOperators\n>;\n\n/**\n * Translates MongoDB-style filters to Qdrant compatible filters.\n *\n * Key transformations:\n * - $and -> must\n * - $or -> should\n * - $not -> must_not\n * - { field: { $op: value } } -> { key: field, match/range: { value/gt/lt: value } }\n *\n * Custom operators (Qdrant-specific):\n * - $count -> values_count (array length/value count)\n * - $geo -> geo filters (box, radius, polygon)\n * - $hasId -> has_id filter\n * - $nested -> nested object filters\n * - $hasVector -> vector existence check\n * - $datetime -> RFC 3339 datetime range\n * - $null -> is_null check\n * - $empty -> is_empty check\n */\nexport class QdrantFilterTranslator extends BaseFilterTranslator<QdrantVectorFilter> {\n protected override isLogicalOperator(key: string): key is LogicalOperator {\n return super.isLogicalOperator(key) || key === '$hasId' || key === '$hasVector';\n }\n\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n logical: ['$and', '$or', '$not'],\n array: ['$in', '$nin'],\n regex: ['$regex'],\n custom: ['$count', '$geo', '$nested', '$datetime', '$null', '$empty', '$hasId', '$hasVector'],\n };\n }\n\n translate(filter?: QdrantVectorFilter): QdrantVectorFilter {\n if (this.isEmpty(filter)) return filter;\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private createCondition(type: string, value: any, fieldKey?: string) {\n const condition = { [type]: value };\n return fieldKey ? { key: fieldKey, ...condition } : condition;\n }\n\n private translateNode(node: QdrantVectorFilter, isNested: boolean = false, fieldKey?: string): any {\n if (!this.isEmpty(node) && !!node && typeof node === 'object' && 'must' in node) {\n return node;\n }\n\n if (this.isPrimitive(node)) {\n if (node === null) {\n return { is_null: { key: fieldKey } };\n }\n return this.createCondition('match', { value: this.normalizeComparisonValue(node) }, fieldKey);\n }\n\n if (this.isRegex(node)) {\n throw new Error('Direct regex pattern format is not supported in Qdrant');\n }\n\n if (Array.isArray(node)) {\n return node.length === 0\n ? { is_empty: { key: fieldKey } }\n : this.createCondition('match', { any: this.normalizeArrayValues(node) }, fieldKey);\n }\n\n const entries = Object.entries(node as Record<string, any>);\n\n // Handle logical operators first\n const logicalResult = this.handleLogicalOperators(entries, isNested);\n if (logicalResult) {\n return logicalResult;\n }\n\n // Handle field conditions\n const { conditions, range, matchCondition } = this.handleFieldConditions(entries, fieldKey);\n\n if (Object.keys(range).length > 0) {\n conditions.push({ key: fieldKey, range });\n }\n\n if (matchCondition) {\n conditions.push({ key: fieldKey, match: matchCondition });\n }\n\n return this.buildFinalConditions(conditions, isNested);\n }\n\n private buildFinalConditions(conditions: any[], isNested: boolean): any {\n if (conditions.length === 0) {\n return {};\n } else if (conditions.length === 1 && isNested) {\n return conditions[0];\n } else {\n return { must: conditions };\n }\n }\n\n private handleLogicalOperators(entries: [string, any][], isNested: boolean): any | null {\n const firstKey = entries[0]?.[0];\n\n if (firstKey && this.isLogicalOperator(firstKey) && !this.isCustomOperator(firstKey)) {\n const [key, value] = entries[0]!;\n const qdrantOp = this.getQdrantLogicalOp(key);\n return {\n [qdrantOp]: Array.isArray(value)\n ? value.map(v => this.translateNode(v, true))\n : [this.translateNode(value, true)],\n };\n }\n\n if (\n entries.length > 1 &&\n !isNested &&\n entries.every(([key]) => !this.isOperator(key) && !this.isCustomOperator(key))\n ) {\n return {\n must: entries.map(([key, value]) => this.translateNode(value, true, key)),\n };\n }\n\n return null;\n }\n\n private handleFieldConditions(\n entries: [string, any][],\n fieldKey?: string,\n ): { conditions: any[]; range: Record<string, any>; matchCondition: Record<string, any> | null } {\n const conditions = [];\n let range: Record<string, any> = {};\n let matchCondition: Record<string, any> | null = null;\n\n for (const [key, value] of entries) {\n if (this.isCustomOperator(key)) {\n const customOp = this.translateCustomOperator(key, value, fieldKey);\n conditions.push(customOp);\n } else if (this.isOperator(key)) {\n const opResult = this.translateOperatorValue(key, value);\n if (opResult.range) {\n Object.assign(range, opResult.range);\n } else {\n matchCondition = opResult;\n }\n } else {\n const nestedKey = fieldKey ? `${fieldKey}.${key}` : key;\n const nestedCondition = this.translateNode(value, true, nestedKey);\n\n if (nestedCondition.must) {\n conditions.push(...nestedCondition.must);\n } else if (!this.isEmpty(nestedCondition)) {\n conditions.push(nestedCondition);\n }\n }\n }\n\n return { conditions, range, matchCondition };\n }\n\n private translateCustomOperator(op: string, value: any, fieldKey?: string): any {\n switch (op) {\n case '$count':\n const countConditions = Object.entries(value).reduce(\n (acc, [k, v]) => ({\n ...acc,\n [k.replace('$', '')]: v,\n }),\n {},\n );\n return { key: fieldKey, values_count: countConditions };\n case '$geo':\n const geoOp = this.translateGeoFilter(value.type, value);\n return { key: fieldKey, ...geoOp };\n case '$hasId':\n return { has_id: Array.isArray(value) ? value : [value] };\n case '$nested':\n return {\n nested: {\n key: fieldKey,\n filter: this.translateNode(value),\n },\n };\n case '$hasVector':\n return { has_vector: value };\n case '$datetime':\n return {\n key: fieldKey,\n range: this.normalizeDatetimeRange(value.range),\n };\n case '$null':\n return { is_null: { key: fieldKey } };\n case '$empty':\n return { is_empty: { key: fieldKey } };\n default:\n throw new Error(`Unsupported custom operator: ${op}`);\n }\n }\n\n private getQdrantLogicalOp(op: string): string {\n switch (op) {\n case '$and':\n return 'must';\n case '$or':\n return 'should';\n case '$not':\n return 'must_not';\n default:\n throw new Error(`Unsupported logical operator: ${op}`);\n }\n }\n\n private translateOperatorValue(operator: string, value: any): any {\n const normalizedValue = this.normalizeComparisonValue(value);\n\n switch (operator) {\n case '$eq':\n return { value: normalizedValue };\n case '$ne':\n return { except: [normalizedValue] };\n case '$gt':\n return { range: { gt: normalizedValue } };\n case '$gte':\n return { range: { gte: normalizedValue } };\n case '$lt':\n return { range: { lt: normalizedValue } };\n case '$lte':\n return { range: { lte: normalizedValue } };\n case '$in':\n return { any: this.normalizeArrayValues(value) };\n case '$nin':\n return { except: this.normalizeArrayValues(value) };\n case '$regex':\n return { text: value };\n case 'exists':\n return value\n ? {\n must_not: [{ is_null: { key: value } }, { is_empty: { key: value } }],\n }\n : {\n is_empty: { key: value },\n };\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n }\n\n private translateGeoFilter(type: string, value: any): any {\n switch (type) {\n case 'box':\n return {\n geo_bounding_box: {\n top_left: value.top_left,\n bottom_right: value.bottom_right,\n },\n };\n case 'radius':\n return {\n geo_radius: {\n center: value.center,\n radius: value.radius,\n },\n };\n case 'polygon':\n return {\n geo_polygon: {\n exterior: value.exterior,\n interiors: value.interiors,\n },\n };\n default:\n throw new Error(`Unsupported geo filter type: ${type}`);\n }\n }\n\n private normalizeDatetimeRange(value: any): any {\n const range: Record<string, string> = {};\n for (const [op, val] of Object.entries(value)) {\n if (val instanceof Date) {\n range[op] = val.toISOString();\n } else if (typeof val === 'string') {\n // Assume string is already in proper format\n range[op] = val;\n }\n }\n return range;\n }\n}\n","import { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { MastraVector } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport { QdrantClient } from '@qdrant/js-client-rest';\nimport type { QdrantClientParams, Schemas } from '@qdrant/js-client-rest';\n\nimport { QdrantFilterTranslator } from './filter';\nimport type { QdrantVectorFilter } from './filter';\n\nconst BATCH_SIZE = 256;\nconst DISTANCE_MAPPING: Record<string, Schemas['Distance']> = {\n cosine: 'Cosine',\n euclidean: 'Euclid',\n dotproduct: 'Dot',\n};\n\ntype QdrantQueryVectorParams = QueryVectorParams<QdrantVectorFilter>;\n\n/**\n * Supported payload schema types for Qdrant payload indexes.\n * These correspond to Qdrant's native payload indexing types.\n * @see https://qdrant.tech/documentation/concepts/indexing/#payload-index\n */\nexport type PayloadSchemaType = 'keyword' | 'integer' | 'float' | 'geo' | 'text' | 'bool' | 'datetime' | 'uuid';\n\n/**\n * Parameters for creating a payload index on a Qdrant collection.\n */\nexport interface CreatePayloadIndexParams {\n /** The name of the collection (index) to create the payload index on. */\n indexName: string;\n /** The name of the payload field to index. */\n fieldName: string;\n /** The schema type for the payload field. */\n fieldSchema: PayloadSchemaType;\n /** Whether to wait for the operation to complete. Defaults to true. */\n wait?: boolean;\n}\n\n/**\n * Parameters for deleting a payload index from a Qdrant collection.\n */\nexport interface DeletePayloadIndexParams {\n /** The name of the collection (index) to delete the payload index from. */\n indexName: string;\n /** The name of the payload field index to delete. */\n fieldName: string;\n /** Whether to wait for the operation to complete. Defaults to true. */\n wait?: boolean;\n}\n\nexport class QdrantVector extends MastraVector {\n private client: QdrantClient;\n\n /**\n * Creates a new QdrantVector client.\n * @param id - The unique identifier for this vector store instance.\n * @param url - The URL of the Qdrant server.\n * @param apiKey - The API key for Qdrant.\n * @param https - Whether to use HTTPS.\n */\n constructor({ id, ...qdrantParams }: QdrantClientParams & { id: string }) {\n super({ id });\n this.client = new QdrantClient(qdrantParams);\n }\n\n async upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n const pointIds = ids || vectors.map(() => crypto.randomUUID());\n\n const records = vectors.map((vector, i) => ({\n id: pointIds[i],\n vector: vector,\n payload: metadata?.[i] || {},\n }));\n\n try {\n for (let i = 0; i < records.length; i += BATCH_SIZE) {\n const batch = records.slice(i, i + BATCH_SIZE);\n await this.client.upsert(indexName, {\n // @ts-expect-error\n points: batch,\n wait: true,\n });\n }\n\n return pointIds;\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, vectorCount: vectors.length },\n },\n error,\n );\n }\n }\n\n async createIndex({ indexName, dimension, metric = 'cosine' }: CreateIndexParams): Promise<void> {\n try {\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n if (!DISTANCE_MAPPING[metric]) {\n throw new Error(`Invalid metric: \"${metric}\". Must be one of: cosine, euclidean, dotproduct`);\n }\n } catch (validationError) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'CREATE_INDEX', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, dimension, metric },\n },\n validationError,\n );\n }\n\n try {\n await this.client.createCollection(indexName, {\n vectors: {\n size: dimension,\n distance: DISTANCE_MAPPING[metric],\n },\n });\n } catch (error: any) {\n const message = error?.message || error?.toString();\n // Qdrant typically returns 409 for existing collection\n if (error?.status === 409 || (typeof message === 'string' && message.toLowerCase().includes('exists'))) {\n // Fetch collection info and check dimension\n await this.validateExistingIndex(indexName, dimension, metric);\n return;\n }\n\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'CREATE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n }\n\n transformFilter(filter?: QdrantVectorFilter) {\n const translator = new QdrantFilterTranslator();\n return translator.translate(filter);\n }\n\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n }: QdrantQueryVectorParams): Promise<QueryResult[]> {\n const translatedFilter = this.transformFilter(filter) ?? {};\n\n try {\n const results = (\n await this.client.query(indexName, {\n query: queryVector,\n limit: topK,\n filter: translatedFilter,\n with_payload: true,\n with_vector: includeVector,\n })\n ).points;\n\n return results.map(match => {\n let vector: number[] = [];\n if (includeVector) {\n if (Array.isArray(match.vector)) {\n // If it's already an array of numbers\n vector = match.vector as number[];\n } else if (typeof match.vector === 'object' && match.vector !== null) {\n // If it's an object with vector data\n vector = Object.values(match.vector).filter(v => typeof v === 'number');\n }\n }\n\n return {\n id: match.id as string,\n score: match.score || 0,\n metadata: match.payload as Record<string, any>,\n ...(includeVector && { vector }),\n };\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, topK },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const response = await this.client.getCollections();\n return response.collections.map(collection => collection.name) || [];\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'LIST_INDEXES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const { config, points_count } = await this.client.getCollection(indexName);\n\n const distance = config.params.vectors?.distance as Schemas['Distance'];\n return {\n dimension: config.params.vectors?.size as number,\n count: points_count || 0,\n // @ts-expect-error\n metric: Object.keys(DISTANCE_MAPPING).find(key => DISTANCE_MAPPING[key] === distance),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DESCRIBE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n try {\n await this.client.deleteCollection(indexName);\n } catch (error: any) {\n // If the collection doesn't exist, treat it as a no-op (already deleted)\n const errorMessage = error?.message || error?.toString() || '';\n if (\n error?.status === 404 ||\n errorMessage.toLowerCase().includes('not found') ||\n errorMessage.toLowerCase().includes('not exist')\n ) {\n this.logger.info(`Collection ${indexName} does not exist, treating as already deleted`);\n return;\n }\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Updates a vector by its ID or multiple vectors matching a filter.\n * @param indexName - The name of the index containing the vector(s).\n * @param id - The ID of the vector to update (mutually exclusive with filter).\n * @param filter - Filter to match multiple vectors to update (mutually exclusive with id).\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n async updateVector({ indexName, id, filter, update }: UpdateVectorParams<QdrantVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (id && filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both id and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (!id && !filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'NO_TARGET'),\n text: 'Either id or filter must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (!update.vector && !update.metadata) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'NO_PAYLOAD'),\n text: 'No updates provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n indexName,\n ...(id && { id }),\n },\n });\n }\n\n // Validate filter is not empty\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n text: 'Filter cannot be an empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n try {\n if (id) {\n // Update single vector by ID\n const pointId = this.parsePointId(id);\n\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n await this.client.setPayload(indexName, { payload: update.metadata, points: [pointId] });\n return;\n }\n\n // Handle vector-only update\n if (update.vector && !update.metadata) {\n await this.client.updateVectors(indexName, {\n points: [\n {\n id: pointId,\n vector: update.vector,\n },\n ],\n });\n return;\n }\n\n // Handle both vector and metadata update\n if (update.vector && update.metadata) {\n const point = {\n id: pointId,\n vector: update.vector,\n payload: update.metadata,\n };\n\n await this.client.upsert(indexName, {\n points: [point],\n });\n return;\n }\n } else if (filter) {\n // Update multiple vectors matching filter\n const translatedFilter = this.transformFilter(filter);\n\n // First, scroll through all matching points to get their IDs\n const matchingPoints: Array<{ id: string | number; vector?: number[] }> = [];\n let offset: string | number | undefined = undefined;\n\n do {\n const scrollResult = await this.client.scroll(indexName, {\n filter: translatedFilter,\n limit: 100,\n offset,\n with_payload: false,\n with_vector: update.vector ? false : true, // Only fetch vectors if not updating them\n });\n\n matchingPoints.push(\n ...scrollResult.points.map(point => ({\n id: point.id,\n vector: Array.isArray(point.vector) ? (point.vector as number[]) : undefined,\n })),\n );\n\n const nextOffset = scrollResult.next_page_offset;\n offset = typeof nextOffset === 'string' || typeof nextOffset === 'number' ? nextOffset : undefined;\n } while (offset !== undefined);\n\n if (matchingPoints.length === 0) {\n // No vectors to update - this is not an error\n return;\n }\n\n const pointIds = matchingPoints.map(p => p.id);\n\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n await this.client.setPayload(indexName, { payload: update.metadata, points: pointIds });\n return;\n }\n\n // Handle vector-only or both updates\n if (update.vector) {\n // For vector updates with filter, we need to upsert each point\n const points = matchingPoints.map(p => ({\n id: p.id,\n vector: update.vector!,\n payload: update.metadata || {},\n }));\n\n // Batch upsert\n for (let i = 0; i < points.length; i += BATCH_SIZE) {\n const batch = points.slice(i, i + BATCH_SIZE);\n await this.client.upsert(indexName, {\n points: batch,\n wait: true,\n });\n }\n return;\n }\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n ...(filter && { filter: JSON.stringify(filter) }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n try {\n // Parse the ID - Qdrant supports both string and numeric IDs\n const pointId = this.parsePointId(id);\n\n // Use the Qdrant client to delete the point from the collection\n await this.client.delete(indexName, {\n points: [pointId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Parses and converts a string ID to the appropriate type (string or number) for Qdrant point operations.\n *\n * Qdrant supports both numeric and string IDs. This helper method ensures IDs are in the correct format\n * before sending them to the Qdrant client API.\n *\n * @param id - The ID string to parse\n * @returns The parsed ID as either a number (if string contains only digits) or the original string\n *\n * @example\n * // Numeric ID strings are converted to numbers\n * parsePointId(\"123\") => 123\n * parsePointId(\"42\") => 42\n * parsePointId(\"0\") => 0\n *\n * // String IDs containing any non-digit characters remain as strings\n * parsePointId(\"doc-123\") => \"doc-123\"\n * parsePointId(\"user_42\") => \"user_42\"\n * parsePointId(\"abc123\") => \"abc123\"\n * parsePointId(\"123abc\") => \"123abc\"\n * parsePointId(\"\") => \"\"\n * parsePointId(\"uuid-5678-xyz\") => \"uuid-5678-xyz\"\n *\n * @remarks\n * - This conversion is important because Qdrant treats numeric and string IDs differently\n * - Only positive integers are converted to numbers (negative numbers with minus signs remain strings)\n * - The method uses base-10 parsing, so leading zeros will be dropped in numeric conversions\n * - reference: https://qdrant.tech/documentation/concepts/points/?q=qdrant+point+id#point-ids\n */\n private parsePointId(id: string): string | number {\n // Try to parse as number if it looks like one\n if (/^\\d+$/.test(id)) {\n return parseInt(id, 10);\n }\n return id;\n }\n\n /**\n * Deletes multiple vectors by IDs or filter.\n * @param indexName - The name of the index containing the vectors.\n * @param ids - Array of vector IDs to delete (mutually exclusive with filter).\n * @param filter - Filter to match vectors to delete (mutually exclusive with ids).\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if both ids and filter are provided, or if neither is provided.\n */\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams<QdrantVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (ids && filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both ids and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (!ids && !filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'NO_TARGET'),\n text: 'Either filter or ids must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n // Validate ids array is not empty\n if (ids && ids.length === 0) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'EMPTY_IDS'),\n text: 'Cannot delete with empty ids array',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n // Validate filter is not empty\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n text: 'Cannot delete with empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n try {\n if (ids) {\n // Delete by IDs - parse all IDs to support both string and numeric formats\n const pointIds = ids.map(id => this.parsePointId(id));\n try {\n await this.client.delete(indexName, {\n points: pointIds,\n wait: true,\n });\n } catch (error: any) {\n // Qdrant throws \"Bad Request\" when trying to delete non-existent IDs\n // This is expected behavior and should be handled gracefully\n const message = error?.message || error?.toString() || '';\n if (message.toLowerCase().includes('bad request')) {\n // Silently ignore - deleting non-existent IDs is not an error\n return;\n }\n throw error;\n }\n } else if (filter) {\n // Delete by filter\n const translatedFilter = this.transformFilter(filter) ?? {};\n await this.client.delete(indexName, {\n filter: translatedFilter as any,\n wait: true,\n });\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Creates a payload index on a Qdrant collection to enable efficient filtering on metadata fields.\n *\n * This is required for Qdrant Cloud and any Qdrant instance with `strict_mode_config = true`,\n * where metadata (payload) fields must be explicitly indexed before they can be used for filtering.\n *\n * @param params - The parameters for creating the payload index.\n * @param params.indexName - The name of the collection (index) to create the payload index on.\n * @param params.fieldName - The name of the payload field to index.\n * @param params.fieldSchema - The schema type for the field (e.g., 'keyword', 'integer', 'text').\n * @param params.wait - Whether to wait for the operation to complete. Defaults to true.\n * @returns A promise that resolves when the index is created (idempotent if index already exists).\n * @throws Will throw a MastraError if arguments are invalid or if the operation fails.\n *\n * @example\n * ```ts\n * // Create a keyword index for filtering by source\n * await qdrant.createPayloadIndex({\n * indexName: 'my-collection',\n * fieldName: 'source',\n * fieldSchema: 'keyword',\n * });\n *\n * // Create an integer index for numeric filtering\n * await qdrant.createPayloadIndex({\n * indexName: 'my-collection',\n * fieldName: 'price',\n * fieldSchema: 'integer',\n * });\n * ```\n *\n * @see https://qdrant.tech/documentation/concepts/indexing/#payload-index\n */\n async createPayloadIndex({\n indexName,\n fieldName,\n fieldSchema,\n wait = true,\n }: CreatePayloadIndexParams): Promise<void> {\n // Validate inputs\n const validSchemas: PayloadSchemaType[] = [\n 'keyword',\n 'integer',\n 'float',\n 'geo',\n 'text',\n 'bool',\n 'datetime',\n 'uuid',\n ];\n\n if (!indexName || typeof indexName !== 'string' || indexName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'indexName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName, fieldSchema },\n });\n }\n\n if (!fieldName || typeof fieldName !== 'string' || fieldName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'fieldName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName, fieldSchema },\n });\n }\n\n if (!validSchemas.includes(fieldSchema)) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: `fieldSchema must be one of: ${validSchemas.join(', ')}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName, fieldSchema },\n });\n }\n\n try {\n await this.client.createPayloadIndex(indexName, {\n field_name: fieldName,\n field_schema: fieldSchema,\n wait,\n });\n } catch (error: any) {\n const message = error?.message || error?.toString() || '';\n // Qdrant returns 409 or \"exists\" message if index already exists - treat as idempotent success\n if (error?.status === 409 || message.toLowerCase().includes('exists')) {\n this.logger.info(`Payload index for field \"${fieldName}\" already exists on collection \"${indexName}\"`);\n return;\n }\n\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, fieldName, fieldSchema },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a payload index from a Qdrant collection.\n *\n * @param params - The parameters for deleting the payload index.\n * @param params.indexName - The name of the collection (index) to delete the payload index from.\n * @param params.fieldName - The name of the payload field index to delete.\n * @param params.wait - Whether to wait for the operation to complete. Defaults to true.\n * @returns A promise that resolves when the index is deleted (idempotent if index doesn't exist).\n * @throws Will throw a MastraError if the operation fails.\n *\n * @example\n * ```ts\n * await qdrant.deletePayloadIndex({\n * indexName: 'my-collection',\n * fieldName: 'source',\n * });\n * ```\n */\n async deletePayloadIndex({ indexName, fieldName, wait = true }: DeletePayloadIndexParams): Promise<void> {\n // Validate inputs\n if (!indexName || typeof indexName !== 'string' || indexName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'indexName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName },\n });\n }\n\n if (!fieldName || typeof fieldName !== 'string' || fieldName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'fieldName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName },\n });\n }\n\n try {\n await this.client.deletePayloadIndex(indexName, fieldName, { wait });\n } catch (error: any) {\n const message = error?.message || error?.toString() || '';\n // If index doesn't exist, treat as idempotent success (already deleted)\n if (\n error?.status === 404 ||\n message.toLowerCase().includes('not found') ||\n message.toLowerCase().includes('not exist')\n ) {\n this.logger.info(`Payload index for field \"${fieldName}\" does not exist on collection \"${indexName}\"`);\n return;\n }\n\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_PAYLOAD_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, fieldName },\n },\n error,\n );\n }\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Qdrant Vector.\n */\nexport const QDRANT_PROMPT = `When querying Qdrant, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n- $match: Match text using full-text search\n Example: { \"description\": { \"$match\": \"gaming laptop\" } }\n- $null: Check if field is null\n Example: { \"rating\": { \"$null\": true } }\n\nRestrictions:\n- Regex patterns are not supported\n- Only $and, $or, and $not logical operators are supported at the top level\n- Empty arrays in $in/$nin will return no results\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or, $not):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"description\": { \"$match\": \"gaming laptop\" } },\n { \"rating\": { \"$exists\": true, \"$gt\": 4 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": { \"$null\": false } }\n ]},\n { \"$not\": { \"status\": \"discontinued\" } }\n ]\n}`;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type {\n VectorFilter,\n LogicalOperator,\n OperatorSupport,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\n\ntype QdrantOperatorValueMap = Omit<OperatorValueMap, '$options' | '$elemMatch'> & {\n /**\n * $count: Filter by array length or value count.\n * Example: { tags: { $count: { gt: 2 } } }\n */\n $count: {\n $gt?: number;\n $gte?: number;\n $lt?: number;\n $lte?: number;\n $eq?: number;\n };\n\n /**\n * $geo: Geospatial filter.\n * Example: { location: { $geo: { type: 'geo_radius', center: [lon, lat], radius: 1000 } } }\n */\n $geo: {\n type: string;\n [key: string]: any;\n };\n\n /**\n * $hasId: Filter by point IDs.\n * Allowed at root level.\n * Example: { $hasId: '123' } or { $hasId: ['123', '456'] }\n */\n $hasId: string | string[];\n\n /**\n * $nested: Nested object filter.\n * Example: { metadata: { $nested: { key: 'foo', filter: { $eq: 'bar' } } } }\n */\n $nested: {\n // Additional properties depend on the nested object structure\n [key: string]: any;\n };\n\n /**\n * $hasVector: Filter by vector existence or field.\n * Allowed at root level.\n * Example: { $hasVector: true } or { $hasVector: 'vector_field' }\n */\n $hasVector: boolean | string;\n\n /**\n * $datetime: RFC 3339 datetime range.\n * Example: { createdAt: { $datetime: { gte: '2024-01-01T00:00:00Z' } } }\n */\n $datetime: {\n key?: string;\n range?: {\n gt?: Date | string;\n gte?: Date | string;\n lt?: Date | string;\n lte?: Date | string;\n eq?: Date | string;\n };\n };\n\n /**\n * $null: Check if a field is null.\n * Example: { metadata: { $null: true } }\n */\n $null: boolean;\n\n /**\n * $empty: Check if an array or object field is empty.\n * Example: { tags: { $empty: true } }\n */\n $empty: boolean;\n};\n\ntype QdrantLogicalOperatorValueMap = Omit<LogicalOperatorValueMap, '$nor'>;\n\ntype QdrantBlacklistedRootOperators =\n | BlacklistedRootOperators\n | '$count'\n | '$geo'\n | '$nested'\n | '$datetime'\n | '$null'\n | '$empty';\n\nexport type QdrantVectorFilter = VectorFilter<\n keyof QdrantOperatorValueMap,\n QdrantOperatorValueMap,\n QdrantLogicalOperatorValueMap,\n QdrantBlacklistedRootOperators\n>;\n\n/**\n * Translates MongoDB-style filters to Qdrant compatible filters.\n *\n * Key transformations:\n * - $and -> must\n * - $or -> should\n * - $not -> must_not\n * - { field: { $op: value } } -> { key: field, match/range: { value/gt/lt: value } }\n *\n * Custom operators (Qdrant-specific):\n * - $count -> values_count (array length/value count)\n * - $geo -> geo filters (box, radius, polygon)\n * - $hasId -> has_id filter\n * - $nested -> nested object filters\n * - $hasVector -> vector existence check\n * - $datetime -> RFC 3339 datetime range\n * - $null -> is_null check\n * - $empty -> is_empty check\n */\nexport class QdrantFilterTranslator extends BaseFilterTranslator<QdrantVectorFilter> {\n protected override isLogicalOperator(key: string): key is LogicalOperator {\n return super.isLogicalOperator(key) || key === '$hasId' || key === '$hasVector';\n }\n\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n logical: ['$and', '$or', '$not'],\n array: ['$in', '$nin', '$all'],\n regex: ['$regex'],\n element: ['$exists'],\n custom: ['$count', '$geo', '$nested', '$datetime', '$null', '$empty', '$hasId', '$hasVector'],\n };\n }\n\n protected override isOperator(key: string): key is any {\n // $not can be both a logical operator and a field-level operator\n // When used at field level like { field: { $not: { $gt: 5 } } }, treat it as an operator\n return super.isOperator(key) || key === '$not';\n }\n\n translate(filter?: QdrantVectorFilter): QdrantVectorFilter {\n if (this.isEmpty(filter)) return filter;\n this.validateFilter(filter);\n return this.translateNode(filter);\n }\n\n private createCondition(type: string, value: any, fieldKey?: string) {\n const condition = { [type]: value };\n return fieldKey ? { key: fieldKey, ...condition } : condition;\n }\n\n private translateNode(node: QdrantVectorFilter, isNested: boolean = false, fieldKey?: string): any {\n if (!this.isEmpty(node) && !!node && typeof node === 'object' && 'must' in node) {\n return node;\n }\n\n if (this.isPrimitive(node)) {\n if (node === null) {\n return { is_null: { key: fieldKey } };\n }\n return this.createCondition('match', { value: this.normalizeComparisonValue(node) }, fieldKey);\n }\n\n if (this.isRegex(node)) {\n throw new Error('Direct regex pattern format is not supported in Qdrant');\n }\n\n if (Array.isArray(node)) {\n return node.length === 0\n ? { is_empty: { key: fieldKey } }\n : this.createCondition('match', { any: this.normalizeArrayValues(node) }, fieldKey);\n }\n\n const entries = Object.entries(node as Record<string, any>);\n\n // Handle logical operators first (but not $not when we have a fieldKey - that's handled as a field operator)\n const logicalResult = this.handleLogicalOperators(entries, isNested, fieldKey);\n if (logicalResult) {\n return logicalResult;\n }\n\n // Handle field conditions\n const { conditions, range, matchCondition } = this.handleFieldConditions(entries, fieldKey);\n\n if (Object.keys(range).length > 0) {\n conditions.push({ key: fieldKey, range });\n }\n\n if (matchCondition) {\n conditions.push({ key: fieldKey, match: matchCondition });\n }\n\n return this.buildFinalConditions(conditions, isNested);\n }\n\n private buildFinalConditions(conditions: any[], isNested: boolean): any {\n if (conditions.length === 0) {\n return {};\n } else if (conditions.length === 1 && isNested) {\n return conditions[0];\n } else {\n return { must: conditions };\n }\n }\n\n private handleLogicalOperators(entries: [string, any][], isNested: boolean, fieldKey?: string): any | null {\n const firstKey = entries[0]?.[0];\n\n // When we have a fieldKey and see $not, it's a field-level $not operator, not a logical operator\n // Let handleFieldConditions handle it via the _specialNot path\n if (firstKey === '$not' && fieldKey) {\n return null;\n }\n\n if (firstKey && this.isLogicalOperator(firstKey) && !this.isCustomOperator(firstKey)) {\n const [key, value] = entries[0]!;\n const qdrantOp = this.getQdrantLogicalOp(key);\n return {\n [qdrantOp]: Array.isArray(value)\n ? value.map(v => this.translateNode(v, true))\n : [this.translateNode(value, true)],\n };\n }\n\n if (\n entries.length > 1 &&\n !isNested &&\n entries.every(([key]) => !this.isOperator(key) && !this.isCustomOperator(key))\n ) {\n return {\n must: entries.map(([key, value]) => this.translateNode(value, true, key)),\n };\n }\n\n return null;\n }\n\n private handleFieldConditions(\n entries: [string, any][],\n fieldKey?: string,\n ): { conditions: any[]; range: Record<string, any>; matchCondition: Record<string, any> | null } {\n const conditions = [];\n let range: Record<string, any> = {};\n let matchCondition: Record<string, any> | null = null;\n\n for (const [key, value] of entries) {\n if (this.isCustomOperator(key)) {\n const customOp = this.translateCustomOperator(key, value, fieldKey);\n conditions.push(customOp);\n } else if (this.isOperator(key)) {\n const opResult = this.translateOperatorValue(key, value);\n\n // Handle special markers for operators that need custom handling\n if (opResult._specialNull) {\n // $eq: null -> use is_null\n conditions.push({ is_null: { key: fieldKey } });\n } else if (opResult._specialNotNull) {\n // $ne: null -> use must_not with is_null\n conditions.push({ must_not: [{ is_null: { key: fieldKey } }] });\n } else if (opResult._specialNe) {\n // $ne: value -> use must_not with match\n conditions.push({\n must_not: [{ key: fieldKey, match: { value: opResult._specialNe } }],\n });\n } else if (opResult._specialNin) {\n // $nin: [values] -> use must_not with match any\n conditions.push({\n must_not: [{ key: fieldKey, match: { any: opResult._specialNin } }],\n });\n } else if (opResult._specialAll) {\n // $all: [values] -> create multiple match conditions joined with must\n for (const val of opResult._specialAll) {\n conditions.push({ key: fieldKey, match: { value: val } });\n }\n } else if (opResult._specialExists) {\n // $exists: true -> field must not be null or empty\n conditions.push({\n must_not: [{ is_null: { key: fieldKey } }, { is_empty: { key: fieldKey } }],\n });\n } else if (opResult._specialNotExists) {\n // $exists: false -> field must be null or empty\n conditions.push({\n should: [{ is_null: { key: fieldKey } }, { is_empty: { key: fieldKey } }],\n });\n } else if (opResult._specialNot) {\n // $not: { operator: value } -> translate inner condition and wrap in must_not\n const innerResult = this.translateNode(opResult._specialNot, true, fieldKey);\n conditions.push({ must_not: [innerResult] });\n } else if (opResult.range) {\n Object.assign(range, opResult.range);\n } else {\n matchCondition = opResult;\n }\n } else {\n const nestedKey = fieldKey ? `${fieldKey}.${key}` : key;\n const nestedCondition = this.translateNode(value, true, nestedKey);\n\n if (nestedCondition.must) {\n conditions.push(...nestedCondition.must);\n } else if (!this.isEmpty(nestedCondition)) {\n conditions.push(nestedCondition);\n }\n }\n }\n\n return { conditions, range, matchCondition };\n }\n\n private translateCustomOperator(op: string, value: any, fieldKey?: string): any {\n switch (op) {\n case '$count':\n const countConditions = Object.entries(value).reduce(\n (acc, [k, v]) => ({\n ...acc,\n [k.replace('$', '')]: v,\n }),\n {},\n );\n return { key: fieldKey, values_count: countConditions };\n case '$geo':\n const geoOp = this.translateGeoFilter(value.type, value);\n return { key: fieldKey, ...geoOp };\n case '$hasId':\n return { has_id: Array.isArray(value) ? value : [value] };\n case '$nested':\n return {\n nested: {\n key: fieldKey,\n filter: this.translateNode(value),\n },\n };\n case '$hasVector':\n return { has_vector: value };\n case '$datetime':\n return {\n key: fieldKey,\n range: this.normalizeDatetimeRange(value.range),\n };\n case '$null':\n return { is_null: { key: fieldKey } };\n case '$empty':\n return { is_empty: { key: fieldKey } };\n default:\n throw new Error(`Unsupported custom operator: ${op}`);\n }\n }\n\n private getQdrantLogicalOp(op: string): string {\n switch (op) {\n case '$and':\n return 'must';\n case '$or':\n return 'should';\n case '$not':\n return 'must_not';\n default:\n throw new Error(`Unsupported logical operator: ${op}`);\n }\n }\n\n private translateOperatorValue(operator: string, value: any): any {\n const normalizedValue = this.normalizeComparisonValue(value);\n\n switch (operator) {\n case '$eq':\n // Handle null comparison: use is_null instead of match\n if (value === null) {\n return { _specialNull: true };\n }\n return { value: normalizedValue };\n case '$ne':\n // Handle null comparison: for \"not null\", we need is_null wrapped in must_not\n if (value === null) {\n return { _specialNotNull: true };\n }\n // For $ne with non-null values, we need to use must_not with match\n return { _specialNe: normalizedValue };\n case '$gt':\n return { range: { gt: normalizedValue } };\n case '$gte':\n return { range: { gte: normalizedValue } };\n case '$lt':\n return { range: { lt: normalizedValue } };\n case '$lte':\n return { range: { lte: normalizedValue } };\n case '$in':\n return { any: this.normalizeArrayValues(value) };\n case '$nin':\n // Similar to $ne, $nin should use must_not\n return { _specialNin: this.normalizeArrayValues(value) };\n case '$regex':\n return { text: value };\n case '$all':\n // For $all operator, all values must be present in the array\n // Qdrant doesn't have native $all, but we can use must with multiple match conditions\n return { _specialAll: this.normalizeArrayValues(value) };\n case '$exists':\n // $exists: true means field must not be null/empty\n // $exists: false means field must be null or empty\n return value ? { _specialExists: true } : { _specialNotExists: true };\n case '$not':\n // $not wraps another operator\n return { _specialNot: value };\n default:\n throw new Error(`Unsupported operator: ${operator}`);\n }\n }\n\n private translateGeoFilter(type: string, value: any): any {\n switch (type) {\n case 'box':\n return {\n geo_bounding_box: {\n top_left: value.top_left,\n bottom_right: value.bottom_right,\n },\n };\n case 'radius':\n return {\n geo_radius: {\n center: value.center,\n radius: value.radius,\n },\n };\n case 'polygon':\n return {\n geo_polygon: {\n exterior: value.exterior,\n interiors: value.interiors,\n },\n };\n default:\n throw new Error(`Unsupported geo filter type: ${type}`);\n }\n }\n\n private normalizeDatetimeRange(value: any): any {\n const range: Record<string, string> = {};\n for (const [op, val] of Object.entries(value)) {\n if (val instanceof Date) {\n range[op] = val.toISOString();\n } else if (typeof val === 'string') {\n // Assume string is already in proper format\n range[op] = val;\n }\n }\n return range;\n }\n}\n","import { MastraError, ErrorDomain, ErrorCategory } from '@mastra/core/error';\nimport { createVectorErrorId } from '@mastra/core/storage';\nimport { MastraVector, validateUpsertInput } from '@mastra/core/vector';\nimport type {\n QueryResult,\n IndexStats,\n CreateIndexParams,\n UpsertVectorParams,\n QueryVectorParams,\n DescribeIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n UpdateVectorParams,\n DeleteVectorsParams,\n} from '@mastra/core/vector';\nimport { QdrantClient } from '@qdrant/js-client-rest';\nimport type { QdrantClientParams, Schemas } from '@qdrant/js-client-rest';\n\nimport { QdrantFilterTranslator } from './filter';\nimport type { QdrantVectorFilter } from './filter';\n\nconst BATCH_SIZE = 256;\nconst DISTANCE_MAPPING: Record<string, Schemas['Distance']> = {\n cosine: 'Cosine',\n euclidean: 'Euclid',\n dotproduct: 'Dot',\n};\n\n/**\n * Configuration for a named vector space in Qdrant.\n * @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors\n */\nexport interface NamedVectorConfig {\n /** The dimension (size) of vectors in this space. */\n size: number;\n /** The distance metric for similarity search. */\n distance: 'cosine' | 'euclidean' | 'dotproduct';\n}\n\n/**\n * Query parameters for Qdrant vector store.\n * Extends the base QueryVectorParams with Qdrant-specific options.\n */\nexport interface QdrantQueryVectorParams extends QueryVectorParams<QdrantVectorFilter> {\n /**\n * Name of the vector field to query against when using named vectors.\n * Use this when your collection has multiple named vector fields.\n * @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors\n */\n using?: string;\n}\n\n/**\n * Parameters for creating a Qdrant index/collection.\n * Extends the base CreateIndexParams with support for named vectors.\n */\nexport interface QdrantCreateIndexParams extends CreateIndexParams {\n /**\n * Configuration for named vector spaces.\n * When provided, creates a collection with multiple named vector fields.\n * Each key is the vector name, and the value defines its configuration.\n * @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors\n *\n * @example\n * ```ts\n * namedVectors: {\n * text: { size: 768, distance: 'cosine' },\n * image: { size: 512, distance: 'euclidean' },\n * }\n * ```\n */\n namedVectors?: Record<string, NamedVectorConfig>;\n}\n\n/**\n * Parameters for upserting vectors into Qdrant.\n * Extends the base UpsertVectorParams with support for named vectors.\n */\nexport interface QdrantUpsertVectorParams extends UpsertVectorParams {\n /**\n * Name of the vector space to upsert into when using named vectors.\n * Required when the collection was created with namedVectors.\n * @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors\n */\n vectorName?: string;\n}\n\n/**\n * Supported payload schema types for Qdrant payload indexes.\n * These correspond to Qdrant's native payload indexing types.\n * @see https://qdrant.tech/documentation/concepts/indexing/#payload-index\n */\nexport type PayloadSchemaType = 'keyword' | 'integer' | 'float' | 'geo' | 'text' | 'bool' | 'datetime' | 'uuid';\n\n/**\n * Parameters for creating a payload index on a Qdrant collection.\n */\nexport interface CreatePayloadIndexParams {\n /** The name of the collection (index) to create the payload index on. */\n indexName: string;\n /** The name of the payload field to index. */\n fieldName: string;\n /** The schema type for the payload field. */\n fieldSchema: PayloadSchemaType;\n /** Whether to wait for the operation to complete. Defaults to true. */\n wait?: boolean;\n}\n\n/**\n * Parameters for deleting a payload index from a Qdrant collection.\n */\nexport interface DeletePayloadIndexParams {\n /** The name of the collection (index) to delete the payload index from. */\n indexName: string;\n /** The name of the payload field index to delete. */\n fieldName: string;\n /** Whether to wait for the operation to complete. Defaults to true. */\n wait?: boolean;\n}\n\nexport class QdrantVector extends MastraVector {\n protected client: QdrantClient;\n\n /**\n * Creates a new QdrantVector client.\n * @param id - The unique identifier for this vector store instance.\n * @param url - The URL of the Qdrant server.\n * @param apiKey - The API key for Qdrant.\n * @param https - Whether to use HTTPS.\n */\n constructor({ id, ...qdrantParams }: QdrantClientParams & { id: string }) {\n super({ id });\n this.client = new QdrantClient(qdrantParams);\n }\n\n /**\n * Validates that a named vector exists in the collection.\n * @param indexName - The name of the collection to check.\n * @param vectorName - The name of the vector space to validate.\n * @throws Error if the vector name doesn't exist in the collection.\n */\n private async validateVectorName(indexName: string, vectorName: string): Promise<void> {\n const { config } = await this.client.getCollection(indexName);\n const vectorsConfig = config.params.vectors;\n const isNamedVectors = vectorsConfig && typeof vectorsConfig === 'object' && !('size' in vectorsConfig);\n\n if (!isNamedVectors || !(vectorName in vectorsConfig)) {\n throw new Error(`Vector name \"${vectorName}\" does not exist in collection \"${indexName}\"`);\n }\n }\n\n /**\n * Upserts vectors into the index.\n * @param indexName - The name of the index to upsert into.\n * @param vectors - Array of embedding vectors.\n * @param metadata - Optional metadata for each vector.\n * @param ids - Optional vector IDs (auto-generated if not provided).\n * @param vectorName - Optional name of the vector space when using named vectors.\n */\n async upsert({ indexName, vectors, metadata, ids, vectorName }: QdrantUpsertVectorParams): Promise<string[]> {\n // Validate input parameters\n validateUpsertInput('QDRANT', vectors, metadata, ids);\n const pointIds = ids || vectors.map(() => crypto.randomUUID());\n\n // Validate vector name if provided\n if (vectorName) {\n try {\n await this.validateVectorName(indexName, vectorName);\n } catch (validationError) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'UPSERT', 'INVALID_VECTOR_NAME'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, vectorName },\n },\n validationError,\n );\n }\n }\n\n const records = vectors.map((vector, i) => ({\n id: pointIds[i]!,\n vector: vectorName ? { [vectorName]: vector } : vector,\n payload: metadata?.[i] || {},\n }));\n\n try {\n for (let i = 0; i < records.length; i += BATCH_SIZE) {\n const batch = records.slice(i, i + BATCH_SIZE);\n await this.client.upsert(indexName, {\n points: batch,\n wait: true,\n });\n }\n\n return pointIds;\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'UPSERT', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, vectorCount: vectors.length, ...(vectorName && { vectorName }) },\n },\n error,\n );\n }\n }\n\n /**\n * Creates a new index (collection) in Qdrant.\n * Supports both single vector and named vector configurations.\n *\n * @param indexName - The name of the collection to create.\n * @param dimension - Vector dimension (required for single vector mode).\n * @param metric - Distance metric (default: 'cosine').\n * @param namedVectors - Optional named vector configurations for multi-vector collections.\n *\n * @example\n * ```ts\n * // Single vector collection\n * await qdrant.createIndex({ indexName: 'docs', dimension: 768, metric: 'cosine' });\n *\n * // Named vectors collection\n * await qdrant.createIndex({\n * indexName: 'multi-modal',\n * dimension: 768, // Used as fallback, can be omitted with namedVectors\n * namedVectors: {\n * text: { size: 768, distance: 'cosine' },\n * image: { size: 512, distance: 'euclidean' },\n * },\n * });\n * ```\n */\n async createIndex({ indexName, dimension, metric = 'cosine', namedVectors }: QdrantCreateIndexParams): Promise<void> {\n try {\n if (namedVectors) {\n // Validate named vectors configuration\n if (Object.keys(namedVectors).length === 0) {\n throw new Error('namedVectors must contain at least one named vector configuration');\n }\n for (const [name, config] of Object.entries(namedVectors)) {\n if (!Number.isInteger(config.size) || config.size <= 0) {\n throw new Error(`Named vector \"${name}\": size must be a positive integer`);\n }\n if (!DISTANCE_MAPPING[config.distance]) {\n throw new Error(\n `Named vector \"${name}\": invalid distance \"${config.distance}\". Must be one of: cosine, euclidean, dotproduct`,\n );\n }\n }\n } else {\n // Validate single vector configuration\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n if (!DISTANCE_MAPPING[metric]) {\n throw new Error(`Invalid metric: \"${metric}\". Must be one of: cosine, euclidean, dotproduct`);\n }\n }\n } catch (validationError) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'CREATE_INDEX', 'INVALID_ARGS'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n indexName,\n dimension,\n metric,\n ...(namedVectors && { namedVectorNames: Object.keys(namedVectors).join(', ') }),\n },\n },\n validationError,\n );\n }\n\n try {\n // Build vectors configuration\n if (namedVectors) {\n const namedVectorsConfig = Object.entries(namedVectors).reduce(\n (acc, [name, config]) => {\n acc[name] = {\n size: config.size,\n distance: DISTANCE_MAPPING[config.distance]!,\n };\n return acc;\n },\n {} as Record<string, { size: number; distance: Schemas['Distance'] }>,\n );\n\n await this.client.createCollection(indexName, {\n vectors: namedVectorsConfig,\n });\n } else {\n await this.client.createCollection(indexName, {\n vectors: {\n size: dimension,\n distance: DISTANCE_MAPPING[metric]!,\n },\n });\n }\n } catch (error: any) {\n const message = error?.message || error?.toString();\n // Qdrant typically returns 409 for existing collection\n if (error?.status === 409 || (typeof message === 'string' && message.toLowerCase().includes('exists'))) {\n if (!namedVectors) {\n // Fetch collection info and check dimension for single vector mode\n await this.validateExistingIndex(indexName, dimension, metric);\n } else {\n // For named vectors, just log and continue (validation is complex)\n this.logger.info(\n `Collection \"${indexName}\" already exists. Skipping validation for named vectors configuration.`,\n );\n }\n return;\n }\n\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'CREATE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n }\n\n transformFilter(filter?: QdrantVectorFilter) {\n const translator = new QdrantFilterTranslator();\n return translator.translate(filter);\n }\n\n /**\n * Queries the index for similar vectors.\n *\n * @param indexName - The name of the index to query.\n * @param queryVector - The query vector to find similar vectors for.\n * @param topK - Number of results to return (default: 10).\n * @param filter - Optional metadata filter.\n * @param includeVector - Whether to include vectors in results (default: false).\n * @param using - Name of the vector space to query when using named vectors.\n */\n async query({\n indexName,\n queryVector,\n topK = 10,\n filter,\n includeVector = false,\n using,\n }: QdrantQueryVectorParams): Promise<QueryResult[]> {\n const translatedFilter = this.transformFilter(filter) ?? {};\n\n try {\n const results = (\n await this.client.query(indexName, {\n query: queryVector,\n limit: topK,\n filter: translatedFilter,\n with_payload: true,\n with_vector: includeVector,\n ...(using ? { using } : {}),\n })\n ).points;\n\n return results.map(match => {\n let vector: number[] = [];\n if (includeVector && match.vector != null) {\n if (Array.isArray(match.vector)) {\n // Single vector mode - already an array of numbers\n vector = match.vector as number[];\n } else if (typeof match.vector === 'object' && match.vector !== null) {\n // Named vectors mode - extract from the correct vector space\n const namedVectors = match.vector as Record<string, unknown>;\n\n // If `using` is specified, try to get that specific vector\n // Otherwise, find the first array in the object\n const sourceArray: unknown[] | undefined =\n using && Array.isArray(namedVectors[using])\n ? (namedVectors[using] as unknown[])\n : (Object.values(namedVectors).find(v => Array.isArray(v)) as unknown[] | undefined);\n\n if (sourceArray) {\n vector = sourceArray.filter((v): v is number => typeof v === 'number');\n }\n }\n }\n\n return {\n id: match.id as string,\n score: match.score || 0,\n metadata: match.payload as Record<string, any>,\n ...(includeVector && { vector }),\n };\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'QUERY', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, topK, ...(using && { using }) },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const response = await this.client.getCollections();\n return response.collections.map(collection => collection.name) || [];\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'LIST_INDEXES', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n /**\n * Retrieves statistics about a vector index.\n *\n * @param {string} indexName - The name of the index to describe\n * @returns A promise that resolves to the index statistics including dimension, count and metric\n */\n async describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats> {\n try {\n const { config, points_count } = await this.client.getCollection(indexName);\n\n const distance = config.params.vectors?.distance as Schemas['Distance'];\n return {\n dimension: config.params.vectors?.size as number,\n count: points_count || 0,\n // @ts-expect-error\n metric: Object.keys(DISTANCE_MAPPING).find(key => DISTANCE_MAPPING[key] === distance),\n };\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DESCRIBE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n try {\n await this.client.deleteCollection(indexName);\n } catch (error: any) {\n // If the collection doesn't exist, treat it as a no-op (already deleted)\n const errorMessage = error?.message || error?.toString() || '';\n if (\n error?.status === 404 ||\n errorMessage.toLowerCase().includes('not found') ||\n errorMessage.toLowerCase().includes('not exist')\n ) {\n this.logger.info(`Collection ${indexName} does not exist, treating as already deleted`);\n return;\n }\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n /**\n * Updates a vector by its ID or multiple vectors matching a filter.\n * @param indexName - The name of the index containing the vector(s).\n * @param id - The ID of the vector to update (mutually exclusive with filter).\n * @param filter - Filter to match multiple vectors to update (mutually exclusive with id).\n * @param update - An object containing the vector and/or metadata to update.\n * @param update.vector - An optional array of numbers representing the new vector.\n * @param update.metadata - An optional record containing the new metadata.\n * @returns A promise that resolves when the update is complete.\n * @throws Will throw an error if no updates are provided or if the update operation fails.\n */\n async updateVector({ indexName, id, filter, update }: UpdateVectorParams<QdrantVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (id && filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both id and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (!id && !filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'NO_TARGET'),\n text: 'Either id or filter must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (!update.vector && !update.metadata) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'NO_PAYLOAD'),\n text: 'No updates provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: {\n indexName,\n ...(id && { id }),\n },\n });\n }\n\n // Validate filter is not empty\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'EMPTY_FILTER'),\n text: 'Filter cannot be an empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n try {\n if (id) {\n // Update single vector by ID\n const pointId = this.parsePointId(id);\n\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n await this.client.setPayload(indexName, { payload: update.metadata, points: [pointId] });\n return;\n }\n\n // Handle vector-only update\n if (update.vector && !update.metadata) {\n await this.client.updateVectors(indexName, {\n points: [\n {\n id: pointId,\n vector: update.vector,\n },\n ],\n });\n return;\n }\n\n // Handle both vector and metadata update\n if (update.vector && update.metadata) {\n const point = {\n id: pointId,\n vector: update.vector,\n payload: update.metadata,\n };\n\n await this.client.upsert(indexName, {\n points: [point],\n });\n return;\n }\n } else if (filter) {\n // Update multiple vectors matching filter\n const translatedFilter = this.transformFilter(filter);\n\n // First, scroll through all matching points to get their IDs\n const matchingPoints: Array<{ id: string | number; vector?: number[] }> = [];\n let offset: string | number | undefined = undefined;\n\n do {\n const scrollResult = await this.client.scroll(indexName, {\n filter: translatedFilter,\n limit: 100,\n offset,\n with_payload: false,\n with_vector: update.vector ? false : true, // Only fetch vectors if not updating them\n });\n\n matchingPoints.push(\n ...scrollResult.points.map(point => ({\n id: point.id,\n vector: Array.isArray(point.vector) ? (point.vector as number[]) : undefined,\n })),\n );\n\n const nextOffset = scrollResult.next_page_offset;\n offset = typeof nextOffset === 'string' || typeof nextOffset === 'number' ? nextOffset : undefined;\n } while (offset !== undefined);\n\n if (matchingPoints.length === 0) {\n // No vectors to update - this is not an error\n return;\n }\n\n const pointIds = matchingPoints.map(p => p.id);\n\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n await this.client.setPayload(indexName, { payload: update.metadata, points: pointIds });\n return;\n }\n\n // Handle vector-only or both updates\n if (update.vector) {\n // For vector updates with filter, we need to upsert each point\n const points = matchingPoints.map(p => ({\n id: p.id,\n vector: update.vector!,\n payload: update.metadata || {},\n }));\n\n // Batch upsert\n for (let i = 0; i < points.length; i += BATCH_SIZE) {\n const batch = points.slice(i, i + BATCH_SIZE);\n await this.client.upsert(indexName, {\n points: batch,\n wait: true,\n });\n }\n return;\n }\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'UPDATE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n ...(filter && { filter: JSON.stringify(filter) }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ indexName, id }: DeleteVectorParams): Promise<void> {\n try {\n // Parse the ID - Qdrant supports both string and numeric IDs\n const pointId = this.parsePointId(id);\n\n // Use the Qdrant client to delete the point from the collection\n await this.client.delete(indexName, {\n points: [pointId],\n });\n } catch (error) {\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_VECTOR', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(id && { id }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Parses and converts a string ID to the appropriate type (string or number) for Qdrant point operations.\n *\n * Qdrant supports both numeric and string IDs. This helper method ensures IDs are in the correct format\n * before sending them to the Qdrant client API.\n *\n * @param id - The ID string to parse\n * @returns The parsed ID as either a number (if string contains only digits) or the original string\n *\n * @example\n * // Numeric ID strings are converted to numbers\n * parsePointId(\"123\") => 123\n * parsePointId(\"42\") => 42\n * parsePointId(\"0\") => 0\n *\n * // String IDs containing any non-digit characters remain as strings\n * parsePointId(\"doc-123\") => \"doc-123\"\n * parsePointId(\"user_42\") => \"user_42\"\n * parsePointId(\"abc123\") => \"abc123\"\n * parsePointId(\"123abc\") => \"123abc\"\n * parsePointId(\"\") => \"\"\n * parsePointId(\"uuid-5678-xyz\") => \"uuid-5678-xyz\"\n *\n * @remarks\n * - This conversion is important because Qdrant treats numeric and string IDs differently\n * - Only positive integers are converted to numbers (negative numbers with minus signs remain strings)\n * - The method uses base-10 parsing, so leading zeros will be dropped in numeric conversions\n * - reference: https://qdrant.tech/documentation/concepts/points/?q=qdrant+point+id#point-ids\n */\n private parsePointId(id: string): string | number {\n // Try to parse as number if it looks like one\n if (/^\\d+$/.test(id)) {\n return parseInt(id, 10);\n }\n return id;\n }\n\n /**\n * Deletes multiple vectors by IDs or filter.\n * @param indexName - The name of the index containing the vectors.\n * @param ids - Array of vector IDs to delete (mutually exclusive with filter).\n * @param filter - Filter to match vectors to delete (mutually exclusive with ids).\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if both ids and filter are provided, or if neither is provided.\n */\n async deleteVectors({ indexName, filter, ids }: DeleteVectorsParams<QdrantVectorFilter>): Promise<void> {\n // Validate mutually exclusive parameters\n if (ids && filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'MUTUALLY_EXCLUSIVE'),\n text: 'Cannot specify both ids and filter - they are mutually exclusive',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n if (!ids && !filter) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'NO_TARGET'),\n text: 'Either filter or ids must be provided',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n // Validate ids array is not empty\n if (ids && ids.length === 0) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'EMPTY_IDS'),\n text: 'Cannot delete with empty ids array',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n // Validate filter is not empty\n if (filter && Object.keys(filter).length === 0) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'EMPTY_FILTER'),\n text: 'Cannot delete with empty filter object',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n });\n }\n\n try {\n if (ids) {\n // Delete by IDs - parse all IDs to support both string and numeric formats\n const pointIds = ids.map(id => this.parsePointId(id));\n try {\n await this.client.delete(indexName, {\n points: pointIds,\n wait: true,\n });\n } catch (error: any) {\n // Qdrant throws \"Bad Request\" when trying to delete non-existent IDs\n // This is expected behavior and should be handled gracefully\n const message = error?.message || error?.toString() || '';\n if (message.toLowerCase().includes('bad request')) {\n // Silently ignore - deleting non-existent IDs is not an error\n return;\n }\n throw error;\n }\n } else if (filter) {\n // Delete by filter\n const translatedFilter = this.transformFilter(filter) ?? {};\n await this.client.delete(indexName, {\n filter: translatedFilter as any,\n wait: true,\n });\n }\n } catch (error) {\n if (error instanceof MastraError) throw error;\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_VECTORS', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n ...(filter && { filter: JSON.stringify(filter) }),\n ...(ids && { idsCount: ids.length }),\n },\n },\n error,\n );\n }\n }\n\n /**\n * Creates a payload index on a Qdrant collection to enable efficient filtering on metadata fields.\n *\n * This is required for Qdrant Cloud and any Qdrant instance with `strict_mode_config = true`,\n * where metadata (payload) fields must be explicitly indexed before they can be used for filtering.\n *\n * @param params - The parameters for creating the payload index.\n * @param params.indexName - The name of the collection (index) to create the payload index on.\n * @param params.fieldName - The name of the payload field to index.\n * @param params.fieldSchema - The schema type for the field (e.g., 'keyword', 'integer', 'text').\n * @param params.wait - Whether to wait for the operation to complete. Defaults to true.\n * @returns A promise that resolves when the index is created (idempotent if index already exists).\n * @throws Will throw a MastraError if arguments are invalid or if the operation fails.\n *\n * @example\n * ```ts\n * // Create a keyword index for filtering by source\n * await qdrant.createPayloadIndex({\n * indexName: 'my-collection',\n * fieldName: 'source',\n * fieldSchema: 'keyword',\n * });\n *\n * // Create an integer index for numeric filtering\n * await qdrant.createPayloadIndex({\n * indexName: 'my-collection',\n * fieldName: 'price',\n * fieldSchema: 'integer',\n * });\n * ```\n *\n * @see https://qdrant.tech/documentation/concepts/indexing/#payload-index\n */\n async createPayloadIndex({\n indexName,\n fieldName,\n fieldSchema,\n wait = true,\n }: CreatePayloadIndexParams): Promise<void> {\n // Validate inputs\n const validSchemas: PayloadSchemaType[] = [\n 'keyword',\n 'integer',\n 'float',\n 'geo',\n 'text',\n 'bool',\n 'datetime',\n 'uuid',\n ];\n\n if (!indexName || typeof indexName !== 'string' || indexName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'indexName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName, fieldSchema },\n });\n }\n\n if (!fieldName || typeof fieldName !== 'string' || fieldName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'fieldName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName, fieldSchema },\n });\n }\n\n if (!validSchemas.includes(fieldSchema)) {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: `fieldSchema must be one of: ${validSchemas.join(', ')}`,\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName, fieldSchema },\n });\n }\n\n try {\n await this.client.createPayloadIndex(indexName, {\n field_name: fieldName,\n field_schema: fieldSchema,\n wait,\n });\n } catch (error: any) {\n const message = error?.message || error?.toString() || '';\n // Qdrant returns 409 or \"exists\" message if index already exists - treat as idempotent success\n if (error?.status === 409 || message.toLowerCase().includes('exists')) {\n this.logger.info(`Payload index for field \"${fieldName}\" already exists on collection \"${indexName}\"`);\n return;\n }\n\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'CREATE_PAYLOAD_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, fieldName, fieldSchema },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a payload index from a Qdrant collection.\n *\n * @param params - The parameters for deleting the payload index.\n * @param params.indexName - The name of the collection (index) to delete the payload index from.\n * @param params.fieldName - The name of the payload field index to delete.\n * @param params.wait - Whether to wait for the operation to complete. Defaults to true.\n * @returns A promise that resolves when the index is deleted (idempotent if index doesn't exist).\n * @throws Will throw a MastraError if the operation fails.\n *\n * @example\n * ```ts\n * await qdrant.deletePayloadIndex({\n * indexName: 'my-collection',\n * fieldName: 'source',\n * });\n * ```\n */\n async deletePayloadIndex({ indexName, fieldName, wait = true }: DeletePayloadIndexParams): Promise<void> {\n // Validate inputs\n if (!indexName || typeof indexName !== 'string' || indexName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'indexName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName },\n });\n }\n\n if (!fieldName || typeof fieldName !== 'string' || fieldName.trim() === '') {\n throw new MastraError({\n id: createVectorErrorId('QDRANT', 'DELETE_PAYLOAD_INDEX', 'INVALID_ARGS'),\n text: 'fieldName must be a non-empty string',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, fieldName },\n });\n }\n\n try {\n await this.client.deletePayloadIndex(indexName, fieldName, { wait });\n } catch (error: any) {\n const message = error?.message || error?.toString() || '';\n // If index doesn't exist, treat as idempotent success (already deleted)\n if (\n error?.status === 404 ||\n message.toLowerCase().includes('not found') ||\n message.toLowerCase().includes('not exist')\n ) {\n this.logger.info(`Payload index for field \"${fieldName}\" does not exist on collection \"${indexName}\"`);\n return;\n }\n\n throw new MastraError(\n {\n id: createVectorErrorId('QDRANT', 'DELETE_PAYLOAD_INDEX', 'FAILED'),\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName, fieldName },\n },\n error,\n );\n }\n }\n}\n","/**\n * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Qdrant Vector.\n */\nexport const QDRANT_PROMPT = `When querying Qdrant, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n- $match: Match text using full-text search\n Example: { \"description\": { \"$match\": \"gaming laptop\" } }\n- $null: Check if field is null\n Example: { \"rating\": { \"$null\": true } }\n\nRestrictions:\n- Regex patterns are not supported\n- Only $and, $or, and $not logical operators are supported at the top level\n- Empty arrays in $in/$nin will return no results\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or, $not):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"description\": { \"$match\": \"gaming laptop\" } },\n { \"rating\": { \"$exists\": true, \"$gt\": 4 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": { \"$null\": false } }\n ]},\n { \"$not\": { \"status\": \"discontinued\" } }\n ]\n}`;\n"]}
|
package/dist/vector/filter.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BaseFilterTranslator } from '@mastra/core/vector/filter';
|
|
2
2
|
import type { VectorFilter, LogicalOperator, OperatorSupport, OperatorValueMap, LogicalOperatorValueMap, BlacklistedRootOperators } from '@mastra/core/vector/filter';
|
|
3
|
-
type QdrantOperatorValueMap = Omit<OperatorValueMap, '$options' | '$elemMatch'
|
|
3
|
+
type QdrantOperatorValueMap = Omit<OperatorValueMap, '$options' | '$elemMatch'> & {
|
|
4
4
|
/**
|
|
5
5
|
* $count: Filter by array length or value count.
|
|
6
6
|
* Example: { tags: { $count: { gt: 2 } } }
|
|
@@ -89,6 +89,7 @@ export type QdrantVectorFilter = VectorFilter<keyof QdrantOperatorValueMap, Qdra
|
|
|
89
89
|
export declare class QdrantFilterTranslator extends BaseFilterTranslator<QdrantVectorFilter> {
|
|
90
90
|
protected isLogicalOperator(key: string): key is LogicalOperator;
|
|
91
91
|
protected getSupportedOperators(): OperatorSupport;
|
|
92
|
+
protected isOperator(key: string): key is any;
|
|
92
93
|
translate(filter?: QdrantVectorFilter): QdrantVectorFilter;
|
|
93
94
|
private createCondition;
|
|
94
95
|
private translateNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/vector/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAEpC,KAAK,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/vector/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AAEpC,KAAK,sBAAsB,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG;IAChF;;;OAGG;IACH,MAAM,EAAE;QACN,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;IAEF;;;OAGG;IACH,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IAEF;;;;OAIG;IACH,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAE1B;;;OAGG;IACH,OAAO,EAAE;QAEP,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IAEF;;;;OAIG;IACH,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC;IAE7B;;;OAGG;IACH,SAAS,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE;YACN,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;YACnB,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;YACpB,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;YACnB,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;YACpB,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;SACpB,CAAC;KACH,CAAC;IAEF;;;OAGG;IACH,KAAK,EAAE,OAAO,CAAC;IAEf;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,6BAA6B,GAAG,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAE3E,KAAK,8BAA8B,GAC/B,wBAAwB,GACxB,QAAQ,GACR,MAAM,GACN,SAAS,GACT,WAAW,GACX,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAC3C,MAAM,sBAAsB,EAC5B,sBAAsB,EACtB,6BAA6B,EAC7B,8BAA8B,CAC/B,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAuB,SAAQ,oBAAoB,CAAC,kBAAkB,CAAC;cAC/D,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,eAAe;cAItD,qBAAqB,IAAI,eAAe;cAWxC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,GAAG;IAMtD,SAAS,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,kBAAkB;IAM1D,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,aAAa;IA4CrB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,sBAAsB;IAgC9B,OAAO,CAAC,qBAAqB;IAuE7B,OAAO,CAAC,uBAAuB;IAuC/B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,sBAAsB;IAgD9B,OAAO,CAAC,kBAAkB;IA4B1B,OAAO,CAAC,sBAAsB;CAY/B"}
|
package/dist/vector/index.d.ts
CHANGED
|
@@ -1,8 +1,63 @@
|
|
|
1
1
|
import { MastraVector } from '@mastra/core/vector';
|
|
2
2
|
import type { QueryResult, IndexStats, CreateIndexParams, UpsertVectorParams, QueryVectorParams, DescribeIndexParams, DeleteIndexParams, DeleteVectorParams, UpdateVectorParams, DeleteVectorsParams } from '@mastra/core/vector';
|
|
3
|
+
import { QdrantClient } from '@qdrant/js-client-rest';
|
|
3
4
|
import type { QdrantClientParams } from '@qdrant/js-client-rest';
|
|
4
5
|
import type { QdrantVectorFilter } from './filter.js';
|
|
5
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for a named vector space in Qdrant.
|
|
8
|
+
* @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors
|
|
9
|
+
*/
|
|
10
|
+
export interface NamedVectorConfig {
|
|
11
|
+
/** The dimension (size) of vectors in this space. */
|
|
12
|
+
size: number;
|
|
13
|
+
/** The distance metric for similarity search. */
|
|
14
|
+
distance: 'cosine' | 'euclidean' | 'dotproduct';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Query parameters for Qdrant vector store.
|
|
18
|
+
* Extends the base QueryVectorParams with Qdrant-specific options.
|
|
19
|
+
*/
|
|
20
|
+
export interface QdrantQueryVectorParams extends QueryVectorParams<QdrantVectorFilter> {
|
|
21
|
+
/**
|
|
22
|
+
* Name of the vector field to query against when using named vectors.
|
|
23
|
+
* Use this when your collection has multiple named vector fields.
|
|
24
|
+
* @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors
|
|
25
|
+
*/
|
|
26
|
+
using?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parameters for creating a Qdrant index/collection.
|
|
30
|
+
* Extends the base CreateIndexParams with support for named vectors.
|
|
31
|
+
*/
|
|
32
|
+
export interface QdrantCreateIndexParams extends CreateIndexParams {
|
|
33
|
+
/**
|
|
34
|
+
* Configuration for named vector spaces.
|
|
35
|
+
* When provided, creates a collection with multiple named vector fields.
|
|
36
|
+
* Each key is the vector name, and the value defines its configuration.
|
|
37
|
+
* @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* namedVectors: {
|
|
42
|
+
* text: { size: 768, distance: 'cosine' },
|
|
43
|
+
* image: { size: 512, distance: 'euclidean' },
|
|
44
|
+
* }
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
namedVectors?: Record<string, NamedVectorConfig>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Parameters for upserting vectors into Qdrant.
|
|
51
|
+
* Extends the base UpsertVectorParams with support for named vectors.
|
|
52
|
+
*/
|
|
53
|
+
export interface QdrantUpsertVectorParams extends UpsertVectorParams {
|
|
54
|
+
/**
|
|
55
|
+
* Name of the vector space to upsert into when using named vectors.
|
|
56
|
+
* Required when the collection was created with namedVectors.
|
|
57
|
+
* @see https://qdrant.tech/documentation/concepts/vectors/#named-vectors
|
|
58
|
+
*/
|
|
59
|
+
vectorName?: string;
|
|
60
|
+
}
|
|
6
61
|
/**
|
|
7
62
|
* Supported payload schema types for Qdrant payload indexes.
|
|
8
63
|
* These correspond to Qdrant's native payload indexing types.
|
|
@@ -34,7 +89,7 @@ export interface DeletePayloadIndexParams {
|
|
|
34
89
|
wait?: boolean;
|
|
35
90
|
}
|
|
36
91
|
export declare class QdrantVector extends MastraVector {
|
|
37
|
-
|
|
92
|
+
protected client: QdrantClient;
|
|
38
93
|
/**
|
|
39
94
|
* Creates a new QdrantVector client.
|
|
40
95
|
* @param id - The unique identifier for this vector store instance.
|
|
@@ -45,10 +100,60 @@ export declare class QdrantVector extends MastraVector {
|
|
|
45
100
|
constructor({ id, ...qdrantParams }: QdrantClientParams & {
|
|
46
101
|
id: string;
|
|
47
102
|
});
|
|
48
|
-
|
|
49
|
-
|
|
103
|
+
/**
|
|
104
|
+
* Validates that a named vector exists in the collection.
|
|
105
|
+
* @param indexName - The name of the collection to check.
|
|
106
|
+
* @param vectorName - The name of the vector space to validate.
|
|
107
|
+
* @throws Error if the vector name doesn't exist in the collection.
|
|
108
|
+
*/
|
|
109
|
+
private validateVectorName;
|
|
110
|
+
/**
|
|
111
|
+
* Upserts vectors into the index.
|
|
112
|
+
* @param indexName - The name of the index to upsert into.
|
|
113
|
+
* @param vectors - Array of embedding vectors.
|
|
114
|
+
* @param metadata - Optional metadata for each vector.
|
|
115
|
+
* @param ids - Optional vector IDs (auto-generated if not provided).
|
|
116
|
+
* @param vectorName - Optional name of the vector space when using named vectors.
|
|
117
|
+
*/
|
|
118
|
+
upsert({ indexName, vectors, metadata, ids, vectorName }: QdrantUpsertVectorParams): Promise<string[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Creates a new index (collection) in Qdrant.
|
|
121
|
+
* Supports both single vector and named vector configurations.
|
|
122
|
+
*
|
|
123
|
+
* @param indexName - The name of the collection to create.
|
|
124
|
+
* @param dimension - Vector dimension (required for single vector mode).
|
|
125
|
+
* @param metric - Distance metric (default: 'cosine').
|
|
126
|
+
* @param namedVectors - Optional named vector configurations for multi-vector collections.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```ts
|
|
130
|
+
* // Single vector collection
|
|
131
|
+
* await qdrant.createIndex({ indexName: 'docs', dimension: 768, metric: 'cosine' });
|
|
132
|
+
*
|
|
133
|
+
* // Named vectors collection
|
|
134
|
+
* await qdrant.createIndex({
|
|
135
|
+
* indexName: 'multi-modal',
|
|
136
|
+
* dimension: 768, // Used as fallback, can be omitted with namedVectors
|
|
137
|
+
* namedVectors: {
|
|
138
|
+
* text: { size: 768, distance: 'cosine' },
|
|
139
|
+
* image: { size: 512, distance: 'euclidean' },
|
|
140
|
+
* },
|
|
141
|
+
* });
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
createIndex({ indexName, dimension, metric, namedVectors }: QdrantCreateIndexParams): Promise<void>;
|
|
50
145
|
transformFilter(filter?: QdrantVectorFilter): QdrantVectorFilter;
|
|
51
|
-
|
|
146
|
+
/**
|
|
147
|
+
* Queries the index for similar vectors.
|
|
148
|
+
*
|
|
149
|
+
* @param indexName - The name of the index to query.
|
|
150
|
+
* @param queryVector - The query vector to find similar vectors for.
|
|
151
|
+
* @param topK - Number of results to return (default: 10).
|
|
152
|
+
* @param filter - Optional metadata filter.
|
|
153
|
+
* @param includeVector - Whether to include vectors in results (default: false).
|
|
154
|
+
* @param using - Name of the vector space to query when using named vectors.
|
|
155
|
+
*/
|
|
156
|
+
query({ indexName, queryVector, topK, filter, includeVector, using, }: QdrantQueryVectorParams): Promise<QueryResult[]>;
|
|
52
157
|
listIndexes(): Promise<string[]>;
|
|
53
158
|
/**
|
|
54
159
|
* Retrieves statistics about a vector index.
|
|
@@ -171,5 +276,4 @@ export declare class QdrantVector extends MastraVector {
|
|
|
171
276
|
*/
|
|
172
277
|
deletePayloadIndex({ indexName, fieldName, wait }: DeletePayloadIndexParams): Promise<void>;
|
|
173
278
|
}
|
|
174
|
-
export {};
|
|
175
279
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAuB,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAW,MAAM,wBAAwB,CAAC;AAG1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AASnD;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB,CAAC,kBAAkB,CAAC;IACpF;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE;;;;;;;;;;;;;OAaG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;AAEhH;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,WAAW,EAAE,iBAAiB,CAAC;IAC/B,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;IAE/B;;;;;;OAMG;gBACS,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,kBAAkB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAKxE;;;;;OAKG;YACW,kBAAkB;IAUhC;;;;;;;OAOG;IACG,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmD5G;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAiB,EAAE,YAAY,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgGpH,eAAe,CAAC,MAAM,CAAC,EAAE,kBAAkB;IAK3C;;;;;;;;;OASG;IACG,KAAK,CAAC,EACV,SAAS,EACT,WAAW,EACX,IAAS,EACT,MAAM,EACN,aAAqB,EACrB,KAAK,GACN,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0D7C,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBtC;;;;;OAKG;IACG,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBtE,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BlE;;;;;;;;;;OAUG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkK5G;;;;;;OAMG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,OAAO,CAAC,YAAY;IAQpB;;;;;;;OAOG;IACG,aAAa,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,mBAAmB,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAyFvG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACG,kBAAkB,CAAC,EACvB,SAAS,EACT,SAAS,EACT,WAAW,EACX,IAAW,GACZ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqE3C;;;;;;;;;;;;;;;;;OAiBG;IACG,kBAAkB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAW,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;CA+CzG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/qdrant",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Qdrant vector store provider for Mastra",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"tsup": "^8.5.0",
|
|
31
31
|
"typescript": "^5.9.3",
|
|
32
32
|
"vitest": "4.0.16",
|
|
33
|
-
"@internal/lint": "0.0.
|
|
34
|
-
"@internal/storage-test-utils": "0.0.
|
|
35
|
-
"@
|
|
36
|
-
"@
|
|
33
|
+
"@internal/lint": "0.0.54",
|
|
34
|
+
"@internal/storage-test-utils": "0.0.50",
|
|
35
|
+
"@mastra/core": "1.0.0",
|
|
36
|
+
"@internal/types-builder": "0.0.29"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@mastra/core": ">=1.0.0-0 <2.0.0-0"
|