145 lines
5.3 KiB
JavaScript
145 lines
5.3 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ConvexKVStore = void 0;
|
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
const server_1 = require("convex/server");
|
|
const stores_1 = require("@langchain/core/stores");
|
|
/**
|
|
* Class that extends the BaseStore class to interact with a Convex
|
|
* database. It provides methods for getting, setting, and deleting key value pairs,
|
|
* as well as yielding keys from the database.
|
|
*/
|
|
class ConvexKVStore extends stores_1.BaseStore {
|
|
constructor(config) {
|
|
super(config);
|
|
Object.defineProperty(this, "lc_namespace", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: ["langchain", "storage", "convex"]
|
|
});
|
|
Object.defineProperty(this, "ctx", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "table", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "index", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "keyField", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "valueField", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "upsert", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "lookup", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "deleteMany", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
this.ctx = config.ctx;
|
|
this.table = config.table ?? "cache";
|
|
this.index = config.index ?? "byKey";
|
|
this.keyField = config.keyField ?? "key";
|
|
this.valueField = config.valueField ?? "value";
|
|
this.upsert =
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
config.upsert ?? (0, server_1.makeFunctionReference)("langchain/db:upsert");
|
|
this.lookup =
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
config.lookup ?? (0, server_1.makeFunctionReference)("langchain/db:lookup");
|
|
this.deleteMany =
|
|
config.deleteMany ??
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
(0, server_1.makeFunctionReference)("langchain/db:deleteMany");
|
|
}
|
|
/**
|
|
* Gets multiple keys from the Convex database.
|
|
* @param keys Array of keys to be retrieved.
|
|
* @returns An array of retrieved values.
|
|
*/
|
|
async mget(keys) {
|
|
return (await Promise.all(keys.map(async (key) => {
|
|
const found = (await this.ctx.runQuery(this.lookup, {
|
|
table: this.table,
|
|
index: this.index,
|
|
keyField: this.keyField,
|
|
key,
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
}));
|
|
return found.length > 0 ? found[0][this.valueField] : undefined;
|
|
})));
|
|
}
|
|
/**
|
|
* Sets multiple keys in the Convex database.
|
|
* @param keyValuePairs Array of key-value pairs to be set.
|
|
* @returns Promise that resolves when all keys have been set.
|
|
*/
|
|
async mset(keyValuePairs) {
|
|
// TODO: Remove chunking when Convex handles the concurrent requests correctly
|
|
const PAGE_SIZE = 16;
|
|
for (let i = 0; i < keyValuePairs.length; i += PAGE_SIZE) {
|
|
await Promise.all(keyValuePairs.slice(i, i + PAGE_SIZE).map(([key, value]) => this.ctx.runMutation(this.upsert, {
|
|
table: this.table,
|
|
index: this.index,
|
|
keyField: this.keyField,
|
|
key,
|
|
document: { [this.keyField]: key, [this.valueField]: value },
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
})));
|
|
}
|
|
}
|
|
/**
|
|
* Deletes multiple keys from the Convex database.
|
|
* @param keys Array of keys to be deleted.
|
|
* @returns Promise that resolves when all keys have been deleted.
|
|
*/
|
|
async mdelete(keys) {
|
|
await Promise.all(keys.map((key) => this.ctx.runMutation(this.deleteMany, {
|
|
table: this.table,
|
|
index: this.index,
|
|
keyField: this.keyField,
|
|
key,
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
})));
|
|
}
|
|
/**
|
|
* Yields keys from the Convex database.
|
|
* @param prefix Optional prefix to filter the keys.
|
|
* @returns An AsyncGenerator that yields keys from the Convex database.
|
|
*/
|
|
// eslint-disable-next-line require-yield
|
|
async *yieldKeys(_prefix) {
|
|
throw new Error("yieldKeys not implemented yet for ConvexKVStore");
|
|
}
|
|
}
|
|
exports.ConvexKVStore = ConvexKVStore;
|