@oracle/langchain-oracledb 0.1.1

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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/dist/document_loaders.cjs +211 -0
  4. package/dist/document_loaders.cjs.map +1 -0
  5. package/dist/document_loaders.d.cts +33 -0
  6. package/dist/document_loaders.d.ts +33 -0
  7. package/dist/document_loaders.js +181 -0
  8. package/dist/document_loaders.js.map +1 -0
  9. package/dist/embeddings.cjs +129 -0
  10. package/dist/embeddings.cjs.map +1 -0
  11. package/dist/embeddings.d.cts +35 -0
  12. package/dist/embeddings.d.ts +35 -0
  13. package/dist/embeddings.js +122 -0
  14. package/dist/embeddings.js.map +1 -0
  15. package/dist/index.cjs +22 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.cts +5 -0
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.js +6 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/summary.cjs +63 -0
  22. package/dist/summary.cjs.map +1 -0
  23. package/dist/summary.d.cts +16 -0
  24. package/dist/summary.d.ts +16 -0
  25. package/dist/summary.js +56 -0
  26. package/dist/summary.js.map +1 -0
  27. package/dist/text_splitter.cjs +58 -0
  28. package/dist/text_splitter.cjs.map +1 -0
  29. package/dist/text_splitter.d.cts +17 -0
  30. package/dist/text_splitter.d.ts +17 -0
  31. package/dist/text_splitter.js +51 -0
  32. package/dist/text_splitter.js.map +1 -0
  33. package/dist/vectorstores.cjs +658 -0
  34. package/dist/vectorstores.cjs.map +1 -0
  35. package/dist/vectorstores.d.cts +98 -0
  36. package/dist/vectorstores.d.ts +98 -0
  37. package/dist/vectorstores.js +647 -0
  38. package/dist/vectorstores.js.map +1 -0
  39. package/index.cjs +1 -0
  40. package/index.d.cts +1 -0
  41. package/index.d.ts +1 -0
  42. package/index.js +1 -0
  43. package/package.json +88 -0
