@mastra/turbopuffer 0.0.0-vector-sources-20250516175436 → 0.0.0-vector-query-tool-provider-options-20250828222356
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/LICENSE.md +12 -4
- package/dist/index.cjs +176 -66
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +169 -59
- package/dist/index.js.map +1 -0
- package/dist/vector/filter.d.ts +50 -0
- package/dist/vector/filter.d.ts.map +1 -0
- package/dist/{_tsup-dts-rollup.d.cts → vector/index.d.ts} +44 -104
- package/dist/vector/index.d.ts.map +1 -0
- package/package.json +18 -14
- package/dist/_tsup-dts-rollup.d.ts +0 -147
- package/dist/index.d.cts +0 -2
package/LICENSE.md
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
# Apache License 2.0
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Copyright (c) 2025 Kepler Software, Inc.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
you may not use this file except in compliance with the License.
|
|
7
|
+
You may obtain a copy of the License at
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
|
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
See the License for the specific language governing permissions and
|
|
15
|
+
limitations under the License.
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var error = require('@mastra/core/error');
|
|
3
4
|
var vector = require('@mastra/core/vector');
|
|
4
5
|
var turbopuffer = require('@turbopuffer/turbopuffer');
|
|
5
6
|
var filter = require('@mastra/core/vector/filter');
|
|
@@ -188,28 +189,40 @@ var TurbopufferVector = class extends vector.MastraVector {
|
|
|
188
189
|
}
|
|
189
190
|
async createIndex({ indexName, dimension, metric }) {
|
|
190
191
|
metric = metric ?? "cosine";
|
|
191
|
-
if (this.createIndexCache.has(indexName)) {
|
|
192
|
-
const expected = this.createIndexCache.get(indexName);
|
|
193
|
-
if (dimension !== expected.dimension || metric !== expected.metric) {
|
|
194
|
-
throw new Error(
|
|
195
|
-
`createIndex() called more than once with inconsistent inputs. Index ${indexName} expected dimensions=${expected.dimension} and metric=${expected.metric} but got dimensions=${dimension} and metric=${metric}`
|
|
196
|
-
);
|
|
197
|
-
}
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
if (dimension <= 0) {
|
|
201
|
-
throw new Error("Dimension must be a positive integer");
|
|
202
|
-
}
|
|
203
192
|
let distanceMetric = "cosine_distance";
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
193
|
+
try {
|
|
194
|
+
if (this.createIndexCache.has(indexName)) {
|
|
195
|
+
const expected = this.createIndexCache.get(indexName);
|
|
196
|
+
if (dimension !== expected.dimension || metric !== expected.metric) {
|
|
197
|
+
throw new Error(
|
|
198
|
+
`createIndex() called more than once with inconsistent inputs. Index ${indexName} expected dimensions=${expected.dimension} and metric=${expected.metric} but got dimensions=${dimension} and metric=${metric}`
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (dimension <= 0) {
|
|
204
|
+
throw new Error("Dimension must be a positive integer");
|
|
205
|
+
}
|
|
206
|
+
switch (metric) {
|
|
207
|
+
case "cosine":
|
|
208
|
+
distanceMetric = "cosine_distance";
|
|
209
|
+
break;
|
|
210
|
+
case "euclidean":
|
|
211
|
+
distanceMetric = "euclidean_squared";
|
|
212
|
+
break;
|
|
213
|
+
case "dotproduct":
|
|
214
|
+
throw new Error("dotproduct is not supported in Turbopuffer");
|
|
215
|
+
}
|
|
216
|
+
} catch (error$1) {
|
|
217
|
+
throw new error.MastraError(
|
|
218
|
+
{
|
|
219
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_CREATE_INDEX_INVALID_ARGS",
|
|
220
|
+
domain: error.ErrorDomain.STORAGE,
|
|
221
|
+
category: error.ErrorCategory.USER,
|
|
222
|
+
details: { indexName, dimension, metric }
|
|
223
|
+
},
|
|
224
|
+
error$1
|
|
225
|
+
);
|
|
213
226
|
}
|
|
214
227
|
this.createIndexCache.set(indexName, {
|
|
215
228
|
indexName,
|
|
@@ -219,15 +232,29 @@ var TurbopufferVector = class extends vector.MastraVector {
|
|
|
219
232
|
});
|
|
220
233
|
}
|
|
221
234
|
async upsert({ indexName, vectors, metadata, ids }) {
|
|
235
|
+
let index;
|
|
236
|
+
let createIndex;
|
|
222
237
|
try {
|
|
223
238
|
if (vectors.length === 0) {
|
|
224
239
|
throw new Error("upsert() called with empty vectors");
|
|
225
240
|
}
|
|
226
|
-
|
|
227
|
-
|
|
241
|
+
index = this.client.namespace(indexName);
|
|
242
|
+
createIndex = this.createIndexCache.get(indexName);
|
|
228
243
|
if (!createIndex) {
|
|
229
244
|
throw new Error(`createIndex() not called for this index`);
|
|
230
245
|
}
|
|
246
|
+
} catch (error$1) {
|
|
247
|
+
throw new error.MastraError(
|
|
248
|
+
{
|
|
249
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPSERT_INVALID_ARGS",
|
|
250
|
+
domain: error.ErrorDomain.STORAGE,
|
|
251
|
+
category: error.ErrorCategory.USER,
|
|
252
|
+
details: { indexName }
|
|
253
|
+
},
|
|
254
|
+
error$1
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
231
258
|
const distanceMetric = createIndex.tpufDistanceMetric;
|
|
232
259
|
const vectorIds = ids || vectors.map(() => crypto.randomUUID());
|
|
233
260
|
const records = vectors.map((vector, i) => ({
|
|
@@ -254,22 +281,49 @@ var TurbopufferVector = class extends vector.MastraVector {
|
|
|
254
281
|
await index.upsert(upsertOptions);
|
|
255
282
|
}
|
|
256
283
|
return vectorIds;
|
|
257
|
-
} catch (error) {
|
|
258
|
-
throw new
|
|
284
|
+
} catch (error$1) {
|
|
285
|
+
throw new error.MastraError(
|
|
286
|
+
{
|
|
287
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPSERT_FAILED",
|
|
288
|
+
domain: error.ErrorDomain.STORAGE,
|
|
289
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
290
|
+
details: { indexName }
|
|
291
|
+
},
|
|
292
|
+
error$1
|
|
293
|
+
);
|
|
259
294
|
}
|
|
260
295
|
}
|
|
261
|
-
async query({
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
296
|
+
async query({
|
|
297
|
+
indexName,
|
|
298
|
+
queryVector,
|
|
299
|
+
topK,
|
|
300
|
+
filter,
|
|
301
|
+
includeVector
|
|
302
|
+
}) {
|
|
303
|
+
let createIndex;
|
|
304
|
+
try {
|
|
305
|
+
const schemaConfig = this.opts.schemaConfigForIndex?.(indexName);
|
|
306
|
+
if (schemaConfig) {
|
|
307
|
+
if (queryVector.length !== schemaConfig.dimensions) {
|
|
308
|
+
throw new Error(
|
|
309
|
+
`Turbopuffer index ${indexName} was configured with dimensions=${schemaConfig.dimensions} but attempting to query with queryVector.length=${queryVector.length}`
|
|
310
|
+
);
|
|
311
|
+
}
|
|
268
312
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
313
|
+
createIndex = this.createIndexCache.get(indexName);
|
|
314
|
+
if (!createIndex) {
|
|
315
|
+
throw new Error(`createIndex() not called for this index`);
|
|
316
|
+
}
|
|
317
|
+
} catch (error$1) {
|
|
318
|
+
throw new error.MastraError(
|
|
319
|
+
{
|
|
320
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_QUERY_INVALID_ARGS",
|
|
321
|
+
domain: error.ErrorDomain.STORAGE,
|
|
322
|
+
category: error.ErrorCategory.USER,
|
|
323
|
+
details: { indexName }
|
|
324
|
+
},
|
|
325
|
+
error$1
|
|
326
|
+
);
|
|
273
327
|
}
|
|
274
328
|
const distanceMetric = createIndex.tpufDistanceMetric;
|
|
275
329
|
try {
|
|
@@ -291,28 +345,40 @@ var TurbopufferVector = class extends vector.MastraVector {
|
|
|
291
345
|
metadata: item.attributes || {},
|
|
292
346
|
...includeVector && item.vector ? { vector: item.vector } : {}
|
|
293
347
|
}));
|
|
294
|
-
} catch (error) {
|
|
295
|
-
throw new
|
|
348
|
+
} catch (error$1) {
|
|
349
|
+
throw new error.MastraError(
|
|
350
|
+
{
|
|
351
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_QUERY_FAILED",
|
|
352
|
+
domain: error.ErrorDomain.STORAGE,
|
|
353
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
354
|
+
details: { indexName }
|
|
355
|
+
},
|
|
356
|
+
error$1
|
|
357
|
+
);
|
|
296
358
|
}
|
|
297
359
|
}
|
|
298
360
|
async listIndexes() {
|
|
299
361
|
try {
|
|
300
362
|
const namespacesResult = await this.client.namespaces({});
|
|
301
363
|
return namespacesResult.namespaces.map((namespace) => namespace.id);
|
|
302
|
-
} catch (error) {
|
|
303
|
-
throw new
|
|
364
|
+
} catch (error$1) {
|
|
365
|
+
throw new error.MastraError(
|
|
366
|
+
{
|
|
367
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_LIST_INDEXES_FAILED",
|
|
368
|
+
domain: error.ErrorDomain.STORAGE,
|
|
369
|
+
category: error.ErrorCategory.THIRD_PARTY
|
|
370
|
+
},
|
|
371
|
+
error$1
|
|
372
|
+
);
|
|
304
373
|
}
|
|
305
374
|
}
|
|
306
375
|
/**
|
|
307
376
|
* Retrieves statistics about a vector index.
|
|
308
377
|
*
|
|
309
|
-
* @param
|
|
310
|
-
* @param params.indexName - The name of the index to describe
|
|
378
|
+
* @param {string} indexName - The name of the index to describe
|
|
311
379
|
* @returns A promise that resolves to the index statistics including dimension, count and metric
|
|
312
380
|
*/
|
|
313
|
-
async describeIndex(
|
|
314
|
-
const params = this.normalizeArgs("describeIndex", args);
|
|
315
|
-
const { indexName } = params;
|
|
381
|
+
async describeIndex({ indexName }) {
|
|
316
382
|
try {
|
|
317
383
|
const namespace = this.client.namespace(indexName);
|
|
318
384
|
const metadata = await namespace.metadata();
|
|
@@ -327,19 +393,33 @@ var TurbopufferVector = class extends vector.MastraVector {
|
|
|
327
393
|
count,
|
|
328
394
|
metric: createIndex.metric
|
|
329
395
|
};
|
|
330
|
-
} catch (error) {
|
|
331
|
-
throw new
|
|
396
|
+
} catch (error$1) {
|
|
397
|
+
throw new error.MastraError(
|
|
398
|
+
{
|
|
399
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_DESCRIBE_INDEX_FAILED",
|
|
400
|
+
domain: error.ErrorDomain.STORAGE,
|
|
401
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
402
|
+
details: { indexName }
|
|
403
|
+
},
|
|
404
|
+
error$1
|
|
405
|
+
);
|
|
332
406
|
}
|
|
333
407
|
}
|
|
334
|
-
async deleteIndex(
|
|
335
|
-
const params = this.normalizeArgs("deleteIndex", args);
|
|
336
|
-
const { indexName } = params;
|
|
408
|
+
async deleteIndex({ indexName }) {
|
|
337
409
|
try {
|
|
338
410
|
const namespace = this.client.namespace(indexName);
|
|
339
411
|
await namespace.deleteAll();
|
|
340
412
|
this.createIndexCache.delete(indexName);
|
|
341
|
-
} catch (error) {
|
|
342
|
-
throw new
|
|
413
|
+
} catch (error$1) {
|
|
414
|
+
throw new error.MastraError(
|
|
415
|
+
{
|
|
416
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_DELETE_INDEX_FAILED",
|
|
417
|
+
domain: error.ErrorDomain.STORAGE,
|
|
418
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
419
|
+
details: { indexName }
|
|
420
|
+
},
|
|
421
|
+
error$1
|
|
422
|
+
);
|
|
343
423
|
}
|
|
344
424
|
}
|
|
345
425
|
/**
|
|
@@ -352,25 +432,47 @@ var TurbopufferVector = class extends vector.MastraVector {
|
|
|
352
432
|
* @returns A promise that resolves when the update is complete.
|
|
353
433
|
* @throws Will throw an error if no updates are provided or if the update operation fails.
|
|
354
434
|
*/
|
|
355
|
-
async updateVector(
|
|
356
|
-
|
|
357
|
-
|
|
435
|
+
async updateVector({ indexName, id, update }) {
|
|
436
|
+
let namespace;
|
|
437
|
+
let createIndex;
|
|
438
|
+
let distanceMetric;
|
|
439
|
+
let record;
|
|
358
440
|
try {
|
|
359
|
-
|
|
360
|
-
|
|
441
|
+
namespace = this.client.namespace(indexName);
|
|
442
|
+
createIndex = this.createIndexCache.get(indexName);
|
|
361
443
|
if (!createIndex) {
|
|
362
444
|
throw new Error(`createIndex() not called for this index`);
|
|
363
445
|
}
|
|
364
|
-
|
|
365
|
-
|
|
446
|
+
distanceMetric = createIndex.tpufDistanceMetric;
|
|
447
|
+
record = { id };
|
|
366
448
|
if (update.vector) record.vector = update.vector;
|
|
367
449
|
if (update.metadata) record.attributes = update.metadata;
|
|
450
|
+
} catch (error$1) {
|
|
451
|
+
throw new error.MastraError(
|
|
452
|
+
{
|
|
453
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_INVALID_ARGS",
|
|
454
|
+
domain: error.ErrorDomain.STORAGE,
|
|
455
|
+
category: error.ErrorCategory.USER,
|
|
456
|
+
details: { indexName }
|
|
457
|
+
},
|
|
458
|
+
error$1
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
try {
|
|
368
462
|
await namespace.upsert({
|
|
369
463
|
vectors: [record],
|
|
370
464
|
distance_metric: distanceMetric
|
|
371
465
|
});
|
|
372
|
-
} catch (error) {
|
|
373
|
-
throw new
|
|
466
|
+
} catch (error$1) {
|
|
467
|
+
throw new error.MastraError(
|
|
468
|
+
{
|
|
469
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_FAILED",
|
|
470
|
+
domain: error.ErrorDomain.STORAGE,
|
|
471
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
472
|
+
details: { indexName }
|
|
473
|
+
},
|
|
474
|
+
error$1
|
|
475
|
+
);
|
|
374
476
|
}
|
|
375
477
|
}
|
|
376
478
|
/**
|
|
@@ -380,16 +482,24 @@ var TurbopufferVector = class extends vector.MastraVector {
|
|
|
380
482
|
* @returns A promise that resolves when the deletion is complete.
|
|
381
483
|
* @throws Will throw an error if the deletion operation fails.
|
|
382
484
|
*/
|
|
383
|
-
async deleteVector(
|
|
384
|
-
const params = this.normalizeArgs("deleteVector", args);
|
|
385
|
-
const { indexName, id } = params;
|
|
485
|
+
async deleteVector({ indexName, id }) {
|
|
386
486
|
try {
|
|
387
487
|
const namespace = this.client.namespace(indexName);
|
|
388
488
|
await namespace.delete({ ids: [id] });
|
|
389
|
-
} catch (error) {
|
|
390
|
-
throw new
|
|
489
|
+
} catch (error$1) {
|
|
490
|
+
throw new error.MastraError(
|
|
491
|
+
{
|
|
492
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_DELETE_VECTOR_FAILED",
|
|
493
|
+
domain: error.ErrorDomain.STORAGE,
|
|
494
|
+
category: error.ErrorCategory.THIRD_PARTY,
|
|
495
|
+
details: { indexName }
|
|
496
|
+
},
|
|
497
|
+
error$1
|
|
498
|
+
);
|
|
391
499
|
}
|
|
392
500
|
}
|
|
393
501
|
};
|
|
394
502
|
|
|
395
503
|
exports.TurbopufferVector = TurbopufferVector;
|
|
504
|
+
//# sourceMappingURL=index.cjs.map
|
|
505
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts"],"names":["BaseFilterTranslator","op","MastraVector","Turbopuffer","error","MastraError","ErrorDomain","ErrorCategory"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n OperatorSupport,\n VectorFilter,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\nimport { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type { FilterCondition, FilterConnective, FilterOperator, Filters } from '@turbopuffer/turbopuffer';\n\ntype TurbopufferOperatorValueMap = Omit<OperatorValueMap, '$regex' | '$options' | '$elemMatch'>;\n\ntype TurbopufferLogicalOperatorValueMap = Omit<LogicalOperatorValueMap, '$nor' | '$not'>;\n\ntype TurbopufferBlacklistedRootOperators = BlacklistedRootOperators | '$nor' | '$not';\n\nexport type TurbopufferVectorFilter = VectorFilter<\n keyof TurbopufferOperatorValueMap,\n TurbopufferOperatorValueMap,\n TurbopufferLogicalOperatorValueMap,\n TurbopufferBlacklistedRootOperators\n>;\n\n/**\n * Translator for converting Mastra filters to Turbopuffer format\n *\n * Mastra filters: { field: { $gt: 10 } }\n * Turbopuffer filters: [\"And\", [[\"field\", \"Gt\", 10]]]\n */\nexport class TurbopufferFilterTranslator extends BaseFilterTranslator<TurbopufferVectorFilter, Filters | undefined> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n logical: ['$and', '$or'],\n array: ['$in', '$nin', '$all'],\n element: ['$exists'],\n regex: [], // No regex support in Turbopuffer\n custom: [], // No custom operators\n };\n }\n\n /**\n * Map Mastra operators to Turbopuffer operators\n */\n private operatorMap: Record<string, FilterOperator> = {\n $eq: 'Eq',\n $ne: 'NotEq',\n $gt: 'Gt',\n $gte: 'Gte',\n $lt: 'Lt',\n $lte: 'Lte',\n $in: 'In',\n $nin: 'NotIn',\n };\n\n /**\n * Convert the Mastra filter to Turbopuffer format\n */\n translate(filter?: TurbopufferVectorFilter): Filters | undefined {\n if (this.isEmpty(filter)) {\n return undefined;\n }\n\n // Validate the filter structure before translating\n this.validateFilter(filter);\n\n // Translate the filter\n const result = this.translateNode(filter);\n\n // If we have a single condition (not a logical operator at the top level),\n // wrap it in an implicit AND to match Turbopuffer's expected format\n if (!Array.isArray(result) || result.length !== 2 || (result[0] !== 'And' && result[0] !== 'Or')) {\n return ['And', [result as FilterCondition]];\n }\n\n return result as Filters;\n }\n\n /**\n * Recursively translate a filter node\n */\n private translateNode(node: TurbopufferVectorFilter): Filters | FilterCondition {\n // Handle empty or null nodes\n if (node === null || node === undefined || Object.keys(node).length === 0) {\n return ['And', []];\n }\n\n // Handle primitive values (direct equality comparison)\n if (this.isPrimitive(node)) {\n throw new Error('Direct primitive values not valid in this context for Turbopuffer');\n }\n\n // Handle direct array value (convert to $in)\n if (Array.isArray(node)) {\n throw new Error('Direct array values not valid in this context for Turbopuffer');\n }\n\n const entries = Object.entries(node);\n\n // Process the first operator or field\n if (entries.length === 0) {\n return ['And', []];\n }\n\n const [key, value] = entries[0] as [string, any];\n\n // Handle logical operators\n if (key && this.isLogicalOperator(key)) {\n return this.translateLogical(key, value);\n }\n\n // Multiple fields at top level - implicit AND\n if (entries.length > 1) {\n const conditions = entries.map(([field, fieldValue]) => this.translateFieldCondition(field, fieldValue));\n return ['And', conditions];\n }\n\n // Single field with condition(s)\n return this.translateFieldCondition(key, value);\n }\n\n /**\n * Translate a field condition\n */\n private translateFieldCondition(field: string, value: any): FilterCondition {\n // Handle Date object directly (convert to ISO string)\n if (value instanceof Date) {\n return [field, 'Eq', this.normalizeValue(value)];\n }\n\n // Handle primitive value (direct equality)\n if (this.isPrimitive(value)) {\n return [field, 'Eq', this.normalizeValue(value)];\n }\n\n // Handle array value (convert to $in)\n if (Array.isArray(value)) {\n return [field, 'In', this.normalizeArrayValues(value)];\n }\n\n // Handle object with operators\n if (typeof value === 'object' && value !== null) {\n const operators = Object.keys(value);\n\n // If multiple operators for the same field, create an AND condition\n if (operators.length > 1) {\n // Check if all keys are operators\n const allOperators = operators.every(op => this.isOperator(op));\n if (allOperators) {\n // For multiple comparison operators on one field\n const conditions = operators.map(op => this.translateOperator(field, op, value[op]));\n return ['And', conditions] as unknown as FilterCondition;\n } else {\n // For nested objects with multiple fields\n const conditions = operators.map(op => {\n const nestedField = `${field}.${op}`;\n return this.translateFieldCondition(nestedField, value[op]);\n });\n return ['And', conditions] as unknown as FilterCondition;\n }\n }\n\n // Single operator\n const op = operators[0];\n if (op && this.isOperator(op)) {\n return this.translateOperator(field, op, value[op]);\n }\n\n // Nested field path (use dot notation)\n if (op && !this.isOperator(op)) {\n const nestedField = `${field}.${op}`;\n return this.translateFieldCondition(nestedField, value[op]);\n }\n }\n\n throw new Error(`Unsupported filter format for field: ${field}`);\n }\n\n /**\n * Translate a logical operator\n */\n private translateLogical(operator: string, conditions: any[]): Filters {\n // Map Mastra logical operators to Turbopuffer\n const logicalOp: FilterConnective = operator === '$and' ? 'And' : 'Or';\n\n // Validate conditions\n if (!Array.isArray(conditions)) {\n throw new Error(`Logical operator ${operator} requires an array of conditions`);\n }\n\n // Translate each condition\n const translatedConditions = conditions.map(condition => {\n if (typeof condition !== 'object' || condition === null) {\n throw new Error(`Invalid condition for logical operator ${operator}`);\n }\n return this.translateNode(condition);\n });\n\n return [logicalOp, translatedConditions];\n }\n\n /**\n * Translate a specific operator\n */\n private translateOperator(field: string, operator: string, value: any): FilterCondition {\n // Handle comparison operators\n if (operator && this.operatorMap[operator]) {\n return [field, this.operatorMap[operator], this.normalizeValue(value)];\n }\n\n // Handle special cases\n switch (operator) {\n case '$exists':\n // $exists: true -> use NotEq with null (field exists if it's not null)\n // $exists: false -> use Eq with null (field doesn't exist if it is null)\n return value ? [field, 'NotEq', null] : [field, 'Eq', null];\n\n case '$all':\n // $all is not directly supported, simulate with AND + IN conditions\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error('$all operator requires a non-empty array');\n }\n\n const allConditions = value.map(item => [field, 'In', [this.normalizeValue(item)]] as FilterCondition);\n\n // Return the array of conditions directly without nesting\n return ['And', allConditions] as unknown as FilterCondition;\n\n default:\n throw new Error(`Unsupported operator: ${operator || 'undefined'}`);\n }\n }\n\n /**\n * Normalize a value for comparison operations\n */\n protected normalizeValue(value: any): any {\n // Handle special value types\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n }\n\n /**\n * Normalize array values\n */\n protected normalizeArrayValues(values: any[]): any[] {\n return values.map(value => this.normalizeValue(value));\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n QueryVectorParams,\n UpdateVectorParams,\n UpsertVectorParams,\n} from '@mastra/core/vector';\nimport { MastraVector } from '@mastra/core/vector';\nimport { Turbopuffer } from '@turbopuffer/turbopuffer';\nimport type { DistanceMetric, QueryResults, Schema, Vector } from '@turbopuffer/turbopuffer';\nimport { TurbopufferFilterTranslator } from './filter';\nimport type { TurbopufferVectorFilter } from './filter';\n\ntype TurbopufferQueryVectorParams = QueryVectorParams<TurbopufferVectorFilter>;\n\nexport interface TurbopufferVectorOptions {\n /** The API key to authenticate with. */\n apiKey: string;\n /** The base URL. Default is https://api.turbopuffer.com. */\n baseUrl?: string;\n /** The timeout to establish a connection, in ms. Default is 10_000. Only applicable in Node and Deno.*/\n connectTimeout?: number;\n /** The socket idle timeout, in ms. Default is 60_000. Only applicable in Node and Deno.*/\n connectionIdleTimeout?: number;\n /** The number of connections to open initially when creating a new client. Default is 0. */\n warmConnections?: number;\n /** Whether to compress requests and accept compressed responses. Default is true. */\n compression?: boolean;\n /**\n * A callback function that takes an index name and returns a config object for that index.\n * This allows you to define explicit schemas per index.\n *\n * Example:\n * ```typescript\n * schemaConfigForIndex: (indexName: string) => {\n * // Mastra's default embedding model and index for memory messages:\n * if (indexName === \"memory_messages_384\") {\n * return {\n * dimensions: 384,\n * schema: {\n * thread_id: {\n * type: \"string\",\n * filterable: true,\n * },\n * },\n * };\n * } else {\n * throw new Error(`TODO: add schema for index: ${indexName}`);\n * }\n * },\n * ```\n */\n schemaConfigForIndex?: (indexName: string) => {\n dimensions: number;\n schema: Schema;\n };\n}\n\nexport class TurbopufferVector extends MastraVector<TurbopufferVectorFilter> {\n private client: Turbopuffer;\n private filterTranslator: TurbopufferFilterTranslator;\n // There is no explicit create index operation in Turbopuffer, so just register that\n // someone has called createIndex() and verify that subsequent upsert calls are consistent\n // with how the index was \"created\"\n private createIndexCache: Map<\n string,\n CreateIndexParams & {\n tpufDistanceMetric: DistanceMetric;\n }\n > = new Map();\n private opts: TurbopufferVectorOptions;\n\n constructor(opts: TurbopufferVectorOptions) {\n super();\n this.filterTranslator = new TurbopufferFilterTranslator();\n this.opts = opts;\n\n const baseClient = new Turbopuffer(opts);\n const telemetry = this.__getTelemetry();\n this.client =\n telemetry?.traceClass(baseClient, {\n spanNamePrefix: 'turbopuffer-vector',\n attributes: {\n 'vector.type': 'turbopuffer',\n },\n }) ?? baseClient;\n }\n\n async createIndex({ indexName, dimension, metric }: CreateIndexParams): Promise<void> {\n metric = metric ?? 'cosine'; // default to cosine distance\n let distanceMetric: DistanceMetric = 'cosine_distance';\n try {\n if (this.createIndexCache.has(indexName)) {\n // verify that the dimensions and distance metric match what we expect\n const expected = this.createIndexCache.get(indexName)!;\n if (dimension !== expected.dimension || metric !== expected.metric) {\n throw new Error(\n `createIndex() called more than once with inconsistent inputs. Index ${indexName} expected dimensions=${expected.dimension} and metric=${expected.metric} but got dimensions=${dimension} and metric=${metric}`,\n );\n }\n return;\n }\n if (dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n switch (metric) {\n case 'cosine':\n distanceMetric = 'cosine_distance';\n break;\n case 'euclidean':\n distanceMetric = 'euclidean_squared';\n break;\n case 'dotproduct':\n throw new Error('dotproduct is not supported in Turbopuffer');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_CREATE_INDEX_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n\n this.createIndexCache.set(indexName, {\n indexName,\n dimension,\n metric,\n tpufDistanceMetric: distanceMetric,\n });\n }\n\n async upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n let index;\n let createIndex;\n try {\n if (vectors.length === 0) {\n throw new Error('upsert() called with empty vectors');\n }\n\n index = this.client.namespace(indexName);\n createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPSERT_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n error,\n );\n }\n\n try {\n const distanceMetric = createIndex.tpufDistanceMetric;\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n const records: Vector[] = vectors.map((vector, i) => ({\n id: vectorIds[i]!,\n vector: vector,\n attributes: metadata?.[i] || {},\n }));\n\n // limit is 256 MB per upsert request, so set a reasonable batch size here that will stay under that for most cases\n // https://turbopuffer.com/docs/limits\n const batchSize = 100;\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n const upsertOptions: {\n vectors: Vector[];\n distance_metric: DistanceMetric;\n schema?: Schema;\n batchSize?: number;\n } = {\n vectors: batch,\n distance_metric: distanceMetric,\n };\n\n // Use the schemaForIndex callback if provided\n const schemaConfig = this.opts.schemaConfigForIndex?.(indexName);\n if (schemaConfig) {\n upsertOptions.schema = schemaConfig.schema;\n if (vectors[0]?.length !== schemaConfig.dimensions) {\n throw new Error(\n `Turbopuffer index ${indexName} was configured with dimensions=${schemaConfig.dimensions} but attempting to upsert vectors[0].length=${vectors[0]?.length}`,\n );\n }\n }\n\n await index.upsert(upsertOptions);\n }\n\n return vectorIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async query({\n indexName,\n queryVector,\n topK,\n filter,\n includeVector,\n }: TurbopufferQueryVectorParams): Promise<QueryResult[]> {\n let createIndex;\n try {\n const schemaConfig = this.opts.schemaConfigForIndex?.(indexName);\n if (schemaConfig) {\n if (queryVector.length !== schemaConfig.dimensions) {\n throw new Error(\n `Turbopuffer index ${indexName} was configured with dimensions=${schemaConfig.dimensions} but attempting to query with queryVector.length=${queryVector.length}`,\n );\n }\n }\n createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_QUERY_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n error,\n );\n }\n\n const distanceMetric = createIndex.tpufDistanceMetric;\n try {\n const index = this.client.namespace(indexName);\n const translatedFilter = this.filterTranslator.translate(filter);\n const results: QueryResults = await index.query({\n distance_metric: distanceMetric,\n vector: queryVector,\n top_k: topK,\n filters: translatedFilter,\n include_vectors: includeVector,\n include_attributes: true,\n consistency: { level: 'strong' }, // todo: make this configurable somehow?\n });\n return results.map(item => ({\n id: String(item.id),\n score: typeof item.dist === 'number' ? item.dist : 0,\n metadata: item.attributes || {},\n ...(includeVector && item.vector ? { vector: item.vector } : {}),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const namespacesResult = await this.client.namespaces({});\n return namespacesResult.namespaces.map(namespace => namespace.id);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_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 namespace = this.client.namespace(indexName);\n const metadata = await namespace.metadata();\n const createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n const dimension = metadata.dimensions;\n const count = metadata.approx_count;\n return {\n dimension,\n count,\n metric: createIndex.metric,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_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 const namespace = this.client.namespace(indexName);\n await namespace.deleteAll();\n this.createIndexCache.delete(indexName);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_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 let namespace;\n let createIndex;\n let distanceMetric;\n let record;\n try {\n namespace = this.client.namespace(indexName);\n createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n distanceMetric = createIndex.tpufDistanceMetric;\n record = { id } as Vector;\n if (update.vector) record.vector = update.vector;\n if (update.metadata) record.attributes = update.metadata;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n error,\n );\n }\n try {\n await namespace.upsert({\n vectors: [record],\n distance_metric: distanceMetric,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\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 const namespace = this.client.namespace(indexName);\n await namespace.delete({ ids: [id] });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
1
|
+
export * from './vector/index.js';
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
|
|
1
2
|
import { MastraVector } from '@mastra/core/vector';
|
|
2
3
|
import { Turbopuffer } from '@turbopuffer/turbopuffer';
|
|
3
4
|
import { BaseFilterTranslator } from '@mastra/core/vector/filter';
|
|
@@ -186,28 +187,40 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
186
187
|
}
|
|
187
188
|
async createIndex({ indexName, dimension, metric }) {
|
|
188
189
|
metric = metric ?? "cosine";
|
|
189
|
-
if (this.createIndexCache.has(indexName)) {
|
|
190
|
-
const expected = this.createIndexCache.get(indexName);
|
|
191
|
-
if (dimension !== expected.dimension || metric !== expected.metric) {
|
|
192
|
-
throw new Error(
|
|
193
|
-
`createIndex() called more than once with inconsistent inputs. Index ${indexName} expected dimensions=${expected.dimension} and metric=${expected.metric} but got dimensions=${dimension} and metric=${metric}`
|
|
194
|
-
);
|
|
195
|
-
}
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
if (dimension <= 0) {
|
|
199
|
-
throw new Error("Dimension must be a positive integer");
|
|
200
|
-
}
|
|
201
190
|
let distanceMetric = "cosine_distance";
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
191
|
+
try {
|
|
192
|
+
if (this.createIndexCache.has(indexName)) {
|
|
193
|
+
const expected = this.createIndexCache.get(indexName);
|
|
194
|
+
if (dimension !== expected.dimension || metric !== expected.metric) {
|
|
195
|
+
throw new Error(
|
|
196
|
+
`createIndex() called more than once with inconsistent inputs. Index ${indexName} expected dimensions=${expected.dimension} and metric=${expected.metric} but got dimensions=${dimension} and metric=${metric}`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
if (dimension <= 0) {
|
|
202
|
+
throw new Error("Dimension must be a positive integer");
|
|
203
|
+
}
|
|
204
|
+
switch (metric) {
|
|
205
|
+
case "cosine":
|
|
206
|
+
distanceMetric = "cosine_distance";
|
|
207
|
+
break;
|
|
208
|
+
case "euclidean":
|
|
209
|
+
distanceMetric = "euclidean_squared";
|
|
210
|
+
break;
|
|
211
|
+
case "dotproduct":
|
|
212
|
+
throw new Error("dotproduct is not supported in Turbopuffer");
|
|
213
|
+
}
|
|
214
|
+
} catch (error) {
|
|
215
|
+
throw new MastraError(
|
|
216
|
+
{
|
|
217
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_CREATE_INDEX_INVALID_ARGS",
|
|
218
|
+
domain: ErrorDomain.STORAGE,
|
|
219
|
+
category: ErrorCategory.USER,
|
|
220
|
+
details: { indexName, dimension, metric }
|
|
221
|
+
},
|
|
222
|
+
error
|
|
223
|
+
);
|
|
211
224
|
}
|
|
212
225
|
this.createIndexCache.set(indexName, {
|
|
213
226
|
indexName,
|
|
@@ -217,15 +230,29 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
217
230
|
});
|
|
218
231
|
}
|
|
219
232
|
async upsert({ indexName, vectors, metadata, ids }) {
|
|
233
|
+
let index;
|
|
234
|
+
let createIndex;
|
|
220
235
|
try {
|
|
221
236
|
if (vectors.length === 0) {
|
|
222
237
|
throw new Error("upsert() called with empty vectors");
|
|
223
238
|
}
|
|
224
|
-
|
|
225
|
-
|
|
239
|
+
index = this.client.namespace(indexName);
|
|
240
|
+
createIndex = this.createIndexCache.get(indexName);
|
|
226
241
|
if (!createIndex) {
|
|
227
242
|
throw new Error(`createIndex() not called for this index`);
|
|
228
243
|
}
|
|
244
|
+
} catch (error) {
|
|
245
|
+
throw new MastraError(
|
|
246
|
+
{
|
|
247
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPSERT_INVALID_ARGS",
|
|
248
|
+
domain: ErrorDomain.STORAGE,
|
|
249
|
+
category: ErrorCategory.USER,
|
|
250
|
+
details: { indexName }
|
|
251
|
+
},
|
|
252
|
+
error
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
229
256
|
const distanceMetric = createIndex.tpufDistanceMetric;
|
|
230
257
|
const vectorIds = ids || vectors.map(() => crypto.randomUUID());
|
|
231
258
|
const records = vectors.map((vector, i) => ({
|
|
@@ -253,21 +280,48 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
253
280
|
}
|
|
254
281
|
return vectorIds;
|
|
255
282
|
} catch (error) {
|
|
256
|
-
throw new
|
|
283
|
+
throw new MastraError(
|
|
284
|
+
{
|
|
285
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPSERT_FAILED",
|
|
286
|
+
domain: ErrorDomain.STORAGE,
|
|
287
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
288
|
+
details: { indexName }
|
|
289
|
+
},
|
|
290
|
+
error
|
|
291
|
+
);
|
|
257
292
|
}
|
|
258
293
|
}
|
|
259
|
-
async query({
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
294
|
+
async query({
|
|
295
|
+
indexName,
|
|
296
|
+
queryVector,
|
|
297
|
+
topK,
|
|
298
|
+
filter,
|
|
299
|
+
includeVector
|
|
300
|
+
}) {
|
|
301
|
+
let createIndex;
|
|
302
|
+
try {
|
|
303
|
+
const schemaConfig = this.opts.schemaConfigForIndex?.(indexName);
|
|
304
|
+
if (schemaConfig) {
|
|
305
|
+
if (queryVector.length !== schemaConfig.dimensions) {
|
|
306
|
+
throw new Error(
|
|
307
|
+
`Turbopuffer index ${indexName} was configured with dimensions=${schemaConfig.dimensions} but attempting to query with queryVector.length=${queryVector.length}`
|
|
308
|
+
);
|
|
309
|
+
}
|
|
266
310
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
311
|
+
createIndex = this.createIndexCache.get(indexName);
|
|
312
|
+
if (!createIndex) {
|
|
313
|
+
throw new Error(`createIndex() not called for this index`);
|
|
314
|
+
}
|
|
315
|
+
} catch (error) {
|
|
316
|
+
throw new MastraError(
|
|
317
|
+
{
|
|
318
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_QUERY_INVALID_ARGS",
|
|
319
|
+
domain: ErrorDomain.STORAGE,
|
|
320
|
+
category: ErrorCategory.USER,
|
|
321
|
+
details: { indexName }
|
|
322
|
+
},
|
|
323
|
+
error
|
|
324
|
+
);
|
|
271
325
|
}
|
|
272
326
|
const distanceMetric = createIndex.tpufDistanceMetric;
|
|
273
327
|
try {
|
|
@@ -290,7 +344,15 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
290
344
|
...includeVector && item.vector ? { vector: item.vector } : {}
|
|
291
345
|
}));
|
|
292
346
|
} catch (error) {
|
|
293
|
-
throw new
|
|
347
|
+
throw new MastraError(
|
|
348
|
+
{
|
|
349
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_QUERY_FAILED",
|
|
350
|
+
domain: ErrorDomain.STORAGE,
|
|
351
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
352
|
+
details: { indexName }
|
|
353
|
+
},
|
|
354
|
+
error
|
|
355
|
+
);
|
|
294
356
|
}
|
|
295
357
|
}
|
|
296
358
|
async listIndexes() {
|
|
@@ -298,19 +360,23 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
298
360
|
const namespacesResult = await this.client.namespaces({});
|
|
299
361
|
return namespacesResult.namespaces.map((namespace) => namespace.id);
|
|
300
362
|
} catch (error) {
|
|
301
|
-
throw new
|
|
363
|
+
throw new MastraError(
|
|
364
|
+
{
|
|
365
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_LIST_INDEXES_FAILED",
|
|
366
|
+
domain: ErrorDomain.STORAGE,
|
|
367
|
+
category: ErrorCategory.THIRD_PARTY
|
|
368
|
+
},
|
|
369
|
+
error
|
|
370
|
+
);
|
|
302
371
|
}
|
|
303
372
|
}
|
|
304
373
|
/**
|
|
305
374
|
* Retrieves statistics about a vector index.
|
|
306
375
|
*
|
|
307
|
-
* @param
|
|
308
|
-
* @param params.indexName - The name of the index to describe
|
|
376
|
+
* @param {string} indexName - The name of the index to describe
|
|
309
377
|
* @returns A promise that resolves to the index statistics including dimension, count and metric
|
|
310
378
|
*/
|
|
311
|
-
async describeIndex(
|
|
312
|
-
const params = this.normalizeArgs("describeIndex", args);
|
|
313
|
-
const { indexName } = params;
|
|
379
|
+
async describeIndex({ indexName }) {
|
|
314
380
|
try {
|
|
315
381
|
const namespace = this.client.namespace(indexName);
|
|
316
382
|
const metadata = await namespace.metadata();
|
|
@@ -326,18 +392,32 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
326
392
|
metric: createIndex.metric
|
|
327
393
|
};
|
|
328
394
|
} catch (error) {
|
|
329
|
-
throw new
|
|
395
|
+
throw new MastraError(
|
|
396
|
+
{
|
|
397
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_DESCRIBE_INDEX_FAILED",
|
|
398
|
+
domain: ErrorDomain.STORAGE,
|
|
399
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
400
|
+
details: { indexName }
|
|
401
|
+
},
|
|
402
|
+
error
|
|
403
|
+
);
|
|
330
404
|
}
|
|
331
405
|
}
|
|
332
|
-
async deleteIndex(
|
|
333
|
-
const params = this.normalizeArgs("deleteIndex", args);
|
|
334
|
-
const { indexName } = params;
|
|
406
|
+
async deleteIndex({ indexName }) {
|
|
335
407
|
try {
|
|
336
408
|
const namespace = this.client.namespace(indexName);
|
|
337
409
|
await namespace.deleteAll();
|
|
338
410
|
this.createIndexCache.delete(indexName);
|
|
339
411
|
} catch (error) {
|
|
340
|
-
throw new
|
|
412
|
+
throw new MastraError(
|
|
413
|
+
{
|
|
414
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_DELETE_INDEX_FAILED",
|
|
415
|
+
domain: ErrorDomain.STORAGE,
|
|
416
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
417
|
+
details: { indexName }
|
|
418
|
+
},
|
|
419
|
+
error
|
|
420
|
+
);
|
|
341
421
|
}
|
|
342
422
|
}
|
|
343
423
|
/**
|
|
@@ -350,25 +430,47 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
350
430
|
* @returns A promise that resolves when the update is complete.
|
|
351
431
|
* @throws Will throw an error if no updates are provided or if the update operation fails.
|
|
352
432
|
*/
|
|
353
|
-
async updateVector(
|
|
354
|
-
|
|
355
|
-
|
|
433
|
+
async updateVector({ indexName, id, update }) {
|
|
434
|
+
let namespace;
|
|
435
|
+
let createIndex;
|
|
436
|
+
let distanceMetric;
|
|
437
|
+
let record;
|
|
356
438
|
try {
|
|
357
|
-
|
|
358
|
-
|
|
439
|
+
namespace = this.client.namespace(indexName);
|
|
440
|
+
createIndex = this.createIndexCache.get(indexName);
|
|
359
441
|
if (!createIndex) {
|
|
360
442
|
throw new Error(`createIndex() not called for this index`);
|
|
361
443
|
}
|
|
362
|
-
|
|
363
|
-
|
|
444
|
+
distanceMetric = createIndex.tpufDistanceMetric;
|
|
445
|
+
record = { id };
|
|
364
446
|
if (update.vector) record.vector = update.vector;
|
|
365
447
|
if (update.metadata) record.attributes = update.metadata;
|
|
448
|
+
} catch (error) {
|
|
449
|
+
throw new MastraError(
|
|
450
|
+
{
|
|
451
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_INVALID_ARGS",
|
|
452
|
+
domain: ErrorDomain.STORAGE,
|
|
453
|
+
category: ErrorCategory.USER,
|
|
454
|
+
details: { indexName }
|
|
455
|
+
},
|
|
456
|
+
error
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
try {
|
|
366
460
|
await namespace.upsert({
|
|
367
461
|
vectors: [record],
|
|
368
462
|
distance_metric: distanceMetric
|
|
369
463
|
});
|
|
370
464
|
} catch (error) {
|
|
371
|
-
throw new
|
|
465
|
+
throw new MastraError(
|
|
466
|
+
{
|
|
467
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_FAILED",
|
|
468
|
+
domain: ErrorDomain.STORAGE,
|
|
469
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
470
|
+
details: { indexName }
|
|
471
|
+
},
|
|
472
|
+
error
|
|
473
|
+
);
|
|
372
474
|
}
|
|
373
475
|
}
|
|
374
476
|
/**
|
|
@@ -378,16 +480,24 @@ var TurbopufferVector = class extends MastraVector {
|
|
|
378
480
|
* @returns A promise that resolves when the deletion is complete.
|
|
379
481
|
* @throws Will throw an error if the deletion operation fails.
|
|
380
482
|
*/
|
|
381
|
-
async deleteVector(
|
|
382
|
-
const params = this.normalizeArgs("deleteVector", args);
|
|
383
|
-
const { indexName, id } = params;
|
|
483
|
+
async deleteVector({ indexName, id }) {
|
|
384
484
|
try {
|
|
385
485
|
const namespace = this.client.namespace(indexName);
|
|
386
486
|
await namespace.delete({ ids: [id] });
|
|
387
487
|
} catch (error) {
|
|
388
|
-
throw new
|
|
488
|
+
throw new MastraError(
|
|
489
|
+
{
|
|
490
|
+
id: "STORAGE_TURBOBUFFER_VECTOR_DELETE_VECTOR_FAILED",
|
|
491
|
+
domain: ErrorDomain.STORAGE,
|
|
492
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
493
|
+
details: { indexName }
|
|
494
|
+
},
|
|
495
|
+
error
|
|
496
|
+
);
|
|
389
497
|
}
|
|
390
498
|
}
|
|
391
499
|
};
|
|
392
500
|
|
|
393
501
|
export { TurbopufferVector };
|
|
502
|
+
//# sourceMappingURL=index.js.map
|
|
503
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vector/filter.ts","../src/vector/index.ts"],"names":["op"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n OperatorSupport,\n VectorFilter,\n OperatorValueMap,\n LogicalOperatorValueMap,\n BlacklistedRootOperators,\n} from '@mastra/core/vector/filter';\nimport { BaseFilterTranslator } from '@mastra/core/vector/filter';\nimport type { FilterCondition, FilterConnective, FilterOperator, Filters } from '@turbopuffer/turbopuffer';\n\ntype TurbopufferOperatorValueMap = Omit<OperatorValueMap, '$regex' | '$options' | '$elemMatch'>;\n\ntype TurbopufferLogicalOperatorValueMap = Omit<LogicalOperatorValueMap, '$nor' | '$not'>;\n\ntype TurbopufferBlacklistedRootOperators = BlacklistedRootOperators | '$nor' | '$not';\n\nexport type TurbopufferVectorFilter = VectorFilter<\n keyof TurbopufferOperatorValueMap,\n TurbopufferOperatorValueMap,\n TurbopufferLogicalOperatorValueMap,\n TurbopufferBlacklistedRootOperators\n>;\n\n/**\n * Translator for converting Mastra filters to Turbopuffer format\n *\n * Mastra filters: { field: { $gt: 10 } }\n * Turbopuffer filters: [\"And\", [[\"field\", \"Gt\", 10]]]\n */\nexport class TurbopufferFilterTranslator extends BaseFilterTranslator<TurbopufferVectorFilter, Filters | undefined> {\n protected override getSupportedOperators(): OperatorSupport {\n return {\n ...BaseFilterTranslator.DEFAULT_OPERATORS,\n logical: ['$and', '$or'],\n array: ['$in', '$nin', '$all'],\n element: ['$exists'],\n regex: [], // No regex support in Turbopuffer\n custom: [], // No custom operators\n };\n }\n\n /**\n * Map Mastra operators to Turbopuffer operators\n */\n private operatorMap: Record<string, FilterOperator> = {\n $eq: 'Eq',\n $ne: 'NotEq',\n $gt: 'Gt',\n $gte: 'Gte',\n $lt: 'Lt',\n $lte: 'Lte',\n $in: 'In',\n $nin: 'NotIn',\n };\n\n /**\n * Convert the Mastra filter to Turbopuffer format\n */\n translate(filter?: TurbopufferVectorFilter): Filters | undefined {\n if (this.isEmpty(filter)) {\n return undefined;\n }\n\n // Validate the filter structure before translating\n this.validateFilter(filter);\n\n // Translate the filter\n const result = this.translateNode(filter);\n\n // If we have a single condition (not a logical operator at the top level),\n // wrap it in an implicit AND to match Turbopuffer's expected format\n if (!Array.isArray(result) || result.length !== 2 || (result[0] !== 'And' && result[0] !== 'Or')) {\n return ['And', [result as FilterCondition]];\n }\n\n return result as Filters;\n }\n\n /**\n * Recursively translate a filter node\n */\n private translateNode(node: TurbopufferVectorFilter): Filters | FilterCondition {\n // Handle empty or null nodes\n if (node === null || node === undefined || Object.keys(node).length === 0) {\n return ['And', []];\n }\n\n // Handle primitive values (direct equality comparison)\n if (this.isPrimitive(node)) {\n throw new Error('Direct primitive values not valid in this context for Turbopuffer');\n }\n\n // Handle direct array value (convert to $in)\n if (Array.isArray(node)) {\n throw new Error('Direct array values not valid in this context for Turbopuffer');\n }\n\n const entries = Object.entries(node);\n\n // Process the first operator or field\n if (entries.length === 0) {\n return ['And', []];\n }\n\n const [key, value] = entries[0] as [string, any];\n\n // Handle logical operators\n if (key && this.isLogicalOperator(key)) {\n return this.translateLogical(key, value);\n }\n\n // Multiple fields at top level - implicit AND\n if (entries.length > 1) {\n const conditions = entries.map(([field, fieldValue]) => this.translateFieldCondition(field, fieldValue));\n return ['And', conditions];\n }\n\n // Single field with condition(s)\n return this.translateFieldCondition(key, value);\n }\n\n /**\n * Translate a field condition\n */\n private translateFieldCondition(field: string, value: any): FilterCondition {\n // Handle Date object directly (convert to ISO string)\n if (value instanceof Date) {\n return [field, 'Eq', this.normalizeValue(value)];\n }\n\n // Handle primitive value (direct equality)\n if (this.isPrimitive(value)) {\n return [field, 'Eq', this.normalizeValue(value)];\n }\n\n // Handle array value (convert to $in)\n if (Array.isArray(value)) {\n return [field, 'In', this.normalizeArrayValues(value)];\n }\n\n // Handle object with operators\n if (typeof value === 'object' && value !== null) {\n const operators = Object.keys(value);\n\n // If multiple operators for the same field, create an AND condition\n if (operators.length > 1) {\n // Check if all keys are operators\n const allOperators = operators.every(op => this.isOperator(op));\n if (allOperators) {\n // For multiple comparison operators on one field\n const conditions = operators.map(op => this.translateOperator(field, op, value[op]));\n return ['And', conditions] as unknown as FilterCondition;\n } else {\n // For nested objects with multiple fields\n const conditions = operators.map(op => {\n const nestedField = `${field}.${op}`;\n return this.translateFieldCondition(nestedField, value[op]);\n });\n return ['And', conditions] as unknown as FilterCondition;\n }\n }\n\n // Single operator\n const op = operators[0];\n if (op && this.isOperator(op)) {\n return this.translateOperator(field, op, value[op]);\n }\n\n // Nested field path (use dot notation)\n if (op && !this.isOperator(op)) {\n const nestedField = `${field}.${op}`;\n return this.translateFieldCondition(nestedField, value[op]);\n }\n }\n\n throw new Error(`Unsupported filter format for field: ${field}`);\n }\n\n /**\n * Translate a logical operator\n */\n private translateLogical(operator: string, conditions: any[]): Filters {\n // Map Mastra logical operators to Turbopuffer\n const logicalOp: FilterConnective = operator === '$and' ? 'And' : 'Or';\n\n // Validate conditions\n if (!Array.isArray(conditions)) {\n throw new Error(`Logical operator ${operator} requires an array of conditions`);\n }\n\n // Translate each condition\n const translatedConditions = conditions.map(condition => {\n if (typeof condition !== 'object' || condition === null) {\n throw new Error(`Invalid condition for logical operator ${operator}`);\n }\n return this.translateNode(condition);\n });\n\n return [logicalOp, translatedConditions];\n }\n\n /**\n * Translate a specific operator\n */\n private translateOperator(field: string, operator: string, value: any): FilterCondition {\n // Handle comparison operators\n if (operator && this.operatorMap[operator]) {\n return [field, this.operatorMap[operator], this.normalizeValue(value)];\n }\n\n // Handle special cases\n switch (operator) {\n case '$exists':\n // $exists: true -> use NotEq with null (field exists if it's not null)\n // $exists: false -> use Eq with null (field doesn't exist if it is null)\n return value ? [field, 'NotEq', null] : [field, 'Eq', null];\n\n case '$all':\n // $all is not directly supported, simulate with AND + IN conditions\n if (!Array.isArray(value) || value.length === 0) {\n throw new Error('$all operator requires a non-empty array');\n }\n\n const allConditions = value.map(item => [field, 'In', [this.normalizeValue(item)]] as FilterCondition);\n\n // Return the array of conditions directly without nesting\n return ['And', allConditions] as unknown as FilterCondition;\n\n default:\n throw new Error(`Unsupported operator: ${operator || 'undefined'}`);\n }\n }\n\n /**\n * Normalize a value for comparison operations\n */\n protected normalizeValue(value: any): any {\n // Handle special value types\n if (value instanceof Date) {\n return value.toISOString();\n }\n return value;\n }\n\n /**\n * Normalize array values\n */\n protected normalizeArrayValues(values: any[]): any[] {\n return values.map(value => this.normalizeValue(value));\n }\n}\n","import { ErrorCategory, ErrorDomain, MastraError } from '@mastra/core/error';\nimport type {\n CreateIndexParams,\n DeleteIndexParams,\n DeleteVectorParams,\n DescribeIndexParams,\n IndexStats,\n QueryResult,\n QueryVectorParams,\n UpdateVectorParams,\n UpsertVectorParams,\n} from '@mastra/core/vector';\nimport { MastraVector } from '@mastra/core/vector';\nimport { Turbopuffer } from '@turbopuffer/turbopuffer';\nimport type { DistanceMetric, QueryResults, Schema, Vector } from '@turbopuffer/turbopuffer';\nimport { TurbopufferFilterTranslator } from './filter';\nimport type { TurbopufferVectorFilter } from './filter';\n\ntype TurbopufferQueryVectorParams = QueryVectorParams<TurbopufferVectorFilter>;\n\nexport interface TurbopufferVectorOptions {\n /** The API key to authenticate with. */\n apiKey: string;\n /** The base URL. Default is https://api.turbopuffer.com. */\n baseUrl?: string;\n /** The timeout to establish a connection, in ms. Default is 10_000. Only applicable in Node and Deno.*/\n connectTimeout?: number;\n /** The socket idle timeout, in ms. Default is 60_000. Only applicable in Node and Deno.*/\n connectionIdleTimeout?: number;\n /** The number of connections to open initially when creating a new client. Default is 0. */\n warmConnections?: number;\n /** Whether to compress requests and accept compressed responses. Default is true. */\n compression?: boolean;\n /**\n * A callback function that takes an index name and returns a config object for that index.\n * This allows you to define explicit schemas per index.\n *\n * Example:\n * ```typescript\n * schemaConfigForIndex: (indexName: string) => {\n * // Mastra's default embedding model and index for memory messages:\n * if (indexName === \"memory_messages_384\") {\n * return {\n * dimensions: 384,\n * schema: {\n * thread_id: {\n * type: \"string\",\n * filterable: true,\n * },\n * },\n * };\n * } else {\n * throw new Error(`TODO: add schema for index: ${indexName}`);\n * }\n * },\n * ```\n */\n schemaConfigForIndex?: (indexName: string) => {\n dimensions: number;\n schema: Schema;\n };\n}\n\nexport class TurbopufferVector extends MastraVector<TurbopufferVectorFilter> {\n private client: Turbopuffer;\n private filterTranslator: TurbopufferFilterTranslator;\n // There is no explicit create index operation in Turbopuffer, so just register that\n // someone has called createIndex() and verify that subsequent upsert calls are consistent\n // with how the index was \"created\"\n private createIndexCache: Map<\n string,\n CreateIndexParams & {\n tpufDistanceMetric: DistanceMetric;\n }\n > = new Map();\n private opts: TurbopufferVectorOptions;\n\n constructor(opts: TurbopufferVectorOptions) {\n super();\n this.filterTranslator = new TurbopufferFilterTranslator();\n this.opts = opts;\n\n const baseClient = new Turbopuffer(opts);\n const telemetry = this.__getTelemetry();\n this.client =\n telemetry?.traceClass(baseClient, {\n spanNamePrefix: 'turbopuffer-vector',\n attributes: {\n 'vector.type': 'turbopuffer',\n },\n }) ?? baseClient;\n }\n\n async createIndex({ indexName, dimension, metric }: CreateIndexParams): Promise<void> {\n metric = metric ?? 'cosine'; // default to cosine distance\n let distanceMetric: DistanceMetric = 'cosine_distance';\n try {\n if (this.createIndexCache.has(indexName)) {\n // verify that the dimensions and distance metric match what we expect\n const expected = this.createIndexCache.get(indexName)!;\n if (dimension !== expected.dimension || metric !== expected.metric) {\n throw new Error(\n `createIndex() called more than once with inconsistent inputs. Index ${indexName} expected dimensions=${expected.dimension} and metric=${expected.metric} but got dimensions=${dimension} and metric=${metric}`,\n );\n }\n return;\n }\n if (dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n switch (metric) {\n case 'cosine':\n distanceMetric = 'cosine_distance';\n break;\n case 'euclidean':\n distanceMetric = 'euclidean_squared';\n break;\n case 'dotproduct':\n throw new Error('dotproduct is not supported in Turbopuffer');\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_CREATE_INDEX_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName, dimension, metric },\n },\n error,\n );\n }\n\n this.createIndexCache.set(indexName, {\n indexName,\n dimension,\n metric,\n tpufDistanceMetric: distanceMetric,\n });\n }\n\n async upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n let index;\n let createIndex;\n try {\n if (vectors.length === 0) {\n throw new Error('upsert() called with empty vectors');\n }\n\n index = this.client.namespace(indexName);\n createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPSERT_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n error,\n );\n }\n\n try {\n const distanceMetric = createIndex.tpufDistanceMetric;\n const vectorIds = ids || vectors.map(() => crypto.randomUUID());\n const records: Vector[] = vectors.map((vector, i) => ({\n id: vectorIds[i]!,\n vector: vector,\n attributes: metadata?.[i] || {},\n }));\n\n // limit is 256 MB per upsert request, so set a reasonable batch size here that will stay under that for most cases\n // https://turbopuffer.com/docs/limits\n const batchSize = 100;\n for (let i = 0; i < records.length; i += batchSize) {\n const batch = records.slice(i, i + batchSize);\n const upsertOptions: {\n vectors: Vector[];\n distance_metric: DistanceMetric;\n schema?: Schema;\n batchSize?: number;\n } = {\n vectors: batch,\n distance_metric: distanceMetric,\n };\n\n // Use the schemaForIndex callback if provided\n const schemaConfig = this.opts.schemaConfigForIndex?.(indexName);\n if (schemaConfig) {\n upsertOptions.schema = schemaConfig.schema;\n if (vectors[0]?.length !== schemaConfig.dimensions) {\n throw new Error(\n `Turbopuffer index ${indexName} was configured with dimensions=${schemaConfig.dimensions} but attempting to upsert vectors[0].length=${vectors[0]?.length}`,\n );\n }\n }\n\n await index.upsert(upsertOptions);\n }\n\n return vectorIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async query({\n indexName,\n queryVector,\n topK,\n filter,\n includeVector,\n }: TurbopufferQueryVectorParams): Promise<QueryResult[]> {\n let createIndex;\n try {\n const schemaConfig = this.opts.schemaConfigForIndex?.(indexName);\n if (schemaConfig) {\n if (queryVector.length !== schemaConfig.dimensions) {\n throw new Error(\n `Turbopuffer index ${indexName} was configured with dimensions=${schemaConfig.dimensions} but attempting to query with queryVector.length=${queryVector.length}`,\n );\n }\n }\n createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_QUERY_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n error,\n );\n }\n\n const distanceMetric = createIndex.tpufDistanceMetric;\n try {\n const index = this.client.namespace(indexName);\n const translatedFilter = this.filterTranslator.translate(filter);\n const results: QueryResults = await index.query({\n distance_metric: distanceMetric,\n vector: queryVector,\n top_k: topK,\n filters: translatedFilter,\n include_vectors: includeVector,\n include_attributes: true,\n consistency: { level: 'strong' }, // todo: make this configurable somehow?\n });\n return results.map(item => ({\n id: String(item.id),\n score: typeof item.dist === 'number' ? item.dist : 0,\n metadata: item.attributes || {},\n ...(includeVector && item.vector ? { vector: item.vector } : {}),\n }));\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n const namespacesResult = await this.client.namespaces({});\n return namespacesResult.namespaces.map(namespace => namespace.id);\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_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 namespace = this.client.namespace(indexName);\n const metadata = await namespace.metadata();\n const createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n const dimension = metadata.dimensions;\n const count = metadata.approx_count;\n return {\n dimension,\n count,\n metric: createIndex.metric,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_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 const namespace = this.client.namespace(indexName);\n await namespace.deleteAll();\n this.createIndexCache.delete(indexName);\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_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 let namespace;\n let createIndex;\n let distanceMetric;\n let record;\n try {\n namespace = this.client.namespace(indexName);\n createIndex = this.createIndexCache.get(indexName);\n if (!createIndex) {\n throw new Error(`createIndex() not called for this index`);\n }\n distanceMetric = createIndex.tpufDistanceMetric;\n record = { id } as Vector;\n if (update.vector) record.vector = update.vector;\n if (update.metadata) record.attributes = update.metadata;\n } catch (error) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_INVALID_ARGS',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.USER,\n details: { indexName },\n },\n error,\n );\n }\n try {\n await namespace.upsert({\n vectors: [record],\n distance_metric: distanceMetric,\n });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_UPDATE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\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 const namespace = this.client.namespace(indexName);\n await namespace.delete({ ids: [id] });\n } catch (error: any) {\n throw new MastraError(\n {\n id: 'STORAGE_TURBOBUFFER_VECTOR_DELETE_VECTOR_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: { indexName },\n },\n error,\n );\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { OperatorSupport, VectorFilter, OperatorValueMap, LogicalOperatorValueMap, BlacklistedRootOperators } from '@mastra/core/vector/filter';
|
|
2
|
+
import { BaseFilterTranslator } from '@mastra/core/vector/filter';
|
|
3
|
+
import type { Filters } from '@turbopuffer/turbopuffer';
|
|
4
|
+
type TurbopufferOperatorValueMap = Omit<OperatorValueMap, '$regex' | '$options' | '$elemMatch'>;
|
|
5
|
+
type TurbopufferLogicalOperatorValueMap = Omit<LogicalOperatorValueMap, '$nor' | '$not'>;
|
|
6
|
+
type TurbopufferBlacklistedRootOperators = BlacklistedRootOperators | '$nor' | '$not';
|
|
7
|
+
export type TurbopufferVectorFilter = VectorFilter<keyof TurbopufferOperatorValueMap, TurbopufferOperatorValueMap, TurbopufferLogicalOperatorValueMap, TurbopufferBlacklistedRootOperators>;
|
|
8
|
+
/**
|
|
9
|
+
* Translator for converting Mastra filters to Turbopuffer format
|
|
10
|
+
*
|
|
11
|
+
* Mastra filters: { field: { $gt: 10 } }
|
|
12
|
+
* Turbopuffer filters: ["And", [["field", "Gt", 10]]]
|
|
13
|
+
*/
|
|
14
|
+
export declare class TurbopufferFilterTranslator extends BaseFilterTranslator<TurbopufferVectorFilter, Filters | undefined> {
|
|
15
|
+
protected getSupportedOperators(): OperatorSupport;
|
|
16
|
+
/**
|
|
17
|
+
* Map Mastra operators to Turbopuffer operators
|
|
18
|
+
*/
|
|
19
|
+
private operatorMap;
|
|
20
|
+
/**
|
|
21
|
+
* Convert the Mastra filter to Turbopuffer format
|
|
22
|
+
*/
|
|
23
|
+
translate(filter?: TurbopufferVectorFilter): Filters | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Recursively translate a filter node
|
|
26
|
+
*/
|
|
27
|
+
private translateNode;
|
|
28
|
+
/**
|
|
29
|
+
* Translate a field condition
|
|
30
|
+
*/
|
|
31
|
+
private translateFieldCondition;
|
|
32
|
+
/**
|
|
33
|
+
* Translate a logical operator
|
|
34
|
+
*/
|
|
35
|
+
private translateLogical;
|
|
36
|
+
/**
|
|
37
|
+
* Translate a specific operator
|
|
38
|
+
*/
|
|
39
|
+
private translateOperator;
|
|
40
|
+
/**
|
|
41
|
+
* Normalize a value for comparison operations
|
|
42
|
+
*/
|
|
43
|
+
protected normalizeValue(value: any): any;
|
|
44
|
+
/**
|
|
45
|
+
* Normalize array values
|
|
46
|
+
*/
|
|
47
|
+
protected normalizeArrayValues(values: any[]): any[];
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/vector/filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAqD,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAE3G,KAAK,2BAA2B,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,CAAC,CAAC;AAEhG,KAAK,kCAAkC,GAAG,IAAI,CAAC,uBAAuB,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAEzF,KAAK,mCAAmC,GAAG,wBAAwB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtF,MAAM,MAAM,uBAAuB,GAAG,YAAY,CAChD,MAAM,2BAA2B,EACjC,2BAA2B,EAC3B,kCAAkC,EAClC,mCAAmC,CACpC,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,2BAA4B,SAAQ,oBAAoB,CAAC,uBAAuB,EAAE,OAAO,GAAG,SAAS,CAAC;cAC9F,qBAAqB,IAAI,eAAe;IAW3D;;OAEG;IACH,OAAO,CAAC,WAAW,CASjB;IAEF;;OAEG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,OAAO,GAAG,SAAS;IAoBhE;;OAEG;IACH,OAAO,CAAC,aAAa;IAwCrB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAsD/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;OAEG;IACH,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;IAQzC;;OAEG;IACH,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;CAGrD"}
|
|
@@ -1,105 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { CreateIndexParams } from '@mastra/core/vector';
|
|
3
|
-
import type { DeleteIndexParams } from '@mastra/core/vector';
|
|
4
|
-
import type { DeleteVectorParams } from '@mastra/core/vector';
|
|
5
|
-
import type { DescribeIndexParams } from '@mastra/core/vector';
|
|
6
|
-
import type { Filters } from '@turbopuffer/turbopuffer';
|
|
7
|
-
import type { IndexStats } from '@mastra/core/vector';
|
|
1
|
+
import type { CreateIndexParams, DeleteIndexParams, DeleteVectorParams, DescribeIndexParams, IndexStats, QueryResult, QueryVectorParams, UpdateVectorParams, UpsertVectorParams } from '@mastra/core/vector';
|
|
8
2
|
import { MastraVector } from '@mastra/core/vector';
|
|
9
|
-
import type { OperatorSupport } from '@mastra/core/vector/filter';
|
|
10
|
-
import type { ParamsToArgs } from '@mastra/core/vector';
|
|
11
|
-
import type { QueryResult } from '@mastra/core/vector';
|
|
12
|
-
import type { QueryVectorParams } from '@mastra/core/vector';
|
|
13
3
|
import type { Schema } from '@turbopuffer/turbopuffer';
|
|
14
|
-
import type {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Translator for converting Mastra filters to Turbopuffer format
|
|
20
|
-
*
|
|
21
|
-
* Mastra filters: { field: { $gt: 10 } }
|
|
22
|
-
* Turbopuffer filters: ["And", [["field", "Gt", 10]]]
|
|
23
|
-
*/
|
|
24
|
-
export declare class TurbopufferFilterTranslator extends BaseFilterTranslator {
|
|
25
|
-
protected getSupportedOperators(): OperatorSupport;
|
|
26
|
-
/**
|
|
27
|
-
* Map Mastra operators to Turbopuffer operators
|
|
28
|
-
*/
|
|
29
|
-
private operatorMap;
|
|
30
|
-
/**
|
|
31
|
-
* Convert the Mastra filter to Turbopuffer format
|
|
32
|
-
*/
|
|
33
|
-
translate(filter?: VectorFilter): Filters | undefined;
|
|
34
|
-
/**
|
|
35
|
-
* Recursively translate a filter node
|
|
36
|
-
*/
|
|
37
|
-
private translateNode;
|
|
38
|
-
/**
|
|
39
|
-
* Translate a field condition
|
|
40
|
-
*/
|
|
41
|
-
private translateFieldCondition;
|
|
42
|
-
/**
|
|
43
|
-
* Translate a logical operator
|
|
44
|
-
*/
|
|
45
|
-
private translateLogical;
|
|
46
|
-
/**
|
|
47
|
-
* Translate a specific operator
|
|
48
|
-
*/
|
|
49
|
-
private translateOperator;
|
|
50
|
-
/**
|
|
51
|
-
* Normalize a value for comparison operations
|
|
52
|
-
*/
|
|
53
|
-
protected normalizeValue(value: any): any;
|
|
54
|
-
/**
|
|
55
|
-
* Normalize array values
|
|
56
|
-
*/
|
|
57
|
-
protected normalizeArrayValues(values: any[]): any[];
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
declare class TurbopufferVector extends MastraVector {
|
|
61
|
-
private client;
|
|
62
|
-
private filterTranslator;
|
|
63
|
-
private createIndexCache;
|
|
64
|
-
private opts;
|
|
65
|
-
constructor(opts: TurbopufferVectorOptions);
|
|
66
|
-
createIndex({ indexName, dimension, metric }: CreateIndexParams): Promise<void>;
|
|
67
|
-
upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]>;
|
|
68
|
-
query({ indexName, queryVector, topK, filter, includeVector }: QueryVectorParams): Promise<QueryResult[]>;
|
|
69
|
-
listIndexes(): Promise<string[]>;
|
|
70
|
-
/**
|
|
71
|
-
* Retrieves statistics about a vector index.
|
|
72
|
-
*
|
|
73
|
-
* @param params - The parameters for describing an index
|
|
74
|
-
* @param params.indexName - The name of the index to describe
|
|
75
|
-
* @returns A promise that resolves to the index statistics including dimension, count and metric
|
|
76
|
-
*/
|
|
77
|
-
describeIndex(...args: ParamsToArgs<DescribeIndexParams>): Promise<IndexStats>;
|
|
78
|
-
deleteIndex(...args: ParamsToArgs<DeleteIndexParams>): Promise<void>;
|
|
79
|
-
/**
|
|
80
|
-
* Updates a vector by its ID with the provided vector and/or metadata.
|
|
81
|
-
* @param indexName - The name of the index containing the vector.
|
|
82
|
-
* @param id - The ID of the vector to update.
|
|
83
|
-
* @param update - An object containing the vector and/or metadata to update.
|
|
84
|
-
* @param update.vector - An optional array of numbers representing the new vector.
|
|
85
|
-
* @param update.metadata - An optional record containing the new metadata.
|
|
86
|
-
* @returns A promise that resolves when the update is complete.
|
|
87
|
-
* @throws Will throw an error if no updates are provided or if the update operation fails.
|
|
88
|
-
*/
|
|
89
|
-
updateVector(...args: ParamsToArgs<UpdateVectorParams>): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Deletes a vector by its ID.
|
|
92
|
-
* @param indexName - The name of the index containing the vector.
|
|
93
|
-
* @param id - The ID of the vector to delete.
|
|
94
|
-
* @returns A promise that resolves when the deletion is complete.
|
|
95
|
-
* @throws Will throw an error if the deletion operation fails.
|
|
96
|
-
*/
|
|
97
|
-
deleteVector(...args: ParamsToArgs<DeleteVectorParams>): Promise<void>;
|
|
98
|
-
}
|
|
99
|
-
export { TurbopufferVector }
|
|
100
|
-
export { TurbopufferVector as TurbopufferVector_alias_1 }
|
|
101
|
-
|
|
102
|
-
declare interface TurbopufferVectorOptions {
|
|
4
|
+
import type { TurbopufferVectorFilter } from './filter.js';
|
|
5
|
+
type TurbopufferQueryVectorParams = QueryVectorParams<TurbopufferVectorFilter>;
|
|
6
|
+
export interface TurbopufferVectorOptions {
|
|
103
7
|
/** The API key to authenticate with. */
|
|
104
8
|
apiKey: string;
|
|
105
9
|
/** The base URL. Default is https://api.turbopuffer.com. */
|
|
@@ -141,7 +45,43 @@ declare interface TurbopufferVectorOptions {
|
|
|
141
45
|
schema: Schema;
|
|
142
46
|
};
|
|
143
47
|
}
|
|
144
|
-
export
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
48
|
+
export declare class TurbopufferVector extends MastraVector<TurbopufferVectorFilter> {
|
|
49
|
+
private client;
|
|
50
|
+
private filterTranslator;
|
|
51
|
+
private createIndexCache;
|
|
52
|
+
private opts;
|
|
53
|
+
constructor(opts: TurbopufferVectorOptions);
|
|
54
|
+
createIndex({ indexName, dimension, metric }: CreateIndexParams): Promise<void>;
|
|
55
|
+
upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]>;
|
|
56
|
+
query({ indexName, queryVector, topK, filter, includeVector, }: TurbopufferQueryVectorParams): Promise<QueryResult[]>;
|
|
57
|
+
listIndexes(): Promise<string[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Retrieves statistics about a vector index.
|
|
60
|
+
*
|
|
61
|
+
* @param {string} indexName - The name of the index to describe
|
|
62
|
+
* @returns A promise that resolves to the index statistics including dimension, count and metric
|
|
63
|
+
*/
|
|
64
|
+
describeIndex({ indexName }: DescribeIndexParams): Promise<IndexStats>;
|
|
65
|
+
deleteIndex({ indexName }: DeleteIndexParams): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Updates a vector by its ID with the provided vector and/or metadata.
|
|
68
|
+
* @param indexName - The name of the index containing the vector.
|
|
69
|
+
* @param id - The ID of the vector to update.
|
|
70
|
+
* @param update - An object containing the vector and/or metadata to update.
|
|
71
|
+
* @param update.vector - An optional array of numbers representing the new vector.
|
|
72
|
+
* @param update.metadata - An optional record containing the new metadata.
|
|
73
|
+
* @returns A promise that resolves when the update is complete.
|
|
74
|
+
* @throws Will throw an error if no updates are provided or if the update operation fails.
|
|
75
|
+
*/
|
|
76
|
+
updateVector({ indexName, id, update }: UpdateVectorParams): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Deletes a vector by its ID.
|
|
79
|
+
* @param indexName - The name of the index containing the vector.
|
|
80
|
+
* @param id - The ID of the vector to delete.
|
|
81
|
+
* @returns A promise that resolves when the deletion is complete.
|
|
82
|
+
* @throws Will throw an error if the deletion operation fails.
|
|
83
|
+
*/
|
|
84
|
+
deleteVector({ indexName, id }: DeleteVectorParams): Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAgC,MAAM,EAAU,MAAM,0BAA0B,CAAC;AAE7F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAExD,KAAK,4BAA4B,GAAG,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;AAE/E,MAAM,WAAW,wBAAwB;IACvC,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wGAAwG;IACxG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,4FAA4F;IAC5F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qFAAqF;IACrF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK;QAC5C,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,uBAAuB,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,gBAAgB,CAA8B;IAItD,OAAO,CAAC,gBAAgB,CAKV;IACd,OAAO,CAAC,IAAI,CAA2B;gBAE3B,IAAI,EAAE,wBAAwB;IAgBpC,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C/E,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA6EpF,KAAK,CAAC,EACV,SAAS,EACT,WAAW,EACX,IAAI,EACJ,MAAM,EACN,aAAa,GACd,EAAE,4BAA4B,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2DlD,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBtC;;;;;OAKG;IACG,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;IA4BtE,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlE;;;;;;;;;OASG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4ChF;;;;;;OAMG;IACG,YAAY,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBzE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mastra/turbopuffer",
|
|
3
|
-
"version": "0.0.0-vector-
|
|
3
|
+
"version": "0.0.0-vector-query-tool-provider-options-20250828222356",
|
|
4
4
|
"description": "Turbopuffer vector store provider for Mastra",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"default": "./dist/index.js"
|
|
16
16
|
},
|
|
17
17
|
"require": {
|
|
18
|
-
"types": "./dist/index.d.
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
19
|
"default": "./dist/index.cjs"
|
|
20
20
|
}
|
|
21
21
|
},
|
|
@@ -23,22 +23,26 @@
|
|
|
23
23
|
},
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@turbopuffer/turbopuffer": "^0.6.
|
|
27
|
-
"@mastra/core": "0.0.0-vector-sources-20250516175436"
|
|
26
|
+
"@turbopuffer/turbopuffer": "^0.6.17"
|
|
28
27
|
},
|
|
29
28
|
"devDependencies": {
|
|
30
|
-
"@microsoft/api-extractor": "^7.52.
|
|
31
|
-
"@types/node": "^20.
|
|
32
|
-
"dotenv": "^
|
|
33
|
-
"eslint": "^9.
|
|
34
|
-
"tsup": "^8.
|
|
35
|
-
"typescript": "^5.8.
|
|
36
|
-
"vitest": "^3.
|
|
37
|
-
"@internal/lint": "0.0.0-vector-
|
|
29
|
+
"@microsoft/api-extractor": "^7.52.8",
|
|
30
|
+
"@types/node": "^20.19.0",
|
|
31
|
+
"dotenv": "^17.0.0",
|
|
32
|
+
"eslint": "^9.30.1",
|
|
33
|
+
"tsup": "^8.5.0",
|
|
34
|
+
"typescript": "^5.8.3",
|
|
35
|
+
"vitest": "^3.2.4",
|
|
36
|
+
"@internal/lint": "0.0.0-vector-query-tool-provider-options-20250828222356",
|
|
37
|
+
"@mastra/core": "0.0.0-vector-query-tool-provider-options-20250828222356",
|
|
38
|
+
"@internal/types-builder": "0.0.0-vector-query-tool-provider-options-20250828222356"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"@mastra/core": "0.0.0-vector-query-tool-provider-options-20250828222356"
|
|
38
42
|
},
|
|
39
43
|
"scripts": {
|
|
40
|
-
"build": "tsup
|
|
41
|
-
"build:watch": "
|
|
44
|
+
"build": "tsup --silent --config tsup.config.ts",
|
|
45
|
+
"build:watch": "tsup --watch --silent --config tsup.config.ts",
|
|
42
46
|
"test": "vitest run",
|
|
43
47
|
"lint": "eslint ."
|
|
44
48
|
}
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { BaseFilterTranslator } from '@mastra/core/vector/filter';
|
|
2
|
-
import type { CreateIndexParams } from '@mastra/core/vector';
|
|
3
|
-
import type { DeleteIndexParams } from '@mastra/core/vector';
|
|
4
|
-
import type { DeleteVectorParams } from '@mastra/core/vector';
|
|
5
|
-
import type { DescribeIndexParams } from '@mastra/core/vector';
|
|
6
|
-
import type { Filters } from '@turbopuffer/turbopuffer';
|
|
7
|
-
import type { IndexStats } from '@mastra/core/vector';
|
|
8
|
-
import { MastraVector } from '@mastra/core/vector';
|
|
9
|
-
import type { OperatorSupport } from '@mastra/core/vector/filter';
|
|
10
|
-
import type { ParamsToArgs } from '@mastra/core/vector';
|
|
11
|
-
import type { QueryResult } from '@mastra/core/vector';
|
|
12
|
-
import type { QueryVectorParams } from '@mastra/core/vector';
|
|
13
|
-
import type { Schema } from '@turbopuffer/turbopuffer';
|
|
14
|
-
import type { UpdateVectorParams } from '@mastra/core/vector';
|
|
15
|
-
import type { UpsertVectorParams } from '@mastra/core/vector';
|
|
16
|
-
import type { VectorFilter } from '@mastra/core/vector/filter';
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Translator for converting Mastra filters to Turbopuffer format
|
|
20
|
-
*
|
|
21
|
-
* Mastra filters: { field: { $gt: 10 } }
|
|
22
|
-
* Turbopuffer filters: ["And", [["field", "Gt", 10]]]
|
|
23
|
-
*/
|
|
24
|
-
export declare class TurbopufferFilterTranslator extends BaseFilterTranslator {
|
|
25
|
-
protected getSupportedOperators(): OperatorSupport;
|
|
26
|
-
/**
|
|
27
|
-
* Map Mastra operators to Turbopuffer operators
|
|
28
|
-
*/
|
|
29
|
-
private operatorMap;
|
|
30
|
-
/**
|
|
31
|
-
* Convert the Mastra filter to Turbopuffer format
|
|
32
|
-
*/
|
|
33
|
-
translate(filter?: VectorFilter): Filters | undefined;
|
|
34
|
-
/**
|
|
35
|
-
* Recursively translate a filter node
|
|
36
|
-
*/
|
|
37
|
-
private translateNode;
|
|
38
|
-
/**
|
|
39
|
-
* Translate a field condition
|
|
40
|
-
*/
|
|
41
|
-
private translateFieldCondition;
|
|
42
|
-
/**
|
|
43
|
-
* Translate a logical operator
|
|
44
|
-
*/
|
|
45
|
-
private translateLogical;
|
|
46
|
-
/**
|
|
47
|
-
* Translate a specific operator
|
|
48
|
-
*/
|
|
49
|
-
private translateOperator;
|
|
50
|
-
/**
|
|
51
|
-
* Normalize a value for comparison operations
|
|
52
|
-
*/
|
|
53
|
-
protected normalizeValue(value: any): any;
|
|
54
|
-
/**
|
|
55
|
-
* Normalize array values
|
|
56
|
-
*/
|
|
57
|
-
protected normalizeArrayValues(values: any[]): any[];
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
declare class TurbopufferVector extends MastraVector {
|
|
61
|
-
private client;
|
|
62
|
-
private filterTranslator;
|
|
63
|
-
private createIndexCache;
|
|
64
|
-
private opts;
|
|
65
|
-
constructor(opts: TurbopufferVectorOptions);
|
|
66
|
-
createIndex({ indexName, dimension, metric }: CreateIndexParams): Promise<void>;
|
|
67
|
-
upsert({ indexName, vectors, metadata, ids }: UpsertVectorParams): Promise<string[]>;
|
|
68
|
-
query({ indexName, queryVector, topK, filter, includeVector }: QueryVectorParams): Promise<QueryResult[]>;
|
|
69
|
-
listIndexes(): Promise<string[]>;
|
|
70
|
-
/**
|
|
71
|
-
* Retrieves statistics about a vector index.
|
|
72
|
-
*
|
|
73
|
-
* @param params - The parameters for describing an index
|
|
74
|
-
* @param params.indexName - The name of the index to describe
|
|
75
|
-
* @returns A promise that resolves to the index statistics including dimension, count and metric
|
|
76
|
-
*/
|
|
77
|
-
describeIndex(...args: ParamsToArgs<DescribeIndexParams>): Promise<IndexStats>;
|
|
78
|
-
deleteIndex(...args: ParamsToArgs<DeleteIndexParams>): Promise<void>;
|
|
79
|
-
/**
|
|
80
|
-
* Updates a vector by its ID with the provided vector and/or metadata.
|
|
81
|
-
* @param indexName - The name of the index containing the vector.
|
|
82
|
-
* @param id - The ID of the vector to update.
|
|
83
|
-
* @param update - An object containing the vector and/or metadata to update.
|
|
84
|
-
* @param update.vector - An optional array of numbers representing the new vector.
|
|
85
|
-
* @param update.metadata - An optional record containing the new metadata.
|
|
86
|
-
* @returns A promise that resolves when the update is complete.
|
|
87
|
-
* @throws Will throw an error if no updates are provided or if the update operation fails.
|
|
88
|
-
*/
|
|
89
|
-
updateVector(...args: ParamsToArgs<UpdateVectorParams>): Promise<void>;
|
|
90
|
-
/**
|
|
91
|
-
* Deletes a vector by its ID.
|
|
92
|
-
* @param indexName - The name of the index containing the vector.
|
|
93
|
-
* @param id - The ID of the vector to delete.
|
|
94
|
-
* @returns A promise that resolves when the deletion is complete.
|
|
95
|
-
* @throws Will throw an error if the deletion operation fails.
|
|
96
|
-
*/
|
|
97
|
-
deleteVector(...args: ParamsToArgs<DeleteVectorParams>): Promise<void>;
|
|
98
|
-
}
|
|
99
|
-
export { TurbopufferVector }
|
|
100
|
-
export { TurbopufferVector as TurbopufferVector_alias_1 }
|
|
101
|
-
|
|
102
|
-
declare interface TurbopufferVectorOptions {
|
|
103
|
-
/** The API key to authenticate with. */
|
|
104
|
-
apiKey: string;
|
|
105
|
-
/** The base URL. Default is https://api.turbopuffer.com. */
|
|
106
|
-
baseUrl?: string;
|
|
107
|
-
/** The timeout to establish a connection, in ms. Default is 10_000. Only applicable in Node and Deno.*/
|
|
108
|
-
connectTimeout?: number;
|
|
109
|
-
/** The socket idle timeout, in ms. Default is 60_000. Only applicable in Node and Deno.*/
|
|
110
|
-
connectionIdleTimeout?: number;
|
|
111
|
-
/** The number of connections to open initially when creating a new client. Default is 0. */
|
|
112
|
-
warmConnections?: number;
|
|
113
|
-
/** Whether to compress requests and accept compressed responses. Default is true. */
|
|
114
|
-
compression?: boolean;
|
|
115
|
-
/**
|
|
116
|
-
* A callback function that takes an index name and returns a config object for that index.
|
|
117
|
-
* This allows you to define explicit schemas per index.
|
|
118
|
-
*
|
|
119
|
-
* Example:
|
|
120
|
-
* ```typescript
|
|
121
|
-
* schemaConfigForIndex: (indexName: string) => {
|
|
122
|
-
* // Mastra's default embedding model and index for memory messages:
|
|
123
|
-
* if (indexName === "memory_messages_384") {
|
|
124
|
-
* return {
|
|
125
|
-
* dimensions: 384,
|
|
126
|
-
* schema: {
|
|
127
|
-
* thread_id: {
|
|
128
|
-
* type: "string",
|
|
129
|
-
* filterable: true,
|
|
130
|
-
* },
|
|
131
|
-
* },
|
|
132
|
-
* };
|
|
133
|
-
* } else {
|
|
134
|
-
* throw new Error(`TODO: add schema for index: ${indexName}`);
|
|
135
|
-
* }
|
|
136
|
-
* },
|
|
137
|
-
* ```
|
|
138
|
-
*/
|
|
139
|
-
schemaConfigForIndex?: (indexName: string) => {
|
|
140
|
-
dimensions: number;
|
|
141
|
-
schema: Schema;
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
export { TurbopufferVectorOptions }
|
|
145
|
-
export { TurbopufferVectorOptions as TurbopufferVectorOptions_alias_1 }
|
|
146
|
-
|
|
147
|
-
export { }
|
package/dist/index.d.cts
DELETED