langchain 0.0.173 → 0.0.175

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/dist/callbacks/manager.cjs +2 -1
  2. package/dist/callbacks/manager.js +2 -1
  3. package/dist/load/import_constants.cjs +4 -0
  4. package/dist/load/import_constants.js +4 -0
  5. package/dist/memory/index.cjs +2 -1
  6. package/dist/memory/index.d.ts +1 -1
  7. package/dist/memory/index.js +1 -1
  8. package/dist/prompts/selectors/SemanticSimilarityExampleSelector.cjs +15 -18
  9. package/dist/prompts/selectors/SemanticSimilarityExampleSelector.d.ts +12 -6
  10. package/dist/prompts/selectors/SemanticSimilarityExampleSelector.js +15 -18
  11. package/dist/storage/convex.cjs +145 -0
  12. package/dist/storage/convex.d.ts +85 -0
  13. package/dist/storage/convex.js +141 -0
  14. package/dist/stores/message/convex.cjs +120 -0
  15. package/dist/stores/message/convex.d.ts +60 -0
  16. package/dist/stores/message/convex.js +116 -0
  17. package/dist/util/convex.cjs +77 -0
  18. package/dist/util/convex.d.ts +26 -0
  19. package/dist/util/convex.js +74 -0
  20. package/dist/vectorstores/convex.cjs +177 -0
  21. package/dist/vectorstores/convex.d.ts +113 -0
  22. package/dist/vectorstores/convex.js +173 -0
  23. package/dist/vectorstores/milvus.cjs +4 -2
  24. package/dist/vectorstores/milvus.js +4 -2
  25. package/dist/vectorstores/pinecone.cjs +46 -9
  26. package/dist/vectorstores/pinecone.d.ts +20 -2
  27. package/dist/vectorstores/pinecone.js +46 -9
  28. package/dist/vectorstores/vercel_postgres.cjs +29 -7
  29. package/dist/vectorstores/vercel_postgres.d.ts +1 -1
  30. package/dist/vectorstores/vercel_postgres.js +29 -7
  31. package/package.json +38 -1
  32. package/storage/convex.cjs +1 -0
  33. package/storage/convex.d.ts +1 -0
  34. package/storage/convex.js +1 -0
  35. package/stores/message/convex.cjs +1 -0
  36. package/stores/message/convex.d.ts +1 -0
  37. package/stores/message/convex.js +1 -0
  38. package/util/convex.cjs +1 -0
  39. package/util/convex.d.ts +1 -0
  40. package/util/convex.js +1 -0
  41. package/vectorstores/convex.cjs +1 -0
  42. package/vectorstores/convex.d.ts +1 -0
  43. package/vectorstores/convex.js +1 -0
@@ -504,7 +504,8 @@ class CallbackManager extends BaseCallbackManager {
504
504
  ? localHandlers.map(ensureHandler)
505
505
  : localHandlers?.handlers, false);
506
506
  }
507
- const verboseEnabled = (0, env_js_1.getEnvironmentVariable)("LANGCHAIN_VERBOSE") || options?.verbose;
507
+ const verboseEnabled = (0, env_js_1.getEnvironmentVariable)("LANGCHAIN_VERBOSE") === "true" ||
508
+ options?.verbose;
508
509
  const tracingV2Enabled = (0, env_js_1.getEnvironmentVariable)("LANGCHAIN_TRACING_V2") === "true";
509
510
  const tracingEnabled = tracingV2Enabled ||
510
511
  ((0, env_js_1.getEnvironmentVariable)("LANGCHAIN_TRACING") ?? false);
@@ -495,7 +495,8 @@ export class CallbackManager extends BaseCallbackManager {
495
495
  ? localHandlers.map(ensureHandler)
496
496
  : localHandlers?.handlers, false);
497
497
  }
498
- const verboseEnabled = getEnvironmentVariable("LANGCHAIN_VERBOSE") || options?.verbose;
498
+ const verboseEnabled = getEnvironmentVariable("LANGCHAIN_VERBOSE") === "true" ||
499
+ options?.verbose;
499
500
  const tracingV2Enabled = getEnvironmentVariable("LANGCHAIN_TRACING_V2") === "true";
500
501
  const tracingEnabled = tracingV2Enabled ||
