@mastra/qdrant 0.11.19-alpha.0 → 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -10
- package/dist/index.cjs +4 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -15
- package/dist/index.js.map +1 -1
- package/dist/vector/index.d.ts +4 -1
- package/dist/vector/index.d.ts.map +1 -1
- package/package.json +8 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
# @mastra/qdrant
|
|
2
2
|
|
|
3
|
-
## 0.
|
|
3
|
+
## 1.0.0-beta.0
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Major Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- Every Mastra primitive (agent, MCPServer, workflow, tool, processor, scorer, and vector) now has a get, list, and add method associated with it. Each primitive also now requires an id to be set. ([#9675](https://github.com/mastra-ai/mastra/pull/9675))
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
- @mastra/core@0.24.0-alpha.0
|
|
9
|
+
Primitives that are added to other primitives are also automatically added to the Mastra instance
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
- Bump minimum required Node.js version to 22.13.0 ([#9706](https://github.com/mastra-ai/mastra/pull/9706))
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
- Removed old tracing code based on OpenTelemetry ([#9237](https://github.com/mastra-ai/mastra/pull/9237))
|
|
15
14
|
|
|
16
|
-
-
|
|
15
|
+
- Mark as stable ([`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc))
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- Update peer dependencies to match core package version bump (1.0.0) ([#9237](https://github.com/mastra-ai/mastra/pull/9237))
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Updated dependencies [[`39c9743`](https://github.com/mastra-ai/mastra/commit/39c97432d084294f8ba85fbf3ef28098ff21459e), [`f743dbb`](https://github.com/mastra-ai/mastra/commit/f743dbb8b40d1627b5c10c0e6fc154f4ebb6e394), [`fec5129`](https://github.com/mastra-ai/mastra/commit/fec5129de7fc64423ea03661a56cef31dc747a0d), [`0491e7c`](https://github.com/mastra-ai/mastra/commit/0491e7c9b714cb0ba22187ee062147ec2dd7c712), [`f6f4903`](https://github.com/mastra-ai/mastra/commit/f6f4903397314f73362061dc5a3e8e7c61ea34aa), [`0e8ed46`](https://github.com/mastra-ai/mastra/commit/0e8ed467c54d6901a6a365f270ec15d6faadb36c), [`6c049d9`](https://github.com/mastra-ai/mastra/commit/6c049d94063fdcbd5b81c4912a2bf82a92c9cc0b), [`2f897df`](https://github.com/mastra-ai/mastra/commit/2f897df208508f46f51b7625e5dd20c37f93e0e3), [`3443770`](https://github.com/mastra-ai/mastra/commit/3443770662df8eb24c9df3589b2792d78cfcb811), [`f0a07e0`](https://github.com/mastra-ai/mastra/commit/f0a07e0111b3307c5fabfa4094c5c2cfb734fbe6), [`aaa40e7`](https://github.com/mastra-ai/mastra/commit/aaa40e788628b319baa8e889407d11ad626547fa), [`1521d71`](https://github.com/mastra-ai/mastra/commit/1521d716e5daedc74690c983fbd961123c56756b), [`9e1911d`](https://github.com/mastra-ai/mastra/commit/9e1911db2b4db85e0e768c3f15e0d61e319869f6), [`ebac155`](https://github.com/mastra-ai/mastra/commit/ebac15564a590117db7078233f927a7e28a85106), [`dd1c38d`](https://github.com/mastra-ai/mastra/commit/dd1c38d1b75f1b695c27b40d8d9d6ed00d5e0f6f), [`5948e6a`](https://github.com/mastra-ai/mastra/commit/5948e6a5146c83666ba3f294b2be576c82a513fb), [`8940859`](https://github.com/mastra-ai/mastra/commit/89408593658199b4ad67f7b65e888f344e64a442), [`e629310`](https://github.com/mastra-ai/mastra/commit/e629310f1a73fa236d49ec7a1d1cceb6229dc7cc), [`4c6b492`](https://github.com/mastra-ai/mastra/commit/4c6b492c4dd591c6a592520c1f6855d6e936d71f), [`dff01d8`](https://github.com/mastra-ai/mastra/commit/dff01d81ce1f4e4087cfac20fa868e6db138dd14), [`9d819d5`](https://github.com/mastra-ai/mastra/commit/9d819d54b61481639f4008e4694791bddf187edd), [`71c8d6c`](https://github.com/mastra-ai/mastra/commit/71c8d6c161253207b2b9588bdadb7eed604f7253), [`6179a9b`](https://github.com/mastra-ai/mastra/commit/6179a9ba36ffac326de3cc3c43cdc8028d37c251), [`00f4921`](https://github.com/mastra-ai/mastra/commit/00f4921dd2c91a1e5446799599ef7116a8214a1a), [`ca8041c`](https://github.com/mastra-ai/mastra/commit/ca8041cce0379fda22ed293a565bcb5b6ddca68a), [`7051bf3`](https://github.com/mastra-ai/mastra/commit/7051bf38b3b122a069008f861f7bfc004a6d9f6e), [`a8f1494`](https://github.com/mastra-ai/mastra/commit/a8f1494f4bbdc2770bcf327d4c7d869e332183f1), [`0793497`](https://github.com/mastra-ai/mastra/commit/079349753620c40246ffd673e3f9d7d9820beff3), [`5df9cce`](https://github.com/mastra-ai/mastra/commit/5df9cce1a753438413f64c11eeef8f845745c2a8), [`a854ede`](https://github.com/mastra-ai/mastra/commit/a854ede62bf5ac0945a624ac48913dd69c73aabf), [`c576fc0`](https://github.com/mastra-ai/mastra/commit/c576fc0b100b2085afded91a37c97a0ea0ec09c7), [`3defc80`](https://github.com/mastra-ai/mastra/commit/3defc80cf2b88a1b7fc1cc4ddcb91e982a614609), [`16153fe`](https://github.com/mastra-ai/mastra/commit/16153fe7eb13c99401f48e6ca32707c965ee28b9), [`9f4a683`](https://github.com/mastra-ai/mastra/commit/9f4a6833e88b52574665c028fd5508ad5c2f6004), [`bc94344`](https://github.com/mastra-ai/mastra/commit/bc943444a1342d8a662151b7bce1df7dae32f59c), [`57d157f`](https://github.com/mastra-ai/mastra/commit/57d157f0b163a95c3e6c9eae31bdb11d1bfc64f9), [`903f67d`](https://github.com/mastra-ai/mastra/commit/903f67d184504a273893818c02b961f5423a79ad), [`2a90c55`](https://github.com/mastra-ai/mastra/commit/2a90c55a86a9210697d5adaab5ee94584b079adc), [`eb09742`](https://github.com/mastra-ai/mastra/commit/eb09742197f66c4c38154c3beec78313e69760b2), [`96d35f6`](https://github.com/mastra-ai/mastra/commit/96d35f61376bc2b1bf148648a2c1985bd51bef55), [`5cbe88a`](https://github.com/mastra-ai/mastra/commit/5cbe88aefbd9f933bca669fd371ea36bf939ac6d), [`a1bd7b8`](https://github.com/mastra-ai/mastra/commit/a1bd7b8571db16b94eb01588f451a74758c96d65), [`d78b38d`](https://github.com/mastra-ai/mastra/commit/d78b38d898fce285260d3bbb4befade54331617f), [`0633100`](https://github.com/mastra-ai/mastra/commit/0633100a911ad22f5256471bdf753da21c104742), [`c710c16`](https://github.com/mastra-ai/mastra/commit/c710c1652dccfdc4111c8412bca7a6bb1d48b441), [`354ad0b`](https://github.com/mastra-ai/mastra/commit/354ad0b7b1b8183ac567f236a884fc7ede6d7138), [`cfae733`](https://github.com/mastra-ai/mastra/commit/cfae73394f4920635e6c919c8e95ff9a0788e2e5), [`e3dfda7`](https://github.com/mastra-ai/mastra/commit/e3dfda7b11bf3b8c4bb55637028befb5f387fc74), [`844ea5d`](https://github.com/mastra-ai/mastra/commit/844ea5dc0c248961e7bf73629ae7dcff503e853c), [`398fde3`](https://github.com/mastra-ai/mastra/commit/398fde3f39e707cda79372cdae8f9870e3b57c8d), [`f0f8f12`](https://github.com/mastra-ai/mastra/commit/f0f8f125c308f2d0fd36942ef652fd852df7522f), [`0d7618b`](https://github.com/mastra-ai/mastra/commit/0d7618bc650bf2800934b243eca5648f4aeed9c2), [`7b763e5`](https://github.com/mastra-ai/mastra/commit/7b763e52fc3eaf699c2a99f2adf418dd46e4e9a5), [`d36cfbb`](https://github.com/mastra-ai/mastra/commit/d36cfbbb6565ba5f827883cc9bb648eb14befdc1), [`3697853`](https://github.com/mastra-ai/mastra/commit/3697853deeb72017d90e0f38a93c1e29221aeca0), [`b2e45ec`](https://github.com/mastra-ai/mastra/commit/b2e45eca727a8db01a81ba93f1a5219c7183c839), [`d6d49f7`](https://github.com/mastra-ai/mastra/commit/d6d49f7b8714fa19a52ff9c7cf7fb7e73751901e), [`a534e95`](https://github.com/mastra-ai/mastra/commit/a534e9591f83b3cc1ebff99c67edf4cda7bf81d3), [`9d0e7fe`](https://github.com/mastra-ai/mastra/commit/9d0e7feca8ed98de959f53476ee1456073673348), [`53d927c`](https://github.com/mastra-ai/mastra/commit/53d927cc6f03bff33655b7e2b788da445a08731d), [`3f2faf2`](https://github.com/mastra-ai/mastra/commit/3f2faf2e2d685d6c053cc5af1bf9fedf267b2ce5), [`22f64bc`](https://github.com/mastra-ai/mastra/commit/22f64bc1d37149480b58bf2fefe35b79a1e3e7d5), [`83d5942`](https://github.com/mastra-ai/mastra/commit/83d5942669ce7bba4a6ca4fd4da697a10eb5ebdc), [`b7959e6`](https://github.com/mastra-ai/mastra/commit/b7959e6e25a46b480f9ea2217c4c6c588c423791), [`bda6370`](https://github.com/mastra-ai/mastra/commit/bda637009360649aaf579919e7873e33553c273e), [`d7acd8e`](https://github.com/mastra-ai/mastra/commit/d7acd8e987b5d7eff4fd98b0906c17c06a2e83d5), [`c7f1f7d`](https://github.com/mastra-ai/mastra/commit/c7f1f7d24f61f247f018cc2d1f33bf63212959a7), [`0bddc6d`](https://github.com/mastra-ai/mastra/commit/0bddc6d8dbd6f6008c0cba2e4960a2da75a55af1), [`735d8c1`](https://github.com/mastra-ai/mastra/commit/735d8c1c0d19fbc09e6f8b66cf41bc7655993838), [`acf322e`](https://github.com/mastra-ai/mastra/commit/acf322e0f1fd0189684cf529d91c694bea918a45), [`c942802`](https://github.com/mastra-ai/mastra/commit/c942802a477a925b01859a7b8688d4355715caaa), [`a0c8c1b`](https://github.com/mastra-ai/mastra/commit/a0c8c1b87d4fee252aebda73e8637fbe01d761c9), [`cc34739`](https://github.com/mastra-ai/mastra/commit/cc34739c34b6266a91bea561119240a7acf47887), [`c218bd3`](https://github.com/mastra-ai/mastra/commit/c218bd3759e32423735b04843a09404572631014), [`2c4438b`](https://github.com/mastra-ai/mastra/commit/2c4438b87817ab7eed818c7990fef010475af1a3), [`2b8893c`](https://github.com/mastra-ai/mastra/commit/2b8893cb108ef9acb72ee7835cd625610d2c1a4a), [`8e5c75b`](https://github.com/mastra-ai/mastra/commit/8e5c75bdb1d08a42d45309a4c72def4b6890230f), [`e59e0d3`](https://github.com/mastra-ai/mastra/commit/e59e0d32afb5fcf2c9f3c00c8f81f6c21d3a63fa), [`fa8409b`](https://github.com/mastra-ai/mastra/commit/fa8409bc39cfd8ba6643b9db5269b90b22e2a2f7), [`173c535`](https://github.com/mastra-ai/mastra/commit/173c535c0645b0da404fe09f003778f0b0d4e019)]:
|
|
24
|
+
- @mastra/core@1.0.0-beta.0
|
|
20
25
|
|
|
21
26
|
## 0.11.17
|
|
22
27
|
|
package/dist/index.cjs
CHANGED
|
@@ -242,25 +242,14 @@ var QdrantVector = class extends vector.MastraVector {
|
|
|
242
242
|
client;
|
|
243
243
|
/**
|
|
244
244
|
* Creates a new QdrantVector client.
|
|
245
|
+
* @param id - The unique identifier for this vector store instance.
|
|
245
246
|
* @param url - The URL of the Qdrant server.
|
|
246
247
|
* @param apiKey - The API key for Qdrant.
|
|
247
248
|
* @param https - Whether to use HTTPS.
|
|
248
249
|
*/
|
|
249
|
-
constructor({
|
|
250
|
-
super();
|
|
251
|
-
|
|
252
|
-
url,
|
|
253
|
-
apiKey,
|
|
254
|
-
https,
|
|
255
|
-
...rest
|
|
256
|
-
});
|
|
257
|
-
const telemetry = this.__getTelemetry();
|
|
258
|
-
this.client = telemetry?.traceClass(baseClient, {
|
|
259
|
-
spanNamePrefix: "qdrant-vector",
|
|
260
|
-
attributes: {
|
|
261
|
-
"vector.type": "qdrant"
|
|
262
|
-
}
|
|
263
|
-
}) ?? baseClient;
|
|
250
|
+
constructor({ id, ...qdrantParams }) {
|
|
251
|
+
super({ id });
|
|
252
|
+
this.client = new jsClientRest.QdrantClient(qdrantParams);
|
|
264
253
|
}
|
|
265
254
|
async upsert({ indexName, vectors, metadata, ids }) {
|
|
266
255
|
const pointIds = ids || vectors.map(() => crypto.randomUUID());
|
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} 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 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({ url, apiKey, https, ...rest }: QdrantClientParams) {\n super();\n const baseClient = new QdrantClient({\n url,\n apiKey,\n https,\n ...rest,\n });\n const telemetry = this.__getTelemetry();\n this.client =\n telemetry?.traceClass(baseClient, {\n spanNamePrefix: 'qdrant-vector',\n attributes: {\n 'vector.type': 'qdrant',\n },\n }) ?? baseClient;\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) {\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 with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\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, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n } catch (validationError) {\n throw new MastraError(\n {\n id: 'STORAGE_QDRANT_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, id },\n },\n validationError,\n );\n }\n\n const pointId = this.parsePointId(id);\n\n try {\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n // For metadata-only updates, use the setPayload method\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 } catch (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: { indexName, id },\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: { indexName, id },\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 * 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","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} 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) {\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 with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\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, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n } catch (validationError) {\n throw new MastraError(\n {\n id: 'STORAGE_QDRANT_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, id },\n },\n validationError,\n );\n }\n\n const pointId = this.parsePointId(id);\n\n try {\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n // For metadata-only updates, use the setPayload method\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 } catch (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: { indexName, id },\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: { indexName, id },\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 * 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
|
@@ -240,25 +240,14 @@ var QdrantVector = class extends MastraVector {
|
|
|
240
240
|
client;
|
|
241
241
|
/**
|
|
242
242
|
* Creates a new QdrantVector client.
|
|
243
|
+
* @param id - The unique identifier for this vector store instance.
|
|
243
244
|
* @param url - The URL of the Qdrant server.
|
|
244
245
|
* @param apiKey - The API key for Qdrant.
|
|
245
246
|
* @param https - Whether to use HTTPS.
|
|
246
247
|
*/
|
|
247
|
-
constructor({
|
|
248
|
-
super();
|
|
249
|
-
|
|
250
|
-
url,
|
|
251
|
-
apiKey,
|
|
252
|
-
https,
|
|
253
|
-
...rest
|
|
254
|
-
});
|
|
255
|
-
const telemetry = this.__getTelemetry();
|
|
256
|
-
this.client = telemetry?.traceClass(baseClient, {
|
|
257
|
-
spanNamePrefix: "qdrant-vector",
|
|
258
|
-
attributes: {
|
|
259
|
-
"vector.type": "qdrant"
|
|
260
|
-
}
|
|
261
|
-
}) ?? baseClient;
|
|
248
|
+
constructor({ id, ...qdrantParams }) {
|
|
249
|
+
super({ id });
|
|
250
|
+
this.client = new QdrantClient(qdrantParams);
|
|
262
251
|
}
|
|
263
252
|
async upsert({ indexName, vectors, metadata, ids }) {
|
|
264
253
|
const pointIds = ids || vectors.map(() => crypto.randomUUID());
|
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} 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 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({ url, apiKey, https, ...rest }: QdrantClientParams) {\n super();\n const baseClient = new QdrantClient({\n url,\n apiKey,\n https,\n ...rest,\n });\n const telemetry = this.__getTelemetry();\n this.client =\n telemetry?.traceClass(baseClient, {\n spanNamePrefix: 'qdrant-vector',\n attributes: {\n 'vector.type': 'qdrant',\n },\n }) ?? baseClient;\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) {\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 with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\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, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n } catch (validationError) {\n throw new MastraError(\n {\n id: 'STORAGE_QDRANT_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, id },\n },\n validationError,\n );\n }\n\n const pointId = this.parsePointId(id);\n\n try {\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n // For metadata-only updates, use the setPayload method\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 } catch (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: { indexName, id },\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: { indexName, id },\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 * 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 { 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} 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) {\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 with the provided vector and/or metadata.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to update.\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, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n } catch (validationError) {\n throw new MastraError(\n {\n id: 'STORAGE_QDRANT_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, id },\n },\n validationError,\n );\n }\n\n const pointId = this.parsePointId(id);\n\n try {\n // Handle metadata-only update\n if (update.metadata && !update.vector) {\n // For metadata-only updates, use the setPayload method\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 } catch (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: { indexName, id },\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: { indexName, id },\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 * Vector store specific prompt that details supported operators and examples.\n * This prompt helps users construct valid filters for Qdrant Vector.\n */\nexport const QDRANT_PROMPT = `When querying Qdrant, you can ONLY use the operators listed below. Any other operators will be rejected.\nImportant: Don't explain how to construct the filter - use the specified operators and fields to search the content and return relevant results.\nIf a user tries to give an explicit operator that is not supported, reject the filter entirely and let them know that the operator is not supported.\n\nBasic Comparison Operators:\n- $eq: Exact match (default when using field: value)\n Example: { \"category\": \"electronics\" }\n- $ne: Not equal\n Example: { \"category\": { \"$ne\": \"electronics\" } }\n- $gt: Greater than\n Example: { \"price\": { \"$gt\": 100 } }\n- $gte: Greater than or equal\n Example: { \"price\": { \"$gte\": 100 } }\n- $lt: Less than\n Example: { \"price\": { \"$lt\": 100 } }\n- $lte: Less than or equal\n Example: { \"price\": { \"$lte\": 100 } }\n\nArray Operators:\n- $in: Match any value in array\n Example: { \"category\": { \"$in\": [\"electronics\", \"books\"] } }\n- $nin: Does not match any value in array\n Example: { \"category\": { \"$nin\": [\"electronics\", \"books\"] } }\n\nLogical Operators:\n- $and: Logical AND (can be implicit or explicit)\n Implicit Example: { \"price\": { \"$gt\": 100 }, \"category\": \"electronics\" }\n Explicit Example: { \"$and\": [{ \"price\": { \"$gt\": 100 } }, { \"category\": \"electronics\" }] }\n- $or: Logical OR\n Example: { \"$or\": [{ \"price\": { \"$lt\": 50 } }, { \"category\": \"books\" }] }\n- $not: Logical NOT\n Example: { \"$not\": { \"category\": \"electronics\" } }\n\nElement Operators:\n- $exists: Check if field exists\n Example: { \"rating\": { \"$exists\": true } }\n- $match: Match text using full-text search\n Example: { \"description\": { \"$match\": \"gaming laptop\" } }\n- $null: Check if field is null\n Example: { \"rating\": { \"$null\": true } }\n\nRestrictions:\n- Regex patterns are not supported\n- Only $and, $or, and $not logical operators are supported at the top level\n- Empty arrays in $in/$nin will return no results\n- Nested fields are supported using dot notation\n- Multiple conditions on the same field are supported with both implicit and explicit $and\n- At least one key-value pair is required in filter object\n- Empty objects and undefined values are treated as no filter\n- Invalid types in comparison operators will throw errors\n- All non-logical operators must be used within a field condition\n Valid: { \"field\": { \"$gt\": 100 } }\n Valid: { \"$and\": [...] }\n Invalid: { \"$gt\": 100 }\n- Logical operators must contain field conditions, not direct operators\n Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n Invalid: { \"$and\": [{ \"$gt\": 100 }] }\n- Logical operators ($and, $or, $not):\n - Can only be used at top level or nested within other logical operators\n - Can not be used on a field level, or be nested inside a field\n - Can not be used inside an operator\n - Valid: { \"$and\": [{ \"field\": { \"$gt\": 100 } }] }\n - Valid: { \"$or\": [{ \"$and\": [{ \"field\": { \"$gt\": 100 } }] }] }\n - Invalid: { \"field\": { \"$and\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$or\": [{ \"$gt\": 100 }] } }\n - Invalid: { \"field\": { \"$gt\": { \"$and\": [{...}] } } }\n\nExample Complex Query:\n{\n \"$and\": [\n { \"category\": { \"$in\": [\"electronics\", \"computers\"] } },\n { \"price\": { \"$gte\": 100, \"$lte\": 1000 } },\n { \"description\": { \"$match\": \"gaming laptop\" } },\n { \"rating\": { \"$exists\": true, \"$gt\": 4 } },\n { \"$or\": [\n { \"stock\": { \"$gt\": 0 } },\n { \"preorder\": { \"$null\": false } }\n ]},\n { \"$not\": { \"status\": \"discontinued\" } }\n ]\n}`;\n"]}
|
package/dist/vector/index.d.ts
CHANGED
|
@@ -7,11 +7,14 @@ export declare class QdrantVector extends MastraVector {
|
|
|
7
7
|
private client;
|
|
8
8
|
/**
|
|
9
9
|
* Creates a new QdrantVector client.
|
|
10
|
+
* @param id - The unique identifier for this vector store instance.
|
|
10
11
|
* @param url - The URL of the Qdrant server.
|
|
11
12
|
* @param apiKey - The API key for Qdrant.
|
|
12
13
|
* @param https - Whether to use HTTPS.
|
|
13
14
|
*/
|
|
14
|
-
constructor({
|
|
15
|
+
constructor({ id, ...qdrantParams }: QdrantClientParams & {
|
|
16
|
+
id: string;
|
|
17
|
+
});
|
|
15
18
|
upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]>;
|
|
16
19
|
createIndex({ indexName, dimension, metric }: CreateIndexParams): Promise<void>;
|
|
17
20
|
transformFilter(filter?: QdrantVectorFilter): QdrantVectorFilter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AACA,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,EACnB,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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AACA,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,EACnB,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;IAgBlE;;;;;;;;;OASG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEhF;;;;;;OAMG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,OAAO,CAAC,YAAY;CAOrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/qdrant",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-beta.0",
|
|
4
4
|
"description": "Qdrant vector store provider for Mastra",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,13 +29,13 @@
|
|
|
29
29
|
"tsup": "^8.5.0",
|
|
30
30
|
"typescript": "^5.8.3",
|
|
31
31
|
"vitest": "^3.2.4",
|
|
32
|
-
"@internal/lint": "0.0.
|
|
33
|
-
"@
|
|
34
|
-
"@
|
|
35
|
-
"@internal/storage-test-utils": "0.0.
|
|
32
|
+
"@internal/lint": "0.0.53",
|
|
33
|
+
"@mastra/core": "1.0.0-beta.0",
|
|
34
|
+
"@internal/types-builder": "0.0.28",
|
|
35
|
+
"@internal/storage-test-utils": "0.0.49"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
|
-
"@mastra/core": ">=0.
|
|
38
|
+
"@mastra/core": ">=1.0.0-0 <2.0.0-0"
|
|
39
39
|
},
|
|
40
40
|
"files": [
|
|
41
41
|
"dist",
|
|
@@ -50,12 +50,8 @@
|
|
|
50
50
|
"bugs": {
|
|
51
51
|
"url": "https://github.com/mastra-ai/mastra/issues"
|
|
52
52
|
},
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"publish-branch": [
|
|
56
|
-
"main",
|
|
57
|
-
"0.x"
|
|
58
|
-
]
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=22.13.0"
|
|
59
55
|
},
|
|
60
56
|
"scripts": {
|
|
61
57
|
"build": "tsup --silent --config tsup.config.ts",
|