@mastra/couchbase 0.0.0-working-memory-per-user-20250620163010 → 0.0.0-zod-v4-compat-part-2-20250820135355
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 +100 -3
- package/LICENSE.md +11 -42
- package/dist/index.cjs +274 -129
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +272 -127
- package/dist/index.js.map +1 -0
- package/dist/{_tsup-dts-rollup.d.cts → vector/index.d.ts} +16 -35
- package/dist/vector/index.d.ts.map +1 -0
- package/package.json +9 -9
- package/src/vector/index.ts +284 -141
- package/src/vector/index.unit.test.ts +1 -1
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +1 -1
- package/tsup.config.ts +22 -0
- package/dist/_tsup-dts-rollup.d.ts +0 -80
- package/dist/index.d.cts +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vector/index.ts"],"names":["MastraVector","connect","error","MastraError","ErrorDomain","ErrorCategory","SearchRequest","VectorSearch","VectorQuery","MutateInSpec"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ErrorCategory, ErrorDomain, MastraError } 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 type { Bucket, Cluster, Collection, Scope } from 'couchbase';\nimport { MutateInSpec, connect, SearchRequest, VectorQuery, VectorSearch } from 'couchbase';\n\ntype MastraMetric = 'cosine' | 'euclidean' | 'dotproduct';\ntype CouchbaseMetric = 'cosine' | 'l2_norm' | 'dot_product';\nexport const DISTANCE_MAPPING: Record<MastraMetric, CouchbaseMetric> = {\n cosine: 'cosine',\n euclidean: 'l2_norm',\n dotproduct: 'dot_product',\n};\n\nexport type CouchbaseVectorParams = {\n connectionString: string;\n username: string;\n password: string;\n bucketName: string;\n scopeName: string;\n collectionName: string;\n};\n\nexport class CouchbaseVector extends MastraVector {\n private clusterPromise: Promise<Cluster>;\n private cluster: Cluster;\n private bucketName: string;\n private collectionName: string;\n private scopeName: string;\n private collection: Collection;\n private bucket: Bucket;\n private scope: Scope;\n private vector_dimension: number;\n\n constructor({ connectionString, username, password, bucketName, scopeName, collectionName }: CouchbaseVectorParams) {\n super();\n\n try {\n const baseClusterPromise = connect(connectionString, {\n username,\n password,\n configProfile: 'wanDevelopment',\n });\n\n const telemetry = this.__getTelemetry();\n this.clusterPromise =\n telemetry?.traceClass(baseClusterPromise, {\n spanNamePrefix: 'couchbase-vector',\n attributes: {\n 'vector.type': 'couchbase',\n },\n }) ?? baseClusterPromise;\n this.cluster = null as unknown as Cluster;\n this.bucketName = bucketName;\n this.collectionName = collectionName;\n this.scopeName = scopeName;\n this.collection = null as unknown as Collection;\n this.bucket = null as unknown as Bucket;\n this.scope = null as unknown as Scope;\n this.vector_dimension = null as unknown as number;\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_INITIALIZE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n connectionString,\n username,\n password,\n bucketName,\n scopeName,\n collectionName,\n },\n },\n error,\n );\n }\n }\n\n async getCollection() {\n if (!this.cluster) {\n this.cluster = await this.clusterPromise;\n }\n\n if (!this.collection) {\n this.bucket = this.cluster.bucket(this.bucketName);\n this.scope = this.bucket.scope(this.scopeName);\n this.collection = this.scope.collection(this.collectionName);\n }\n\n return this.collection;\n }\n\n async createIndex({ indexName, dimension, metric = 'dotproduct' as MastraMetric }: CreateIndexParams): Promise<void> {\n try {\n await this.getCollection();\n\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n\n await this.scope.searchIndexes().upsertIndex({\n name: indexName,\n sourceName: this.bucketName,\n type: 'fulltext-index',\n params: {\n doc_config: {\n docid_prefix_delim: '',\n docid_regexp: '',\n mode: 'scope.collection.type_field',\n type_field: 'type',\n },\n mapping: {\n default_analyzer: 'standard',\n default_datetime_parser: 'dateTimeOptional',\n default_field: '_all',\n default_mapping: {\n dynamic: true,\n enabled: false,\n },\n default_type: '_default',\n docvalues_dynamic: true, // [Doc](https://docs.couchbase.com/server/current/search/search-index-params.html#params) mentions this attribute is required for vector search to return the indexed field\n index_dynamic: true,\n store_dynamic: true, // [Doc](https://docs.couchbase.com/server/current/search/search-index-params.html#params) mentions this attribute is required for vector search to return the indexed field\n type_field: '_type',\n types: {\n [`${this.scopeName}.${this.collectionName}`]: {\n dynamic: true,\n enabled: true,\n properties: {\n embedding: {\n enabled: true,\n fields: [\n {\n dims: dimension,\n index: true,\n name: 'embedding',\n similarity: DISTANCE_MAPPING[metric],\n type: 'vector',\n vector_index_optimized_for: 'recall',\n store: true, // CHANGED due to https://docs.couchbase.com/server/current/search/search-index-params.html#fields\n docvalues: true, // CHANGED due to https://docs.couchbase.com/server/current/search/search-index-params.html#fields\n include_term_vectors: true, // CHANGED due to https://docs.couchbase.com/server/current/search/search-index-params.html#fields\n },\n ],\n },\n content: {\n enabled: true,\n fields: [\n {\n index: true,\n name: 'content',\n store: true,\n type: 'text',\n },\n ],\n },\n },\n },\n },\n },\n store: {\n indexType: 'scorch',\n segmentVersion: 16,\n },\n },\n sourceUuid: '',\n sourceParams: {},\n sourceType: 'gocbcore',\n planParams: {\n maxPartitionsPerPIndex: 64,\n indexPartitions: 16,\n numReplicas: 0,\n },\n });\n this.vector_dimension = dimension;\n } catch (error: any) {\n // Check for 'already exists' error (Couchbase may throw a 400 or 409, or have a message)\n const message = error?.message || error?.toString();\n if (message && message.toLowerCase().includes('index exists')) {\n // Fetch index info and check dimension\n await this.validateExistingIndex(indexName, dimension, metric);\n return;\n }\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n dimension,\n metric,\n },\n },\n error,\n );\n }\n }\n\n async upsert({ vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n try {\n await this.getCollection();\n\n if (!vectors || vectors.length === 0) {\n throw new Error('No vectors provided');\n }\n if (this.vector_dimension) {\n for (const vector of vectors) {\n if (!vector || this.vector_dimension !== vector.length) {\n throw new Error('Vector dimension mismatch');\n }\n }\n }\n\n const pointIds = ids || vectors.map(() => crypto.randomUUID());\n const records = vectors.map((vector, i) => {\n const metadataObj = metadata?.[i] || {};\n const record: Record<string, any> = {\n embedding: vector,\n metadata: metadataObj,\n };\n // If metadata has a text field, save it as content\n if (metadataObj.text) {\n record.content = metadataObj.text;\n }\n return record;\n });\n\n const allPromises = [];\n for (let i = 0; i < records.length; i++) {\n allPromises.push(this.collection.upsert(pointIds[i]!, records[i]));\n }\n await Promise.all(allPromises);\n\n return pointIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async query({ indexName, queryVector, topK = 10, includeVector = false }: QueryVectorParams): Promise<QueryResult[]> {\n try {\n await this.getCollection();\n\n const index_stats = await this.describeIndex({ indexName });\n if (queryVector.length !== index_stats.dimension) {\n throw new Error(\n `Query vector dimension mismatch. Expected ${index_stats.dimension}, got ${queryVector.length}`,\n );\n }\n\n let request = SearchRequest.create(\n VectorSearch.fromVectorQuery(VectorQuery.create('embedding', queryVector).numCandidates(topK)),\n );\n const results = await this.scope.search(indexName, request, {\n fields: ['*'],\n });\n\n if (includeVector) {\n throw new Error('Including vectors in search results is not yet supported by the Couchbase vector store');\n }\n const output = [];\n for (const match of results.rows) {\n const cleanedMetadata: Record<string, any> = {};\n const fields = (match.fields as Record<string, any>) || {}; // Ensure fields is an object\n for (const key in fields) {\n if (Object.prototype.hasOwnProperty.call(fields, key)) {\n const newKey = key.startsWith('metadata.') ? key.substring('metadata.'.length) : key;\n cleanedMetadata[newKey] = fields[key];\n }\n }\n output.push({\n id: match.id as string,\n score: (match.score as number) || 0,\n metadata: cleanedMetadata, // Use the cleaned metadata object\n });\n }\n return output;\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n topK,\n },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n await this.getCollection();\n const indexes = await this.scope.searchIndexes().getAllIndexes();\n return indexes?.map(index => index.name) || [];\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_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 await this.getCollection();\n if (!(await this.listIndexes()).includes(indexName)) {\n throw new Error(`Index ${indexName} does not exist`);\n }\n const index = await this.scope.searchIndexes().getIndex(indexName);\n const dimensions =\n index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding?.fields?.[0]\n ?.dims;\n const count = -1; // Not added support yet for adding a count of documents covered by an index\n const metric = index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding\n ?.fields?.[0]?.similarity as CouchbaseMetric;\n return {\n dimension: dimensions,\n count: count,\n metric: Object.keys(DISTANCE_MAPPING).find(\n key => DISTANCE_MAPPING[key as MastraMetric] === metric,\n ) as MastraMetric,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n try {\n await this.getCollection();\n if (!(await this.listIndexes()).includes(indexName)) {\n throw new Error(`Index ${indexName} does not exist`);\n }\n await this.scope.searchIndexes().dropIndex(indexName);\n this.vector_dimension = null as unknown as number;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\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({ id, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n if (update.vector && this.vector_dimension && update.vector.length !== this.vector_dimension) {\n throw new Error('Vector dimension mismatch');\n }\n const collection = await this.getCollection();\n\n // Check if document exists\n try {\n await collection.get(id);\n } catch (err: any) {\n if (err.code === 13 || err.message?.includes('document not found')) {\n throw new Error(`Vector with id ${id} does not exist`);\n }\n throw err;\n }\n\n const specs: MutateInSpec[] = [];\n if (update.vector) specs.push(MutateInSpec.replace('embedding', update.vector));\n if (update.metadata) specs.push(MutateInSpec.replace('metadata', update.metadata));\n\n await collection.mutateIn(id, specs);\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n id,\n hasVectorUpdate: !!update.vector,\n hasMetadataUpdate: !!update.metadata,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ id }: DeleteVectorParams): Promise<void> {\n try {\n const collection = await this.getCollection();\n\n // Check if document exists\n try {\n await collection.get(id);\n } catch (err: any) {\n if (err.code === 13 || err.message?.includes('document not found')) {\n throw new Error(`Vector with id ${id} does not exist`);\n }\n throw err;\n }\n\n await collection.remove(id);\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DELETE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n id,\n },\n },\n error,\n );\n }\n }\n\n async disconnect() {\n try {\n if (!this.cluster) {\n return;\n }\n await this.cluster.close();\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DISCONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
export { CouchbaseVector } from './_tsup-dts-rollup.js';
|
|
1
|
+
export * from './vector';
|
|
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,UAAU,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 { connect, SearchRequest, VectorSearch, VectorQuery, MutateInSpec } from 'couchbase';
|
|
3
4
|
|
|
@@ -19,26 +20,45 @@ var CouchbaseVector = class extends MastraVector {
|
|
|
19
20
|
vector_dimension;
|
|
20
21
|
constructor({ connectionString, username, password, bucketName, scopeName, collectionName }) {
|
|
21
22
|
super();
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
try {
|
|
24
|
+
const baseClusterPromise = connect(connectionString, {
|
|
25
|
+
username,
|
|
26
|
+
password,
|
|
27
|
+
configProfile: "wanDevelopment"
|
|
28
|
+
});
|
|
29
|
+
const telemetry = this.__getTelemetry();
|
|
30
|
+
this.clusterPromise = telemetry?.traceClass(baseClusterPromise, {
|
|
31
|
+
spanNamePrefix: "couchbase-vector",
|
|
32
|
+
attributes: {
|
|
33
|
+
"vector.type": "couchbase"
|
|
34
|
+
}
|
|
35
|
+
}) ?? baseClusterPromise;
|
|
36
|
+
this.cluster = null;
|
|
37
|
+
this.bucketName = bucketName;
|
|
38
|
+
this.collectionName = collectionName;
|
|
39
|
+
this.scopeName = scopeName;
|
|
40
|
+
this.collection = null;
|
|
41
|
+
this.bucket = null;
|
|
42
|
+
this.scope = null;
|
|
43
|
+
this.vector_dimension = null;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
throw new MastraError(
|
|
46
|
+
{
|
|
47
|
+
id: "COUCHBASE_VECTOR_INITIALIZE_FAILED",
|
|
48
|
+
domain: ErrorDomain.STORAGE,
|
|
49
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
50
|
+
details: {
|
|
51
|
+
connectionString,
|
|
52
|
+
username,
|
|
53
|
+
password,
|
|
54
|
+
bucketName,
|
|
55
|
+
scopeName,
|
|
56
|
+
collectionName
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
error
|
|
60
|
+
);
|
|
61
|
+
}
|
|
42
62
|
}
|
|
43
63
|
async getCollection() {
|
|
44
64
|
if (!this.cluster) {
|
|
@@ -52,11 +72,11 @@ var CouchbaseVector = class extends MastraVector {
|
|
|
52
72
|
return this.collection;
|
|
53
73
|
}
|
|
54
74
|
async createIndex({ indexName, dimension, metric = "dotproduct" }) {
|
|
55
|
-
await this.getCollection();
|
|
56
|
-
if (!Number.isInteger(dimension) || dimension <= 0) {
|
|
57
|
-
throw new Error("Dimension must be a positive integer");
|
|
58
|
-
}
|
|
59
75
|
try {
|
|
76
|
+
await this.getCollection();
|
|
77
|
+
if (!Number.isInteger(dimension) || dimension <= 0) {
|
|
78
|
+
throw new Error("Dimension must be a positive integer");
|
|
79
|
+
}
|
|
60
80
|
await this.scope.searchIndexes().upsertIndex({
|
|
61
81
|
name: indexName,
|
|
62
82
|
sourceName: this.bucketName,
|
|
@@ -143,78 +163,129 @@ var CouchbaseVector = class extends MastraVector {
|
|
|
143
163
|
await this.validateExistingIndex(indexName, dimension, metric);
|
|
144
164
|
return;
|
|
145
165
|
}
|
|
146
|
-
throw
|
|
166
|
+
throw new MastraError(
|
|
167
|
+
{
|
|
168
|
+
id: "COUCHBASE_VECTOR_CREATE_INDEX_FAILED",
|
|
169
|
+
domain: ErrorDomain.STORAGE,
|
|
170
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
171
|
+
details: {
|
|
172
|
+
indexName,
|
|
173
|
+
dimension,
|
|
174
|
+
metric
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
error
|
|
178
|
+
);
|
|
147
179
|
}
|
|
148
180
|
}
|
|
149
181
|
async upsert({ vectors, metadata, ids }) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
182
|
+
try {
|
|
183
|
+
await this.getCollection();
|
|
184
|
+
if (!vectors || vectors.length === 0) {
|
|
185
|
+
throw new Error("No vectors provided");
|
|
186
|
+
}
|
|
187
|
+
if (this.vector_dimension) {
|
|
188
|
+
for (const vector of vectors) {
|
|
189
|
+
if (!vector || this.vector_dimension !== vector.length) {
|
|
190
|
+
throw new Error("Vector dimension mismatch");
|
|
191
|
+
}
|
|
158
192
|
}
|
|
159
193
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
194
|
+
const pointIds = ids || vectors.map(() => crypto.randomUUID());
|
|
195
|
+
const records = vectors.map((vector, i) => {
|
|
196
|
+
const metadataObj = metadata?.[i] || {};
|
|
197
|
+
const record = {
|
|
198
|
+
embedding: vector,
|
|
199
|
+
metadata: metadataObj
|
|
200
|
+
};
|
|
201
|
+
if (metadataObj.text) {
|
|
202
|
+
record.content = metadataObj.text;
|
|
203
|
+
}
|
|
204
|
+
return record;
|
|
205
|
+
});
|
|
206
|
+
const allPromises = [];
|
|
207
|
+
for (let i = 0; i < records.length; i++) {
|
|
208
|
+
allPromises.push(this.collection.upsert(pointIds[i], records[i]));
|
|
170
209
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
210
|
+
await Promise.all(allPromises);
|
|
211
|
+
return pointIds;
|
|
212
|
+
} catch (error) {
|
|
213
|
+
throw new MastraError(
|
|
214
|
+
{
|
|
215
|
+
id: "COUCHBASE_VECTOR_UPSERT_FAILED",
|
|
216
|
+
domain: ErrorDomain.STORAGE,
|
|
217
|
+
category: ErrorCategory.THIRD_PARTY
|
|
218
|
+
},
|
|
219
|
+
error
|
|
220
|
+
);
|
|
176
221
|
}
|
|
177
|
-
await Promise.all(allPromises);
|
|
178
|
-
return pointIds;
|
|
179
222
|
}
|
|
180
223
|
async query({ indexName, queryVector, topK = 10, includeVector = false }) {
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
);
|
|
189
|
-
const results = await this.scope.search(indexName, request, {
|
|
190
|
-
fields: ["*"]
|
|
191
|
-
});
|
|
192
|
-
if (includeVector) {
|
|
193
|
-
throw new Error("Including vectors in search results is not yet supported by the Couchbase vector store");
|
|
194
|
-
}
|
|
195
|
-
const output = [];
|
|
196
|
-
for (const match of results.rows) {
|
|
197
|
-
const cleanedMetadata = {};
|
|
198
|
-
const fields = match.fields || {};
|
|
199
|
-
for (const key in fields) {
|
|
200
|
-
if (Object.prototype.hasOwnProperty.call(fields, key)) {
|
|
201
|
-
const newKey = key.startsWith("metadata.") ? key.substring("metadata.".length) : key;
|
|
202
|
-
cleanedMetadata[newKey] = fields[key];
|
|
203
|
-
}
|
|
224
|
+
try {
|
|
225
|
+
await this.getCollection();
|
|
226
|
+
const index_stats = await this.describeIndex({ indexName });
|
|
227
|
+
if (queryVector.length !== index_stats.dimension) {
|
|
228
|
+
throw new Error(
|
|
229
|
+
`Query vector dimension mismatch. Expected ${index_stats.dimension}, got ${queryVector.length}`
|
|
230
|
+
);
|
|
204
231
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
232
|
+
let request = SearchRequest.create(
|
|
233
|
+
VectorSearch.fromVectorQuery(VectorQuery.create("embedding", queryVector).numCandidates(topK))
|
|
234
|
+
);
|
|
235
|
+
const results = await this.scope.search(indexName, request, {
|
|
236
|
+
fields: ["*"]
|
|
210
237
|
});
|
|
238
|
+
if (includeVector) {
|
|
239
|
+
throw new Error("Including vectors in search results is not yet supported by the Couchbase vector store");
|
|
240
|
+
}
|
|
241
|
+
const output = [];
|
|
242
|
+
for (const match of results.rows) {
|
|
243
|
+
const cleanedMetadata = {};
|
|
244
|
+
const fields = match.fields || {};
|
|
245
|
+
for (const key in fields) {
|
|
246
|
+
if (Object.prototype.hasOwnProperty.call(fields, key)) {
|
|
247
|
+
const newKey = key.startsWith("metadata.") ? key.substring("metadata.".length) : key;
|
|
248
|
+
cleanedMetadata[newKey] = fields[key];
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
output.push({
|
|
252
|
+
id: match.id,
|
|
253
|
+
score: match.score || 0,
|
|
254
|
+
metadata: cleanedMetadata
|
|
255
|
+
// Use the cleaned metadata object
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
return output;
|
|
259
|
+
} catch (error) {
|
|
260
|
+
throw new MastraError(
|
|
261
|
+
{
|
|
262
|
+
id: "COUCHBASE_VECTOR_QUERY_FAILED",
|
|
263
|
+
domain: ErrorDomain.STORAGE,
|
|
264
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
265
|
+
details: {
|
|
266
|
+
indexName,
|
|
267
|
+
topK
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
error
|
|
271
|
+
);
|
|
211
272
|
}
|
|
212
|
-
return output;
|
|
213
273
|
}
|
|
214
274
|
async listIndexes() {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
275
|
+
try {
|
|
276
|
+
await this.getCollection();
|
|
277
|
+
const indexes = await this.scope.searchIndexes().getAllIndexes();
|
|
278
|
+
return indexes?.map((index) => index.name) || [];
|
|
279
|
+
} catch (error) {
|
|
280
|
+
throw new MastraError(
|
|
281
|
+
{
|
|
282
|
+
id: "COUCHBASE_VECTOR_LIST_INDEXES_FAILED",
|
|
283
|
+
domain: ErrorDomain.STORAGE,
|
|
284
|
+
category: ErrorCategory.THIRD_PARTY
|
|
285
|
+
},
|
|
286
|
+
error
|
|
287
|
+
);
|
|
288
|
+
}
|
|
218
289
|
}
|
|
219
290
|
/**
|
|
220
291
|
* Retrieves statistics about a vector index.
|
|
@@ -223,29 +294,60 @@ var CouchbaseVector = class extends MastraVector {
|
|
|
223
294
|
* @returns A promise that resolves to the index statistics including dimension, count and metric
|
|
224
295
|
*/
|
|
225
296
|
async describeIndex({ indexName }) {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
297
|
+
try {
|
|
298
|
+
await this.getCollection();
|
|
299
|
+
if (!(await this.listIndexes()).includes(indexName)) {
|
|
300
|
+
throw new Error(`Index ${indexName} does not exist`);
|
|
301
|
+
}
|
|
302
|
+
const index = await this.scope.searchIndexes().getIndex(indexName);
|
|
303
|
+
const dimensions = index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding?.fields?.[0]?.dims;
|
|
304
|
+
const count = -1;
|
|
305
|
+
const metric = index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding?.fields?.[0]?.similarity;
|
|
306
|
+
return {
|
|
307
|
+
dimension: dimensions,
|
|
308
|
+
count,
|
|
309
|
+
metric: Object.keys(DISTANCE_MAPPING).find(
|
|
310
|
+
(key) => DISTANCE_MAPPING[key] === metric
|
|
311
|
+
)
|
|
312
|
+
};
|
|
313
|
+
} catch (error) {
|
|
314
|
+
throw new MastraError(
|
|
315
|
+
{
|
|
316
|
+
id: "COUCHBASE_VECTOR_DESCRIBE_INDEX_FAILED",
|
|
317
|
+
domain: ErrorDomain.STORAGE,
|
|
318
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
319
|
+
details: {
|
|
320
|
+
indexName
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
error
|
|
324
|
+
);
|
|
229
325
|
}
|
|
230
|
-
const index = await this.scope.searchIndexes().getIndex(indexName);
|
|
231
|
-
const dimensions = index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding?.fields?.[0]?.dims;
|
|
232
|
-
const count = -1;
|
|
233
|
-
const metric = index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding?.fields?.[0]?.similarity;
|
|
234
|
-
return {
|
|
235
|
-
dimension: dimensions,
|
|
236
|
-
count,
|
|
237
|
-
metric: Object.keys(DISTANCE_MAPPING).find(
|
|
238
|
-
(key) => DISTANCE_MAPPING[key] === metric
|
|
239
|
-
)
|
|
240
|
-
};
|
|
241
326
|
}
|
|
242
327
|
async deleteIndex({ indexName }) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
328
|
+
try {
|
|
329
|
+
await this.getCollection();
|
|
330
|
+
if (!(await this.listIndexes()).includes(indexName)) {
|
|
331
|
+
throw new Error(`Index ${indexName} does not exist`);
|
|
332
|
+
}
|
|
333
|
+
await this.scope.searchIndexes().dropIndex(indexName);
|
|
334
|
+
this.vector_dimension = null;
|
|
335
|
+
} catch (error) {
|
|
336
|
+
if (error instanceof MastraError) {
|
|
337
|
+
throw error;
|
|
338
|
+
}
|
|
339
|
+
throw new MastraError(
|
|
340
|
+
{
|
|
341
|
+
id: "COUCHBASE_VECTOR_DELETE_INDEX_FAILED",
|
|
342
|
+
domain: ErrorDomain.STORAGE,
|
|
343
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
344
|
+
details: {
|
|
345
|
+
indexName
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
error
|
|
349
|
+
);
|
|
246
350
|
}
|
|
247
|
-
await this.scope.searchIndexes().dropIndex(indexName);
|
|
248
|
-
this.vector_dimension = null;
|
|
249
351
|
}
|
|
250
352
|
/**
|
|
251
353
|
* Updates a vector by its ID with the provided vector and/or metadata.
|
|
@@ -258,25 +360,41 @@ var CouchbaseVector = class extends MastraVector {
|
|
|
258
360
|
* @throws Will throw an error if no updates are provided or if the update operation fails.
|
|
259
361
|
*/
|
|
260
362
|
async updateVector({ id, update }) {
|
|
261
|
-
if (!update.vector && !update.metadata) {
|
|
262
|
-
throw new Error("No updates provided");
|
|
263
|
-
}
|
|
264
|
-
if (update.vector && this.vector_dimension && update.vector.length !== this.vector_dimension) {
|
|
265
|
-
throw new Error("Vector dimension mismatch");
|
|
266
|
-
}
|
|
267
|
-
const collection = await this.getCollection();
|
|
268
363
|
try {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
if (err.code === 13 || err.message?.includes("document not found")) {
|
|
272
|
-
throw new Error(`Vector with id ${id} does not exist`);
|
|
364
|
+
if (!update.vector && !update.metadata) {
|
|
365
|
+
throw new Error("No updates provided");
|
|
273
366
|
}
|
|
274
|
-
|
|
367
|
+
if (update.vector && this.vector_dimension && update.vector.length !== this.vector_dimension) {
|
|
368
|
+
throw new Error("Vector dimension mismatch");
|
|
369
|
+
}
|
|
370
|
+
const collection = await this.getCollection();
|
|
371
|
+
try {
|
|
372
|
+
await collection.get(id);
|
|
373
|
+
} catch (err) {
|
|
374
|
+
if (err.code === 13 || err.message?.includes("document not found")) {
|
|
375
|
+
throw new Error(`Vector with id ${id} does not exist`);
|
|
376
|
+
}
|
|
377
|
+
throw err;
|
|
378
|
+
}
|
|
379
|
+
const specs = [];
|
|
380
|
+
if (update.vector) specs.push(MutateInSpec.replace("embedding", update.vector));
|
|
381
|
+
if (update.metadata) specs.push(MutateInSpec.replace("metadata", update.metadata));
|
|
382
|
+
await collection.mutateIn(id, specs);
|
|
383
|
+
} catch (error) {
|
|
384
|
+
throw new MastraError(
|
|
385
|
+
{
|
|
386
|
+
id: "COUCHBASE_VECTOR_UPDATE_FAILED",
|
|
387
|
+
domain: ErrorDomain.STORAGE,
|
|
388
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
389
|
+
details: {
|
|
390
|
+
id,
|
|
391
|
+
hasVectorUpdate: !!update.vector,
|
|
392
|
+
hasMetadataUpdate: !!update.metadata
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
error
|
|
396
|
+
);
|
|
275
397
|
}
|
|
276
|
-
const specs = [];
|
|
277
|
-
if (update.vector) specs.push(MutateInSpec.replace("embedding", update.vector));
|
|
278
|
-
if (update.metadata) specs.push(MutateInSpec.replace("metadata", update.metadata));
|
|
279
|
-
await collection.mutateIn(id, specs);
|
|
280
398
|
}
|
|
281
399
|
/**
|
|
282
400
|
* Deletes a vector by its ID.
|
|
@@ -286,23 +404,50 @@ var CouchbaseVector = class extends MastraVector {
|
|
|
286
404
|
* @throws Will throw an error if the deletion operation fails.
|
|
287
405
|
*/
|
|
288
406
|
async deleteVector({ id }) {
|
|
289
|
-
const collection = await this.getCollection();
|
|
290
407
|
try {
|
|
291
|
-
await
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
408
|
+
const collection = await this.getCollection();
|
|
409
|
+
try {
|
|
410
|
+
await collection.get(id);
|
|
411
|
+
} catch (err) {
|
|
412
|
+
if (err.code === 13 || err.message?.includes("document not found")) {
|
|
413
|
+
throw new Error(`Vector with id ${id} does not exist`);
|
|
414
|
+
}
|
|
415
|
+
throw err;
|
|
295
416
|
}
|
|
296
|
-
|
|
417
|
+
await collection.remove(id);
|
|
418
|
+
} catch (error) {
|
|
419
|
+
throw new MastraError(
|
|
420
|
+
{
|
|
421
|
+
id: "COUCHBASE_VECTOR_DELETE_FAILED",
|
|
422
|
+
domain: ErrorDomain.STORAGE,
|
|
423
|
+
category: ErrorCategory.THIRD_PARTY,
|
|
424
|
+
details: {
|
|
425
|
+
id
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
error
|
|
429
|
+
);
|
|
297
430
|
}
|
|
298
|
-
await collection.remove(id);
|
|
299
431
|
}
|
|
300
432
|
async disconnect() {
|
|
301
|
-
|
|
302
|
-
|
|
433
|
+
try {
|
|
434
|
+
if (!this.cluster) {
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
await this.cluster.close();
|
|
438
|
+
} catch (error) {
|
|
439
|
+
throw new MastraError(
|
|
440
|
+
{
|
|
441
|
+
id: "COUCHBASE_VECTOR_DISCONNECT_FAILED",
|
|
442
|
+
domain: ErrorDomain.STORAGE,
|
|
443
|
+
category: ErrorCategory.THIRD_PARTY
|
|
444
|
+
},
|
|
445
|
+
error
|
|
446
|
+
);
|
|
303
447
|
}
|
|
304
|
-
await this.cluster.close();
|
|
305
448
|
}
|
|
306
449
|
};
|
|
307
450
|
|
|
308
451
|
export { CouchbaseVector, DISTANCE_MAPPING };
|
|
452
|
+
//# sourceMappingURL=index.js.map
|
|
453
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/vector/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { ErrorCategory, ErrorDomain, MastraError } 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 type { Bucket, Cluster, Collection, Scope } from 'couchbase';\nimport { MutateInSpec, connect, SearchRequest, VectorQuery, VectorSearch } from 'couchbase';\n\ntype MastraMetric = 'cosine' | 'euclidean' | 'dotproduct';\ntype CouchbaseMetric = 'cosine' | 'l2_norm' | 'dot_product';\nexport const DISTANCE_MAPPING: Record<MastraMetric, CouchbaseMetric> = {\n cosine: 'cosine',\n euclidean: 'l2_norm',\n dotproduct: 'dot_product',\n};\n\nexport type CouchbaseVectorParams = {\n connectionString: string;\n username: string;\n password: string;\n bucketName: string;\n scopeName: string;\n collectionName: string;\n};\n\nexport class CouchbaseVector extends MastraVector {\n private clusterPromise: Promise<Cluster>;\n private cluster: Cluster;\n private bucketName: string;\n private collectionName: string;\n private scopeName: string;\n private collection: Collection;\n private bucket: Bucket;\n private scope: Scope;\n private vector_dimension: number;\n\n constructor({ connectionString, username, password, bucketName, scopeName, collectionName }: CouchbaseVectorParams) {\n super();\n\n try {\n const baseClusterPromise = connect(connectionString, {\n username,\n password,\n configProfile: 'wanDevelopment',\n });\n\n const telemetry = this.__getTelemetry();\n this.clusterPromise =\n telemetry?.traceClass(baseClusterPromise, {\n spanNamePrefix: 'couchbase-vector',\n attributes: {\n 'vector.type': 'couchbase',\n },\n }) ?? baseClusterPromise;\n this.cluster = null as unknown as Cluster;\n this.bucketName = bucketName;\n this.collectionName = collectionName;\n this.scopeName = scopeName;\n this.collection = null as unknown as Collection;\n this.bucket = null as unknown as Bucket;\n this.scope = null as unknown as Scope;\n this.vector_dimension = null as unknown as number;\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_INITIALIZE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n connectionString,\n username,\n password,\n bucketName,\n scopeName,\n collectionName,\n },\n },\n error,\n );\n }\n }\n\n async getCollection() {\n if (!this.cluster) {\n this.cluster = await this.clusterPromise;\n }\n\n if (!this.collection) {\n this.bucket = this.cluster.bucket(this.bucketName);\n this.scope = this.bucket.scope(this.scopeName);\n this.collection = this.scope.collection(this.collectionName);\n }\n\n return this.collection;\n }\n\n async createIndex({ indexName, dimension, metric = 'dotproduct' as MastraMetric }: CreateIndexParams): Promise<void> {\n try {\n await this.getCollection();\n\n if (!Number.isInteger(dimension) || dimension <= 0) {\n throw new Error('Dimension must be a positive integer');\n }\n\n await this.scope.searchIndexes().upsertIndex({\n name: indexName,\n sourceName: this.bucketName,\n type: 'fulltext-index',\n params: {\n doc_config: {\n docid_prefix_delim: '',\n docid_regexp: '',\n mode: 'scope.collection.type_field',\n type_field: 'type',\n },\n mapping: {\n default_analyzer: 'standard',\n default_datetime_parser: 'dateTimeOptional',\n default_field: '_all',\n default_mapping: {\n dynamic: true,\n enabled: false,\n },\n default_type: '_default',\n docvalues_dynamic: true, // [Doc](https://docs.couchbase.com/server/current/search/search-index-params.html#params) mentions this attribute is required for vector search to return the indexed field\n index_dynamic: true,\n store_dynamic: true, // [Doc](https://docs.couchbase.com/server/current/search/search-index-params.html#params) mentions this attribute is required for vector search to return the indexed field\n type_field: '_type',\n types: {\n [`${this.scopeName}.${this.collectionName}`]: {\n dynamic: true,\n enabled: true,\n properties: {\n embedding: {\n enabled: true,\n fields: [\n {\n dims: dimension,\n index: true,\n name: 'embedding',\n similarity: DISTANCE_MAPPING[metric],\n type: 'vector',\n vector_index_optimized_for: 'recall',\n store: true, // CHANGED due to https://docs.couchbase.com/server/current/search/search-index-params.html#fields\n docvalues: true, // CHANGED due to https://docs.couchbase.com/server/current/search/search-index-params.html#fields\n include_term_vectors: true, // CHANGED due to https://docs.couchbase.com/server/current/search/search-index-params.html#fields\n },\n ],\n },\n content: {\n enabled: true,\n fields: [\n {\n index: true,\n name: 'content',\n store: true,\n type: 'text',\n },\n ],\n },\n },\n },\n },\n },\n store: {\n indexType: 'scorch',\n segmentVersion: 16,\n },\n },\n sourceUuid: '',\n sourceParams: {},\n sourceType: 'gocbcore',\n planParams: {\n maxPartitionsPerPIndex: 64,\n indexPartitions: 16,\n numReplicas: 0,\n },\n });\n this.vector_dimension = dimension;\n } catch (error: any) {\n // Check for 'already exists' error (Couchbase may throw a 400 or 409, or have a message)\n const message = error?.message || error?.toString();\n if (message && message.toLowerCase().includes('index exists')) {\n // Fetch index info and check dimension\n await this.validateExistingIndex(indexName, dimension, metric);\n return;\n }\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_CREATE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n dimension,\n metric,\n },\n },\n error,\n );\n }\n }\n\n async upsert({ vectors, metadata, ids }: UpsertVectorParams): Promise<string[]> {\n try {\n await this.getCollection();\n\n if (!vectors || vectors.length === 0) {\n throw new Error('No vectors provided');\n }\n if (this.vector_dimension) {\n for (const vector of vectors) {\n if (!vector || this.vector_dimension !== vector.length) {\n throw new Error('Vector dimension mismatch');\n }\n }\n }\n\n const pointIds = ids || vectors.map(() => crypto.randomUUID());\n const records = vectors.map((vector, i) => {\n const metadataObj = metadata?.[i] || {};\n const record: Record<string, any> = {\n embedding: vector,\n metadata: metadataObj,\n };\n // If metadata has a text field, save it as content\n if (metadataObj.text) {\n record.content = metadataObj.text;\n }\n return record;\n });\n\n const allPromises = [];\n for (let i = 0; i < records.length; i++) {\n allPromises.push(this.collection.upsert(pointIds[i]!, records[i]));\n }\n await Promise.all(allPromises);\n\n return pointIds;\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_UPSERT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n\n async query({ indexName, queryVector, topK = 10, includeVector = false }: QueryVectorParams): Promise<QueryResult[]> {\n try {\n await this.getCollection();\n\n const index_stats = await this.describeIndex({ indexName });\n if (queryVector.length !== index_stats.dimension) {\n throw new Error(\n `Query vector dimension mismatch. Expected ${index_stats.dimension}, got ${queryVector.length}`,\n );\n }\n\n let request = SearchRequest.create(\n VectorSearch.fromVectorQuery(VectorQuery.create('embedding', queryVector).numCandidates(topK)),\n );\n const results = await this.scope.search(indexName, request, {\n fields: ['*'],\n });\n\n if (includeVector) {\n throw new Error('Including vectors in search results is not yet supported by the Couchbase vector store');\n }\n const output = [];\n for (const match of results.rows) {\n const cleanedMetadata: Record<string, any> = {};\n const fields = (match.fields as Record<string, any>) || {}; // Ensure fields is an object\n for (const key in fields) {\n if (Object.prototype.hasOwnProperty.call(fields, key)) {\n const newKey = key.startsWith('metadata.') ? key.substring('metadata.'.length) : key;\n cleanedMetadata[newKey] = fields[key];\n }\n }\n output.push({\n id: match.id as string,\n score: (match.score as number) || 0,\n metadata: cleanedMetadata, // Use the cleaned metadata object\n });\n }\n return output;\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_QUERY_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n topK,\n },\n },\n error,\n );\n }\n }\n\n async listIndexes(): Promise<string[]> {\n try {\n await this.getCollection();\n const indexes = await this.scope.searchIndexes().getAllIndexes();\n return indexes?.map(index => index.name) || [];\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_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 await this.getCollection();\n if (!(await this.listIndexes()).includes(indexName)) {\n throw new Error(`Index ${indexName} does not exist`);\n }\n const index = await this.scope.searchIndexes().getIndex(indexName);\n const dimensions =\n index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding?.fields?.[0]\n ?.dims;\n const count = -1; // Not added support yet for adding a count of documents covered by an index\n const metric = index.params.mapping?.types?.[`${this.scopeName}.${this.collectionName}`]?.properties?.embedding\n ?.fields?.[0]?.similarity as CouchbaseMetric;\n return {\n dimension: dimensions,\n count: count,\n metric: Object.keys(DISTANCE_MAPPING).find(\n key => DISTANCE_MAPPING[key as MastraMetric] === metric,\n ) as MastraMetric,\n };\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DESCRIBE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\n },\n error,\n );\n }\n }\n\n async deleteIndex({ indexName }: DeleteIndexParams): Promise<void> {\n try {\n await this.getCollection();\n if (!(await this.listIndexes()).includes(indexName)) {\n throw new Error(`Index ${indexName} does not exist`);\n }\n await this.scope.searchIndexes().dropIndex(indexName);\n this.vector_dimension = null as unknown as number;\n } catch (error) {\n if (error instanceof MastraError) {\n throw error;\n }\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DELETE_INDEX_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n indexName,\n },\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({ id, update }: UpdateVectorParams): Promise<void> {\n try {\n if (!update.vector && !update.metadata) {\n throw new Error('No updates provided');\n }\n if (update.vector && this.vector_dimension && update.vector.length !== this.vector_dimension) {\n throw new Error('Vector dimension mismatch');\n }\n const collection = await this.getCollection();\n\n // Check if document exists\n try {\n await collection.get(id);\n } catch (err: any) {\n if (err.code === 13 || err.message?.includes('document not found')) {\n throw new Error(`Vector with id ${id} does not exist`);\n }\n throw err;\n }\n\n const specs: MutateInSpec[] = [];\n if (update.vector) specs.push(MutateInSpec.replace('embedding', update.vector));\n if (update.metadata) specs.push(MutateInSpec.replace('metadata', update.metadata));\n\n await collection.mutateIn(id, specs);\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_UPDATE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n id,\n hasVectorUpdate: !!update.vector,\n hasMetadataUpdate: !!update.metadata,\n },\n },\n error,\n );\n }\n }\n\n /**\n * Deletes a vector by its ID.\n * @param indexName - The name of the index containing the vector.\n * @param id - The ID of the vector to delete.\n * @returns A promise that resolves when the deletion is complete.\n * @throws Will throw an error if the deletion operation fails.\n */\n async deleteVector({ id }: DeleteVectorParams): Promise<void> {\n try {\n const collection = await this.getCollection();\n\n // Check if document exists\n try {\n await collection.get(id);\n } catch (err: any) {\n if (err.code === 13 || err.message?.includes('document not found')) {\n throw new Error(`Vector with id ${id} does not exist`);\n }\n throw err;\n }\n\n await collection.remove(id);\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DELETE_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n details: {\n id,\n },\n },\n error,\n );\n }\n }\n\n async disconnect() {\n try {\n if (!this.cluster) {\n return;\n }\n await this.cluster.close();\n } catch (error) {\n throw new MastraError(\n {\n id: 'COUCHBASE_VECTOR_DISCONNECT_FAILED',\n domain: ErrorDomain.STORAGE,\n category: ErrorCategory.THIRD_PARTY,\n },\n error,\n );\n }\n }\n}\n"]}
|