-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
stores.ts
140 lines (126 loc) Β· 4.71 KB
/
stores.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import { Serializable } from "./load/serializable.js";
/** @deprecated For backwards compatibility only. Remove on next minor version upgrade. */
export interface BaseStoreInterface<K, V> {
/**
* Method to get multiple values for a set of keys.
* @param {K[]} keys - An array of keys.
* @returns {Promise<(V | undefined)[]>} - A Promise that resolves with array of values or undefined if key not found.
*/
mget(keys: K[]): Promise<(V | undefined)[]>;
/**
* Method to set a value for multiple keys.
* @param {[K, V][]} keyValuePairs - An array of key-value pairs.
* @returns {Promise<void>} - A Promise that resolves when the operation is complete.
*/
mset(keyValuePairs: [K, V][]): Promise<void>;
/**
* Method to delete multiple keys.
* @param {K[]} keys - An array of keys to delete.
* @returns {Promise<void>} - A Promise that resolves when the operation is complete.
*/
mdelete(keys: K[]): Promise<void>;
/**
* Method to yield keys optionally based on a prefix.
* @param {string} prefix - Optional prefix to filter keys.
* @returns {AsyncGenerator<K | string>} - An asynchronous generator that yields keys on iteration.
*/
yieldKeys(prefix?: string): AsyncGenerator<K | string>;
}
/**
* Abstract interface for a key-value store.
*/
export abstract class BaseStore<K, V>
extends Serializable
implements BaseStoreInterface<K, V>
{
/**
* Abstract method to get multiple values for a set of keys.
* @param {K[]} keys - An array of keys.
* @returns {Promise<(V | undefined)[]>} - A Promise that resolves with array of values or undefined if key not found.
*/
abstract mget(keys: K[]): Promise<(V | undefined)[]>;
/**
* Abstract method to set a value for multiple keys.
* @param {[K, V][]} keyValuePairs - An array of key-value pairs.
* @returns {Promise<void>} - A Promise that resolves when the operation is complete.
*/
abstract mset(keyValuePairs: [K, V][]): Promise<void>;
/**
* Abstract method to delete multiple keys.
* @param {K[]} keys - An array of keys to delete.
* @returns {Promise<void>} - A Promise that resolves when the operation is complete.
*/
abstract mdelete(keys: K[]): Promise<void>;
/**
* Abstract method to yield keys optionally based on a prefix.
* @param {string} prefix - Optional prefix to filter keys.
* @returns {AsyncGenerator<K | string>} - An asynchronous generator that yields keys on iteration.
*/
abstract yieldKeys(prefix?: string): AsyncGenerator<K | string>;
}
/**
* In-memory implementation of the BaseStore using a dictionary. Used for
* storing key-value pairs in memory.
* @example
* ```typescript
* const store = new InMemoryStore<BaseMessage>();
* await store.mset(
* Array.from({ length: 5 }).map((_, index) => [
* `message:id:${index}`,
* index % 2 === 0
* ? new AIMessage("ai stuff...")
* : new HumanMessage("human stuff..."),
* ]),
* );
*
* const retrievedMessages = await store.mget(["message:id:0", "message:id:1"]);
* await store.mdelete(await store.yieldKeys("message:id:").toArray());
* ```
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export class InMemoryStore<T = any> extends BaseStore<string, T> {
lc_namespace = ["langchain", "storage"];
protected store: Record<string, T> = {};
/**
* Retrieves the values associated with the given keys from the store.
* @param keys Keys to retrieve values for.
* @returns Array of values associated with the given keys.
*/
async mget(keys: string[]) {
return keys.map((key) => this.store[key]);
}
/**
* Sets the values for the given keys in the store.
* @param keyValuePairs Array of key-value pairs to set in the store.
* @returns Promise that resolves when all key-value pairs have been set.
*/
async mset(keyValuePairs: [string, T][]): Promise<void> {
for (const [key, value] of keyValuePairs) {
this.store[key] = value;
}
}
/**
* Deletes the given keys and their associated values from the store.
* @param keys Keys to delete from the store.
* @returns Promise that resolves when all keys have been deleted.
*/
async mdelete(keys: string[]): Promise<void> {
for (const key of keys) {
delete this.store[key];
}
}
/**
* Asynchronous generator that yields keys from the store. If a prefix is
* provided, it only yields keys that start with the prefix.
* @param prefix Optional prefix to filter keys.
* @returns AsyncGenerator that yields keys from the store.
*/
async *yieldKeys(prefix?: string | undefined): AsyncGenerator<string> {
const keys = Object.keys(this.store);
for (const key of keys) {
if (prefix === undefined || key.startsWith(prefix)) {
yield key;
}
}
}
}