501
502
  (getEnvironmentVariable("LANGCHAIN_TRACING") ?? false);
@@ -41,6 +41,7 @@ exports.optionalImportEntrypoints = [
41
41
  "langchain/prompts/load",
42
42
  "langchain/vectorstores/analyticdb",
43
43
  "langchain/vectorstores/cassandra",
44
+ "langchain/vectorstores/convex",
44
45
  "langchain/vectorstores/elasticsearch",
45
46
  "langchain/vectorstores/cloudflare_vectorize",
46
47
  "langchain/vectorstores/closevector/web",
@@ -133,6 +134,7 @@ exports.optionalImportEntrypoints = [
133
134
  "langchain/cache/upstash_redis",
134
135
  "langchain/stores/doc/gcs",
135
136
  "langchain/stores/file/node",
137
+ "langchain/stores/message/convex",
136
138
  "langchain/stores/message/cloudflare_d1",
137
139
  "langchain/stores/message/dynamodb",
138
140
  "langchain/stores/message/firestore",
@@ -143,12 +145,14 @@ exports.optionalImportEntrypoints = [
143
145
  "langchain/stores/message/upstash_redis",
144
146
  "langchain/stores/message/planetscale",
145
147
  "langchain/stores/message/xata",
148
+ "langchain/storage/convex",
146
149
  "langchain/storage/ioredis",
147
150
  "langchain/storage/vercel_kv",
148
151
  "langchain/storage/upstash_redis",
149
152
  "langchain/storage/file_system",
150
153
  "langchain/graphs/neo4j_graph",
151
154
  "langchain/hub",
155
+ "langchain/util/convex",
152
156
  "langchain/experimental/multimodal_embeddings/googlevertexai",
153
157
  "langchain/experimental/chat_models/anthropic_functions",
154
158
  "langchain/experimental/llms/bittensor",
@@ -38,6 +38,7 @@ export const optionalImportEntrypoints = [
38
38
  "langchain/prompts/load",
39
39
  "langchain/vectorstores/analyticdb",
40
40
  "langchain/vectorstores/cassandra",
41
+ "langchain/vectorstores/convex",
41
42
  "langchain/vectorstores/elasticsearch",
42
43
  "langchain/vectorstores/cloudflare_vectorize",
43
44
  "langchain/vectorstores/closevector/web",
@@ -130,6 +131,7 @@ export const optionalImportEntrypoints = [
130
131
  "langchain/cache/upstash_redis",
131
132
  "langchain/stores/doc/gcs",
132
133
  "langchain/stores/file/node",
134
+ "langchain/stores/message/convex",
133
135
  "langchain/stores/message/cloudflare_d1",
134
136
  "langchain/stores/message/dynamodb",
135
137
  "langchain/stores/message/firestore",
@@ -140,12 +142,14 @@ export const optionalImportEntrypoints = [
140
142
  "langchain/stores/message/upstash_redis",
141
143
  "langchain/stores/message/planetscale",
142
144
  "langchain/stores/message/xata",
145
+ "langchain/storage/convex",
143
146
  "langchain/storage/ioredis",
144
147
  "langchain/storage/vercel_kv",
145
148
  "langchain/storage/upstash_redis",
146
149
  "langchain/storage/file_system",
147
150
  "langchain/graphs/neo4j_graph",
148
151
  "langchain/hub",
152
+ "langchain/util/convex",
149
153
  "langchain/experimental/multimodal_embeddings/googlevertexai",
150
154
  "langchain/experimental/chat_models/anthropic_functions",
151
155
  "langchain/experimental/llms/bittensor",
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ConversationSummaryBufferMemory = exports.CombinedMemory = exports.ENTITY_MEMORY_CONVERSATION_TEMPLATE = exports.EntityMemory = exports.VectorStoreRetrieverMemory = exports.MotorheadMemory = exports.ChatMessageHistory = exports.BaseChatMemory = exports.BufferWindowMemory = exports.BaseConversationSummaryMemory = exports.ConversationSummaryMemory = exports.getBufferString = exports.getInputValue = exports.BaseMemory = exports.BufferMemory = void 0;
3
+ exports.ConversationSummaryBufferMemory = exports.CombinedMemory = exports.ENTITY_MEMORY_CONVERSATION_TEMPLATE = exports.EntityMemory = exports.VectorStoreRetrieverMemory = exports.MotorheadMemory = exports.ChatMessageHistory = exports.BaseChatMemory = exports.BufferWindowMemory = exports.BaseConversationSummaryMemory = exports.ConversationSummaryMemory = exports.getBufferString = exports.getOutputValue = exports.getInputValue = exports.BaseMemory = exports.BufferMemory = void 0;
4
4
  var buffer_memory_js_1 = require("./buffer_memory.cjs");
5
5
  Object.defineProperty(exports, "BufferMemory", { enumerable: true, get: function () { return buffer_memory_js_1.BufferMemory; } });
6
6
  var base_js_1 = require("./base.cjs");
7
7
  Object.defineProperty(exports, "BaseMemory", { enumerable: true, get: function () { return base_js_1.BaseMemory; } });
8
8
  Object.defineProperty(exports, "getInputValue", { enumerable: true, get: function () { return base_js_1.getInputValue; } });
9
+ Object.defineProperty(exports, "getOutputValue", { enumerable: true, get: function () { return base_js_1.getOutputValue; } });
9
10
  Object.defineProperty(exports, "getBufferString", { enumerable: true, get: function () { return base_js_1.getBufferString; } });
10
11
  var summary_js_1 = require("./summary.cjs");
11
12
  Object.defineProperty(exports, "ConversationSummaryMemory", { enumerable: true, get: function () { return summary_js_1.ConversationSummaryMemory; } });
@@ -1,5 +1,5 @@
1
1
  export { BufferMemory, type BufferMemoryInput } from "./buffer_memory.js";
2
- export { BaseMemory, getInputValue, getBufferString, type InputValues, type OutputValues, type MemoryVariables, } from "./base.js";
2
+ export { BaseMemory, getInputValue, getOutputValue, getBufferString, type InputValues, type OutputValues, type MemoryVariables, } from "./base.js";
3
3
  export { ConversationSummaryMemory, type ConversationSummaryMemoryInput, BaseConversationSummaryMemory, type BaseConversationSummaryMemoryInput, } from "./summary.js";
4
4
  export { BufferWindowMemory, type BufferWindowMemoryInput, } from "./buffer_window_memory.js";
5
5
  export { BaseChatMemory, type BaseChatMemoryInput } from "./chat_memory.js";
@@ -1,5 +1,5 @@
1
1
  export { BufferMemory } from "./buffer_memory.js";
2
- export { BaseMemory, getInputValue, getBufferString, } from "./base.js";
2
+ export { BaseMemory, getInputValue, getOutputValue, getBufferString, } from "./base.js";
3
3
  export { ConversationSummaryMemory, BaseConversationSummaryMemory, } from "./summary.js";
4
4
  export { BufferWindowMemory, } from "./buffer_window_memory.js";
5
5
  export { BaseChatMemory } from "./chat_memory.js";
@@ -15,18 +15,12 @@ function sortedValues(values) {
15
15
  class SemanticSimilarityExampleSelector extends base_js_1.BaseExampleSelector {
16
16
  constructor(data) {
17
17
  super(data);
18
- Object.defineProperty(this, "vectorStore", {
18
+ Object.defineProperty(this, "vectorStoreRetriever", {
19
19
  enumerable: true,
20
20
  configurable: true,
21
21
  writable: true,
22
22
  value: void 0
23
23
  });
24
- Object.defineProperty(this, "k", {
25
- enumerable: true,
26
- configurable: true,
27
- writable: true,
28
- value: 4
29
- });
30
24
  Object.defineProperty(this, "exampleKeys", {
31
25
  enumerable: true,
32
26
  configurable: true,
@@ -39,17 +33,20 @@ class SemanticSimilarityExampleSelector extends base_js_1.BaseExampleSelector {
39
33
  writable: true,
40
34
  value: void 0
41
35
  });
42
- Object.defineProperty(this, "filter", {
43
- enumerable: true,
44
- configurable: true,
45
- writable: true,
46
- value: void 0
47
- });
48
- this.vectorStore = data.vectorStore;
49
- this.k = data.k ?? 4;
50
36
  this.exampleKeys = data.exampleKeys;
51
37
  this.inputKeys = data.inputKeys;
52
- this.filter = data.filter;
38
+ if (data.vectorStore !== undefined) {
39
+ this.vectorStoreRetriever = data.vectorStore.asRetriever({
40
+ k: data.k ?? 4,
41
+ filter: data.filter,
42
+ });
43
+ }
44
+ else if (data.vectorStoreRetriever) {
45
+ this.vectorStoreRetriever = data.vectorStoreRetriever;
46
+ }
47
+ else {
48
+ throw new Error(`You must specify one of "vectorStore" and "vectorStoreRetriever".`);
49
+ }
53
50
  }
54
51
  /**
55
52
  * Method that adds a new example to the vectorStore. The example is
@@ -60,7 +57,7 @@ class SemanticSimilarityExampleSelector extends base_js_1.BaseExampleSelector {
60
57
  async addExample(example) {
61
58
  const inputKeys = this.inputKeys ?? Object.keys(example);
62
59
  const stringExample = sortedValues(inputKeys.reduce((acc, key) => ({ ...acc, [key]: example[key] }), {})).join(" ");
63
- await this.vectorStore.addDocuments([
60
+ await this.vectorStoreRetriever.addDocuments([
64
61
  new document_js_1.Document({
65
62
  pageContent: stringExample,
66
63
  metadata: example,
@@ -77,7 +74,7 @@ class SemanticSimilarityExampleSelector extends base_js_1.BaseExampleSelector {
77
74
  async selectExamples(inputVariables) {
78
75
  const inputKeys = this.inputKeys ?? Object.keys(inputVariables);
79
76
  const query = sortedValues(inputKeys.reduce((acc, key) => ({ ...acc, [key]: inputVariables[key] }), {})).join(" ");
80
- const exampleDocs = await this.vectorStore.similaritySearch(query, this.k, this.filter);
77
+ const exampleDocs = await this.vectorStoreRetriever.invoke(query);
81
78
  const examples = exampleDocs.map((doc) => doc.metadata);
82
79
  if (this.exampleKeys) {
83
80
  // If example keys are provided, filter examples to those keys.
@@ -1,28 +1,34 @@
1
1
  import { Embeddings } from "../../embeddings/base.js";
2
- import { VectorStore } from "../../vectorstores/base.js";
2
+ import { VectorStore, VectorStoreRetriever } from "../../vectorstores/base.js";
3
3
  import { Example } from "../../schema/index.js";
4
4
  import { BaseExampleSelector } from "../base.js";
5
5
  /**
6
6
  * Interface for the input data of the SemanticSimilarityExampleSelector
7
7
  * class.
8
8
  */
9
- export interface SemanticSimilarityExampleSelectorInput<V extends VectorStore = VectorStore> {
9
+ export type SemanticSimilarityExampleSelectorInput<V extends VectorStore = VectorStore> = {
10
10
  vectorStore: V;
11
11
  k?: number;
12
12
  filter?: V["FilterType"];
13
13
  exampleKeys?: string[];
14
14
  inputKeys?: string[];
15
- }
15
+ vectorStoreRetriever?: never;
16
+ } | {
17
+ vectorStoreRetriever: VectorStoreRetriever<V>;
18
+ exampleKeys?: string[];
19
+ inputKeys?: string[];
20
+ vectorStore?: never;
21
+ k?: never;
22
+ filter?: never;
23
+ };
16
24
  /**
17
25
  * Class that selects examples based on semantic similarity. It extends
18
26
  * the BaseExampleSelector class.
19
27
  */
20
28
  export declare class SemanticSimilarityExampleSelector<V extends VectorStore = VectorStore> extends BaseExampleSelector {
21
- vectorStore: V;
22
- k: number;
29
+ vectorStoreRetriever: VectorStoreRetriever<V>;
23
30
  exampleKeys?: string[];
24
31
  inputKeys?: string[];
25
- filter?: V["FilterType"];
26
32
  constructor(data: SemanticSimilarityExampleSelectorInput<V>);
27
33
  /**
28
34
  * Method that adds a new example to the vectorStore. The example is
@@ -12,18 +12,12 @@ function sortedValues(values) {
12
12
  export class SemanticSimilarityExampleSelector extends BaseExampleSelector {
13
13
  constructor(data) {
14
14
  super(data);
15
- Object.defineProperty(this, "vectorStore", {
15
+ Object.defineProperty(this, "vectorStoreRetriever", {
16
16
  enumerable: true,
17
17
  configurable: true,
18
18
  writable: true,
19
19
  value: void 0
20
20
  });
21
- Object.defineProperty(this, "k", {
22
- enumerable: true,
23
- configurable: true,
24
- writable: true,
25
- value: 4
26
- });
27
21
  Object.defineProperty(this, "exampleKeys", {
28
22
  enumerable: true,
29
23
  configurable: true,
@@ -36,17 +30,20 @@ export class SemanticSimilarityExampleSelector extends BaseExampleSelector {
36
30
  writable: true,
37
31
  value: void 0
38
32
  });
39
- Object.defineProperty(this, "filter", {
40
- enumerable: true,
41
- configurable: true,
42
- writable: true,
43
- value: void 0
44
- });
45
- this.vectorStore = data.vectorStore;
46
- this.k = data.k ?? 4;
47
33
  this.exampleKeys = data.exampleKeys;
48
34
  this.inputKeys = data.inputKeys;
49
- this.filter = data.filter;
35
+ if (data.vectorStore !== undefined) {
36
+ this.vectorStoreRetriever = data.vectorStore.asRetriever({
37
+ k: data.k ?? 4,
38
+ filter: data.filter,
39
+ });
40
+ }
41
+ else if (data.vectorStoreRetriever) {
42
+ this.vectorStoreRetriever = data.vectorStoreRetriever;
43
+ }
44
+ else {
45
+ throw new Error(`You must specify one of "vectorStore" and "vectorStoreRetriever".`);
46
+ }
50
47
  }
51
48
  /**
52
49
  * Method that adds a new example to the vectorStore. The example is
@@ -57,7 +54,7 @@ export class SemanticSimilarityExampleSelector extends BaseExampleSelector {
57
54
  async addExample(example) {
58
55
  const inputKeys = this.inputKeys ?? Object.keys(example);
59
56
  const stringExample = sortedValues(inputKeys.reduce((acc, key) => ({ ...acc, [key]: example[key] }), {})).join(" ");
60
- await this.vectorStore.addDocuments([
57
+ await this.vectorStoreRetriever.addDocuments([
61
58
  new Document({
62
59
  pageContent: stringExample,
63
60
  metadata: example,
@@ -74,7 +71,7 @@ export class SemanticSimilarityExampleSelector extends BaseExampleSelector {
74
71
  async selectExamples(inputVariables) {
75
72
  const inputKeys = this.inputKeys ?? Object.keys(inputVariables);
76
73
  const query = sortedValues(inputKeys.reduce((acc, key) => ({ ...acc, [key]: inputVariables[key] }), {})).join(" ");
77
- const exampleDocs = await this.vectorStore.similaritySearch(query, this.k, this.filter);
74
+ const exampleDocs = await this.vectorStoreRetriever.invoke(query);
78
75
  const examples = exampleDocs.map((doc) => doc.metadata);
79
76
  if (this.exampleKeys) {
80
77
  // If example keys are provided, filter examples to those keys.
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConvexKVStore = void 0;
4
+ // eslint-disable-next-line import/no-extraneous-dependencies
5
+ const server_1 = require("convex/server");
6
+ const storage_js_1 = require("../schema/storage.cjs");
7
+ /**
8
+ * Class that extends the BaseStore class to interact with a Convex
9
+ * database. It provides methods for getting, setting, and deleting key value pairs,
10
+ * as well as yielding keys from the database.
11
+ */
12
+ class ConvexKVStore extends storage_js_1.BaseStore {
13
+ constructor(config) {
14
+ super(config);
15
+ Object.defineProperty(this, "lc_namespace", {
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true,
19
+ value: ["langchain", "storage", "convex"]
20
+ });
21
+ Object.defineProperty(this, "ctx", {
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true,
25
+ value: void 0
26
+ });
27
+ Object.defineProperty(this, "table", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: void 0
32
+ });
33
+ Object.defineProperty(this, "index", {
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true,
37
+ value: void 0
38
+ });
39
+ Object.defineProperty(this, "keyField", {
40
+ enumerable: true,
41
+ configurable: true,
42
+ writable: true,
43
+ value: void 0
44
+ });
45
+ Object.defineProperty(this, "valueField", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: void 0
50
+ });
51
+ Object.defineProperty(this, "upsert", {
52
+ enumerable: true,
53
+ configurable: true,
54
+ writable: true,
55
+ value: void 0
56
+ });
57
+ Object.defineProperty(this, "lookup", {
58
+ enumerable: true,
59
+ configurable: true,
60
+ writable: true,
61
+ value: void 0
62
+ });
63
+ Object.defineProperty(this, "deleteMany", {
64
+ enumerable: true,
65
+ configurable: true,
66
+ writable: true,
67
+ value: void 0
68
+ });
69
+ this.ctx = config.ctx;
70
+ this.table = config.table ?? "cache";
71
+ this.index = config.index ?? "byKey";
72
+ this.keyField = config.keyField ?? "key";
73
+ this.valueField = config.valueField ?? "value";
74
+ this.upsert =
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
+ config.upsert ?? (0, server_1.makeFunctionReference)("langchain/db:upsert");
77
+ this.lookup =
78
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+ config.lookup ?? (0, server_1.makeFunctionReference)("langchain/db:lookup");
80
+ this.deleteMany =
81
+ config.deleteMany ??
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ (0, server_1.makeFunctionReference)("langchain/db:deleteMany");
84
+ }
85
+ /**
86
+ * Gets multiple keys from the Convex database.
87
+ * @param keys Array of keys to be retrieved.
88
+ * @returns An array of retrieved values.
89
+ */
90
+ async mget(keys) {
91
+ return (await Promise.all(keys.map(async (key) => {
92
+ const found = (await this.ctx.runQuery(this.lookup, {
93
+ table: this.table,
94
+ index: this.index,
95
+ keyField: this.keyField,
96
+ key,
97
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
98
+ }));
99
+ return found.length > 0 ? found[0][this.valueField] : undefined;
100
+ })));
101
+ }
102
+ /**
103
+ * Sets multiple keys in the Convex database.
104
+ * @param keyValuePairs Array of key-value pairs to be set.
105
+ * @returns Promise that resolves when all keys have been set.
106
+ */
107
+ async mset(keyValuePairs) {
108
+ // TODO: Remove chunking when Convex handles the concurrent requests correctly
109
+ const PAGE_SIZE = 16;
110
+ for (let i = 0; i < keyValuePairs.length; i += PAGE_SIZE) {
111
+ await Promise.all(keyValuePairs.slice(i, i + PAGE_SIZE).map(([key, value]) => this.ctx.runMutation(this.upsert, {
112
+ table: this.table,
113
+ index: this.index,
114
+ keyField: this.keyField,
115
+ key,
116
+ document: { [this.keyField]: key, [this.valueField]: value },
117
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
118
+ })));
119
+ }
120
+ }
121
+ /**
122
+ * Deletes multiple keys from the Convex database.
123
+ * @param keys Array of keys to be deleted.
124
+ * @returns Promise that resolves when all keys have been deleted.
125
+ */
126
+ async mdelete(keys) {
127
+ await Promise.all(keys.map((key) => this.ctx.runMutation(this.deleteMany, {
128
+ table: this.table,
129
+ index: this.index,
130
+ keyField: this.keyField,
131
+ key,
132
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
133
+ })));
134
+ }
135
+ /**
136
+ * Yields keys from the Convex database.
137
+ * @param prefix Optional prefix to filter the keys.
138
+ * @returns An AsyncGenerator that yields keys from the Convex database.
139
+ */
140
+ // eslint-disable-next-line require-yield
141
+ async *yieldKeys(_prefix) {
142
+ throw new Error("yieldKeys not implemented yet for ConvexKVStore");
143
+ }
144
+ }
145
+ exports.ConvexKVStore = ConvexKVStore;
@@ -0,0 +1,85 @@
1
+ import { FieldPaths, FunctionReference, GenericActionCtx, GenericDataModel, NamedTableInfo, TableNamesInDataModel, VectorIndexNames } from "convex/server";
2
+ import { Value } from "convex/values";
3
+ import { BaseStore } from "../schema/storage.js";
4
+ /**
5
+ * Type that defines the config required to initialize the
6
+ * ConvexKVStore class. It includes the table name,
7
+ * index name, field name.
8
+ */
9
+ export type ConvexKVStoreConfig<DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>, IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>, KeyFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>, ValueFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>, UpsertMutation extends FunctionReference<"mutation", "internal", {
10
+ table: string;
11
+ document: object;
12
+ }>, LookupQuery extends FunctionReference<"query", "internal", {
13
+ table: string;
14
+ index: string;
15
+ keyField: string;
16
+ key: string;
17
+ }, object[]>, DeleteManyMutation extends FunctionReference<"mutation", "internal", {
18
+ table: string;
19
+ index: string;
20
+ keyField: string;
21
+ key: string;
22
+ }>> = {
23
+ readonly ctx: GenericActionCtx<DataModel>;
24
+ readonly table?: TableName;
25
+ readonly index?: IndexName;
26
+ readonly keyField?: KeyFieldName;
27
+ readonly valueField?: ValueFieldName;
28
+ readonly upsert?: UpsertMutation;
29
+ readonly lookup?: LookupQuery;
30
+ readonly deleteMany?: DeleteManyMutation;
31
+ };
32
+ /**
33
+ * Class that extends the BaseStore class to interact with a Convex
34
+ * database. It provides methods for getting, setting, and deleting key value pairs,
35
+ * as well as yielding keys from the database.
36
+ */
37
+ export declare class ConvexKVStore<T extends Value, DataModel extends GenericDataModel, TableName extends TableNamesInDataModel<DataModel>, IndexName extends VectorIndexNames<NamedTableInfo<DataModel, TableName>>, KeyFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>, ValueFieldName extends FieldPaths<NamedTableInfo<DataModel, TableName>>, UpsertMutation extends FunctionReference<"mutation", "internal", {
38
+ table: string;
39
+ document: object;
40
+ }>, LookupQuery extends FunctionReference<"query", "internal", {
41
+ table: string;
42
+ index: string;
43
+ keyField: string;
44
+ key: string;
45
+ }, object[]>, DeleteManyMutation extends FunctionReference<"mutation", "internal", {
46
+ table: string;
47
+ index: string;
48
+ keyField: string;
49
+ key: string;
50
+ }>> extends BaseStore<string, T> {
51
+ lc_namespace: string[];
52
+ private readonly ctx;
53
+ private readonly table;
54
+ private readonly index;
55
+ private readonly keyField;
56
+ private readonly valueField;
57
+ private readonly upsert;
58
+ private readonly lookup;
59
+ private readonly deleteMany;
60
+ constructor(config: ConvexKVStoreConfig<DataModel, TableName, IndexName, KeyFieldName, ValueFieldName, UpsertMutation, LookupQuery, DeleteManyMutation>);
61
+ /**
62
+ * Gets multiple keys from the Convex database.
63
+ * @param keys Array of keys to be retrieved.
64
+ * @returns An array of retrieved values.
65
+ */
66
+ mget(keys: string[]): Promise<(T | undefined)[]>;
67
+ /**
68
+ * Sets multiple keys in the Convex database.
69
+ * @param keyValuePairs Array of key-value pairs to be set.
70
+ * @returns Promise that resolves when all keys have been set.
71
+ */
72
+ mset(keyValuePairs: [string, T][]): Promise<void>;
73
+ /**
74
+ * Deletes multiple keys from the Convex database.
75
+ * @param keys Array of keys to be deleted.
76
+ * @returns Promise that resolves when all keys have been deleted.
77
+ */
78
+ mdelete(keys: string[]): Promise<void>;
79
+ /**
80
+ * Yields keys from the Convex database.
81
+ * @param prefix Optional prefix to filter the keys.
82
+ * @returns An AsyncGenerator that yields keys from the Convex database.
83
+ */
84
+ yieldKeys(_prefix?: string): AsyncGenerator<string>;
85
+ }
@@ -0,0 +1,141 @@
1
+ // eslint-disable-next-line import/no-extraneous-dependencies
2
+ import { makeFunctionReference, } from "convex/server";
3
+ import { BaseStore } from "../schema/storage.js";
4
+ /**
5
+ * Class that extends the BaseStore class to interact with a Convex
6
+ * database. It provides methods for getting, setting, and deleting key value pairs,
7
+ * as well as yielding keys from the database.
8
+ */
9
+ export class ConvexKVStore extends BaseStore {
10
+ constructor(config) {
11
+ super(config);
12
+ Object.defineProperty(this, "lc_namespace", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: ["langchain", "storage", "convex"]
17
+ });
18
+ Object.defineProperty(this, "ctx", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: void 0
23
+ });
24
+ Object.defineProperty(this, "table", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: void 0
29
+ });
30
+ Object.defineProperty(this, "index", {
31
+ enumerable: true,
32
+ configurable: true,
33
+ writable: true,
34
+ value: void 0
35
+ });
36
+ Object.defineProperty(this, "keyField", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: void 0
41
+ });
42
+ Object.defineProperty(this, "valueField", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: void 0
47
+ });
48
+ Object.defineProperty(this, "upsert", {
49
+ enumerable: true,
50
+ configurable: true,
51
+ writable: true,
52
+ value: void 0
53
+ });
54
+ Object.defineProperty(this, "lookup", {
55
+ enumerable: true,
56
+ configurable: true,
57
+ writable: true,
58
+ value: void 0
59
+ });
60
+ Object.defineProperty(this, "deleteMany", {
61
+ enumerable: true,
62
+ configurable: true,
63
+ writable: true,
64
+ value: void 0
65
+ });
66
+ this.ctx = config.ctx;
67
+ this.table = config.table ?? "cache";
68
+ this.index = config.index ?? "byKey";
69
+ this.keyField = config.keyField ?? "key";
70
+ this.valueField = config.valueField ?? "value";
71
+ this.upsert =
72
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
73
+ config.upsert ?? makeFunctionReference("langchain/db:upsert");
74
+ this.lookup =
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
+ config.lookup ?? makeFunctionReference("langchain/db:lookup");
77
+ this.deleteMany =
78
+ config.deleteMany ??
79
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
+ makeFunctionReference("langchain/db:deleteMany");
81
+ }
82
+ /**
83
+ * Gets multiple keys from the Convex database.
84
+ * @param keys Array of keys to be retrieved.
85
+ * @returns An array of retrieved values.
86
+ */
87
+ async mget(keys) {
88
+ return (await Promise.all(keys.map(async (key) => {
89
+ const found = (await this.ctx.runQuery(this.lookup, {
90
+ table: this.table,
91
+ index: this.index,
92
+ keyField: this.keyField,
93
+ key,
94
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
95
+ }));
96
+ return found.length > 0 ? found[0][this.valueField] : undefined;
97
+ })));
98
+ }
99
+ /**
100
+ * Sets multiple keys in the Convex database.
101
+ * @param keyValuePairs Array of key-value pairs to be set.
102
+ * @returns Promise that resolves when all keys have been set.
103
+ */
104
+ async mset(keyValuePairs) {
105
+ // TODO: Remove chunking when Convex handles the concurrent requests correctly
106
+ const PAGE_SIZE = 16;
107
+ for (let i = 0; i < keyValuePairs.length; i += PAGE_SIZE) {
108
+ await Promise.all(keyValuePairs.slice(i, i + PAGE_SIZE).map(([key, value]) => this.ctx.runMutation(this.upsert, {
109
+ table: this.table,
110
+ index: this.index,
111
+ keyField: this.keyField,
112
+ key,
113
+ document: { [this.keyField]: key, [this.valueField]: value },
114
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
115
+ })));
116
+ }
117
+ }
118
+ /**
119
+ * Deletes multiple keys from the Convex database.
120
+ * @param keys Array of keys to be deleted.
121
+ * @returns Promise that resolves when all keys have been deleted.
122
+ */
123
+ async mdelete(keys) {
124
+ await Promise.all(keys.map((key) => this.ctx.runMutation(this.deleteMany, {
125
+ table: this.table,
126
+ index: this.index,
127
+ keyField: this.keyField,
128
+ key,
129
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
130
+ })));
131
+ }
132
+ /**
133
+ * Yields keys from the Convex database.
134
+ * @param prefix Optional prefix to filter the keys.
135
+ * @returns An AsyncGenerator that yields keys from the Convex database.
136
+ */
137
+ // eslint-disable-next-line require-yield
138
+ async *yieldKeys(_prefix) {
139
+ throw new Error("yieldKeys not implemented yet for ConvexKVStore");
140
+ }
141
+ }