UNPKG

@langchain/community

Version:
1 lines 8.3 kB
{"version":3,"file":"convex.cjs","names":["BaseStore"],"sources":["../../src/storage/convex.ts"],"sourcesContent":["import {\n FieldPaths,\n FunctionReference,\n GenericActionCtx,\n GenericDataModel,\n NamedTableInfo,\n TableNamesInDataModel,\n VectorIndexNames,\n makeFunctionReference,\n} from \"convex/server\";\nimport { Value } from \"convex/values\";\nimport { BaseStore } from \"@langchain/core/stores\";\n\n/**\n * Type that defines the config required to initialize the\n * ConvexKVStore class. It includes the table name,\n * index name, field name.\n */\nexport type ConvexKVStoreConfig<\n DataModel extends GenericDataModel,\n TableName extends TableNamesInDataModel<DataModel>,\n IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>,\n KeyFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n ValueFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n UpsertMutation extends FunctionReference<\n \"mutation\",\n \"internal\",\n { table: string; document: object }\n >,\n LookupQuery extends FunctionReference<\n \"query\",\n \"internal\",\n { table: string; index: string; keyField: string; key: string },\n object[]\n >,\n DeleteManyMutation extends FunctionReference<\n \"mutation\",\n \"internal\",\n { table: string; index: string; keyField: string; key: string }\n >,\n> = {\n readonly ctx: GenericActionCtx<DataModel>;\n /**\n * Defaults to \"cache\"\n */\n readonly table?: TableName;\n /**\n * Defaults to \"byKey\"\n */\n readonly index?: IndexName;\n /**\n * Defaults to \"key\"\n */\n readonly keyField?: KeyFieldName;\n /**\n * Defaults to \"value\"\n */\n readonly valueField?: ValueFieldName;\n /**\n * Defaults to `internal.langchain.db.upsert`\n */\n readonly upsert?: UpsertMutation;\n /**\n * Defaults to `internal.langchain.db.lookup`\n */\n readonly lookup?: LookupQuery;\n /**\n * Defaults to `internal.langchain.db.deleteMany`\n */\n readonly deleteMany?: DeleteManyMutation;\n};\n\n/**\n * Class that extends the BaseStore class to interact with a Convex\n * database. It provides methods for getting, setting, and deleting key value pairs,\n * as well as yielding keys from the database.\n */\nexport class ConvexKVStore<\n T extends Value,\n DataModel extends GenericDataModel,\n TableName extends TableNamesInDataModel<DataModel>,\n IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>,\n KeyFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n ValueFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>,\n UpsertMutation extends FunctionReference<\n \"mutation\",\n \"internal\",\n { table: string; document: object }\n >,\n LookupQuery extends FunctionReference<\n \"query\",\n \"internal\",\n { table: string; index: string; keyField: string; key: string },\n object[]\n >,\n DeleteManyMutation extends FunctionReference<\n \"mutation\",\n \"internal\",\n { table: string; index: string; keyField: string; key: string }\n >,\n> extends BaseStore<string, T> {\n lc_namespace = [\"langchain\", \"storage\", \"convex\"];\n\n private readonly ctx: GenericActionCtx<DataModel>;\n\n private readonly table: TableName;\n\n private readonly index: IndexName;\n\n private readonly keyField: KeyFieldName;\n\n private readonly valueField: ValueFieldName;\n\n private readonly upsert: UpsertMutation;\n\n private readonly lookup: LookupQuery;\n\n private readonly deleteMany: DeleteManyMutation;\n\n constructor(\n config: ConvexKVStoreConfig<\n DataModel,\n TableName,\n IndexName,\n KeyFieldName,\n ValueFieldName,\n UpsertMutation,\n LookupQuery,\n DeleteManyMutation\n >\n ) {\n super(config);\n this.ctx = config.ctx;\n this.table = config.table ?? (\"cache\" as TableName);\n this.index = config.index ?? (\"byKey\" as IndexName);\n this.keyField = config.keyField ?? (\"key\" as KeyFieldName);\n this.valueField = config.valueField ?? (\"value\" as ValueFieldName);\n this.upsert =\n // oxlint-disable-next-line typescript/no-explicit-any\n config.upsert ?? (makeFunctionReference(\"langchain/db:upsert\") as any);\n this.lookup =\n // oxlint-disable-next-line typescript/no-explicit-any\n config.lookup ?? (makeFunctionReference(\"langchain/db:lookup\") as any);\n this.deleteMany =\n config.deleteMany ??\n // oxlint-disable-next-line typescript/no-explicit-any\n (makeFunctionReference(\"langchain/db:deleteMany\") as any);\n }\n\n /**\n * Gets multiple keys from the Convex database.\n * @param keys Array of keys to be retrieved.\n * @returns An array of retrieved values.\n */\n async mget(keys: string[]) {\n return (await Promise.all(\n keys.map(async (key) => {\n const found = (await this.ctx.runQuery(this.lookup, {\n table: this.table,\n index: this.index,\n keyField: this.keyField,\n key,\n // oxlint-disable-next-line typescript/no-explicit-any\n } as any)) as any;\n return found.length > 0 ? found[0][this.valueField] : undefined;\n })\n )) as (T | undefined)[];\n }\n\n /**\n * Sets multiple keys in the Convex database.\n * @param keyValuePairs Array of key-value pairs to be set.\n * @returns Promise that resolves when all keys have been set.\n */\n async mset(keyValuePairs: [string, T][]): Promise<void> {\n // TODO: Remove chunking when Convex handles the concurrent requests correctly\n const PAGE_SIZE = 16;\n for (let i = 0; i < keyValuePairs.length; i += PAGE_SIZE) {\n await Promise.all(\n keyValuePairs.slice(i, i + PAGE_SIZE).map(([key, value]) =>\n this.ctx.runMutation(this.upsert, {\n table: this.table,\n index: this.index,\n keyField: this.keyField,\n key,\n document: { [this.keyField]: key, [this.valueField]: value },\n // oxlint-disable-next-line typescript/no-explicit-any\n } as any)\n )\n );\n }\n }\n\n /**\n * Deletes multiple keys from the Convex database.\n * @param keys Array of keys to be deleted.\n * @returns Promise that resolves when all keys have been deleted.\n */\n async mdelete(keys: string[]): Promise<void> {\n await Promise.all(\n keys.map((key) =>\n this.ctx.runMutation(this.deleteMany, {\n table: this.table,\n index: this.index,\n keyField: this.keyField,\n key,\n // oxlint-disable-next-line typescript/no-explicit-any\n } as any)\n )\n );\n }\n\n /**\n * Yields keys from the Convex database.\n * @param prefix Optional prefix to filter the keys.\n * @returns An AsyncGenerator that yields keys from the Convex database.\n */\n // eslint-disable-next-line require-yield\n async *yieldKeys(_prefix?: string): AsyncGenerator<string> {\n throw new Error(\"yieldKeys not implemented yet for ConvexKVStore\");\n }\n}\n"],"mappings":";;;;;;;;;;;AA6EA,IAAa,gBAAb,cAuBUA,uBAAAA,UAAqB;CAC7B,eAAe;EAAC;EAAa;EAAW;EAAS;CAEjD;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,YACE,QAUA;AACA,QAAM,OAAO;AACb,OAAK,MAAM,OAAO;AAClB,OAAK,QAAQ,OAAO,SAAU;AAC9B,OAAK,QAAQ,OAAO,SAAU;AAC9B,OAAK,WAAW,OAAO,YAAa;AACpC,OAAK,aAAa,OAAO,cAAe;AACxC,OAAK,SAEH,OAAO,WAAA,GAAA,cAAA,uBAAiC,sBAAsB;AAChE,OAAK,SAEH,OAAO,WAAA,GAAA,cAAA,uBAAiC,sBAAsB;AAChE,OAAK,aACH,OAAO,eAAA,GAAA,cAAA,uBAEgB,0BAA0B;;;;;;;CAQrD,MAAM,KAAK,MAAgB;AACzB,SAAQ,MAAM,QAAQ,IACpB,KAAK,IAAI,OAAO,QAAQ;GACtB,MAAM,QAAS,MAAM,KAAK,IAAI,SAAS,KAAK,QAAQ;IAClD,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,UAAU,KAAK;IACf;IAED,CAAQ;AACT,UAAO,MAAM,SAAS,IAAI,MAAM,GAAG,KAAK,cAAc,KAAA;IACtD,CACH;;;;;;;CAQH,MAAM,KAAK,eAA6C;EAEtD,MAAM,YAAY;AAClB,OAAK,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK,UAC7C,OAAM,QAAQ,IACZ,cAAc,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,WAC/C,KAAK,IAAI,YAAY,KAAK,QAAQ;GAChC,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,UAAU,KAAK;GACf;GACA,UAAU;KAAG,KAAK,WAAW;KAAM,KAAK,aAAa;IAAO;GAE7D,CAAQ,CACV,CACF;;;;;;;CASL,MAAM,QAAQ,MAA+B;AAC3C,QAAM,QAAQ,IACZ,KAAK,KAAK,QACR,KAAK,IAAI,YAAY,KAAK,YAAY;GACpC,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,UAAU,KAAK;GACf;GAED,CAAQ,CACV,CACF;;;;;;;CASH,OAAO,UAAU,SAA0C;AACzD,QAAM,IAAI,MAAM,kDAAkD"}