stores.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { Serializable } from "./load/serializable.js";
  2. /**
  3. * Abstract interface for a key-value store.
  4. */
  5. export class BaseStore extends Serializable {
  6. }
  7. /**
  8. * In-memory implementation of the BaseStore using a dictionary. Used for
  9. * storing key-value pairs in memory.
  10. * @example
  11. * ```typescript
  12. * const store = new InMemoryStore<BaseMessage>();
  13. * await store.mset(
  14. * Array.from({ length: 5 }).map((_, index) => [
  15. * `message:id:${index}`,
  16. * index % 2 === 0
  17. * ? new AIMessage("ai stuff...")
  18. * : new HumanMessage("human stuff..."),
  19. * ]),
  20. * );
  21. *
  22. * const retrievedMessages = await store.mget(["message:id:0", "message:id:1"]);
  23. * await store.mdelete(await store.yieldKeys("message:id:").toArray());
  24. * ```
  25. */
  26. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  27. export class InMemoryStore extends BaseStore {
  28. constructor() {
  29. super(...arguments);
  30. Object.defineProperty(this, "lc_namespace", {
  31. enumerable: true,
  32. configurable: true,
  33. writable: true,
  34. value: ["langchain", "storage"]
  35. });
  36. Object.defineProperty(this, "store", {
  37. enumerable: true,
  38. configurable: true,
  39. writable: true,
  40. value: {}
  41. });
  42. }
  43. /**
  44. * Retrieves the values associated with the given keys from the store.
  45. * @param keys Keys to retrieve values for.
  46. * @returns Array of values associated with the given keys.
  47. */
  48. async mget(keys) {
  49. return keys.map((key) => this.store[key]);
  50. }
  51. /**
  52. * Sets the values for the given keys in the store.
  53. * @param keyValuePairs Array of key-value pairs to set in the store.
  54. * @returns Promise that resolves when all key-value pairs have been set.
  55. */
  56. async mset(keyValuePairs) {
  57. for (const [key, value] of keyValuePairs) {
  58. this.store[key] = value;
  59. }
  60. }
  61. /**
  62. * Deletes the given keys and their associated values from the store.
  63. * @param keys Keys to delete from the store.
  64. * @returns Promise that resolves when all keys have been deleted.
  65. */
  66. async mdelete(keys) {
  67. for (const key of keys) {
  68. delete this.store[key];
  69. }
  70. }
  71. /**
  72. * Asynchronous generator that yields keys from the store. If a prefix is
  73. * provided, it only yields keys that start with the prefix.
  74. * @param prefix Optional prefix to filter keys.
  75. * @returns AsyncGenerator that yields keys from the store.
  76. */
  77. async *yieldKeys(prefix) {
  78. const keys = Object.keys(this.store);
  79. for (const key of keys) {
  80. if (prefix === undefined || key.startsWith(prefix)) {
  81. yield key;
  82. }
  83. }
  84. }
  85. }