@@ -0,0 +1,647 @@
1
+ import oracledb from "oracledb";
2
+ import { createHash } from "crypto";
3
+ import { VectorStore, } from "@langchain/core/vectorstores";
4
+ import { Document } from "@langchain/core/documents";
5
+ import { maximalMarginalRelevance } from "@langchain/core/utils/math";
6
+ export function generateWhereClause(dbFilter, bindValues) {
7
+ // Handle $and
8
+ if ("$and" in dbFilter && Array.isArray(dbFilter.$and)) {
9
+ const andConditions = dbFilter.$and.map((cond) => generateWhereClause(cond, bindValues));
10
+ return `(${andConditions.join(" AND ")})`;
11
+ }
12
+ // Handle $or
13
+ if ("$or" in dbFilter && Array.isArray(dbFilter.$or)) {
14
+ const orConditions = dbFilter.$or.map((cond) => generateWhereClause(cond, bindValues));
15
+ return `(${orConditions.join(" OR ")})`;
16
+ }
17
+ // Otherwise, normal object with key: condition(s)
18
+ const conditions = [];
19
+ for (const [col, val] of Object.entries(dbFilter)) {
20
+ if (typeof val === "object" && val !== null && !Array.isArray(val)) {
21
+ // Operator-based filters ($eq, $lte, $in,...)
22
+ for (const [op, operand] of Object.entries(val)) {
23
+ conditions.push(generateOperatorCondition(col, op, operand, bindValues));
24
+ }
25
+ }
26
+ else if (Array.isArray(val)) {
27
+ // shorthand { tags: ["a","b"] } → IN
28
+ conditions.push(generateOperatorCondition(col, "$in", val, bindValues));
29
+ }
30
+ else {
31
+ // shorthand { name: "John" } → equality
32
+ conditions.push(generateOperatorCondition(col, "$eq", val, bindValues));
33
+ }
34
+ }
35
+ return conditions.length > 1
36
+ ? `(${conditions.join(" AND ")})`
37
+ : conditions[0];
38
+ }
39
+ function generateOperatorCondition(column, operator, value, bindValues) {
40
+ switch (operator) {
41
+ case "$eq":
42
+ return jsonCompare(column, "=", value, bindValues);
43
+ case "$ne":
44
+ return jsonCompare(column, "!=", value, bindValues);
45
+ case "$lt":
46
+ return jsonCompare(column, "<", value, bindValues);
47
+ case "$lte":
48
+ return jsonCompare(column, "<=", value, bindValues);
49
+ case "$gt":
50
+ return jsonCompare(column, ">", value, bindValues);
51
+ case "$gte":
52
+ return jsonCompare(column, ">=", value, bindValues);
53
+ case "$in": {
54
+ if (!Array.isArray(value))
55
+ throw new Error("$in requires array");
56
+ const inClauses = value.map((v) => jsonCompare(column, "=", v, bindValues));
57
+ return `(${inClauses.join(" OR ")})`;
58
+ }
59
+ case "$nin": {
60
+ if (!Array.isArray(value))
61
+ throw new Error("$nin requires array");
62
+ const ninClauses = value.map((v) => jsonCompare(column, "!=", v, bindValues));
63
+ return `(${ninClauses.join(" AND ")})`;
64
+ }
65
+ case "$between": {
66
+ if (!Array.isArray(value) || value.length !== 2)
67
+ throw new Error("$between requires [low, high]");
68
+ const [low, high] = value;
69
+ bindValues.push(low, high);
70
+ const posLow = bindValues.length - 1;
71
+ const posHigh = bindValues.length;
72
+ return `JSON_EXISTS(metadata, '$.${column}?(@ >= $low && @ <= $high)' PASSING :${posLow} AS "low", :${posHigh} AS "high")`;
73
+ }
74
+ case "$exists":
75
+ if (value) {
76
+ return `JSON_EXISTS(metadata, '$.${column}')`;
77
+ }
78
+ else {
79
+ return `NOT JSON_EXISTS(metadata, '$.${column}')`;
80
+ }
81
+ default:
82
+ throw new Error(`Unsupported operator: ${operator}`);
83
+ }
84
+ }
85
+ // Helper: build JSON_EXISTS clause for comparison
86
+ function jsonCompare(column, op, value, bindValues) {
87
+ bindValues.push(value);
88
+ const pos = bindValues.length;
89
+ const alias = `val${pos}`; // unique bind alias
90
+ const operator = op === "=" ? "==" : op; // Oracle requires '==' for equality
91
+ return `JSON_EXISTS(metadata, '$.${column}?(@ ${operator} $${alias})' PASSING :${pos} AS "${alias}")`;
92
+ }
93
+ export const DistanceStrategy = {
94
+ COSINE: "COSINE",
95
+ DOT_PRODUCT: "DOT",
96
+ EUCLIDEAN: "EUCLIDEAN",
97
+ MANHATTAN: "MANHATTAN",
98
+ HAMMING: "HAMMING",
99
+ EUCLIDEAN_SQUARED: "EUCLIDEAN_SQUARED",
100
+ };
101
+ function handleError(error) {
102
+ // Type guard to check if the error is an object and has 'name' and 'message' properties
103
+ if (typeof error === "object" &&
104
+ error !== null &&
105
+ "name" in error &&
106
+ "message" in error) {
107
+ const err = error; // Type assertion based on guarded checks
108
+ // Handle specific error types based on the name property
109
+ switch (err.name) {
110
+ case "RuntimeError":
111
+ throw new Error("Database operation failed due to a runtime error.");
112
+ case "ValidationError":
113
+ throw new Error("Operation failed due to a validation error.");
114
+ default:
115
+ throw new Error(`An unexpected error occurred during the operation. ${error}`);
116
+ }
117
+ }
118
+ throw new Error(`An unknown and unexpected error occurred. ${error}`);
119
+ }
120
+ function isPool(client) {
121
+ return "getConnection" in client;
122
+ }
123
+ function quoteIdentifier(identifier) {
124
+ const name = identifier.trim();
125
+ const validateRegex = /^(?:"[^"]+"|[^".]+)(?:\.(?:"[^"]+"|[^".]+))*$/;
126
+ if (!validateRegex.test(name)) {
127
+ throw new Error(`Identifier name ${identifier} is not valid.`);
128
+ }
129
+ // extracts parts of the identifier with quoted and unquoted.
130
+ const matchRegex = /"([^"]+)"|([^".]+)/g;
131
+ const groups = [];
132
+ for (const match of name.matchAll(matchRegex)) {
133
+ groups.push(match[1] || match[2]);
134
+ }
135
+ const quotedParts = groups.map((g) => `"${g}"`);
136
+ return quotedParts.join(".");
137
+ }
138
+ export async function createTable(connection, tableName, embeddingDim) {
139
+ const colsDict = {
140
+ id: "RAW(16) DEFAULT SYS_GUID() PRIMARY KEY",
141
+ embedding: `vector(${embeddingDim}, FLOAT32)`,
142
+ text: "CLOB",
143
+ metadata: "JSON",
144
+ };
145
+ try {
146
+ const ddlBody = Object.entries(colsDict)
147
+ .map(([colName, colType]) => `${colName} ${colType}`)
148
+ .join(", ");
149
+ const ddl = `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(tableName)}
150
+ (
151
+ ${ddlBody}
152
+ )`;
153
+ await connection.execute(ddl);
154
+ }
155
+ catch (error) {
156
+ handleError(error);
157
+ }
158
+ }
159
+ function _getIndexName(baseName) {
160
+ const uniqueId = crypto.randomUUID().replace(/-/g, "");
161
+ return `${baseName}_${uniqueId}`;
162
+ }
163
+ export async function createIndex(client, vectorStore, params) {
164
+ const idxType = params?.idxType || "HNSW";
165
+ if (idxType === "IVF") {
166
+ await createIVFIndex(client, vectorStore, params);
167
+ }
168
+ else {
169
+ await createHNSWIndex(client, vectorStore, params);
170
+ }
171
+ }
172
+ async function createHNSWIndex(connection, oraclevs, params) {
173
+ try {
174
+ const defaults = {
175
+ idxName: "HNSW",
176
+ idxType: "HNSW",
177
+ neighbors: 32,
178
+ efConstruction: 200,
179
+ accuracy: 90,
180
+ parallel: 8,
181
+ };
182
+ // if params then copy params to config
183
+ const config = params
184
+ ? { ...params }
185
+ : { ...defaults };
186
+ // Ensure compulsory parts are included
187
+ const compulsoryKeys = ["idxName", "parallel"];
188
+ for (const key of compulsoryKeys) {
189
+ if (!(key in config)) {
190
+ if (key === "idxName") {
191
+ config[key] = _getIndexName(defaults[key]);
192
+ }
193
+ else {
194
+ config[key] = defaults[key];
195
+ }
196
+ }
197
+ }
198
+ // Validate keys in config against defaults
199
+ for (const key of Object.keys(config)) {
200
+ if (!(key in defaults)) {
201
+ throw new Error(`Invalid parameter: ${key}`);
202
+ }
203
+ }
204
+ const { idxName } = config;
205
+ const baseSql = `CREATE VECTOR INDEX IF NOT EXISTS ${quoteIdentifier(idxName)}
206
+ ON ${oraclevs.tableName}(embedding)
207
+ ORGANIZATION INMEMORY NEIGHBOR GRAPH`;
208
+ const accuracyPart = config.accuracy
209
+ ? ` WITH TARGET ACCURACY ${config.accuracy}`
210
+ : "";
211
+ const distancePart = ` DISTANCE ${oraclevs.distanceStrategy}`;
212
+ let parametersPart = "";
213
+ if ("neighbors" in config && "efConstruction" in config) {
214
+ parametersPart = ` parameters (type ${config.idxType},
215
+ neighbors ${config.neighbors},
216
+ efConstruction ${config.efConstruction})`;
217
+ }
218
+ else if ("neighbors" in config && !("efConstruction" in config)) {
219
+ config.efConstruction = defaults.efConstruction;
220
+ parametersPart = ` parameters (type ${config.idxType},
221
+ neighbors ${config.neighbors},
222
+ efConstruction ${config.efConstruction})`;
223
+ }
224
+ else if (!("neighbors" in config) && "efConstruction" in config) {
225
+ config.neighbors = defaults.neighbors;
226
+ parametersPart = ` parameters (type ${config.idxType},
227
+ neighbors ${config.neighbors},
228
+ efConstruction ${config.efConstruction})`;
229
+ }
230
+ const parallelPart = ` PARALLEL ${config.parallel}`;
231
+ const ddl = baseSql + accuracyPart + distancePart + parametersPart + parallelPart;
232
+ await connection.execute(ddl);
233
+ }
234
+ catch (error) {
235
+ handleError(error);
236
+ }
237
+ }
238
+ async function createIVFIndex(connection, oraclevs, params) {
239
+ try {
240
+ const defaults = {
241
+ idxName: "IVF",
242
+ idxType: "IVF",
243
+ neighborPart: 32,
244
+ accuracy: 90,
245
+ parallel: 8,
246
+ };
247
+ // Combine defaults with any provided params. Note: params could contain keys not explicitly declared in IndexConfig
248
+ const config = params
249
+ ? { ...params }
250
+ : { ...defaults };
251
+ // Ensure compulsory parts are included
252
+ const compulsoryKeys = ["idxName", "parallel"];
253
+ for (const key of compulsoryKeys) {
254
+ if (!(key in config)) {
255
+ if (key === "idxName") {
256
+ config[key] = _getIndexName(defaults[key]);
257
+ }
258
+ else {
259
+ config[key] = defaults[key];
260
+ }
261
+ }
262
+ }
263
+ // Validate keys in config against defaults
264
+ for (const key of Object.keys(config)) {
265
+ if (!(key in defaults)) {
266
+ throw new Error(`Invalid parameter: ${key}`);
267
+ }
268
+ }
269
+ // Base SQL statement
270
+ const { idxName } = config;
271
+ const baseSql = `CREATE VECTOR INDEX IF NOT EXISTS ${quoteIdentifier(idxName)}
272
+ ON ${oraclevs.tableName}(embedding)
273
+ ORGANIZATION NEIGHBOR PARTITIONS`;
274
+ // Optional parts depending on parameters
275
+ const accuracyPart = config.accuracy
276
+ ? ` WITH TARGET ACCURACY ${config.accuracy}`
277
+ : "";
278
+ const distancePart = ` DISTANCE ${oraclevs.distanceStrategy}`;
279
+ let parametersPart = "";
280
+ if ("idxType" in config && "neighborPart" in config) {
281
+ parametersPart = ` PARAMETERS (type ${config.idxType},
282
+ neighbor partitions ${config.neighborPart})`;
283
+ }
284
+ // Always included part for parallel - assuming parallel is compulsory and always included
285
+ const parallelPart = ` PARALLEL ${config.parallel}`;
286
+ // Combine all parts
287
+ const ddl = baseSql + accuracyPart + distancePart + parametersPart + parallelPart;
288
+ await connection.execute(ddl);
289
+ }
290
+ catch (error) {
291
+ handleError(error);
292
+ }
293
+ }
294
+ export async function dropTablePurge(connection, tableName) {
295
+ try {
296
+ const ddl = `DROP TABLE IF EXISTS ${quoteIdentifier(tableName)} PURGE`;
297
+ await connection.execute(ddl);
298
+ }
299
+ catch (error) {
300
+ handleError(error);
301
+ }
302
+ }
303
+ export class OracleVS extends VectorStore {
304
+ _vectorstoreType() {
305
+ return "oraclevs";
306
+ }
307
+ constructor(embeddings, dbConfig) {
308
+ super(embeddings, dbConfig);
309
+ Object.defineProperty(this, "client", {
310
+ enumerable: true,
311
+ configurable: true,
312
+ writable: true,
313
+ value: void 0
314
+ });
315
+ Object.defineProperty(this, "embeddingDimension", {
316
+ enumerable: true,
317
+ configurable: true,
318
+ writable: true,
319
+ value: void 0
320
+ });
321
+ Object.defineProperty(this, "tableName", {
322
+ enumerable: true,
323
+ configurable: true,
324
+ writable: true,
325
+ value: void 0
326
+ });
327
+ Object.defineProperty(this, "distanceStrategy", {
328
+ enumerable: true,
329
+ configurable: true,
330
+ writable: true,
331
+ value: DistanceStrategy.COSINE
332
+ });
333
+ Object.defineProperty(this, "filter", {
334
+ enumerable: true,
335
+ configurable: true,
336
+ writable: true,
337
+ value: void 0
338
+ });
339
+ Object.defineProperty(this, "query", {
340
+ enumerable: true,
341
+ configurable: true,
342
+ writable: true,
343
+ value: void 0
344
+ });
345
+ try {
346
+ this.client = dbConfig.client;
347
+ this.tableName = quoteIdentifier(dbConfig.tableName);
348
+ this.distanceStrategy =
349
+ dbConfig.distanceStrategy ?? this.distanceStrategy;
350
+ this.query = dbConfig.query;
351
+ this.filter = dbConfig.filter;
352
+ }
353
+ catch (error) {
354
+ handleError(error);
355
+ }
356
+ }
357
+ async getEmbeddingDimension(query) {
358
+ const embeddingVector = await this.embeddings.embedQuery(query);
359
+ return embeddingVector.length;
360
+ }
361
+ async initialize() {
362
+ let connection = null;
363
+ try {
364
+ this.embeddingDimension = await this.getEmbeddingDimension(this.query);
365
+ connection = await this.getConnection();
366
+ await createTable(connection, this.tableName, this.embeddingDimension);
367
+ }
368
+ catch (error) {
369
+ handleError(error);
370
+ }
371
+ finally {
372
+ if (connection)
373
+ await this.retConnection(connection);
374
+ }
375
+ }
376
+ async getConnection() {
377
+ try {
378
+ if (isPool(this.client)) {
379
+ return await this.client.getConnection();
380
+ }
381
+ return this.client;
382
+ }
383
+ catch (error) {
384
+ handleError(error);
385
+ }
386
+ }
387
+ // Close connection or return it to the pool
388
+ async retConnection(connection) {
389
+ try {
390
+ // If the client is a pool, close the connection (return it to the pool)
391
+ if (isPool(this.client)) {
392
+ await connection.close();
393
+ }
394
+ }
395
+ catch (error) {
396
+ console.error("Error in retConnection:", error);
397
+ throw error;
398
+ }
399
+ }
400
+ /**
401
+ * Method to add vectors to the Oracle database.
402
+ * @param vectors The vectors to add.
403
+ * @param documents The documents associated with the vectors.
404
+ * @param options
405
+ * @returns Promise that resolves when the vectors have been added.
406
+ */
407
+ async addVectors(vectors, documents, options) {
408
+ if (vectors.length === 0) {
409
+ throw new Error("Vectors input null. Nothing to add...");
410
+ }
411
+ const ids = options?.ids;
412
+ let connection = null;
413
+ try {
414
+ // Ensure there are IDs for all documents
415
+ if (ids !== undefined && ids.length !== vectors.length) {
416
+ throw new Error("The number of ids must match the number of vectors provided.");
417
+ }
418
+ connection = await this.getConnection();
419
+ const binds = [];
420
+ for (let index = 0; index < documents.length; index += 1) {
421
+ const doc = documents[index];
422
+ let processedId;
423
+ if (ids) {
424
+ processedId = createHash("sha256")
425
+ .update(ids[index])
426
+ .digest("hex")
427
+ .substring(0, 16)
428
+ .toUpperCase();
429
+ }
430
+ else {
431
+ const sourceId = doc.metadata.id ?? crypto.randomUUID();
432
+ processedId = createHash("sha256")
433
+ .update(sourceId)
434
+ .digest("hex")
435
+ .substring(0, 16)
436
+ .toUpperCase();
437
+ }
438
+ const idBuffer = Buffer.from(processedId, "hex");
439
+ const bind = {
440
+ id: idBuffer,
441
+ text: doc.pageContent,
442
+ metadata: doc.metadata,
443
+ embedding: new Float32Array(vectors[index]),
444
+ };
445
+ binds.push(bind);
446
+ }
447
+ const sql = `INSERT INTO ${this.tableName} (id, embedding, text, metadata )
448
+ VALUES (:id, :embedding, :text, :metadata)`;
449
+ const options = {
450
+ bindDefs: {
451
+ id: { type: oracledb.BUFFER, maxSize: 24 },
452
+ text: { type: oracledb.STRING, maxSize: 10000000 },
453
+ metadata: { type: oracledb.DB_TYPE_JSON },
454
+ embedding: { type: oracledb.DB_TYPE_VECTOR },
455
+ },
456
+ autoCommit: false,
457
+ };
458
+ await connection.executeMany(sql, binds, options);
459
+ // Commit once all inserts are queued up
460
+ await connection.commit();
461
+ console.log("All documents have been inserted and committed.");
462
+ }
463
+ catch (error) {
464
+ handleError(error);
465
+ }
466
+ finally {
467
+ if (connection) {
468
+ await this.retConnection(connection);
469
+ }
470
+ }
471
+ return ids;
472
+ }
473
+ async addDocuments(documents, options) {
474
+ const texts = documents.map(({ pageContent }) => pageContent);
475
+ return this.addVectors(await this.embeddings.embedDocuments(texts), documents, options);
476
+ }
477
+ /**
478
+ * Method to search for vectors that are similar to a given query vector.
479
+ * @param query The query vector.
480
+ * @param k The number of similar vectors to return.
481
+ * @param filter Optional filter for the search results.
482
+ * @returns Promise that resolves with an array of tuples, each containing a Document and a score.
483
+ */
484
+ async similaritySearchByVectorReturningEmbeddings(query, k = 4, filter) {
485
+ const docsScoresAndEmbeddings = [];
486
+ let connection = null;
487
+ try {
488
+ const convertedEmbedding = new Float32Array(query);
489
+ const bindValues = [convertedEmbedding];
490
+ let sqlQuery = `
491
+ SELECT id,
492
+ text,
493
+ metadata,
494
+ vector_distance(embedding, :1, ${this.distanceStrategy}) as distance,
495
+ embedding
496
+ FROM ${this.tableName} `;
497
+ if (filter && Object.keys(filter).length > 0) {
498
+ sqlQuery += ` WHERE ${generateWhereClause(filter, bindValues)}`;
499
+ }
500
+ bindValues.push(k);
501
+ sqlQuery += ` ORDER BY distance FETCH APPROX FIRST :${bindValues.length} ROWS ONLY `;
502
+ // Execute the query
503
+ connection = await this.getConnection();
504
+ const resultSet = await connection.execute(sqlQuery, bindValues, {
505
+ fetchInfo: {
506
+ TEXT: { type: oracledb.STRING },
507
+ },
508
+ });
509
+ if (Array.isArray(resultSet.rows) && resultSet.rows.length > 0) {
510
+ const rows = resultSet.rows;
511
+ for (let idx = 0; idx < resultSet.rows.length; idx += 1) {
512
+ const row = rows[idx];
513
+ const text = row[1];
514
+ const metadata = row[2];
515
+ const distance = row[3];
516
+ const embedding = row[4];
517
+ const document = new Document({
518
+ pageContent: text || "",
519
+ metadata: metadata || {},
520
+ id: row[0].toString("hex"),
521
+ });
522
+ docsScoresAndEmbeddings.push([document, distance, embedding]);
523
+ }
524
+ }
525
+ else {
526
+ // Throw an exception if no rows are found
527
+ throw new Error("No rows found.");
528
+ }
529
+ }
530
+ finally {
531
+ if (connection) {
532
+ await connection.close();
533
+ }
534
+ }
535
+ return docsScoresAndEmbeddings;
536
+ }
537
+ async similaritySearchVectorWithScore(query, k, filter) {
538
+ const docsScoresAndEmbeddings = await this.similaritySearchByVectorReturningEmbeddings(query, k, filter);
539
+ return docsScoresAndEmbeddings.map(([document, score]) => [
540
+ document,
541
+ score,
542
+ ]);
543
+ }
544
+ /**
545
+ * Return documents selected using the maximal marginal relevance.
546
+ * Maximal marginal relevance optimizes for similarity to the query AND diversity
547
+ * among selected documents.
548
+ *
549
+ * @param {string} query - Text to look up documents similar to.
550
+ * @param options
551
+ * @param {number} options.k - Number of documents to return.
552
+ * @param {number} options.fetchK - Number of documents to fetch before passing to the MMR algorithm.
553
+ * @param {number} options.lambda - Number between 0 and 1 that determines the degree of diversity among the results,
554
+ * where 0 corresponds to maximum diversity and 1 to minimum diversity.
555
+ * @param {this["FilterType"]} options.filter - Optional filter
556
+ * @param _callbacks
557
+ *
558
+ * @returns {Promise<DocumentInterface[]>} - List of documents selected by maximal marginal relevance.
559
+ */
560
+ async maxMarginalRelevanceSearch(query, options) {
561
+ const embedding = await this.embeddings.embedQuery(query);
562
+ return await this.maxMarginalRelevanceSearchByVector(embedding, options);
563
+ }
564
+ async maxMarginalRelevanceSearchByVector(embedding, options) {
565
+ // Fetch documents and their scores. This calls the previously adapted function.
566
+ const docsAndScores = await this.maxMarginalRelevanceSearchWithScoreByVector(embedding, options);
567
+ // Extract and return only the documents from the results
568
+ return docsAndScores.map((ds) => ds.document);
569
+ }
570
+ async maxMarginalRelevanceSearchWithScoreByVector(embedding, options) {
571
+ // Fetch documents and their scores.
572
+ const docsScoresEmbeddings = await this.similaritySearchByVectorReturningEmbeddings(embedding, options.fetchK, options.filter);
573
+ if (!docsScoresEmbeddings.length) {
574
+ return [];
575
+ }
576
+ // Split documents, scores, and embeddings
577
+ const documents = docsScoresEmbeddings.map(([document]) => document);
578
+ const scores = docsScoresEmbeddings.map(([, score]) => score);
579
+ const embeddings = docsScoresEmbeddings.map(([, , embedding]) => new Float32Array(embedding));
580
+ // Convert all embeddings to Float32Array for consistency
581
+ const consistentEmbeddings = embeddings.map((embedding) => Array.from(embedding));
582
+ const queryEmbedding = Array.from(embedding);
583
+ // Ensure lambdaMult has a default value if not provided
584
+ const lambdaMult = options.lambda ?? 0.5;
585
+ const mmrSelectedIndices = maximalMarginalRelevance(queryEmbedding, consistentEmbeddings, lambdaMult, options.k);
586
+ // Filter documents based on MMR-selected indices and map scores
587
+ return mmrSelectedIndices.map((index) => ({
588
+ document: documents[index],
589
+ score: scores[index],
590
+ }));
591
+ }
592
+ async delete(params) {
593
+ let connection = null;
594
+ try {
595
+ connection = await this.getConnection();
596
+ const options = { autoCommit: true };
597
+ if (params.ids && params.ids.length > 0) {
598
+ // Dynamically create placeholders
599
+ const placeholders = params.ids
600
+ .map((_, index) => `:${index + 1}`)
601
+ .join(",");
602
+ // Prepare the query
603
+ const query = `DELETE FROM ${this.tableName} WHERE id IN (${placeholders})`;
604
+ // Execute the query with the IDs as bind parameters
605
+ await connection.execute(query, [...params.ids], options);
606
+ }
607
+ else if (params.deleteAll) {
608
+ await connection.execute(`TRUNCATE TABLE ${this.tableName}`, [], options);
609
+ }
610
+ }
611
+ catch (error) {
612
+ handleError(error);
613
+ }
614
+ finally {
615
+ if (connection)
616
+ await connection.close();
617
+ }
618
+ }
619
+ static async fromDocuments(documents, embeddings, dbConfig) {
620
+ const { client } = dbConfig;
621
+ if (!client)
622
+ throw new Error("client parameter is required...");
623
+ try {
624
+ const vss = new OracleVS(embeddings, dbConfig);
625
+ await vss.initialize();
626
+ const texts = documents.map(({ pageContent }) => pageContent);
627
+ const vectors = await embeddings.embedDocuments(texts);
628
+ // Assuming a method exists to handle adding texts and metadata appropriately
629
+ await vss.addVectors(vectors, documents);
630
+ return vss;
631
+ }
632
+ catch (error) {
633
+ handleError(error);
634
+ }
635
+ }
636
+ /**
637
+ *
638
+ * @returns Promise that resolves when all connections
639
+ * inside the pool are terminated.
640
+ */
641
+ async end() {
642
+ if (isPool(this.client)) {
643
+ await this.client?.close();
644
+ }
645
+ }
646
+ }
647
+ //# sourceMappingURL=vectorstores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vectorstores.js","sourceRoot":"","sources":["../src/vectorstores.ts"],"names":[],"mappings":"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"}