@mastra/qdrant 1.0.0-beta.1 → 1.0.0-beta.2
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 +9 -0
- package/dist/index.cjs +19 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +19 -18
- package/dist/index.js.map +1 -1
- package/dist/vector/index.d.ts.map +1 -1
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @mastra/qdrant
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Standardize error IDs across all storage and vector stores using centralized helper functions (`createStorageErrorId` and `createVectorErrorId`). This ensures consistent error ID patterns (`MASTRA_STORAGE_{STORE}_{OPERATION}_{STATUS}` and `MASTRA_VECTOR_{STORE}_{OPERATION}_{STATUS}`) across the codebase for better error tracking and debugging. ([#10913](https://github.com/mastra-ai/mastra/pull/10913))
|
|
8
|
+
|
|
9
|
+
- Updated dependencies [[`3076c67`](https://github.com/mastra-ai/mastra/commit/3076c6778b18988ae7d5c4c5c466366974b2d63f), [`85d7ee1`](https://github.com/mastra-ai/mastra/commit/85d7ee18ff4e14d625a8a30ec6656bb49804989b), [`c6c1092`](https://github.com/mastra-ai/mastra/commit/c6c1092f8fbf76109303f69e000e96fd1960c4ce), [`81dc110`](https://github.com/mastra-ai/mastra/commit/81dc11008d147cf5bdc8996ead1aa61dbdebb6fc), [`7aedb74`](https://github.com/mastra-ai/mastra/commit/7aedb74883adf66af38e270e4068fd42e7a37036), [`8f02d80`](https://github.com/mastra-ai/mastra/commit/8f02d800777397e4b45d7f1ad041988a8b0c6630), [`d7aad50`](https://github.com/mastra-ai/mastra/commit/d7aad501ce61646b76b4b511e558ac4eea9884d0), [`ce0a73a`](https://github.com/mastra-ai/mastra/commit/ce0a73abeaa75b10ca38f9e40a255a645d50ebfb), [`a02e542`](https://github.com/mastra-ai/mastra/commit/a02e542d23179bad250b044b17ff023caa61739f), [`a372c64`](https://github.com/mastra-ai/mastra/commit/a372c640ad1fd12e8f0613cebdc682fc156b4d95), [`8846867`](https://github.com/mastra-ai/mastra/commit/8846867ffa9a3746767618e314bebac08eb77d87), [`42a42cf`](https://github.com/mastra-ai/mastra/commit/42a42cf3132b9786feecbb8c13c583dce5b0e198), [`ae08bf0`](https://github.com/mastra-ai/mastra/commit/ae08bf0ebc6a4e4da992b711c4a389c32ba84cf4), [`21735a7`](https://github.com/mastra-ai/mastra/commit/21735a7ef306963554a69a89b44f06c3bcd85141), [`1d877b8`](https://github.com/mastra-ai/mastra/commit/1d877b8d7b536a251c1a7a18db7ddcf4f68d6f8b)]:
|
|
10
|
+
- @mastra/core@1.0.0-beta.7
|
|
11
|
+
|
|
3
12
|
## 1.0.0-beta.1
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var error = require('@mastra/core/error');
|
|
4
|
+
var storage = require('@mastra/core/storage');
|
|
4
5
|
var vector = require('@mastra/core/vector');
|
|
5
6
|
var jsClientRest = require('@qdrant/js-client-rest');
|
|
6
7
|
var filter = require('@mastra/core/vector/filter');
|
|
@@ -271,7 +272,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
271
272
|
} catch (error$1) {
|
|
272
273
|
throw new error.MastraError(
|
|
273
274
|
{
|
|
274
|
-
id: "
|
|
275
|
+
id: storage.createVectorErrorId("QDRANT", "UPSERT", "FAILED"),
|
|
275
276
|
domain: error.ErrorDomain.STORAGE,
|
|
276
277
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
277
278
|
details: { indexName, vectorCount: vectors.length }
|
|
@@ -291,7 +292,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
291
292
|
} catch (validationError) {
|
|
292
293
|
throw new error.MastraError(
|
|
293
294
|
{
|
|
294
|
-
id: "
|
|
295
|
+
id: storage.createVectorErrorId("QDRANT", "CREATE_INDEX", "INVALID_ARGS"),
|
|
295
296
|
domain: error.ErrorDomain.STORAGE,
|
|
296
297
|
category: error.ErrorCategory.USER,
|
|
297
298
|
details: { indexName, dimension, metric }
|
|
@@ -314,7 +315,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
314
315
|
}
|
|
315
316
|
throw new error.MastraError(
|
|
316
317
|
{
|
|
317
|
-
id: "
|
|
318
|
+
id: storage.createVectorErrorId("QDRANT", "CREATE_INDEX", "FAILED"),
|
|
318
319
|
domain: error.ErrorDomain.STORAGE,
|
|
319
320
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
320
321
|
details: { indexName, dimension, metric }
|
|
@@ -362,7 +363,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
362
363
|
} catch (error$1) {
|
|
363
364
|
throw new error.MastraError(
|
|
364
365
|
{
|
|
365
|
-
id: "
|
|
366
|
+
id: storage.createVectorErrorId("QDRANT", "QUERY", "FAILED"),
|
|
366
367
|
domain: error.ErrorDomain.STORAGE,
|
|
367
368
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
368
369
|
details: { indexName, topK }
|
|
@@ -378,7 +379,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
378
379
|
} catch (error$1) {
|
|
379
380
|
throw new error.MastraError(
|
|
380
381
|
{
|
|
381
|
-
id: "
|
|
382
|
+
id: storage.createVectorErrorId("QDRANT", "LIST_INDEXES", "FAILED"),
|
|
382
383
|
domain: error.ErrorDomain.STORAGE,
|
|
383
384
|
category: error.ErrorCategory.THIRD_PARTY
|
|
384
385
|
},
|
|
@@ -405,7 +406,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
405
406
|
} catch (error$1) {
|
|
406
407
|
throw new error.MastraError(
|
|
407
408
|
{
|
|
408
|
-
id: "
|
|
409
|
+
id: storage.createVectorErrorId("QDRANT", "DESCRIBE_INDEX", "FAILED"),
|
|
409
410
|
domain: error.ErrorDomain.STORAGE,
|
|
410
411
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
411
412
|
details: { indexName }
|
|
@@ -425,7 +426,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
425
426
|
}
|
|
426
427
|
throw new error.MastraError(
|
|
427
428
|
{
|
|
428
|
-
id: "
|
|
429
|
+
id: storage.createVectorErrorId("QDRANT", "DELETE_INDEX", "FAILED"),
|
|
429
430
|
domain: error.ErrorDomain.STORAGE,
|
|
430
431
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
431
432
|
details: { indexName }
|
|
@@ -448,7 +449,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
448
449
|
async updateVector({ indexName, id, filter, update }) {
|
|
449
450
|
if (id && filter) {
|
|
450
451
|
throw new error.MastraError({
|
|
451
|
-
id: "
|
|
452
|
+
id: storage.createVectorErrorId("QDRANT", "UPDATE_VECTOR", "MUTUALLY_EXCLUSIVE"),
|
|
452
453
|
text: "Cannot specify both id and filter - they are mutually exclusive",
|
|
453
454
|
domain: error.ErrorDomain.STORAGE,
|
|
454
455
|
category: error.ErrorCategory.USER,
|
|
@@ -457,7 +458,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
457
458
|
}
|
|
458
459
|
if (!id && !filter) {
|
|
459
460
|
throw new error.MastraError({
|
|
460
|
-
id: "
|
|
461
|
+
id: storage.createVectorErrorId("QDRANT", "UPDATE_VECTOR", "NO_TARGET"),
|
|
461
462
|
text: "Either id or filter must be provided",
|
|
462
463
|
domain: error.ErrorDomain.STORAGE,
|
|
463
464
|
category: error.ErrorCategory.USER,
|
|
@@ -466,7 +467,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
466
467
|
}
|
|
467
468
|
if (!update.vector && !update.metadata) {
|
|
468
469
|
throw new error.MastraError({
|
|
469
|
-
id: "
|
|
470
|
+
id: storage.createVectorErrorId("QDRANT", "UPDATE_VECTOR", "NO_PAYLOAD"),
|
|
470
471
|
text: "No updates provided",
|
|
471
472
|
domain: error.ErrorDomain.STORAGE,
|
|
472
473
|
category: error.ErrorCategory.USER,
|
|
@@ -478,7 +479,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
478
479
|
}
|
|
479
480
|
if (filter && Object.keys(filter).length === 0) {
|
|
480
481
|
throw new error.MastraError({
|
|
481
|
-
id: "
|
|
482
|
+
id: storage.createVectorErrorId("QDRANT", "UPDATE_VECTOR", "EMPTY_FILTER"),
|
|
482
483
|
text: "Filter cannot be an empty filter object",
|
|
483
484
|
domain: error.ErrorDomain.STORAGE,
|
|
484
485
|
category: error.ErrorCategory.USER,
|
|
@@ -564,7 +565,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
564
565
|
if (error$1 instanceof error.MastraError) throw error$1;
|
|
565
566
|
throw new error.MastraError(
|
|
566
567
|
{
|
|
567
|
-
id: "
|
|
568
|
+
id: storage.createVectorErrorId("QDRANT", "UPDATE_VECTOR", "FAILED"),
|
|
568
569
|
domain: error.ErrorDomain.STORAGE,
|
|
569
570
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
570
571
|
details: {
|
|
@@ -593,7 +594,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
593
594
|
} catch (error$1) {
|
|
594
595
|
throw new error.MastraError(
|
|
595
596
|
{
|
|
596
|
-
id: "
|
|
597
|
+
id: storage.createVectorErrorId("QDRANT", "DELETE_VECTOR", "FAILED"),
|
|
597
598
|
domain: error.ErrorDomain.STORAGE,
|
|
598
599
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
599
600
|
details: {
|
|
@@ -651,7 +652,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
651
652
|
async deleteVectors({ indexName, filter, ids }) {
|
|
652
653
|
if (ids && filter) {
|
|
653
654
|
throw new error.MastraError({
|
|
654
|
-
id: "
|
|
655
|
+
id: storage.createVectorErrorId("QDRANT", "DELETE_VECTORS", "MUTUALLY_EXCLUSIVE"),
|
|
655
656
|
text: "Cannot specify both ids and filter - they are mutually exclusive",
|
|
656
657
|
domain: error.ErrorDomain.STORAGE,
|
|
657
658
|
category: error.ErrorCategory.USER,
|
|
@@ -660,7 +661,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
660
661
|
}
|
|
661
662
|
if (!ids && !filter) {
|
|
662
663
|
throw new error.MastraError({
|
|
663
|
-
id: "
|
|
664
|
+
id: storage.createVectorErrorId("QDRANT", "DELETE_VECTORS", "NO_TARGET"),
|
|
664
665
|
text: "Either filter or ids must be provided",
|
|
665
666
|
domain: error.ErrorDomain.STORAGE,
|
|
666
667
|
category: error.ErrorCategory.USER,
|
|
@@ -669,7 +670,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
669
670
|
}
|
|
670
671
|
if (ids && ids.length === 0) {
|
|
671
672
|
throw new error.MastraError({
|
|
672
|
-
id: "
|
|
673
|
+
id: storage.createVectorErrorId("QDRANT", "DELETE_VECTORS", "EMPTY_IDS"),
|
|
673
674
|
text: "Cannot delete with empty ids array",
|
|
674
675
|
domain: error.ErrorDomain.STORAGE,
|
|
675
676
|
category: error.ErrorCategory.USER,
|
|
@@ -678,7 +679,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
678
679
|
}
|
|
679
680
|
if (filter && Object.keys(filter).length === 0) {
|
|
680
681
|
throw new error.MastraError({
|
|
681
|
-
id: "
|
|
682
|
+
id: storage.createVectorErrorId("QDRANT", "DELETE_VECTORS", "EMPTY_FILTER"),
|
|
682
683
|
text: "Cannot delete with empty filter object",
|
|
683
684
|
domain: error.ErrorDomain.STORAGE,
|
|
684
685
|
category: error.ErrorCategory.USER,
|
|
@@ -711,7 +712,7 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
711
712
|
if (error$1 instanceof error.MastraError) throw error$1;
|
|
712
713
|
throw new error.MastraError(
|
|
713
714
|
{
|
|
714
|
-
id: "
|
|
715
|
+
id: storage.createVectorErrorId("QDRANT", "DELETE_VECTORS", "FAILED"),
|
|
715
716
|
domain: error.ErrorDomain.STORAGE,
|
|
716
717
|
category: error.ErrorCategory.THIRD_PARTY,
|
|
717
718
|
details: {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts","../src/vector/prompt.ts"],"names":["BaseFilterTranslator","MastraVector","QdrantClient","error","MastraError","ErrorDomain","ErrorCategory"],"mappings":"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","file":"index.cjs","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 { 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\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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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 * 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":["BaseFilterTranslator","MastraVector","QdrantClient","error","MastraError","createVectorErrorId","ErrorDomain","ErrorCategory"],"mappings":"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","file":"index.cjs","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\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 * 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/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
|
|
2
|
+
import { createVectorErrorId } from '@mastra/core/storage';
|
|
2
3
|
import { MastraVector } from '@mastra/core/vector';
|
|
3
4
|
import { QdrantClient } from '@qdrant/js-client-rest';
|
|
4
5
|
import { BaseFilterTranslator } from '@mastra/core/vector/filter';
|
|
@@ -269,7 +270,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
269
270
|
} catch (error) {
|
|
270
271
|
throw new MastraError(
|
|
271
272
|
{
|
|
272
|
-
id: "
|
|
273
|
+
id: createVectorErrorId("QDRANT", "UPSERT", "FAILED"),
|
|
273
274
|
domain: ErrorDomain.STORAGE,
|
|
274
275
|
category: ErrorCategory.THIRD_PARTY,
|
|
275
276
|
details: { indexName, vectorCount: vectors.length }
|
|
@@ -289,7 +290,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
289
290
|
} catch (validationError) {
|
|
290
291
|
throw new MastraError(
|
|
291
292
|
{
|
|
292
|
-
id: "
|
|
293
|
+
id: createVectorErrorId("QDRANT", "CREATE_INDEX", "INVALID_ARGS"),
|
|
293
294
|
domain: ErrorDomain.STORAGE,
|
|
294
295
|
category: ErrorCategory.USER,
|
|
295
296
|
details: { indexName, dimension, metric }
|
|
@@ -312,7 +313,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
312
313
|
}
|
|
313
314
|
throw new MastraError(
|
|
314
315
|
{
|
|
315
|
-
id: "
|
|
316
|
+
id: createVectorErrorId("QDRANT", "CREATE_INDEX", "FAILED"),
|
|
316
317
|
domain: ErrorDomain.STORAGE,
|
|
317
318
|
category: ErrorCategory.THIRD_PARTY,
|
|
318
319
|
details: { indexName, dimension, metric }
|
|
@@ -360,7 +361,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
360
361
|
} catch (error) {
|
|
361
362
|
throw new MastraError(
|
|
362
363
|
{
|
|
363
|
-
id: "
|
|
364
|
+
id: createVectorErrorId("QDRANT", "QUERY", "FAILED"),
|
|
364
365
|
domain: ErrorDomain.STORAGE,
|
|
365
366
|
category: ErrorCategory.THIRD_PARTY,
|
|
366
367
|
details: { indexName, topK }
|
|
@@ -376,7 +377,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
376
377
|
} catch (error) {
|
|
377
378
|
throw new MastraError(
|
|
378
379
|
{
|
|
379
|
-
id: "
|
|
380
|
+
id: createVectorErrorId("QDRANT", "LIST_INDEXES", "FAILED"),
|
|
380
381
|
domain: ErrorDomain.STORAGE,
|
|
381
382
|
category: ErrorCategory.THIRD_PARTY
|
|
382
383
|
},
|
|
@@ -403,7 +404,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
403
404
|
} catch (error) {
|
|
404
405
|
throw new MastraError(
|
|
405
406
|
{
|
|
406
|
-
id: "
|
|
407
|
+
id: createVectorErrorId("QDRANT", "DESCRIBE_INDEX", "FAILED"),
|
|
407
408
|
domain: ErrorDomain.STORAGE,
|
|
408
409
|
category: ErrorCategory.THIRD_PARTY,
|
|
409
410
|
details: { indexName }
|
|
@@ -423,7 +424,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
423
424
|
}
|
|
424
425
|
throw new MastraError(
|
|
425
426
|
{
|
|
426
|
-
id: "
|
|
427
|
+
id: createVectorErrorId("QDRANT", "DELETE_INDEX", "FAILED"),
|
|
427
428
|
domain: ErrorDomain.STORAGE,
|
|
428
429
|
category: ErrorCategory.THIRD_PARTY,
|
|
429
430
|
details: { indexName }
|
|
@@ -446,7 +447,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
446
447
|
async updateVector({ indexName, id, filter, update }) {
|
|
447
448
|
if (id && filter) {
|
|
448
449
|
throw new MastraError({
|
|
449
|
-
id: "
|
|
450
|
+
id: createVectorErrorId("QDRANT", "UPDATE_VECTOR", "MUTUALLY_EXCLUSIVE"),
|
|
450
451
|
text: "Cannot specify both id and filter - they are mutually exclusive",
|
|
451
452
|
domain: ErrorDomain.STORAGE,
|
|
452
453
|
category: ErrorCategory.USER,
|
|
@@ -455,7 +456,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
455
456
|
}
|
|
456
457
|
if (!id && !filter) {
|
|
457
458
|
throw new MastraError({
|
|
458
|
-
id: "
|
|
459
|
+
id: createVectorErrorId("QDRANT", "UPDATE_VECTOR", "NO_TARGET"),
|
|
459
460
|
text: "Either id or filter must be provided",
|
|
460
461
|
domain: ErrorDomain.STORAGE,
|
|
461
462
|
category: ErrorCategory.USER,
|
|
@@ -464,7 +465,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
464
465
|
}
|
|
465
466
|
if (!update.vector && !update.metadata) {
|
|
466
467
|
throw new MastraError({
|
|
467
|
-
id: "
|
|
468
|
+
id: createVectorErrorId("QDRANT", "UPDATE_VECTOR", "NO_PAYLOAD"),
|
|
468
469
|
text: "No updates provided",
|
|
469
470
|
domain: ErrorDomain.STORAGE,
|
|
470
471
|
category: ErrorCategory.USER,
|
|
@@ -476,7 +477,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
476
477
|
}
|
|
477
478
|
if (filter && Object.keys(filter).length === 0) {
|
|
478
479
|
throw new MastraError({
|
|
479
|
-
id: "
|
|
480
|
+
id: createVectorErrorId("QDRANT", "UPDATE_VECTOR", "EMPTY_FILTER"),
|
|
480
481
|
text: "Filter cannot be an empty filter object",
|
|
481
482
|
domain: ErrorDomain.STORAGE,
|
|
482
483
|
category: ErrorCategory.USER,
|
|
@@ -562,7 +563,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
562
563
|
if (error instanceof MastraError) throw error;
|
|
563
564
|
throw new MastraError(
|
|
564
565
|
{
|
|
565
|
-
id: "
|
|
566
|
+
id: createVectorErrorId("QDRANT", "UPDATE_VECTOR", "FAILED"),
|
|
566
567
|
domain: ErrorDomain.STORAGE,
|
|
567
568
|
category: ErrorCategory.THIRD_PARTY,
|
|
568
569
|
details: {
|
|
@@ -591,7 +592,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
591
592
|
} catch (error) {
|
|
592
593
|
throw new MastraError(
|
|
593
594
|
{
|
|
594
|
-
id: "
|
|
595
|
+
id: createVectorErrorId("QDRANT", "DELETE_VECTOR", "FAILED"),
|
|
595
596
|
domain: ErrorDomain.STORAGE,
|
|
596
597
|
category: ErrorCategory.THIRD_PARTY,
|
|
597
598
|
details: {
|
|
@@ -649,7 +650,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
649
650
|
async deleteVectors({ indexName, filter, ids }) {
|
|
650
651
|
if (ids && filter) {
|
|
651
652
|
throw new MastraError({
|
|
652
|
-
id: "
|
|
653
|
+
id: createVectorErrorId("QDRANT", "DELETE_VECTORS", "MUTUALLY_EXCLUSIVE"),
|
|
653
654
|
text: "Cannot specify both ids and filter - they are mutually exclusive",
|
|
654
655
|
domain: ErrorDomain.STORAGE,
|
|
655
656
|
category: ErrorCategory.USER,
|
|
@@ -658,7 +659,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
658
659
|
}
|
|
659
660
|
if (!ids && !filter) {
|
|
660
661
|
throw new MastraError({
|
|
661
|
-
id: "
|
|
662
|
+
id: createVectorErrorId("QDRANT", "DELETE_VECTORS", "NO_TARGET"),
|
|
662
663
|
text: "Either filter or ids must be provided",
|
|
663
664
|
domain: ErrorDomain.STORAGE,
|
|
664
665
|
category: ErrorCategory.USER,
|
|
@@ -667,7 +668,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
667
668
|
}
|
|
668
669
|
if (ids && ids.length === 0) {
|
|
669
670
|
throw new MastraError({
|
|
670
|
-
id: "
|
|
671
|
+
id: createVectorErrorId("QDRANT", "DELETE_VECTORS", "EMPTY_IDS"),
|
|
671
672
|
text: "Cannot delete with empty ids array",
|
|
672
673
|
domain: ErrorDomain.STORAGE,
|
|
673
674
|
category: ErrorCategory.USER,
|
|
@@ -676,7 +677,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
676
677
|
}
|
|
677
678
|
if (filter && Object.keys(filter).length === 0) {
|
|
678
679
|
throw new MastraError({
|
|
679
|
-
id: "
|
|
680
|
+
id: createVectorErrorId("QDRANT", "DELETE_VECTORS", "EMPTY_FILTER"),
|
|
680
681
|
text: "Cannot delete with empty filter object",
|
|
681
682
|
domain: ErrorDomain.STORAGE,
|
|
682
683
|
category: ErrorCategory.USER,
|
|
@@ -709,7 +710,7 @@ var QdrantVector = class extends MastraVector {
|
|
|
709
710
|
if (error instanceof MastraError) throw error;
|
|
710
711
|
throw new MastraError(
|
|
711
712
|
{
|
|
712
|
-
id: "
|
|
713
|
+
id: createVectorErrorId("QDRANT", "DELETE_VECTORS", "FAILED"),
|
|
713
714
|
domain: ErrorDomain.STORAGE,
|
|
714
715
|
category: ErrorCategory.THIRD_PARTY,
|
|
715
716
|
details: {
|
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 { 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\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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_UPDATE_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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: 'STORAGE_QDRANT_VECTOR_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 * 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' | '$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\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 * 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,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;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAW,MAAM,wBAAwB,CAAC;AAG1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AASnD,KAAK,uBAAuB,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;AAErE,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAe;IAE7B;;;;;;OAMG;gBACS,EAAE,EAAE,EAAE,GAAG,YAAY,EAAE,EAAE,kBAAkB,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAKlE,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiCpF,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAiB,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDhG,eAAe,CAAC,MAAM,CAAC,EAAE,kBAAkB;IAKrC,KAAK,CAAC,EACV,SAAS,EACT,WAAW,EACX,IAAS,EACT,MAAM,EACN,aAAqB,GACtB,EAAE,uBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA8C7C,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;CAwFxG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/qdrant",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.2",
|
|
4
4
|
"description": "Qdrant vector store provider for Mastra",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"tsup": "^8.5.0",
|
|
32
32
|
"typescript": "^5.8.3",
|
|
33
33
|
"vitest": "4.0.12",
|
|
34
|
-
"@internal/lint": "0.0.53",
|
|
35
34
|
"@internal/storage-test-utils": "0.0.49",
|
|
36
35
|
"@internal/types-builder": "0.0.28",
|
|
37
|
-
"@mastra/core": "1.0.0-beta.
|
|
36
|
+
"@mastra/core": "1.0.0-beta.7",
|
|
37
|
+
"@internal/lint": "0.0.53"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@mastra/core": ">=1.0.0-0 <2.0.0-0"
|