@langchain/classic 1.0.45 → 1.0.46

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 (199) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  3. package/dist/agents/agent.cjs.map +1 -1
  4. package/dist/agents/chat/index.cjs +2 -1
  5. package/dist/agents/chat/index.cjs.map +1 -1
  6. package/dist/agents/chat/index.js +2 -1
  7. package/dist/agents/chat/index.js.map +1 -1
  8. package/dist/agents/chat_convo/index.cjs +7 -5
  9. package/dist/agents/chat_convo/index.cjs.map +1 -1
  10. package/dist/agents/chat_convo/index.js +7 -5
  11. package/dist/agents/chat_convo/index.js.map +1 -1
  12. package/dist/agents/chat_convo/outputParser.cjs.map +1 -1
  13. package/dist/agents/executor.cjs +22 -19
  14. package/dist/agents/executor.cjs.map +1 -1
  15. package/dist/agents/executor.js +22 -19
  16. package/dist/agents/executor.js.map +1 -1
  17. package/dist/agents/format_scratchpad/log_to_message.cjs.map +1 -1
  18. package/dist/agents/format_scratchpad/openai_functions.cjs.map +1 -1
  19. package/dist/agents/mrkl/index.cjs +9 -6
  20. package/dist/agents/mrkl/index.cjs.map +1 -1
  21. package/dist/agents/mrkl/index.js +9 -6
  22. package/dist/agents/mrkl/index.js.map +1 -1
  23. package/dist/agents/mrkl/outputParser.d.cts +1 -1
  24. package/dist/agents/mrkl/outputParser.d.ts +1 -1
  25. package/dist/agents/openai_functions/index.cjs +2 -1
  26. package/dist/agents/openai_functions/index.cjs.map +1 -1
  27. package/dist/agents/openai_functions/index.js +2 -1
  28. package/dist/agents/openai_functions/index.js.map +1 -1
  29. package/dist/agents/openai_functions/output_parser.cjs.map +1 -1
  30. package/dist/agents/openai_tools/index.cjs.map +1 -1
  31. package/dist/agents/openai_tools/output_parser.cjs.map +1 -1
  32. package/dist/agents/react/output_parser.cjs.map +1 -1
  33. package/dist/agents/structured_chat/index.cjs +6 -5
  34. package/dist/agents/structured_chat/index.cjs.map +1 -1
  35. package/dist/agents/structured_chat/index.js +6 -5
  36. package/dist/agents/structured_chat/index.js.map +1 -1
  37. package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
  38. package/dist/agents/tool_calling/output_parser.cjs.map +1 -1
  39. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.cjs.map +1 -1
  40. package/dist/agents/toolkits/conversational_retrieval/tool.cjs +2 -1
  41. package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
  42. package/dist/agents/toolkits/conversational_retrieval/tool.js +2 -1
  43. package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
  44. package/dist/agents/toolkits/json/json.cjs +10 -8
  45. package/dist/agents/toolkits/json/json.cjs.map +1 -1
  46. package/dist/agents/toolkits/json/json.js +10 -8
  47. package/dist/agents/toolkits/json/json.js.map +1 -1
  48. package/dist/agents/toolkits/openapi/openapi.cjs +12 -9
  49. package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
  50. package/dist/agents/toolkits/openapi/openapi.js +12 -9
  51. package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
  52. package/dist/agents/toolkits/sql/sql.cjs +10 -8
  53. package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
  54. package/dist/agents/toolkits/sql/sql.js +10 -8
  55. package/dist/agents/toolkits/sql/sql.js.map +1 -1
  56. package/dist/agents/toolkits/vectorstore/vectorstore.cjs +20 -16
  57. package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
  58. package/dist/agents/toolkits/vectorstore/vectorstore.js +20 -16
  59. package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
  60. package/dist/agents/xml/index.cjs +2 -1
  61. package/dist/agents/xml/index.cjs.map +1 -1
  62. package/dist/agents/xml/index.js +2 -1
  63. package/dist/agents/xml/index.js.map +1 -1
  64. package/dist/chains/base.cjs.map +1 -1
  65. package/dist/chains/chat_vector_db_chain.cjs +2 -1
  66. package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
  67. package/dist/chains/chat_vector_db_chain.js +2 -1
  68. package/dist/chains/chat_vector_db_chain.js.map +1 -1
  69. package/dist/chains/conversational_retrieval_chain.cjs +2 -1
  70. package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
  71. package/dist/chains/conversational_retrieval_chain.js +2 -1
  72. package/dist/chains/conversational_retrieval_chain.js.map +1 -1
  73. package/dist/chains/openai_functions/base.cjs.map +1 -1
  74. package/dist/chains/openai_functions/extraction.cjs.map +1 -1
  75. package/dist/chains/openai_functions/openapi.cjs +9 -8
  76. package/dist/chains/openai_functions/openapi.cjs.map +1 -1
  77. package/dist/chains/openai_functions/openapi.js +9 -8
  78. package/dist/chains/openai_functions/openapi.js.map +1 -1
  79. package/dist/chains/openai_functions/tagging.cjs.map +1 -1
  80. package/dist/chains/openai_moderation.cjs.map +1 -1
  81. package/dist/chains/query_constructor/index.cjs +15 -9
  82. package/dist/chains/query_constructor/index.cjs.map +1 -1
  83. package/dist/chains/query_constructor/index.js +15 -9
  84. package/dist/chains/query_constructor/index.js.map +1 -1
  85. package/dist/chains/query_constructor/parser.cjs +12 -6
  86. package/dist/chains/query_constructor/parser.cjs.map +1 -1
  87. package/dist/chains/query_constructor/parser.js +12 -6
  88. package/dist/chains/query_constructor/parser.js.map +1 -1
  89. package/dist/chains/question_answering/load.cjs +35 -29
  90. package/dist/chains/question_answering/load.cjs.map +1 -1
  91. package/dist/chains/question_answering/load.js +35 -29
  92. package/dist/chains/question_answering/load.js.map +1 -1
  93. package/dist/chains/router/multi_prompt.cjs +5 -3
  94. package/dist/chains/router/multi_prompt.cjs.map +1 -1
  95. package/dist/chains/router/multi_prompt.js +5 -3
  96. package/dist/chains/router/multi_prompt.js.map +1 -1
  97. package/dist/chains/router/multi_retrieval_qa.cjs +18 -11
  98. package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
  99. package/dist/chains/router/multi_retrieval_qa.js +18 -11
  100. package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
  101. package/dist/chains/sequential_chain.cjs +6 -5
  102. package/dist/chains/sequential_chain.cjs.map +1 -1
  103. package/dist/chains/sequential_chain.js +6 -5
  104. package/dist/chains/sequential_chain.js.map +1 -1
  105. package/dist/chains/sql_db/sql_db_chain.cjs +2 -1
  106. package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
  107. package/dist/chains/sql_db/sql_db_chain.js +2 -1
  108. package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
  109. package/dist/chains/summarization/load.cjs +35 -29
  110. package/dist/chains/summarization/load.cjs.map +1 -1
  111. package/dist/chains/summarization/load.js +35 -29
  112. package/dist/chains/summarization/load.js.map +1 -1
  113. package/dist/chat_models/universal.cjs +12 -10
  114. package/dist/chat_models/universal.cjs.map +1 -1
  115. package/dist/chat_models/universal.js +12 -10
  116. package/dist/chat_models/universal.js.map +1 -1
  117. package/dist/document_loaders/fs/buffer.cjs.map +1 -1
  118. package/dist/document_loaders/fs/directory.cjs.map +1 -1
  119. package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
  120. package/dist/document_loaders/fs/text.cjs.map +1 -1
  121. package/dist/document_transformers/openai_functions.cjs.map +1 -1
  122. package/dist/embeddings/cache_backed.cjs.map +1 -1
  123. package/dist/evaluation/comparison/pairwise.cjs +4 -2
  124. package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
  125. package/dist/evaluation/comparison/pairwise.js +4 -2
  126. package/dist/evaluation/comparison/pairwise.js.map +1 -1
  127. package/dist/evaluation/criteria/criteria.cjs +4 -2
  128. package/dist/evaluation/criteria/criteria.cjs.map +1 -1
  129. package/dist/evaluation/criteria/criteria.js +4 -2
  130. package/dist/evaluation/criteria/criteria.js.map +1 -1
  131. package/dist/experimental/autogpt/agent.cjs +8 -7
  132. package/dist/experimental/autogpt/agent.cjs.map +1 -1
  133. package/dist/experimental/autogpt/agent.js +8 -7
  134. package/dist/experimental/autogpt/agent.js.map +1 -1
  135. package/dist/experimental/autogpt/prompt.cjs +2 -1
  136. package/dist/experimental/autogpt/prompt.cjs.map +1 -1
  137. package/dist/experimental/autogpt/prompt.js +2 -1
  138. package/dist/experimental/autogpt/prompt.js.map +1 -1
  139. package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
  140. package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
  141. package/dist/experimental/openai_assistant/index.cjs.map +1 -1
  142. package/dist/experimental/plan_and_execute/agent_executor.cjs +3 -2
  143. package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
  144. package/dist/experimental/plan_and_execute/agent_executor.js +3 -2
  145. package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
  146. package/dist/hub/base.cjs.map +1 -1
  147. package/dist/hub/base.js.map +1 -1
  148. package/dist/hub/index.cjs +2 -1
  149. package/dist/hub/index.cjs.map +1 -1
  150. package/dist/hub/index.js +2 -1
  151. package/dist/hub/index.js.map +1 -1
  152. package/dist/hub/node.cjs +4 -2
  153. package/dist/hub/node.cjs.map +1 -1
  154. package/dist/hub/node.js +4 -2
  155. package/dist/hub/node.js.map +1 -1
  156. package/dist/load/index.cjs.map +1 -1
  157. package/dist/memory/buffer_memory.cjs.map +1 -1
  158. package/dist/memory/buffer_token_memory.cjs.map +1 -1
  159. package/dist/memory/buffer_window_memory.cjs.map +1 -1
  160. package/dist/memory/chat_memory.cjs.map +1 -1
  161. package/dist/memory/entity_memory.cjs +2 -1
  162. package/dist/memory/entity_memory.cjs.map +1 -1
  163. package/dist/memory/entity_memory.js +2 -1
  164. package/dist/memory/entity_memory.js.map +1 -1
  165. package/dist/memory/summary.cjs.map +1 -1
  166. package/dist/memory/summary_buffer.cjs.map +1 -1
  167. package/dist/memory/vector_store.cjs.map +1 -1
  168. package/dist/output_parsers/fix.cjs +2 -1
  169. package/dist/output_parsers/fix.cjs.map +1 -1
  170. package/dist/output_parsers/fix.js +2 -1
  171. package/dist/output_parsers/fix.js.map +1 -1
  172. package/dist/output_parsers/openai_functions.cjs.map +1 -1
  173. package/dist/output_parsers/structured.cjs.map +1 -1
  174. package/dist/retrievers/document_compressors/chain_extract.cjs +2 -1
  175. package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
  176. package/dist/retrievers/document_compressors/chain_extract.js +2 -1
  177. package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
  178. package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
  179. package/dist/retrievers/multi_query.cjs +2 -1
  180. package/dist/retrievers/multi_query.cjs.map +1 -1
  181. package/dist/retrievers/multi_query.js +2 -1
  182. package/dist/retrievers/multi_query.js.map +1 -1
  183. package/dist/smith/runner_utils.cjs.map +1 -1
  184. package/dist/stores/file/node.cjs.map +1 -1
  185. package/dist/tools/render.cjs.map +1 -1
  186. package/dist/tools/retriever.cjs +2 -1
  187. package/dist/tools/retriever.cjs.map +1 -1
  188. package/dist/tools/retriever.js +2 -1
  189. package/dist/tools/retriever.js.map +1 -1
  190. package/dist/tools/webbrowser.cjs +2 -1
  191. package/dist/tools/webbrowser.cjs.map +1 -1
  192. package/dist/tools/webbrowser.js +2 -1
  193. package/dist/tools/webbrowser.js.map +1 -1
  194. package/dist/util/hub.cjs.map +1 -1
  195. package/dist/vectorstores/memory.cjs +2 -1
  196. package/dist/vectorstores/memory.cjs.map +1 -1
  197. package/dist/vectorstores/memory.js +2 -1
  198. package/dist/vectorstores/memory.js.map +1 -1
  199. package/package.json +23 -23
package/dist/hub/node.cjs CHANGED
@@ -66,12 +66,14 @@ async function pull(ownerRepoCommit, options) {
66
66
  if (Array.isArray(chatModelObject?.id)) {
67
67
  const modelName = chatModelObject?.id.at(-1);
68
68
  if (modelName) {
69
- modelClass = await require_chat_models_universal.getChatModelByClassName(modelName, inferModelProviderFromNamespace(chatModelObject.id));
69
+ const modelProvider = inferModelProviderFromNamespace(chatModelObject.id);
70
+ modelClass = await require_chat_models_universal.getChatModelByClassName(modelName, modelProvider);
70
71
  if (!modelClass) console.warn(`Received unknown model name from prompt hub: "${modelName}"`);
71
72
  }
72
73
  }
73
74
  }
74
- return require_base.bindOutputSchema(await require_load_index.load(JSON.stringify(promptObject.manifest), options?.secrets, require_base.generateOptionalImportMap(modelClass), require_base.generateModelImportMap(modelClass), options?.secretsFromEnv));
75
+ const loadedPrompt = await require_load_index.load(JSON.stringify(promptObject.manifest), options?.secrets, require_base.generateOptionalImportMap(modelClass), require_base.generateModelImportMap(modelClass), options?.secretsFromEnv);
76
+ return require_base.bindOutputSchema(loadedPrompt);
75
77
  }
76
78
  //#endregion
77
79
  exports.inferModelProviderFromNamespace = inferModelProviderFromNamespace;
@@ -1 +1 @@
1
- {"version":3,"file":"node.cjs","names":["basePull","getChatModelByClassName","bindOutputSchema","load","generateOptionalImportMap","generateModelImportMap"],"sources":["../../src/hub/node.ts"],"sourcesContent":["import { Runnable } from \"@langchain/core/runnables\";\nimport {\n basePull,\n generateModelImportMap,\n generateOptionalImportMap,\n bindOutputSchema,\n} from \"./base.js\";\nimport { load } from \"../load/index.js\";\nimport { getChatModelByClassName } from \"../chat_models/universal.js\";\n\nexport { basePush as push } from \"./base.js\";\n\nfunction _idEquals(a: string[], b: string[]): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction isRunnableBinding(a: string[]): boolean {\n const wellKnownIds = [\n [\"langchain_core\", \"runnables\", \"RunnableBinding\"],\n [\"langchain\", \"schema\", \"runnable\", \"RunnableBinding\"],\n ];\n return wellKnownIds.some((id) => _idEquals(a, id));\n}\n\n/**\n * Infer modelProvider from the id namespace to avoid className collisions.\n * For non-langchain packages, extracts the provider name from the namespace.\n * e.g., [\"langchain\", \"chat_models\", \"vertexai\", \"ChatVertexAI\"] -> \"google-vertexai\"\n * e.g., [\"langchain_deepseek\", \"chat_models\", \"ChatDeepSeek\"] -> \"deepseek\"\n * @param idArray The full id array from the manifest\n * @returns The inferred modelProvider key or undefined\n */\nexport function inferModelProviderFromNamespace(\n idArray: string[]\n): string | undefined {\n if (!Array.isArray(idArray) || idArray.length < 2) {\n return undefined;\n }\n\n // Check namespace parts (excluding the className at the end)\n const namespace = idArray.slice(0, -1);\n\n // Look for a part that looks like a provider package (not langchain/langchain_core)\n for (const part of namespace) {\n // Skip standard langchain packages\n if (\n part === \"langchain\" ||\n part === \"langchain_core\" ||\n part === \"chat_models\" ||\n part === \"runnables\" ||\n part === \"schema\"\n ) {\n continue;\n }\n\n // If it starts with \"langchain_\", extract the provider name\n // e.g., \"langchain_google_genai\" -> \"google-genai\"\n // e.g., \"langchain_deepseek\" -> \"deepseek\"\n if (part.startsWith(\"langchain_\")) {\n const providerName = part.slice(\"langchain_\".length);\n // Convert underscores to hyphens to match MODEL_PROVIDER_CONFIG keys\n return providerName.replace(/_/g, \"-\");\n }\n\n // Handle special cases for Google providers that need prefix\n if (part.includes(\"vertexai_web\")) {\n return \"google-vertexai-web\";\n } else if (part.includes(\"vertexai\")) {\n return \"google-vertexai\";\n } else if (part.includes(\"genai\") || part.includes(\"google_genai\")) {\n return \"google-genai\";\n }\n\n // For other provider-looking parts, use as-is with underscores converted to hyphens\n // e.g., \"openai\" -> \"openai\", \"anthropic\" -> \"anthropic\"\n if (\n !part.includes(\"langchain\") &&\n part !== \"chat_models\" &&\n part !== \"runnables\"\n ) {\n return part.replace(/_/g, \"-\");\n }\n }\n\n return undefined;\n}\n\n/**\n * Pull a prompt from the hub.\n * @param ownerRepoCommit The name of the repo containing the prompt, as well as an optional commit hash separated by a slash.\n * @param options.apiKey LangSmith API key to use when pulling the prompt\n * @param options.apiUrl LangSmith API URL to use when pulling the prompt\n * @param options.includeModel Whether to also instantiate and attach a model instance to the prompt,\n * if the prompt has associated model metadata. If set to true, invoking the resulting pulled prompt will\n * also invoke the instantiated model. You must have the appropriate LangChain integration package installed.\n * @param options.secrets A map of secrets to use when loading, e.g.\n * {'OPENAI_API_KEY': 'sk-...'}`.\n * If a secret is not found in the map, it will be loaded from the\n * environment if `secrets_from_env` is `True`. Should only be needed when\n * `includeModel` is `true`.\n * @param options.secretsFromEnv Whether to load secrets from environment variables.\n * Use with caution and only with trusted prompts.\n * @returns\n */\nexport async function pull<T extends Runnable>(\n ownerRepoCommit: string,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n includeModel?: boolean;\n secrets?: Record<string, string>;\n secretsFromEnv?: boolean;\n }\n) {\n const promptObject = await basePull(ownerRepoCommit, options);\n let modelClass;\n if (options?.includeModel) {\n const chatModelObject = isRunnableBinding(\n promptObject.manifest.kwargs?.last?.id\n )\n ? promptObject.manifest.kwargs?.last?.kwargs?.bound\n : promptObject.manifest.kwargs?.last;\n\n if (Array.isArray(chatModelObject?.id)) {\n const modelName = chatModelObject?.id.at(-1);\n\n if (modelName) {\n const modelProvider = inferModelProviderFromNamespace(\n chatModelObject.id\n );\n modelClass = await getChatModelByClassName(modelName, modelProvider);\n if (!modelClass) {\n console.warn(\n `Received unknown model name from prompt hub: \"${modelName}\"`\n );\n }\n }\n }\n }\n const loadedPrompt = await load<T>(\n JSON.stringify(promptObject.manifest),\n options?.secrets,\n generateOptionalImportMap(modelClass),\n generateModelImportMap(modelClass),\n options?.secretsFromEnv\n );\n return bindOutputSchema(loadedPrompt);\n}\n"],"mappings":";;;;;AAYA,SAAS,UAAU,GAAa,GAAsB;CACpD,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GACvC,OAAO;CAET,IAAI,EAAE,WAAW,EAAE,QACjB,OAAO;CAET,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,EAAE,OAAO,EAAE,IACb,OAAO;CAGX,OAAO;AACT;AAEA,SAAS,kBAAkB,GAAsB;CAK/C,OAAO,CAHL;EAAC;EAAkB;EAAa;CAAiB,GACjD;EAAC;EAAa;EAAU;EAAY;CAAiB,CAErC,CAAC,CAAC,MAAM,OAAO,UAAU,GAAG,EAAE,CAAC;AACnD;;;;;;;;;AAUA,SAAgB,gCACd,SACoB;CACpB,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAC9C;CAIF,MAAM,YAAY,QAAQ,MAAM,GAAG,EAAE;CAGrC,KAAK,MAAM,QAAQ,WAAW;EAE5B,IACE,SAAS,eACT,SAAS,oBACT,SAAS,iBACT,SAAS,eACT,SAAS,UAET;EAMF,IAAI,KAAK,WAAW,YAAY,GAG9B,OAFqB,KAAK,MAAM,EAEd,CAAC,CAAC,QAAQ,MAAM,GAAG;EAIvC,IAAI,KAAK,SAAS,cAAc,GAC9B,OAAO;OACF,IAAI,KAAK,SAAS,UAAU,GACjC,OAAO;OACF,IAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,cAAc,GAC/D,OAAO;EAKT,IACE,CAAC,KAAK,SAAS,WAAW,KAC1B,SAAS,iBACT,SAAS,aAET,OAAO,KAAK,QAAQ,MAAM,GAAG;CAEjC;AAGF;;;;;;;;;;;;;;;;;;AAmBA,eAAsB,KACpB,iBACA,SAOA;CACA,MAAM,eAAe,MAAMA,aAAAA,SAAS,iBAAiB,OAAO;CAC5D,IAAI;CACJ,IAAI,SAAS,cAAc;EACzB,MAAM,kBAAkB,kBACtB,aAAa,SAAS,QAAQ,MAAM,EACtC,IACI,aAAa,SAAS,QAAQ,MAAM,QAAQ,QAC5C,aAAa,SAAS,QAAQ;EAElC,IAAI,MAAM,QAAQ,iBAAiB,EAAE,GAAG;GACtC,MAAM,YAAY,iBAAiB,GAAG,GAAG,EAAE;GAE3C,IAAI,WAAW;IAIb,aAAa,MAAMC,8BAAAA,wBAAwB,WAHrB,gCACpB,gBAAgB,EAEgD,CAAC;IACnE,IAAI,CAAC,YACH,QAAQ,KACN,iDAAiD,UAAU,EAC7D;GAEJ;EACF;CACF;CAQA,OAAOC,aAAAA,iBAAiB,MAPGC,mBAAAA,KACzB,KAAK,UAAU,aAAa,QAAQ,GACpC,SAAS,SACTC,aAAAA,0BAA0B,UAAU,GACpCC,aAAAA,uBAAuB,UAAU,GACjC,SAAS,cACX,CACoC;AACtC"}
1
+ {"version":3,"file":"node.cjs","names":["basePull","getChatModelByClassName","load","generateOptionalImportMap","generateModelImportMap","bindOutputSchema"],"sources":["../../src/hub/node.ts"],"sourcesContent":["import { Runnable } from \"@langchain/core/runnables\";\nimport {\n basePull,\n generateModelImportMap,\n generateOptionalImportMap,\n bindOutputSchema,\n} from \"./base.js\";\nimport { load } from \"../load/index.js\";\nimport { getChatModelByClassName } from \"../chat_models/universal.js\";\n\nexport { basePush as push } from \"./base.js\";\n\nfunction _idEquals(a: string[], b: string[]): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction isRunnableBinding(a: string[]): boolean {\n const wellKnownIds = [\n [\"langchain_core\", \"runnables\", \"RunnableBinding\"],\n [\"langchain\", \"schema\", \"runnable\", \"RunnableBinding\"],\n ];\n return wellKnownIds.some((id) => _idEquals(a, id));\n}\n\n/**\n * Infer modelProvider from the id namespace to avoid className collisions.\n * For non-langchain packages, extracts the provider name from the namespace.\n * e.g., [\"langchain\", \"chat_models\", \"vertexai\", \"ChatVertexAI\"] -> \"google-vertexai\"\n * e.g., [\"langchain_deepseek\", \"chat_models\", \"ChatDeepSeek\"] -> \"deepseek\"\n * @param idArray The full id array from the manifest\n * @returns The inferred modelProvider key or undefined\n */\nexport function inferModelProviderFromNamespace(\n idArray: string[]\n): string | undefined {\n if (!Array.isArray(idArray) || idArray.length < 2) {\n return undefined;\n }\n\n // Check namespace parts (excluding the className at the end)\n const namespace = idArray.slice(0, -1);\n\n // Look for a part that looks like a provider package (not langchain/langchain_core)\n for (const part of namespace) {\n // Skip standard langchain packages\n if (\n part === \"langchain\" ||\n part === \"langchain_core\" ||\n part === \"chat_models\" ||\n part === \"runnables\" ||\n part === \"schema\"\n ) {\n continue;\n }\n\n // If it starts with \"langchain_\", extract the provider name\n // e.g., \"langchain_google_genai\" -> \"google-genai\"\n // e.g., \"langchain_deepseek\" -> \"deepseek\"\n if (part.startsWith(\"langchain_\")) {\n const providerName = part.slice(\"langchain_\".length);\n // Convert underscores to hyphens to match MODEL_PROVIDER_CONFIG keys\n return providerName.replace(/_/g, \"-\");\n }\n\n // Handle special cases for Google providers that need prefix\n if (part.includes(\"vertexai_web\")) {\n return \"google-vertexai-web\";\n } else if (part.includes(\"vertexai\")) {\n return \"google-vertexai\";\n } else if (part.includes(\"genai\") || part.includes(\"google_genai\")) {\n return \"google-genai\";\n }\n\n // For other provider-looking parts, use as-is with underscores converted to hyphens\n // e.g., \"openai\" -> \"openai\", \"anthropic\" -> \"anthropic\"\n if (\n !part.includes(\"langchain\") &&\n part !== \"chat_models\" &&\n part !== \"runnables\"\n ) {\n return part.replace(/_/g, \"-\");\n }\n }\n\n return undefined;\n}\n\n/**\n * Pull a prompt from the hub.\n * @param ownerRepoCommit The name of the repo containing the prompt, as well as an optional commit hash separated by a slash.\n * @param options.apiKey LangSmith API key to use when pulling the prompt\n * @param options.apiUrl LangSmith API URL to use when pulling the prompt\n * @param options.includeModel Whether to also instantiate and attach a model instance to the prompt,\n * if the prompt has associated model metadata. If set to true, invoking the resulting pulled prompt will\n * also invoke the instantiated model. You must have the appropriate LangChain integration package installed.\n * @param options.secrets A map of secrets to use when loading, e.g.\n * {'OPENAI_API_KEY': 'sk-...'}`.\n * If a secret is not found in the map, it will be loaded from the\n * environment if `secrets_from_env` is `True`. Should only be needed when\n * `includeModel` is `true`.\n * @param options.secretsFromEnv Whether to load secrets from environment variables.\n * Use with caution and only with trusted prompts.\n * @returns\n */\nexport async function pull<T extends Runnable>(\n ownerRepoCommit: string,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n includeModel?: boolean;\n secrets?: Record<string, string>;\n secretsFromEnv?: boolean;\n }\n) {\n const promptObject = await basePull(ownerRepoCommit, options);\n let modelClass;\n if (options?.includeModel) {\n const chatModelObject = isRunnableBinding(\n promptObject.manifest.kwargs?.last?.id\n )\n ? promptObject.manifest.kwargs?.last?.kwargs?.bound\n : promptObject.manifest.kwargs?.last;\n\n if (Array.isArray(chatModelObject?.id)) {\n const modelName = chatModelObject?.id.at(-1);\n\n if (modelName) {\n const modelProvider = inferModelProviderFromNamespace(\n chatModelObject.id\n );\n modelClass = await getChatModelByClassName(modelName, modelProvider);\n if (!modelClass) {\n console.warn(\n `Received unknown model name from prompt hub: \"${modelName}\"`\n );\n }\n }\n }\n }\n const loadedPrompt = await load<T>(\n JSON.stringify(promptObject.manifest),\n options?.secrets,\n generateOptionalImportMap(modelClass),\n generateModelImportMap(modelClass),\n options?.secretsFromEnv\n );\n return bindOutputSchema(loadedPrompt);\n}\n"],"mappings":";;;;;AAYA,SAAS,UAAU,GAAa,GAAsB;CACpD,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GACvC,OAAO;CAET,IAAI,EAAE,WAAW,EAAE,QACjB,OAAO;CAET,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,EAAE,OAAO,EAAE,IACb,OAAO;CAGX,OAAO;AACT;AAEA,SAAS,kBAAkB,GAAsB;CAK/C,OAAO,CAHL;EAAC;EAAkB;EAAa;CAAiB,GACjD;EAAC;EAAa;EAAU;EAAY;CAAiB,CAErC,CAAC,CAAC,MAAM,OAAO,UAAU,GAAG,EAAE,CAAC;AACnD;;;;;;;;;AAUA,SAAgB,gCACd,SACoB;CACpB,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAC9C;CAIF,MAAM,YAAY,QAAQ,MAAM,GAAG,EAAE;CAGrC,KAAK,MAAM,QAAQ,WAAW;EAE5B,IACE,SAAS,eACT,SAAS,oBACT,SAAS,iBACT,SAAS,eACT,SAAS,UAET;EAMF,IAAI,KAAK,WAAW,YAAY,GAG9B,OAFqB,KAAK,MAAM,EAEd,CAAC,CAAC,QAAQ,MAAM,GAAG;EAIvC,IAAI,KAAK,SAAS,cAAc,GAC9B,OAAO;OACF,IAAI,KAAK,SAAS,UAAU,GACjC,OAAO;OACF,IAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,cAAc,GAC/D,OAAO;EAKT,IACE,CAAC,KAAK,SAAS,WAAW,KAC1B,SAAS,iBACT,SAAS,aAET,OAAO,KAAK,QAAQ,MAAM,GAAG;CAEjC;AAGF;;;;;;;;;;;;;;;;;;AAmBA,eAAsB,KACpB,iBACA,SAOA;CACA,MAAM,eAAe,MAAMA,aAAAA,SAAS,iBAAiB,OAAO;CAC5D,IAAI;CACJ,IAAI,SAAS,cAAc;EACzB,MAAM,kBAAkB,kBACtB,aAAa,SAAS,QAAQ,MAAM,EACtC,IACI,aAAa,SAAS,QAAQ,MAAM,QAAQ,QAC5C,aAAa,SAAS,QAAQ;EAElC,IAAI,MAAM,QAAQ,iBAAiB,EAAE,GAAG;GACtC,MAAM,YAAY,iBAAiB,GAAG,GAAG,EAAE;GAE3C,IAAI,WAAW;IACb,MAAM,gBAAgB,gCACpB,gBAAgB,EAClB;IACA,aAAa,MAAMC,8BAAAA,wBAAwB,WAAW,aAAa;IACnE,IAAI,CAAC,YACH,QAAQ,KACN,iDAAiD,UAAU,EAC7D;GAEJ;EACF;CACF;CACA,MAAM,eAAe,MAAMC,mBAAAA,KACzB,KAAK,UAAU,aAAa,QAAQ,GACpC,SAAS,SACTC,aAAAA,0BAA0B,UAAU,GACpCC,aAAAA,uBAAuB,UAAU,GACjC,SAAS,cACX;CACA,OAAOC,aAAAA,iBAAiB,YAAY;AACtC"}
package/dist/hub/node.js CHANGED
@@ -65,12 +65,14 @@ async function pull(ownerRepoCommit, options) {
65
65
  if (Array.isArray(chatModelObject?.id)) {
66
66
  const modelName = chatModelObject?.id.at(-1);
67
67
  if (modelName) {
68
- modelClass = await getChatModelByClassName(modelName, inferModelProviderFromNamespace(chatModelObject.id));
68
+ const modelProvider = inferModelProviderFromNamespace(chatModelObject.id);
69
+ modelClass = await getChatModelByClassName(modelName, modelProvider);
69
70
  if (!modelClass) console.warn(`Received unknown model name from prompt hub: "${modelName}"`);
70
71
  }
71
72
  }
72
73
  }
73
- return bindOutputSchema(await load(JSON.stringify(promptObject.manifest), options?.secrets, generateOptionalImportMap(modelClass), generateModelImportMap(modelClass), options?.secretsFromEnv));
74
+ const loadedPrompt = await load(JSON.stringify(promptObject.manifest), options?.secrets, generateOptionalImportMap(modelClass), generateModelImportMap(modelClass), options?.secretsFromEnv);
75
+ return bindOutputSchema(loadedPrompt);
74
76
  }
75
77
  //#endregion
76
78
  export { inferModelProviderFromNamespace, pull, basePush as push };
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","names":[],"sources":["../../src/hub/node.ts"],"sourcesContent":["import { Runnable } from \"@langchain/core/runnables\";\nimport {\n basePull,\n generateModelImportMap,\n generateOptionalImportMap,\n bindOutputSchema,\n} from \"./base.js\";\nimport { load } from \"../load/index.js\";\nimport { getChatModelByClassName } from \"../chat_models/universal.js\";\n\nexport { basePush as push } from \"./base.js\";\n\nfunction _idEquals(a: string[], b: string[]): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction isRunnableBinding(a: string[]): boolean {\n const wellKnownIds = [\n [\"langchain_core\", \"runnables\", \"RunnableBinding\"],\n [\"langchain\", \"schema\", \"runnable\", \"RunnableBinding\"],\n ];\n return wellKnownIds.some((id) => _idEquals(a, id));\n}\n\n/**\n * Infer modelProvider from the id namespace to avoid className collisions.\n * For non-langchain packages, extracts the provider name from the namespace.\n * e.g., [\"langchain\", \"chat_models\", \"vertexai\", \"ChatVertexAI\"] -> \"google-vertexai\"\n * e.g., [\"langchain_deepseek\", \"chat_models\", \"ChatDeepSeek\"] -> \"deepseek\"\n * @param idArray The full id array from the manifest\n * @returns The inferred modelProvider key or undefined\n */\nexport function inferModelProviderFromNamespace(\n idArray: string[]\n): string | undefined {\n if (!Array.isArray(idArray) || idArray.length < 2) {\n return undefined;\n }\n\n // Check namespace parts (excluding the className at the end)\n const namespace = idArray.slice(0, -1);\n\n // Look for a part that looks like a provider package (not langchain/langchain_core)\n for (const part of namespace) {\n // Skip standard langchain packages\n if (\n part === \"langchain\" ||\n part === \"langchain_core\" ||\n part === \"chat_models\" ||\n part === \"runnables\" ||\n part === \"schema\"\n ) {\n continue;\n }\n\n // If it starts with \"langchain_\", extract the provider name\n // e.g., \"langchain_google_genai\" -> \"google-genai\"\n // e.g., \"langchain_deepseek\" -> \"deepseek\"\n if (part.startsWith(\"langchain_\")) {\n const providerName = part.slice(\"langchain_\".length);\n // Convert underscores to hyphens to match MODEL_PROVIDER_CONFIG keys\n return providerName.replace(/_/g, \"-\");\n }\n\n // Handle special cases for Google providers that need prefix\n if (part.includes(\"vertexai_web\")) {\n return \"google-vertexai-web\";\n } else if (part.includes(\"vertexai\")) {\n return \"google-vertexai\";\n } else if (part.includes(\"genai\") || part.includes(\"google_genai\")) {\n return \"google-genai\";\n }\n\n // For other provider-looking parts, use as-is with underscores converted to hyphens\n // e.g., \"openai\" -> \"openai\", \"anthropic\" -> \"anthropic\"\n if (\n !part.includes(\"langchain\") &&\n part !== \"chat_models\" &&\n part !== \"runnables\"\n ) {\n return part.replace(/_/g, \"-\");\n }\n }\n\n return undefined;\n}\n\n/**\n * Pull a prompt from the hub.\n * @param ownerRepoCommit The name of the repo containing the prompt, as well as an optional commit hash separated by a slash.\n * @param options.apiKey LangSmith API key to use when pulling the prompt\n * @param options.apiUrl LangSmith API URL to use when pulling the prompt\n * @param options.includeModel Whether to also instantiate and attach a model instance to the prompt,\n * if the prompt has associated model metadata. If set to true, invoking the resulting pulled prompt will\n * also invoke the instantiated model. You must have the appropriate LangChain integration package installed.\n * @param options.secrets A map of secrets to use when loading, e.g.\n * {'OPENAI_API_KEY': 'sk-...'}`.\n * If a secret is not found in the map, it will be loaded from the\n * environment if `secrets_from_env` is `True`. Should only be needed when\n * `includeModel` is `true`.\n * @param options.secretsFromEnv Whether to load secrets from environment variables.\n * Use with caution and only with trusted prompts.\n * @returns\n */\nexport async function pull<T extends Runnable>(\n ownerRepoCommit: string,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n includeModel?: boolean;\n secrets?: Record<string, string>;\n secretsFromEnv?: boolean;\n }\n) {\n const promptObject = await basePull(ownerRepoCommit, options);\n let modelClass;\n if (options?.includeModel) {\n const chatModelObject = isRunnableBinding(\n promptObject.manifest.kwargs?.last?.id\n )\n ? promptObject.manifest.kwargs?.last?.kwargs?.bound\n : promptObject.manifest.kwargs?.last;\n\n if (Array.isArray(chatModelObject?.id)) {\n const modelName = chatModelObject?.id.at(-1);\n\n if (modelName) {\n const modelProvider = inferModelProviderFromNamespace(\n chatModelObject.id\n );\n modelClass = await getChatModelByClassName(modelName, modelProvider);\n if (!modelClass) {\n console.warn(\n `Received unknown model name from prompt hub: \"${modelName}\"`\n );\n }\n }\n }\n }\n const loadedPrompt = await load<T>(\n JSON.stringify(promptObject.manifest),\n options?.secrets,\n generateOptionalImportMap(modelClass),\n generateModelImportMap(modelClass),\n options?.secretsFromEnv\n );\n return bindOutputSchema(loadedPrompt);\n}\n"],"mappings":";;;;AAYA,SAAS,UAAU,GAAa,GAAsB;CACpD,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GACvC,OAAO;CAET,IAAI,EAAE,WAAW,EAAE,QACjB,OAAO;CAET,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,EAAE,OAAO,EAAE,IACb,OAAO;CAGX,OAAO;AACT;AAEA,SAAS,kBAAkB,GAAsB;CAK/C,OAAO,CAHL;EAAC;EAAkB;EAAa;CAAiB,GACjD;EAAC;EAAa;EAAU;EAAY;CAAiB,CAErC,CAAC,CAAC,MAAM,OAAO,UAAU,GAAG,EAAE,CAAC;AACnD;;;;;;;;;AAUA,SAAgB,gCACd,SACoB;CACpB,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAC9C;CAIF,MAAM,YAAY,QAAQ,MAAM,GAAG,EAAE;CAGrC,KAAK,MAAM,QAAQ,WAAW;EAE5B,IACE,SAAS,eACT,SAAS,oBACT,SAAS,iBACT,SAAS,eACT,SAAS,UAET;EAMF,IAAI,KAAK,WAAW,YAAY,GAG9B,OAFqB,KAAK,MAAM,EAEd,CAAC,CAAC,QAAQ,MAAM,GAAG;EAIvC,IAAI,KAAK,SAAS,cAAc,GAC9B,OAAO;OACF,IAAI,KAAK,SAAS,UAAU,GACjC,OAAO;OACF,IAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,cAAc,GAC/D,OAAO;EAKT,IACE,CAAC,KAAK,SAAS,WAAW,KAC1B,SAAS,iBACT,SAAS,aAET,OAAO,KAAK,QAAQ,MAAM,GAAG;CAEjC;AAGF;;;;;;;;;;;;;;;;;;AAmBA,eAAsB,KACpB,iBACA,SAOA;CACA,MAAM,eAAe,MAAM,SAAS,iBAAiB,OAAO;CAC5D,IAAI;CACJ,IAAI,SAAS,cAAc;EACzB,MAAM,kBAAkB,kBACtB,aAAa,SAAS,QAAQ,MAAM,EACtC,IACI,aAAa,SAAS,QAAQ,MAAM,QAAQ,QAC5C,aAAa,SAAS,QAAQ;EAElC,IAAI,MAAM,QAAQ,iBAAiB,EAAE,GAAG;GACtC,MAAM,YAAY,iBAAiB,GAAG,GAAG,EAAE;GAE3C,IAAI,WAAW;IAIb,aAAa,MAAM,wBAAwB,WAHrB,gCACpB,gBAAgB,EAEgD,CAAC;IACnE,IAAI,CAAC,YACH,QAAQ,KACN,iDAAiD,UAAU,EAC7D;GAEJ;EACF;CACF;CAQA,OAAO,iBAAiB,MAPG,KACzB,KAAK,UAAU,aAAa,QAAQ,GACpC,SAAS,SACT,0BAA0B,UAAU,GACpC,uBAAuB,UAAU,GACjC,SAAS,cACX,CACoC;AACtC"}
1
+ {"version":3,"file":"node.js","names":[],"sources":["../../src/hub/node.ts"],"sourcesContent":["import { Runnable } from \"@langchain/core/runnables\";\nimport {\n basePull,\n generateModelImportMap,\n generateOptionalImportMap,\n bindOutputSchema,\n} from \"./base.js\";\nimport { load } from \"../load/index.js\";\nimport { getChatModelByClassName } from \"../chat_models/universal.js\";\n\nexport { basePush as push } from \"./base.js\";\n\nfunction _idEquals(a: string[], b: string[]): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\nfunction isRunnableBinding(a: string[]): boolean {\n const wellKnownIds = [\n [\"langchain_core\", \"runnables\", \"RunnableBinding\"],\n [\"langchain\", \"schema\", \"runnable\", \"RunnableBinding\"],\n ];\n return wellKnownIds.some((id) => _idEquals(a, id));\n}\n\n/**\n * Infer modelProvider from the id namespace to avoid className collisions.\n * For non-langchain packages, extracts the provider name from the namespace.\n * e.g., [\"langchain\", \"chat_models\", \"vertexai\", \"ChatVertexAI\"] -> \"google-vertexai\"\n * e.g., [\"langchain_deepseek\", \"chat_models\", \"ChatDeepSeek\"] -> \"deepseek\"\n * @param idArray The full id array from the manifest\n * @returns The inferred modelProvider key or undefined\n */\nexport function inferModelProviderFromNamespace(\n idArray: string[]\n): string | undefined {\n if (!Array.isArray(idArray) || idArray.length < 2) {\n return undefined;\n }\n\n // Check namespace parts (excluding the className at the end)\n const namespace = idArray.slice(0, -1);\n\n // Look for a part that looks like a provider package (not langchain/langchain_core)\n for (const part of namespace) {\n // Skip standard langchain packages\n if (\n part === \"langchain\" ||\n part === \"langchain_core\" ||\n part === \"chat_models\" ||\n part === \"runnables\" ||\n part === \"schema\"\n ) {\n continue;\n }\n\n // If it starts with \"langchain_\", extract the provider name\n // e.g., \"langchain_google_genai\" -> \"google-genai\"\n // e.g., \"langchain_deepseek\" -> \"deepseek\"\n if (part.startsWith(\"langchain_\")) {\n const providerName = part.slice(\"langchain_\".length);\n // Convert underscores to hyphens to match MODEL_PROVIDER_CONFIG keys\n return providerName.replace(/_/g, \"-\");\n }\n\n // Handle special cases for Google providers that need prefix\n if (part.includes(\"vertexai_web\")) {\n return \"google-vertexai-web\";\n } else if (part.includes(\"vertexai\")) {\n return \"google-vertexai\";\n } else if (part.includes(\"genai\") || part.includes(\"google_genai\")) {\n return \"google-genai\";\n }\n\n // For other provider-looking parts, use as-is with underscores converted to hyphens\n // e.g., \"openai\" -> \"openai\", \"anthropic\" -> \"anthropic\"\n if (\n !part.includes(\"langchain\") &&\n part !== \"chat_models\" &&\n part !== \"runnables\"\n ) {\n return part.replace(/_/g, \"-\");\n }\n }\n\n return undefined;\n}\n\n/**\n * Pull a prompt from the hub.\n * @param ownerRepoCommit The name of the repo containing the prompt, as well as an optional commit hash separated by a slash.\n * @param options.apiKey LangSmith API key to use when pulling the prompt\n * @param options.apiUrl LangSmith API URL to use when pulling the prompt\n * @param options.includeModel Whether to also instantiate and attach a model instance to the prompt,\n * if the prompt has associated model metadata. If set to true, invoking the resulting pulled prompt will\n * also invoke the instantiated model. You must have the appropriate LangChain integration package installed.\n * @param options.secrets A map of secrets to use when loading, e.g.\n * {'OPENAI_API_KEY': 'sk-...'}`.\n * If a secret is not found in the map, it will be loaded from the\n * environment if `secrets_from_env` is `True`. Should only be needed when\n * `includeModel` is `true`.\n * @param options.secretsFromEnv Whether to load secrets from environment variables.\n * Use with caution and only with trusted prompts.\n * @returns\n */\nexport async function pull<T extends Runnable>(\n ownerRepoCommit: string,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n includeModel?: boolean;\n secrets?: Record<string, string>;\n secretsFromEnv?: boolean;\n }\n) {\n const promptObject = await basePull(ownerRepoCommit, options);\n let modelClass;\n if (options?.includeModel) {\n const chatModelObject = isRunnableBinding(\n promptObject.manifest.kwargs?.last?.id\n )\n ? promptObject.manifest.kwargs?.last?.kwargs?.bound\n : promptObject.manifest.kwargs?.last;\n\n if (Array.isArray(chatModelObject?.id)) {\n const modelName = chatModelObject?.id.at(-1);\n\n if (modelName) {\n const modelProvider = inferModelProviderFromNamespace(\n chatModelObject.id\n );\n modelClass = await getChatModelByClassName(modelName, modelProvider);\n if (!modelClass) {\n console.warn(\n `Received unknown model name from prompt hub: \"${modelName}\"`\n );\n }\n }\n }\n }\n const loadedPrompt = await load<T>(\n JSON.stringify(promptObject.manifest),\n options?.secrets,\n generateOptionalImportMap(modelClass),\n generateModelImportMap(modelClass),\n options?.secretsFromEnv\n );\n return bindOutputSchema(loadedPrompt);\n}\n"],"mappings":";;;;AAYA,SAAS,UAAU,GAAa,GAAsB;CACpD,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,GACvC,OAAO;CAET,IAAI,EAAE,WAAW,EAAE,QACjB,OAAO;CAET,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAC5B,IAAI,EAAE,OAAO,EAAE,IACb,OAAO;CAGX,OAAO;AACT;AAEA,SAAS,kBAAkB,GAAsB;CAK/C,OAAO,CAHL;EAAC;EAAkB;EAAa;CAAiB,GACjD;EAAC;EAAa;EAAU;EAAY;CAAiB,CAErC,CAAC,CAAC,MAAM,OAAO,UAAU,GAAG,EAAE,CAAC;AACnD;;;;;;;;;AAUA,SAAgB,gCACd,SACoB;CACpB,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAC9C;CAIF,MAAM,YAAY,QAAQ,MAAM,GAAG,EAAE;CAGrC,KAAK,MAAM,QAAQ,WAAW;EAE5B,IACE,SAAS,eACT,SAAS,oBACT,SAAS,iBACT,SAAS,eACT,SAAS,UAET;EAMF,IAAI,KAAK,WAAW,YAAY,GAG9B,OAFqB,KAAK,MAAM,EAEd,CAAC,CAAC,QAAQ,MAAM,GAAG;EAIvC,IAAI,KAAK,SAAS,cAAc,GAC9B,OAAO;OACF,IAAI,KAAK,SAAS,UAAU,GACjC,OAAO;OACF,IAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,cAAc,GAC/D,OAAO;EAKT,IACE,CAAC,KAAK,SAAS,WAAW,KAC1B,SAAS,iBACT,SAAS,aAET,OAAO,KAAK,QAAQ,MAAM,GAAG;CAEjC;AAGF;;;;;;;;;;;;;;;;;;AAmBA,eAAsB,KACpB,iBACA,SAOA;CACA,MAAM,eAAe,MAAM,SAAS,iBAAiB,OAAO;CAC5D,IAAI;CACJ,IAAI,SAAS,cAAc;EACzB,MAAM,kBAAkB,kBACtB,aAAa,SAAS,QAAQ,MAAM,EACtC,IACI,aAAa,SAAS,QAAQ,MAAM,QAAQ,QAC5C,aAAa,SAAS,QAAQ;EAElC,IAAI,MAAM,QAAQ,iBAAiB,EAAE,GAAG;GACtC,MAAM,YAAY,iBAAiB,GAAG,GAAG,EAAE;GAE3C,IAAI,WAAW;IACb,MAAM,gBAAgB,gCACpB,gBAAgB,EAClB;IACA,aAAa,MAAM,wBAAwB,WAAW,aAAa;IACnE,IAAI,CAAC,YACH,QAAQ,KACN,iDAAiD,UAAU,EAC7D;GAEJ;EACF;CACF;CACA,MAAM,eAAe,MAAM,KACzB,KAAK,UAAU,aAAa,QAAQ,GACpC,SAAS,SACT,0BAA0B,UAAU,GACpC,uBAAuB,UAAU,GACjC,SAAS,cACX;CACA,OAAO,iBAAiB,YAAY;AACtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["importMap"],"sources":["../../src/load/index.ts"],"sourcesContent":["import { load as coreLoad } from \"@langchain/core/load\";\nimport { optionalImportEntrypoints } from \"./import_constants.js\";\nimport * as importMap from \"./import_map.js\";\nimport { OptionalImportMap } from \"./import_type.js\";\n\n/**\n * Load a LangChain module from a serialized text representation.\n * NOTE: This functionality is currently in beta.\n * Loaded classes may change independently of semver.\n *\n * **WARNING — insecure deserialization risk.** This function instantiates\n * classes and invokes constructors based on the contents of `text`. Never\n * call this on untrusted or user-supplied input. Only deserialize data that\n * originates from a trusted source you control.\n *\n * See `@langchain/core/load` {@link LoadOptions} for detailed security\n * guidance on `secretsFromEnv`, `secretsMap`, and import maps.\n *\n * @param text Serialized text representation of the module.\n * @param secretsMap\n * @param optionalImportsMap\n * @returns A loaded instance of a LangChain module.\n */\nexport async function load<T>(\n text: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n secretsMap: Record<string, any> = {},\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n optionalImportsMap: OptionalImportMap & Record<string, any> = {},\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n additionalImportsMap: Record<string, any> = {},\n secretsFromEnv?: boolean\n): Promise<T> {\n return coreLoad(text, {\n secretsMap,\n optionalImportsMap,\n optionalImportEntrypoints,\n importMap: { ...importMap, ...additionalImportsMap },\n secretsFromEnv,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuBA,eAAsB,KACpB,MAEA,aAAkC,CAAC,GAEnC,qBAA8D,CAAC,GAE/D,uBAA4C,CAAC,GAC7C,gBACY;CACZ,QAAA,GAAA,qBAAA,KAAA,CAAgB,MAAM;EACpB;EACA;EACA,2BAAA,yBAAA;EACA,WAAW;GAAE,GAAGA,mBAAAA;GAAW,GAAG;EAAqB;EACnD;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"index.cjs","names":["coreLoad","importMap"],"sources":["../../src/load/index.ts"],"sourcesContent":["import { load as coreLoad } from \"@langchain/core/load\";\nimport { optionalImportEntrypoints } from \"./import_constants.js\";\nimport * as importMap from \"./import_map.js\";\nimport { OptionalImportMap } from \"./import_type.js\";\n\n/**\n * Load a LangChain module from a serialized text representation.\n * NOTE: This functionality is currently in beta.\n * Loaded classes may change independently of semver.\n *\n * **WARNING — insecure deserialization risk.** This function instantiates\n * classes and invokes constructors based on the contents of `text`. Never\n * call this on untrusted or user-supplied input. Only deserialize data that\n * originates from a trusted source you control.\n *\n * See `@langchain/core/load` {@link LoadOptions} for detailed security\n * guidance on `secretsFromEnv`, `secretsMap`, and import maps.\n *\n * @param text Serialized text representation of the module.\n * @param secretsMap\n * @param optionalImportsMap\n * @returns A loaded instance of a LangChain module.\n */\nexport async function load<T>(\n text: string,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n secretsMap: Record<string, any> = {},\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n optionalImportsMap: OptionalImportMap & Record<string, any> = {},\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n additionalImportsMap: Record<string, any> = {},\n secretsFromEnv?: boolean\n): Promise<T> {\n return coreLoad(text, {\n secretsMap,\n optionalImportsMap,\n optionalImportEntrypoints,\n importMap: { ...importMap, ...additionalImportsMap },\n secretsFromEnv,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuBA,eAAsB,KACpB,MAEA,aAAkC,CAAC,GAEnC,qBAA8D,CAAC,GAE/D,uBAA4C,CAAC,GAC7C,gBACY;CACZ,QAAA,GAAOA,qBAAAA,KAAAA,CAAS,MAAM;EACpB;EACA;EACA,2BAAA,yBAAA;EACA,WAAW;GAAE,GAAGC,mBAAAA;GAAW,GAAG;EAAqB;EACnD;CACF,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"buffer_memory.cjs","names":["BaseChatMemory"],"sources":["../../src/memory/buffer_memory.ts"],"sourcesContent":["import { InputValues, MemoryVariables } from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the `BufferMemory` class.\n */\nexport interface BufferMemoryInput extends BaseChatMemoryInput {\n humanPrefix?: string;\n aiPrefix?: string;\n memoryKey?: string;\n}\n\n/**\n * The `BufferMemory` class is a type of memory component used for storing\n * and managing previous chat messages. It is a wrapper around\n * `ChatMessageHistory` that extracts the messages into an input variable.\n * This class is particularly useful in applications like chatbots where\n * it is essential to remember previous interactions. Note: The memory\n * instance represents the history of a single conversation. Therefore, it\n * is not recommended to share the same history or memory instance between\n * two different chains. If you deploy your LangChain app on a serverless\n * environment, do not store memory instances in a variable, as your\n * hosting provider may reset it by the next time the function is called.\n * @example\n * ```typescript\n * // Initialize the memory to store chat history and set up the language model with a specific temperature.\n * const memory = new BufferMemory({ memoryKey: \"chat_history\" });\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 });\n *\n * // Create a prompt template for a friendly conversation between a human and an AI.\n * const prompt =\n * PromptTemplate.fromTemplate(`The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n *\n * Current conversation:\n * {chat_history}\n * Human: {input}\n * AI:`);\n *\n * // Set up the chain with the language model, prompt, and memory.\n * const chain = new LLMChain({ llm: model, prompt, memory });\n *\n * // Example usage of the chain to continue the conversation.\n * // The `call` method sends the input to the model and returns the AI's response.\n * const res = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({ res });\n *\n * ```\n */\nexport class BufferMemory extends BaseChatMemory implements BufferMemoryInput {\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n memoryKey = \"history\";\n\n constructor(fields?: BufferMemoryInput) {\n super({\n chatHistory: fields?.chatHistory,\n returnMessages: fields?.returnMessages ?? false,\n inputKey: fields?.inputKey,\n outputKey: fields?.outputKey,\n });\n this.humanPrefix = fields?.humanPrefix ?? this.humanPrefix;\n this.aiPrefix = fields?.aiPrefix ?? this.aiPrefix;\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Loads the memory variables. It takes an `InputValues` object as a\n * parameter and returns a `Promise` that resolves with a\n * `MemoryVariables` object.\n * @param _values `InputValues` object.\n * @returns A `Promise` that resolves with a `MemoryVariables` object.\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: messages,\n };\n return result;\n }\n const result = {\n [this.memoryKey]: getBufferString(\n messages,\n this.humanPrefix,\n this.aiPrefix\n ),\n };\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,IAAa,eAAb,cAAkCA,2BAAAA,eAA4C;CAC5E,cAAc;CAEd,WAAW;CAEX,YAAY;CAEZ,YAAY,QAA4B;EACtC,MAAM;GACJ,aAAa,QAAQ;GACrB,gBAAgB,QAAQ,kBAAkB;GAC1C,UAAU,QAAQ;GAClB,WAAW,QAAQ;EACrB,CAAC;EACD,KAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;CAC7C;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,SAAgD;EACxE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,SAER;EASd,OAAO,GANJ,KAAK,aAAA,GAAA,yBAAA,gBAAA,CACJ,UACA,KAAK,aACL,KAAK,QACP,EAEU;CACd;AACF"}
1
+ {"version":3,"file":"buffer_memory.cjs","names":["BaseChatMemory","getBufferString"],"sources":["../../src/memory/buffer_memory.ts"],"sourcesContent":["import { InputValues, MemoryVariables } from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the `BufferMemory` class.\n */\nexport interface BufferMemoryInput extends BaseChatMemoryInput {\n humanPrefix?: string;\n aiPrefix?: string;\n memoryKey?: string;\n}\n\n/**\n * The `BufferMemory` class is a type of memory component used for storing\n * and managing previous chat messages. It is a wrapper around\n * `ChatMessageHistory` that extracts the messages into an input variable.\n * This class is particularly useful in applications like chatbots where\n * it is essential to remember previous interactions. Note: The memory\n * instance represents the history of a single conversation. Therefore, it\n * is not recommended to share the same history or memory instance between\n * two different chains. If you deploy your LangChain app on a serverless\n * environment, do not store memory instances in a variable, as your\n * hosting provider may reset it by the next time the function is called.\n * @example\n * ```typescript\n * // Initialize the memory to store chat history and set up the language model with a specific temperature.\n * const memory = new BufferMemory({ memoryKey: \"chat_history\" });\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 });\n *\n * // Create a prompt template for a friendly conversation between a human and an AI.\n * const prompt =\n * PromptTemplate.fromTemplate(`The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n *\n * Current conversation:\n * {chat_history}\n * Human: {input}\n * AI:`);\n *\n * // Set up the chain with the language model, prompt, and memory.\n * const chain = new LLMChain({ llm: model, prompt, memory });\n *\n * // Example usage of the chain to continue the conversation.\n * // The `call` method sends the input to the model and returns the AI's response.\n * const res = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({ res });\n *\n * ```\n */\nexport class BufferMemory extends BaseChatMemory implements BufferMemoryInput {\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n memoryKey = \"history\";\n\n constructor(fields?: BufferMemoryInput) {\n super({\n chatHistory: fields?.chatHistory,\n returnMessages: fields?.returnMessages ?? false,\n inputKey: fields?.inputKey,\n outputKey: fields?.outputKey,\n });\n this.humanPrefix = fields?.humanPrefix ?? this.humanPrefix;\n this.aiPrefix = fields?.aiPrefix ?? this.aiPrefix;\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Loads the memory variables. It takes an `InputValues` object as a\n * parameter and returns a `Promise` that resolves with a\n * `MemoryVariables` object.\n * @param _values `InputValues` object.\n * @returns A `Promise` that resolves with a `MemoryVariables` object.\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: messages,\n };\n return result;\n }\n const result = {\n [this.memoryKey]: getBufferString(\n messages,\n this.humanPrefix,\n this.aiPrefix\n ),\n };\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,IAAa,eAAb,cAAkCA,2BAAAA,eAA4C;CAC5E,cAAc;CAEd,WAAW;CAEX,YAAY;CAEZ,YAAY,QAA4B;EACtC,MAAM;GACJ,aAAa,QAAQ;GACrB,gBAAgB,QAAQ,kBAAkB;GAC1C,UAAU,QAAQ;GAClB,WAAW,QAAQ;EACrB,CAAC;EACD,KAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;CAC7C;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,SAAgD;EACxE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,SAER;EASd,OAAO,GANJ,KAAK,aAAA,GAAYC,yBAAAA,gBAAAA,CAChB,UACA,KAAK,aACL,KAAK,QACP,EAEU;CACd;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"buffer_token_memory.cjs","names":["BaseChatMemory"],"sources":["../../src/memory/buffer_token_memory.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the `BufferTokenMemory` class.\n */\n\nexport interface ConversationTokenBufferMemoryInput extends BaseChatMemoryInput {\n /* Prefix for human messages in the buffer. */\n humanPrefix?: string;\n\n /* Prefix for AI messages in the buffer. */\n aiPrefix?: string;\n\n /* The LLM for this instance. */\n llm: BaseLanguageModelInterface;\n\n /* Memory key for buffer instance. */\n memoryKey?: string;\n\n /* Maximmum number of tokens allowed in the buffer. */\n maxTokenLimit?: number;\n}\n\n/**\n * Class that represents a conversation chat memory with a token buffer.\n * It extends the `BaseChatMemory` class and implements the\n * `ConversationTokenBufferMemoryInput` interface.\n * @example\n * ```typescript\n * const memory = new ConversationTokenBufferMemory({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * maxTokenLimit: 10,\n * });\n *\n * // Save conversation context\n * await memory.saveContext({ input: \"hi\" }, { output: \"whats up\" });\n * await memory.saveContext({ input: \"not much you\" }, { output: \"not much\" });\n *\n * // Load memory variables\n * const result = await memory.loadMemoryVariables({});\n * console.log(result);\n * ```\n */\n\nexport class ConversationTokenBufferMemory\n extends BaseChatMemory\n implements ConversationTokenBufferMemoryInput\n{\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n memoryKey = \"history\";\n\n maxTokenLimit = 2000; // Default max token limit of 2000 which can be overridden\n\n llm: BaseLanguageModelInterface;\n\n constructor(fields: ConversationTokenBufferMemoryInput) {\n super(fields);\n this.llm = fields.llm;\n this.humanPrefix = fields?.humanPrefix ?? this.humanPrefix;\n this.aiPrefix = fields?.aiPrefix ?? this.aiPrefix;\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n this.maxTokenLimit = fields?.maxTokenLimit ?? this.maxTokenLimit;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Loads the memory variables. It takes an `InputValues` object as a\n * parameter and returns a `Promise` that resolves with a\n * `MemoryVariables` object.\n * @param _values `InputValues` object.\n * @returns A `Promise` that resolves with a `MemoryVariables` object.\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: messages,\n };\n return result;\n }\n const result = {\n [this.memoryKey]: getBufferString(\n messages,\n this.humanPrefix,\n this.aiPrefix\n ),\n };\n return result;\n }\n\n /**\n * Saves the context from this conversation to buffer. If the amount\n * of tokens required to save the buffer exceeds MAX_TOKEN_LIMIT,\n * prune it.\n */\n async saveContext(inputValues: InputValues, outputValues: OutputValues) {\n await super.saveContext(inputValues, outputValues);\n\n // Prune buffer if it exceeds the max token limit set for this instance.\n const buffer = await this.chatHistory.getMessages();\n let currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n\n if (currBufferLength > this.maxTokenLimit) {\n const prunedMemory = [];\n while (currBufferLength > this.maxTokenLimit) {\n prunedMemory.push(buffer.shift());\n currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmDA,IAAa,gCAAb,cACUA,2BAAAA,eAEV;CACE,cAAc;CAEd,WAAW;CAEX,YAAY;CAEZ,gBAAgB;CAEhB;CAEA,YAAY,QAA4C;EACtD,MAAM,MAAM;EACZ,KAAK,MAAM,OAAO;EAClB,KAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,gBAAgB,QAAQ,iBAAiB,KAAK;CACrD;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,SAAgD;EACxE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,SAER;EASd,OAAO,GANJ,KAAK,aAAA,GAAA,yBAAA,gBAAA,CACJ,UACA,KAAK,aACL,KAAK,QACP,EAEU;CACd;;;;;;CAOA,MAAM,YAAY,aAA0B,cAA4B;EACtE,MAAM,MAAM,YAAY,aAAa,YAAY;EAGjD,MAAM,SAAS,MAAM,KAAK,YAAY,YAAY;EAClD,IAAI,mBAAmB,MAAM,KAAK,IAAI,cAAA,GAAA,yBAAA,gBAAA,CACpB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;EAEA,IAAI,mBAAmB,KAAK,eAAe;GACzC,MAAM,eAAe,CAAC;GACtB,OAAO,mBAAmB,KAAK,eAAe;IAC5C,aAAa,KAAK,OAAO,MAAM,CAAC;IAChC,mBAAmB,MAAM,KAAK,IAAI,cAAA,GAAA,yBAAA,gBAAA,CAChB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;GACF;EACF;CACF;AACF"}
1
+ {"version":3,"file":"buffer_token_memory.cjs","names":["BaseChatMemory","getBufferString"],"sources":["../../src/memory/buffer_token_memory.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the `BufferTokenMemory` class.\n */\n\nexport interface ConversationTokenBufferMemoryInput extends BaseChatMemoryInput {\n /* Prefix for human messages in the buffer. */\n humanPrefix?: string;\n\n /* Prefix for AI messages in the buffer. */\n aiPrefix?: string;\n\n /* The LLM for this instance. */\n llm: BaseLanguageModelInterface;\n\n /* Memory key for buffer instance. */\n memoryKey?: string;\n\n /* Maximmum number of tokens allowed in the buffer. */\n maxTokenLimit?: number;\n}\n\n/**\n * Class that represents a conversation chat memory with a token buffer.\n * It extends the `BaseChatMemory` class and implements the\n * `ConversationTokenBufferMemoryInput` interface.\n * @example\n * ```typescript\n * const memory = new ConversationTokenBufferMemory({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\" }),\n * maxTokenLimit: 10,\n * });\n *\n * // Save conversation context\n * await memory.saveContext({ input: \"hi\" }, { output: \"whats up\" });\n * await memory.saveContext({ input: \"not much you\" }, { output: \"not much\" });\n *\n * // Load memory variables\n * const result = await memory.loadMemoryVariables({});\n * console.log(result);\n * ```\n */\n\nexport class ConversationTokenBufferMemory\n extends BaseChatMemory\n implements ConversationTokenBufferMemoryInput\n{\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n memoryKey = \"history\";\n\n maxTokenLimit = 2000; // Default max token limit of 2000 which can be overridden\n\n llm: BaseLanguageModelInterface;\n\n constructor(fields: ConversationTokenBufferMemoryInput) {\n super(fields);\n this.llm = fields.llm;\n this.humanPrefix = fields?.humanPrefix ?? this.humanPrefix;\n this.aiPrefix = fields?.aiPrefix ?? this.aiPrefix;\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n this.maxTokenLimit = fields?.maxTokenLimit ?? this.maxTokenLimit;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Loads the memory variables. It takes an `InputValues` object as a\n * parameter and returns a `Promise` that resolves with a\n * `MemoryVariables` object.\n * @param _values `InputValues` object.\n * @returns A `Promise` that resolves with a `MemoryVariables` object.\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: messages,\n };\n return result;\n }\n const result = {\n [this.memoryKey]: getBufferString(\n messages,\n this.humanPrefix,\n this.aiPrefix\n ),\n };\n return result;\n }\n\n /**\n * Saves the context from this conversation to buffer. If the amount\n * of tokens required to save the buffer exceeds MAX_TOKEN_LIMIT,\n * prune it.\n */\n async saveContext(inputValues: InputValues, outputValues: OutputValues) {\n await super.saveContext(inputValues, outputValues);\n\n // Prune buffer if it exceeds the max token limit set for this instance.\n const buffer = await this.chatHistory.getMessages();\n let currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n\n if (currBufferLength > this.maxTokenLimit) {\n const prunedMemory = [];\n while (currBufferLength > this.maxTokenLimit) {\n prunedMemory.push(buffer.shift());\n currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n }\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAmDA,IAAa,gCAAb,cACUA,2BAAAA,eAEV;CACE,cAAc;CAEd,WAAW;CAEX,YAAY;CAEZ,gBAAgB;CAEhB;CAEA,YAAY,QAA4C;EACtD,MAAM,MAAM;EACZ,KAAK,MAAM,OAAO;EAClB,KAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,gBAAgB,QAAQ,iBAAiB,KAAK;CACrD;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,SAAgD;EACxE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,SAER;EASd,OAAO,GANJ,KAAK,aAAA,GAAYC,yBAAAA,gBAAAA,CAChB,UACA,KAAK,aACL,KAAK,QACP,EAEU;CACd;;;;;;CAOA,MAAM,YAAY,aAA0B,cAA4B;EACtE,MAAM,MAAM,YAAY,aAAa,YAAY;EAGjD,MAAM,SAAS,MAAM,KAAK,YAAY,YAAY;EAClD,IAAI,mBAAmB,MAAM,KAAK,IAAI,cAAA,GACpCA,yBAAAA,gBAAAA,CAAgB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;EAEA,IAAI,mBAAmB,KAAK,eAAe;GACzC,MAAM,eAAe,CAAC;GACtB,OAAO,mBAAmB,KAAK,eAAe;IAC5C,aAAa,KAAK,OAAO,MAAM,CAAC;IAChC,mBAAmB,MAAM,KAAK,IAAI,cAAA,GAChCA,yBAAAA,gBAAAA,CAAgB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;GACF;EACF;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"buffer_window_memory.cjs","names":["BaseChatMemory"],"sources":["../../src/memory/buffer_window_memory.ts"],"sourcesContent":["import { InputValues, MemoryVariables } from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the BufferWindowMemory class.\n */\nexport interface BufferWindowMemoryInput extends BaseChatMemoryInput {\n humanPrefix?: string;\n aiPrefix?: string;\n memoryKey?: string;\n k?: number;\n}\n\n/**\n * Class for managing and storing previous chat messages. It extends the\n * BaseChatMemory class and implements the BufferWindowMemoryInput\n * interface. This class is stateful and stores messages in a buffer. When\n * called in a chain, it returns all of the messages it has stored.\n * @example\n * ```typescript\n * const prompt =\n * PromptTemplate.fromTemplate(`The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n * Current conversation:\n * {chat_history}\n * Human: {input}\n * AI:`);\n *\n * const chain = new LLMChain({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 }),\n * prompt,\n * memory: new BufferWindowMemory({ memoryKey: \"chat_history\", k: 1 }),\n * });\n *\n * // Example of initiating a conversation with the AI\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({ res1 });\n *\n * // Example of following up with another question\n * const res2 = await chain.call({ input: \"What's my name?\" });\n * console.log({ res2 });\n * ```\n */\nexport class BufferWindowMemory\n extends BaseChatMemory\n implements BufferWindowMemoryInput\n{\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n memoryKey = \"history\";\n\n k = 5;\n\n constructor(fields?: BufferWindowMemoryInput) {\n super({\n returnMessages: fields?.returnMessages ?? false,\n chatHistory: fields?.chatHistory,\n inputKey: fields?.inputKey,\n outputKey: fields?.outputKey,\n });\n this.humanPrefix = fields?.humanPrefix ?? this.humanPrefix;\n this.aiPrefix = fields?.aiPrefix ?? this.aiPrefix;\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n this.k = fields?.k ?? this.k;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Method to load the memory variables. Retrieves the chat messages from\n * the history, slices the last 'k' messages, and stores them in the\n * memory under the memoryKey. If the returnMessages property is set to\n * true, the method returns the messages as they are. Otherwise, it\n * returns a string representation of the messages.\n * @param _values InputValues object.\n * @returns Promise that resolves to a MemoryVariables object.\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: messages.slice(-this.k * 2),\n };\n return result;\n }\n const result = {\n [this.memoryKey]: getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n ),\n };\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,qBAAb,cACUA,2BAAAA,eAEV;CACE,cAAc;CAEd,WAAW;CAEX,YAAY;CAEZ,IAAI;CAEJ,YAAY,QAAkC;EAC5C,MAAM;GACJ,gBAAgB,QAAQ,kBAAkB;GAC1C,aAAa,QAAQ;GACrB,UAAU,QAAQ;GAClB,WAAW,QAAQ;EACrB,CAAC;EACD,KAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,IAAI,QAAQ,KAAK,KAAK;CAC7B;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;;;CAWA,MAAM,oBAAoB,SAAgD;EACxE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,EAElC;EASd,OAAO,GANJ,KAAK,aAAA,GAAA,yBAAA,gBAAA,CACJ,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP,EAEU;CACd;AACF"}
1
+ {"version":3,"file":"buffer_window_memory.cjs","names":["BaseChatMemory","getBufferString"],"sources":["../../src/memory/buffer_window_memory.ts"],"sourcesContent":["import { InputValues, MemoryVariables } from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the BufferWindowMemory class.\n */\nexport interface BufferWindowMemoryInput extends BaseChatMemoryInput {\n humanPrefix?: string;\n aiPrefix?: string;\n memoryKey?: string;\n k?: number;\n}\n\n/**\n * Class for managing and storing previous chat messages. It extends the\n * BaseChatMemory class and implements the BufferWindowMemoryInput\n * interface. This class is stateful and stores messages in a buffer. When\n * called in a chain, it returns all of the messages it has stored.\n * @example\n * ```typescript\n * const prompt =\n * PromptTemplate.fromTemplate(`The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n * Current conversation:\n * {chat_history}\n * Human: {input}\n * AI:`);\n *\n * const chain = new LLMChain({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 }),\n * prompt,\n * memory: new BufferWindowMemory({ memoryKey: \"chat_history\", k: 1 }),\n * });\n *\n * // Example of initiating a conversation with the AI\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({ res1 });\n *\n * // Example of following up with another question\n * const res2 = await chain.call({ input: \"What's my name?\" });\n * console.log({ res2 });\n * ```\n */\nexport class BufferWindowMemory\n extends BaseChatMemory\n implements BufferWindowMemoryInput\n{\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n memoryKey = \"history\";\n\n k = 5;\n\n constructor(fields?: BufferWindowMemoryInput) {\n super({\n returnMessages: fields?.returnMessages ?? false,\n chatHistory: fields?.chatHistory,\n inputKey: fields?.inputKey,\n outputKey: fields?.outputKey,\n });\n this.humanPrefix = fields?.humanPrefix ?? this.humanPrefix;\n this.aiPrefix = fields?.aiPrefix ?? this.aiPrefix;\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n this.k = fields?.k ?? this.k;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Method to load the memory variables. Retrieves the chat messages from\n * the history, slices the last 'k' messages, and stores them in the\n * memory under the memoryKey. If the returnMessages property is set to\n * true, the method returns the messages as they are. Otherwise, it\n * returns a string representation of the messages.\n * @param _values InputValues object.\n * @returns Promise that resolves to a MemoryVariables object.\n */\n async loadMemoryVariables(_values: InputValues): Promise<MemoryVariables> {\n const messages = await this.chatHistory.getMessages();\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: messages.slice(-this.k * 2),\n };\n return result;\n }\n const result = {\n [this.memoryKey]: getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n ),\n };\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,qBAAb,cACUA,2BAAAA,eAEV;CACE,cAAc;CAEd,WAAW;CAEX,YAAY;CAEZ,IAAI;CAEJ,YAAY,QAAkC;EAC5C,MAAM;GACJ,gBAAgB,QAAQ,kBAAkB;GAC1C,aAAa,QAAQ;GACrB,UAAU,QAAQ;GAClB,WAAW,QAAQ;EACrB,CAAC;EACD,KAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,IAAI,QAAQ,KAAK,KAAK;CAC7B;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;;;CAWA,MAAM,oBAAoB,SAAgD;EACxE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,EAElC;EASd,OAAO,GANJ,KAAK,aAAA,GAAYC,yBAAAA,gBAAAA,CAChB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP,EAEU;CACd;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat_memory.cjs","names":["BaseMemory","ChatMessageHistory"],"sources":["../../src/memory/chat_memory.ts"],"sourcesContent":["import {\n BaseChatMessageHistory,\n InMemoryChatMessageHistory as ChatMessageHistory,\n} from \"@langchain/core/chat_history\";\nimport {\n BaseMemory,\n InputValues,\n OutputValues,\n getInputValue,\n getOutputValue,\n} from \"@langchain/core/memory\";\n\n/**\n * Interface for the input parameters of the BaseChatMemory class.\n */\nexport interface BaseChatMemoryInput {\n chatHistory?: BaseChatMessageHistory;\n returnMessages?: boolean;\n inputKey?: string;\n outputKey?: string;\n}\n\n/**\n * Abstract class that provides a base for implementing different types of\n * memory systems. It is designed to maintain the state of an application,\n * specifically the history of a conversation. This class is typically\n * extended by other classes to create specific types of memory systems.\n */\nexport abstract class BaseChatMemory extends BaseMemory {\n chatHistory: BaseChatMessageHistory;\n\n returnMessages = false;\n\n inputKey?: string;\n\n outputKey?: string;\n\n constructor(fields?: BaseChatMemoryInput) {\n super();\n this.chatHistory = fields?.chatHistory ?? new ChatMessageHistory();\n this.returnMessages = fields?.returnMessages ?? this.returnMessages;\n this.inputKey = fields?.inputKey ?? this.inputKey;\n this.outputKey = fields?.outputKey ?? this.outputKey;\n }\n\n /**\n * Method to add user and AI messages to the chat history in sequence.\n * @param inputValues The input values from the user.\n * @param outputValues The output values from the AI.\n * @returns Promise that resolves when the context has been saved.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n // this is purposefully done in sequence so they're saved in order\n await this.chatHistory.addUserMessage(\n getInputValue(inputValues, this.inputKey)\n );\n await this.chatHistory.addAIMessage(\n getOutputValue(outputValues, this.outputKey)\n );\n }\n\n /**\n * Method to clear the chat history.\n * @returns Promise that resolves when the chat history has been cleared.\n */\n async clear(): Promise<void> {\n await this.chatHistory.clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;AA4BA,IAAsB,iBAAtB,cAA6CA,uBAAAA,WAAW;CACtD;CAEA,iBAAiB;CAEjB;CAEA;CAEA,YAAY,QAA8B;EACxC,MAAM;EACN,KAAK,cAAc,QAAQ,eAAe,IAAIC,6BAAAA,2BAAmB;EACjE,KAAK,iBAAiB,QAAQ,kBAAkB,KAAK;EACrD,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;CAC7C;;;;;;;CAQA,MAAM,YACJ,aACA,cACe;EAEf,MAAM,KAAK,YAAY,gBAAA,GAAA,uBAAA,cAAA,CACP,aAAa,KAAK,QAAQ,CAC1C;EACA,MAAM,KAAK,YAAY,cAAA,GAAA,uBAAA,eAAA,CACN,cAAc,KAAK,SAAS,CAC7C;CACF;;;;;CAMA,MAAM,QAAuB;EAC3B,MAAM,KAAK,YAAY,MAAM;CAC/B;AACF"}
1
+ {"version":3,"file":"chat_memory.cjs","names":["BaseMemory","ChatMessageHistory","getInputValue","getOutputValue"],"sources":["../../src/memory/chat_memory.ts"],"sourcesContent":["import {\n BaseChatMessageHistory,\n InMemoryChatMessageHistory as ChatMessageHistory,\n} from \"@langchain/core/chat_history\";\nimport {\n BaseMemory,\n InputValues,\n OutputValues,\n getInputValue,\n getOutputValue,\n} from \"@langchain/core/memory\";\n\n/**\n * Interface for the input parameters of the BaseChatMemory class.\n */\nexport interface BaseChatMemoryInput {\n chatHistory?: BaseChatMessageHistory;\n returnMessages?: boolean;\n inputKey?: string;\n outputKey?: string;\n}\n\n/**\n * Abstract class that provides a base for implementing different types of\n * memory systems. It is designed to maintain the state of an application,\n * specifically the history of a conversation. This class is typically\n * extended by other classes to create specific types of memory systems.\n */\nexport abstract class BaseChatMemory extends BaseMemory {\n chatHistory: BaseChatMessageHistory;\n\n returnMessages = false;\n\n inputKey?: string;\n\n outputKey?: string;\n\n constructor(fields?: BaseChatMemoryInput) {\n super();\n this.chatHistory = fields?.chatHistory ?? new ChatMessageHistory();\n this.returnMessages = fields?.returnMessages ?? this.returnMessages;\n this.inputKey = fields?.inputKey ?? this.inputKey;\n this.outputKey = fields?.outputKey ?? this.outputKey;\n }\n\n /**\n * Method to add user and AI messages to the chat history in sequence.\n * @param inputValues The input values from the user.\n * @param outputValues The output values from the AI.\n * @returns Promise that resolves when the context has been saved.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n // this is purposefully done in sequence so they're saved in order\n await this.chatHistory.addUserMessage(\n getInputValue(inputValues, this.inputKey)\n );\n await this.chatHistory.addAIMessage(\n getOutputValue(outputValues, this.outputKey)\n );\n }\n\n /**\n * Method to clear the chat history.\n * @returns Promise that resolves when the chat history has been cleared.\n */\n async clear(): Promise<void> {\n await this.chatHistory.clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;AA4BA,IAAsB,iBAAtB,cAA6CA,uBAAAA,WAAW;CACtD;CAEA,iBAAiB;CAEjB;CAEA;CAEA,YAAY,QAA8B;EACxC,MAAM;EACN,KAAK,cAAc,QAAQ,eAAe,IAAIC,6BAAAA,2BAAmB;EACjE,KAAK,iBAAiB,QAAQ,kBAAkB,KAAK;EACrD,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,YAAY,QAAQ,aAAa,KAAK;CAC7C;;;;;;;CAQA,MAAM,YACJ,aACA,cACe;EAEf,MAAM,KAAK,YAAY,gBAAA,GACrBC,uBAAAA,cAAAA,CAAc,aAAa,KAAK,QAAQ,CAC1C;EACA,MAAM,KAAK,YAAY,cAAA,GACrBC,uBAAAA,eAAAA,CAAe,cAAc,KAAK,SAAS,CAC7C;CACF;;;;;CAMA,MAAM,QAAuB;EAC3B,MAAM,KAAK,YAAY,MAAM;CAC/B;AACF"}
@@ -113,7 +113,8 @@ var EntityMemory = class extends require_memory_chat_memory.BaseChatMemory {
113
113
  async saveContext(inputs, outputs) {
114
114
  await super.saveContext(inputs, outputs);
115
115
  const promptInputKey = this.inputKey ?? (0, _langchain_core_memory.getPromptInputKey)(inputs, this.memoryVariables);
116
- const serializedMessages = (0, _langchain_core_messages.getBufferString)((await this.chatHistory.getMessages()).slice(-this.k * 2), this.humanPrefix, this.aiPrefix);
116
+ const messages = await this.chatHistory.getMessages();
117
+ const serializedMessages = (0, _langchain_core_messages.getBufferString)(messages.slice(-this.k * 2), this.humanPrefix, this.aiPrefix);
117
118
  const inputData = inputs[promptInputKey];
118
119
  for (const entity of this.entityCache) {
119
120
  const existingSummary = await this.entityStore.get(entity, "No current information known.");
@@ -1 +1 @@
1
- {"version":3,"file":"entity_memory.cjs","names":["BaseChatMemory","LLMChain","ENTITY_EXTRACTION_PROMPT","ENTITY_SUMMARIZATION_PROMPT","InMemoryEntityStore"],"sources":["../../src/memory/entity_memory.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { PromptTemplate } from \"@langchain/core/prompts\";\n\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n getPromptInputKey,\n} from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { InMemoryEntityStore } from \"./stores/entity/in_memory.js\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport {\n ENTITY_EXTRACTION_PROMPT,\n ENTITY_SUMMARIZATION_PROMPT,\n} from \"./prompt.js\";\nimport { BaseEntityStore } from \"./stores/entity/base.js\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters required by the EntityMemory class.\n */\nexport interface EntityMemoryInput extends BaseChatMemoryInput {\n llm: BaseLanguageModelInterface;\n humanPrefix?: string;\n aiPrefix?: string;\n entityExtractionPrompt?: PromptTemplate;\n entitySummarizationPrompt?: PromptTemplate;\n entityCache?: string[];\n k?: number;\n chatHistoryKey?: string;\n entitiesKey?: string;\n entityStore?: BaseEntityStore;\n}\n\n// Entity extractor & summarizer to memory.\n/**\n * Class for managing entity extraction and summarization to memory in\n * chatbot applications. Extends the BaseChatMemory class and implements\n * the EntityMemoryInput interface.\n * @example\n * ```typescript\n * const memory = new EntityMemory({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * chatHistoryKey: \"history\",\n * entitiesKey: \"entities\",\n * });\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 });\n * const chain = new LLMChain({\n * llm: model,\n * prompt: ENTITY_MEMORY_CONVERSATION_TEMPLATE,\n * memory,\n * });\n *\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({\n * res1,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * const res2 = await chain.call({\n * input: \"I work in construction. What about you?\",\n * });\n * console.log({\n * res2,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * ```\n */\nexport class EntityMemory extends BaseChatMemory implements EntityMemoryInput {\n private entityExtractionChain: LLMChain;\n\n private entitySummarizationChain: LLMChain;\n\n entityStore: BaseEntityStore;\n\n entityCache: string[] = [];\n\n k = 3;\n\n chatHistoryKey = \"history\";\n\n llm: BaseLanguageModelInterface;\n\n entitiesKey = \"entities\";\n\n humanPrefix?: string;\n\n aiPrefix?: string;\n\n constructor(fields: EntityMemoryInput) {\n super({\n chatHistory: fields.chatHistory,\n returnMessages: fields.returnMessages ?? false,\n inputKey: fields.inputKey,\n outputKey: fields.outputKey,\n });\n this.llm = fields.llm;\n this.humanPrefix = fields.humanPrefix;\n this.aiPrefix = fields.aiPrefix;\n this.chatHistoryKey = fields.chatHistoryKey ?? this.chatHistoryKey;\n this.entitiesKey = fields.entitiesKey ?? this.entitiesKey;\n this.entityExtractionChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entityExtractionPrompt ?? ENTITY_EXTRACTION_PROMPT,\n });\n this.entitySummarizationChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entitySummarizationPrompt ?? ENTITY_SUMMARIZATION_PROMPT,\n });\n this.entityStore = fields.entityStore ?? new InMemoryEntityStore();\n this.entityCache = fields.entityCache ?? this.entityCache;\n this.k = fields.k ?? this.k;\n }\n\n get memoryKeys() {\n return [this.chatHistoryKey];\n }\n\n // Will always return list of memory variables.\n get memoryVariables(): string[] {\n return [this.entitiesKey, this.chatHistoryKey];\n }\n\n // Return history buffer.\n /**\n * Method to load memory variables and perform entity extraction.\n * @param inputs Input values for the method.\n * @returns Promise resolving to an object containing memory variables.\n */\n async loadMemoryVariables(inputs: InputValues): Promise<MemoryVariables> {\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const output = await this.entityExtractionChain.predict({\n history: serializedMessages,\n input: inputs[promptInputKey],\n });\n const entities: string[] =\n output.trim() === \"NONE\" ? [] : output.split(\",\").map((w) => w.trim());\n const entitySummaries: { [key: string]: string | undefined } = {};\n\n for (const entity of entities) {\n entitySummaries[entity] = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n }\n this.entityCache = [...entities];\n const buffer = this.returnMessages\n ? messages.slice(-this.k * 2)\n : serializedMessages;\n\n return {\n [this.chatHistoryKey]: buffer,\n [this.entitiesKey]: entitySummaries,\n };\n }\n\n // Save context from this conversation to buffer.\n /**\n * Method to save the context from a conversation to a buffer and perform\n * entity summarization.\n * @param inputs Input values for the method.\n * @param outputs Output values from the method.\n * @returns Promise resolving to void.\n */\n async saveContext(inputs: InputValues, outputs: OutputValues): Promise<void> {\n await super.saveContext(inputs, outputs);\n\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const inputData = inputs[promptInputKey];\n\n for (const entity of this.entityCache) {\n const existingSummary = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n const output = await this.entitySummarizationChain.predict({\n summary: existingSummary,\n entity,\n history: serializedMessages,\n input: inputData,\n });\n if (output.trim() !== \"UNCHANGED\") {\n await this.entityStore.set(entity, output.trim());\n }\n }\n }\n\n // Clear memory contents.\n /**\n * Method to clear the memory contents.\n * @returns Promise resolving to void.\n */\n async clear() {\n await super.clear();\n await this.entityStore.clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEA,IAAa,eAAb,cAAkCA,2BAAAA,eAA4C;CAC5E;CAEA;CAEA;CAEA,cAAwB,CAAC;CAEzB,IAAI;CAEJ,iBAAiB;CAEjB;CAEA,cAAc;CAEd;CAEA;CAEA,YAAY,QAA2B;EACrC,MAAM;GACJ,aAAa,OAAO;GACpB,gBAAgB,OAAO,kBAAkB;GACzC,UAAU,OAAO;GACjB,WAAW,OAAO;EACpB,CAAC;EACD,KAAK,MAAM,OAAO;EAClB,KAAK,cAAc,OAAO;EAC1B,KAAK,WAAW,OAAO;EACvB,KAAK,iBAAiB,OAAO,kBAAkB,KAAK;EACpD,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,wBAAwB,IAAIC,kBAAAA,SAAS;GACxC,KAAK,KAAK;GACV,QAAQ,OAAO,0BAA0BC,eAAAA;EAC3C,CAAC;EACD,KAAK,2BAA2B,IAAID,kBAAAA,SAAS;GAC3C,KAAK,KAAK;GACV,QAAQ,OAAO,6BAA6BE,eAAAA;EAC9C,CAAC;EACD,KAAK,cAAc,OAAO,eAAe,IAAIC,kBAAAA,oBAAoB;EACjE,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,IAAI,OAAO,KAAK,KAAK;CAC5B;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,cAAc;CAC7B;CAGA,IAAI,kBAA4B;EAC9B,OAAO,CAAC,KAAK,aAAa,KAAK,cAAc;CAC/C;;;;;;CAQA,MAAM,oBAAoB,QAA+C;EACvE,MAAM,iBACJ,KAAK,aAAA,GAAA,uBAAA,kBAAA,CAA8B,QAAQ,KAAK,eAAe;EACjE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,MAAM,sBAAA,GAAA,yBAAA,gBAAA,CACJ,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,SAAS,MAAM,KAAK,sBAAsB,QAAQ;GACtD,SAAS;GACT,OAAO,OAAO;EAChB,CAAC;EACD,MAAM,WACJ,OAAO,KAAK,MAAM,SAAS,CAAC,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC;EACvE,MAAM,kBAAyD,CAAC;EAEhE,KAAK,MAAM,UAAU,UACnB,gBAAgB,UAAU,MAAM,KAAK,YAAY,IAC/C,QACA,+BACF;EAEF,KAAK,cAAc,CAAC,GAAG,QAAQ;EAC/B,MAAM,SAAS,KAAK,iBAChB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,IAC1B;EAEJ,OAAO;IACJ,KAAK,iBAAiB;IACtB,KAAK,cAAc;EACtB;CACF;;;;;;;;CAUA,MAAM,YAAY,QAAqB,SAAsC;EAC3E,MAAM,MAAM,YAAY,QAAQ,OAAO;EAEvC,MAAM,iBACJ,KAAK,aAAA,GAAA,uBAAA,kBAAA,CAA8B,QAAQ,KAAK,eAAe;EAEjE,MAAM,sBAAA,GAAA,yBAAA,gBAAA,EACJ,MAFqB,KAAK,YAAY,YAAY,EAAA,CAEzC,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,YAAY,OAAO;EAEzB,KAAK,MAAM,UAAU,KAAK,aAAa;GACrC,MAAM,kBAAkB,MAAM,KAAK,YAAY,IAC7C,QACA,+BACF;GACA,MAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;IACzD,SAAS;IACT;IACA,SAAS;IACT,OAAO;GACT,CAAC;GACD,IAAI,OAAO,KAAK,MAAM,aACpB,MAAM,KAAK,YAAY,IAAI,QAAQ,OAAO,KAAK,CAAC;EAEpD;CACF;;;;;CAOA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,MAAM,KAAK,YAAY,MAAM;CAC/B;AACF"}
1
+ {"version":3,"file":"entity_memory.cjs","names":["BaseChatMemory","LLMChain","ENTITY_EXTRACTION_PROMPT","ENTITY_SUMMARIZATION_PROMPT","InMemoryEntityStore","getPromptInputKey","getBufferString"],"sources":["../../src/memory/entity_memory.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { PromptTemplate } from \"@langchain/core/prompts\";\n\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n getPromptInputKey,\n} from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { InMemoryEntityStore } from \"./stores/entity/in_memory.js\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport {\n ENTITY_EXTRACTION_PROMPT,\n ENTITY_SUMMARIZATION_PROMPT,\n} from \"./prompt.js\";\nimport { BaseEntityStore } from \"./stores/entity/base.js\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters required by the EntityMemory class.\n */\nexport interface EntityMemoryInput extends BaseChatMemoryInput {\n llm: BaseLanguageModelInterface;\n humanPrefix?: string;\n aiPrefix?: string;\n entityExtractionPrompt?: PromptTemplate;\n entitySummarizationPrompt?: PromptTemplate;\n entityCache?: string[];\n k?: number;\n chatHistoryKey?: string;\n entitiesKey?: string;\n entityStore?: BaseEntityStore;\n}\n\n// Entity extractor & summarizer to memory.\n/**\n * Class for managing entity extraction and summarization to memory in\n * chatbot applications. Extends the BaseChatMemory class and implements\n * the EntityMemoryInput interface.\n * @example\n * ```typescript\n * const memory = new EntityMemory({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * chatHistoryKey: \"history\",\n * entitiesKey: \"entities\",\n * });\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 });\n * const chain = new LLMChain({\n * llm: model,\n * prompt: ENTITY_MEMORY_CONVERSATION_TEMPLATE,\n * memory,\n * });\n *\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({\n * res1,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * const res2 = await chain.call({\n * input: \"I work in construction. What about you?\",\n * });\n * console.log({\n * res2,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * ```\n */\nexport class EntityMemory extends BaseChatMemory implements EntityMemoryInput {\n private entityExtractionChain: LLMChain;\n\n private entitySummarizationChain: LLMChain;\n\n entityStore: BaseEntityStore;\n\n entityCache: string[] = [];\n\n k = 3;\n\n chatHistoryKey = \"history\";\n\n llm: BaseLanguageModelInterface;\n\n entitiesKey = \"entities\";\n\n humanPrefix?: string;\n\n aiPrefix?: string;\n\n constructor(fields: EntityMemoryInput) {\n super({\n chatHistory: fields.chatHistory,\n returnMessages: fields.returnMessages ?? false,\n inputKey: fields.inputKey,\n outputKey: fields.outputKey,\n });\n this.llm = fields.llm;\n this.humanPrefix = fields.humanPrefix;\n this.aiPrefix = fields.aiPrefix;\n this.chatHistoryKey = fields.chatHistoryKey ?? this.chatHistoryKey;\n this.entitiesKey = fields.entitiesKey ?? this.entitiesKey;\n this.entityExtractionChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entityExtractionPrompt ?? ENTITY_EXTRACTION_PROMPT,\n });\n this.entitySummarizationChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entitySummarizationPrompt ?? ENTITY_SUMMARIZATION_PROMPT,\n });\n this.entityStore = fields.entityStore ?? new InMemoryEntityStore();\n this.entityCache = fields.entityCache ?? this.entityCache;\n this.k = fields.k ?? this.k;\n }\n\n get memoryKeys() {\n return [this.chatHistoryKey];\n }\n\n // Will always return list of memory variables.\n get memoryVariables(): string[] {\n return [this.entitiesKey, this.chatHistoryKey];\n }\n\n // Return history buffer.\n /**\n * Method to load memory variables and perform entity extraction.\n * @param inputs Input values for the method.\n * @returns Promise resolving to an object containing memory variables.\n */\n async loadMemoryVariables(inputs: InputValues): Promise<MemoryVariables> {\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const output = await this.entityExtractionChain.predict({\n history: serializedMessages,\n input: inputs[promptInputKey],\n });\n const entities: string[] =\n output.trim() === \"NONE\" ? [] : output.split(\",\").map((w) => w.trim());\n const entitySummaries: { [key: string]: string | undefined } = {};\n\n for (const entity of entities) {\n entitySummaries[entity] = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n }\n this.entityCache = [...entities];\n const buffer = this.returnMessages\n ? messages.slice(-this.k * 2)\n : serializedMessages;\n\n return {\n [this.chatHistoryKey]: buffer,\n [this.entitiesKey]: entitySummaries,\n };\n }\n\n // Save context from this conversation to buffer.\n /**\n * Method to save the context from a conversation to a buffer and perform\n * entity summarization.\n * @param inputs Input values for the method.\n * @param outputs Output values from the method.\n * @returns Promise resolving to void.\n */\n async saveContext(inputs: InputValues, outputs: OutputValues): Promise<void> {\n await super.saveContext(inputs, outputs);\n\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const inputData = inputs[promptInputKey];\n\n for (const entity of this.entityCache) {\n const existingSummary = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n const output = await this.entitySummarizationChain.predict({\n summary: existingSummary,\n entity,\n history: serializedMessages,\n input: inputData,\n });\n if (output.trim() !== \"UNCHANGED\") {\n await this.entityStore.set(entity, output.trim());\n }\n }\n }\n\n // Clear memory contents.\n /**\n * Method to clear the memory contents.\n * @returns Promise resolving to void.\n */\n async clear() {\n await super.clear();\n await this.entityStore.clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEA,IAAa,eAAb,cAAkCA,2BAAAA,eAA4C;CAC5E;CAEA;CAEA;CAEA,cAAwB,CAAC;CAEzB,IAAI;CAEJ,iBAAiB;CAEjB;CAEA,cAAc;CAEd;CAEA;CAEA,YAAY,QAA2B;EACrC,MAAM;GACJ,aAAa,OAAO;GACpB,gBAAgB,OAAO,kBAAkB;GACzC,UAAU,OAAO;GACjB,WAAW,OAAO;EACpB,CAAC;EACD,KAAK,MAAM,OAAO;EAClB,KAAK,cAAc,OAAO;EAC1B,KAAK,WAAW,OAAO;EACvB,KAAK,iBAAiB,OAAO,kBAAkB,KAAK;EACpD,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,wBAAwB,IAAIC,kBAAAA,SAAS;GACxC,KAAK,KAAK;GACV,QAAQ,OAAO,0BAA0BC,eAAAA;EAC3C,CAAC;EACD,KAAK,2BAA2B,IAAID,kBAAAA,SAAS;GAC3C,KAAK,KAAK;GACV,QAAQ,OAAO,6BAA6BE,eAAAA;EAC9C,CAAC;EACD,KAAK,cAAc,OAAO,eAAe,IAAIC,kBAAAA,oBAAoB;EACjE,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,IAAI,OAAO,KAAK,KAAK;CAC5B;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,cAAc;CAC7B;CAGA,IAAI,kBAA4B;EAC9B,OAAO,CAAC,KAAK,aAAa,KAAK,cAAc;CAC/C;;;;;;CAQA,MAAM,oBAAoB,QAA+C;EACvE,MAAM,iBACJ,KAAK,aAAA,GAAYC,uBAAAA,kBAAAA,CAAkB,QAAQ,KAAK,eAAe;EACjE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,MAAM,sBAAA,GAAqBC,yBAAAA,gBAAAA,CACzB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,SAAS,MAAM,KAAK,sBAAsB,QAAQ;GACtD,SAAS;GACT,OAAO,OAAO;EAChB,CAAC;EACD,MAAM,WACJ,OAAO,KAAK,MAAM,SAAS,CAAC,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC;EACvE,MAAM,kBAAyD,CAAC;EAEhE,KAAK,MAAM,UAAU,UACnB,gBAAgB,UAAU,MAAM,KAAK,YAAY,IAC/C,QACA,+BACF;EAEF,KAAK,cAAc,CAAC,GAAG,QAAQ;EAC/B,MAAM,SAAS,KAAK,iBAChB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,IAC1B;EAEJ,OAAO;IACJ,KAAK,iBAAiB;IACtB,KAAK,cAAc;EACtB;CACF;;;;;;;;CAUA,MAAM,YAAY,QAAqB,SAAsC;EAC3E,MAAM,MAAM,YAAY,QAAQ,OAAO;EAEvC,MAAM,iBACJ,KAAK,aAAA,GAAYD,uBAAAA,kBAAAA,CAAkB,QAAQ,KAAK,eAAe;EACjE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,MAAM,sBAAA,GAAqBC,yBAAAA,gBAAAA,CACzB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,YAAY,OAAO;EAEzB,KAAK,MAAM,UAAU,KAAK,aAAa;GACrC,MAAM,kBAAkB,MAAM,KAAK,YAAY,IAC7C,QACA,+BACF;GACA,MAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;IACzD,SAAS;IACT;IACA,SAAS;IACT,OAAO;GACT,CAAC;GACD,IAAI,OAAO,KAAK,MAAM,aACpB,MAAM,KAAK,YAAY,IAAI,QAAQ,OAAO,KAAK,CAAC;EAEpD;CACF;;;;;CAOA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,MAAM,KAAK,YAAY,MAAM;CAC/B;AACF"}
@@ -113,7 +113,8 @@ var EntityMemory = class extends BaseChatMemory {
113
113
  async saveContext(inputs, outputs) {
114
114
  await super.saveContext(inputs, outputs);
115
115
  const promptInputKey = this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);
116
- const serializedMessages = getBufferString((await this.chatHistory.getMessages()).slice(-this.k * 2), this.humanPrefix, this.aiPrefix);
116
+ const messages = await this.chatHistory.getMessages();
117
+ const serializedMessages = getBufferString(messages.slice(-this.k * 2), this.humanPrefix, this.aiPrefix);
117
118
  const inputData = inputs[promptInputKey];
118
119
  for (const entity of this.entityCache) {
119
120
  const existingSummary = await this.entityStore.get(entity, "No current information known.");
@@ -1 +1 @@
1
- {"version":3,"file":"entity_memory.js","names":[],"sources":["../../src/memory/entity_memory.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { PromptTemplate } from \"@langchain/core/prompts\";\n\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n getPromptInputKey,\n} from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { InMemoryEntityStore } from \"./stores/entity/in_memory.js\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport {\n ENTITY_EXTRACTION_PROMPT,\n ENTITY_SUMMARIZATION_PROMPT,\n} from \"./prompt.js\";\nimport { BaseEntityStore } from \"./stores/entity/base.js\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters required by the EntityMemory class.\n */\nexport interface EntityMemoryInput extends BaseChatMemoryInput {\n llm: BaseLanguageModelInterface;\n humanPrefix?: string;\n aiPrefix?: string;\n entityExtractionPrompt?: PromptTemplate;\n entitySummarizationPrompt?: PromptTemplate;\n entityCache?: string[];\n k?: number;\n chatHistoryKey?: string;\n entitiesKey?: string;\n entityStore?: BaseEntityStore;\n}\n\n// Entity extractor & summarizer to memory.\n/**\n * Class for managing entity extraction and summarization to memory in\n * chatbot applications. Extends the BaseChatMemory class and implements\n * the EntityMemoryInput interface.\n * @example\n * ```typescript\n * const memory = new EntityMemory({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * chatHistoryKey: \"history\",\n * entitiesKey: \"entities\",\n * });\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 });\n * const chain = new LLMChain({\n * llm: model,\n * prompt: ENTITY_MEMORY_CONVERSATION_TEMPLATE,\n * memory,\n * });\n *\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({\n * res1,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * const res2 = await chain.call({\n * input: \"I work in construction. What about you?\",\n * });\n * console.log({\n * res2,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * ```\n */\nexport class EntityMemory extends BaseChatMemory implements EntityMemoryInput {\n private entityExtractionChain: LLMChain;\n\n private entitySummarizationChain: LLMChain;\n\n entityStore: BaseEntityStore;\n\n entityCache: string[] = [];\n\n k = 3;\n\n chatHistoryKey = \"history\";\n\n llm: BaseLanguageModelInterface;\n\n entitiesKey = \"entities\";\n\n humanPrefix?: string;\n\n aiPrefix?: string;\n\n constructor(fields: EntityMemoryInput) {\n super({\n chatHistory: fields.chatHistory,\n returnMessages: fields.returnMessages ?? false,\n inputKey: fields.inputKey,\n outputKey: fields.outputKey,\n });\n this.llm = fields.llm;\n this.humanPrefix = fields.humanPrefix;\n this.aiPrefix = fields.aiPrefix;\n this.chatHistoryKey = fields.chatHistoryKey ?? this.chatHistoryKey;\n this.entitiesKey = fields.entitiesKey ?? this.entitiesKey;\n this.entityExtractionChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entityExtractionPrompt ?? ENTITY_EXTRACTION_PROMPT,\n });\n this.entitySummarizationChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entitySummarizationPrompt ?? ENTITY_SUMMARIZATION_PROMPT,\n });\n this.entityStore = fields.entityStore ?? new InMemoryEntityStore();\n this.entityCache = fields.entityCache ?? this.entityCache;\n this.k = fields.k ?? this.k;\n }\n\n get memoryKeys() {\n return [this.chatHistoryKey];\n }\n\n // Will always return list of memory variables.\n get memoryVariables(): string[] {\n return [this.entitiesKey, this.chatHistoryKey];\n }\n\n // Return history buffer.\n /**\n * Method to load memory variables and perform entity extraction.\n * @param inputs Input values for the method.\n * @returns Promise resolving to an object containing memory variables.\n */\n async loadMemoryVariables(inputs: InputValues): Promise<MemoryVariables> {\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const output = await this.entityExtractionChain.predict({\n history: serializedMessages,\n input: inputs[promptInputKey],\n });\n const entities: string[] =\n output.trim() === \"NONE\" ? [] : output.split(\",\").map((w) => w.trim());\n const entitySummaries: { [key: string]: string | undefined } = {};\n\n for (const entity of entities) {\n entitySummaries[entity] = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n }\n this.entityCache = [...entities];\n const buffer = this.returnMessages\n ? messages.slice(-this.k * 2)\n : serializedMessages;\n\n return {\n [this.chatHistoryKey]: buffer,\n [this.entitiesKey]: entitySummaries,\n };\n }\n\n // Save context from this conversation to buffer.\n /**\n * Method to save the context from a conversation to a buffer and perform\n * entity summarization.\n * @param inputs Input values for the method.\n * @param outputs Output values from the method.\n * @returns Promise resolving to void.\n */\n async saveContext(inputs: InputValues, outputs: OutputValues): Promise<void> {\n await super.saveContext(inputs, outputs);\n\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const inputData = inputs[promptInputKey];\n\n for (const entity of this.entityCache) {\n const existingSummary = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n const output = await this.entitySummarizationChain.predict({\n summary: existingSummary,\n entity,\n history: serializedMessages,\n input: inputData,\n });\n if (output.trim() !== \"UNCHANGED\") {\n await this.entityStore.set(entity, output.trim());\n }\n }\n }\n\n // Clear memory contents.\n /**\n * Method to clear the memory contents.\n * @returns Promise resolving to void.\n */\n async clear() {\n await super.clear();\n await this.entityStore.clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEA,IAAa,eAAb,cAAkC,eAA4C;CAC5E;CAEA;CAEA;CAEA,cAAwB,CAAC;CAEzB,IAAI;CAEJ,iBAAiB;CAEjB;CAEA,cAAc;CAEd;CAEA;CAEA,YAAY,QAA2B;EACrC,MAAM;GACJ,aAAa,OAAO;GACpB,gBAAgB,OAAO,kBAAkB;GACzC,UAAU,OAAO;GACjB,WAAW,OAAO;EACpB,CAAC;EACD,KAAK,MAAM,OAAO;EAClB,KAAK,cAAc,OAAO;EAC1B,KAAK,WAAW,OAAO;EACvB,KAAK,iBAAiB,OAAO,kBAAkB,KAAK;EACpD,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,wBAAwB,IAAI,SAAS;GACxC,KAAK,KAAK;GACV,QAAQ,OAAO,0BAA0B;EAC3C,CAAC;EACD,KAAK,2BAA2B,IAAI,SAAS;GAC3C,KAAK,KAAK;GACV,QAAQ,OAAO,6BAA6B;EAC9C,CAAC;EACD,KAAK,cAAc,OAAO,eAAe,IAAI,oBAAoB;EACjE,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,IAAI,OAAO,KAAK,KAAK;CAC5B;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,cAAc;CAC7B;CAGA,IAAI,kBAA4B;EAC9B,OAAO,CAAC,KAAK,aAAa,KAAK,cAAc;CAC/C;;;;;;CAQA,MAAM,oBAAoB,QAA+C;EACvE,MAAM,iBACJ,KAAK,YAAY,kBAAkB,QAAQ,KAAK,eAAe;EACjE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,MAAM,qBAAqB,gBACzB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,SAAS,MAAM,KAAK,sBAAsB,QAAQ;GACtD,SAAS;GACT,OAAO,OAAO;EAChB,CAAC;EACD,MAAM,WACJ,OAAO,KAAK,MAAM,SAAS,CAAC,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC;EACvE,MAAM,kBAAyD,CAAC;EAEhE,KAAK,MAAM,UAAU,UACnB,gBAAgB,UAAU,MAAM,KAAK,YAAY,IAC/C,QACA,+BACF;EAEF,KAAK,cAAc,CAAC,GAAG,QAAQ;EAC/B,MAAM,SAAS,KAAK,iBAChB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,IAC1B;EAEJ,OAAO;IACJ,KAAK,iBAAiB;IACtB,KAAK,cAAc;EACtB;CACF;;;;;;;;CAUA,MAAM,YAAY,QAAqB,SAAsC;EAC3E,MAAM,MAAM,YAAY,QAAQ,OAAO;EAEvC,MAAM,iBACJ,KAAK,YAAY,kBAAkB,QAAQ,KAAK,eAAe;EAEjE,MAAM,qBAAqB,iBACzB,MAFqB,KAAK,YAAY,YAAY,EAAA,CAEzC,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,YAAY,OAAO;EAEzB,KAAK,MAAM,UAAU,KAAK,aAAa;GACrC,MAAM,kBAAkB,MAAM,KAAK,YAAY,IAC7C,QACA,+BACF;GACA,MAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;IACzD,SAAS;IACT;IACA,SAAS;IACT,OAAO;GACT,CAAC;GACD,IAAI,OAAO,KAAK,MAAM,aACpB,MAAM,KAAK,YAAY,IAAI,QAAQ,OAAO,KAAK,CAAC;EAEpD;CACF;;;;;CAOA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,MAAM,KAAK,YAAY,MAAM;CAC/B;AACF"}
1
+ {"version":3,"file":"entity_memory.js","names":[],"sources":["../../src/memory/entity_memory.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { PromptTemplate } from \"@langchain/core/prompts\";\n\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n getPromptInputKey,\n} from \"@langchain/core/memory\";\nimport { getBufferString } from \"@langchain/core/messages\";\nimport { InMemoryEntityStore } from \"./stores/entity/in_memory.js\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport {\n ENTITY_EXTRACTION_PROMPT,\n ENTITY_SUMMARIZATION_PROMPT,\n} from \"./prompt.js\";\nimport { BaseEntityStore } from \"./stores/entity/base.js\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters required by the EntityMemory class.\n */\nexport interface EntityMemoryInput extends BaseChatMemoryInput {\n llm: BaseLanguageModelInterface;\n humanPrefix?: string;\n aiPrefix?: string;\n entityExtractionPrompt?: PromptTemplate;\n entitySummarizationPrompt?: PromptTemplate;\n entityCache?: string[];\n k?: number;\n chatHistoryKey?: string;\n entitiesKey?: string;\n entityStore?: BaseEntityStore;\n}\n\n// Entity extractor & summarizer to memory.\n/**\n * Class for managing entity extraction and summarization to memory in\n * chatbot applications. Extends the BaseChatMemory class and implements\n * the EntityMemoryInput interface.\n * @example\n * ```typescript\n * const memory = new EntityMemory({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0 }),\n * chatHistoryKey: \"history\",\n * entitiesKey: \"entities\",\n * });\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9 });\n * const chain = new LLMChain({\n * llm: model,\n * prompt: ENTITY_MEMORY_CONVERSATION_TEMPLATE,\n * memory,\n * });\n *\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({\n * res1,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * const res2 = await chain.call({\n * input: \"I work in construction. What about you?\",\n * });\n * console.log({\n * res2,\n * memory: await memory.loadMemoryVariables({ input: \"Who is Jim?\" }),\n * });\n *\n * ```\n */\nexport class EntityMemory extends BaseChatMemory implements EntityMemoryInput {\n private entityExtractionChain: LLMChain;\n\n private entitySummarizationChain: LLMChain;\n\n entityStore: BaseEntityStore;\n\n entityCache: string[] = [];\n\n k = 3;\n\n chatHistoryKey = \"history\";\n\n llm: BaseLanguageModelInterface;\n\n entitiesKey = \"entities\";\n\n humanPrefix?: string;\n\n aiPrefix?: string;\n\n constructor(fields: EntityMemoryInput) {\n super({\n chatHistory: fields.chatHistory,\n returnMessages: fields.returnMessages ?? false,\n inputKey: fields.inputKey,\n outputKey: fields.outputKey,\n });\n this.llm = fields.llm;\n this.humanPrefix = fields.humanPrefix;\n this.aiPrefix = fields.aiPrefix;\n this.chatHistoryKey = fields.chatHistoryKey ?? this.chatHistoryKey;\n this.entitiesKey = fields.entitiesKey ?? this.entitiesKey;\n this.entityExtractionChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entityExtractionPrompt ?? ENTITY_EXTRACTION_PROMPT,\n });\n this.entitySummarizationChain = new LLMChain({\n llm: this.llm,\n prompt: fields.entitySummarizationPrompt ?? ENTITY_SUMMARIZATION_PROMPT,\n });\n this.entityStore = fields.entityStore ?? new InMemoryEntityStore();\n this.entityCache = fields.entityCache ?? this.entityCache;\n this.k = fields.k ?? this.k;\n }\n\n get memoryKeys() {\n return [this.chatHistoryKey];\n }\n\n // Will always return list of memory variables.\n get memoryVariables(): string[] {\n return [this.entitiesKey, this.chatHistoryKey];\n }\n\n // Return history buffer.\n /**\n * Method to load memory variables and perform entity extraction.\n * @param inputs Input values for the method.\n * @returns Promise resolving to an object containing memory variables.\n */\n async loadMemoryVariables(inputs: InputValues): Promise<MemoryVariables> {\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const output = await this.entityExtractionChain.predict({\n history: serializedMessages,\n input: inputs[promptInputKey],\n });\n const entities: string[] =\n output.trim() === \"NONE\" ? [] : output.split(\",\").map((w) => w.trim());\n const entitySummaries: { [key: string]: string | undefined } = {};\n\n for (const entity of entities) {\n entitySummaries[entity] = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n }\n this.entityCache = [...entities];\n const buffer = this.returnMessages\n ? messages.slice(-this.k * 2)\n : serializedMessages;\n\n return {\n [this.chatHistoryKey]: buffer,\n [this.entitiesKey]: entitySummaries,\n };\n }\n\n // Save context from this conversation to buffer.\n /**\n * Method to save the context from a conversation to a buffer and perform\n * entity summarization.\n * @param inputs Input values for the method.\n * @param outputs Output values from the method.\n * @returns Promise resolving to void.\n */\n async saveContext(inputs: InputValues, outputs: OutputValues): Promise<void> {\n await super.saveContext(inputs, outputs);\n\n const promptInputKey =\n this.inputKey ?? getPromptInputKey(inputs, this.memoryVariables);\n const messages = await this.chatHistory.getMessages();\n const serializedMessages = getBufferString(\n messages.slice(-this.k * 2),\n this.humanPrefix,\n this.aiPrefix\n );\n const inputData = inputs[promptInputKey];\n\n for (const entity of this.entityCache) {\n const existingSummary = await this.entityStore.get(\n entity,\n \"No current information known.\"\n );\n const output = await this.entitySummarizationChain.predict({\n summary: existingSummary,\n entity,\n history: serializedMessages,\n input: inputData,\n });\n if (output.trim() !== \"UNCHANGED\") {\n await this.entityStore.set(entity, output.trim());\n }\n }\n }\n\n // Clear memory contents.\n /**\n * Method to clear the memory contents.\n * @returns Promise resolving to void.\n */\n async clear() {\n await super.clear();\n await this.entityStore.clear();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsEA,IAAa,eAAb,cAAkC,eAA4C;CAC5E;CAEA;CAEA;CAEA,cAAwB,CAAC;CAEzB,IAAI;CAEJ,iBAAiB;CAEjB;CAEA,cAAc;CAEd;CAEA;CAEA,YAAY,QAA2B;EACrC,MAAM;GACJ,aAAa,OAAO;GACpB,gBAAgB,OAAO,kBAAkB;GACzC,UAAU,OAAO;GACjB,WAAW,OAAO;EACpB,CAAC;EACD,KAAK,MAAM,OAAO;EAClB,KAAK,cAAc,OAAO;EAC1B,KAAK,WAAW,OAAO;EACvB,KAAK,iBAAiB,OAAO,kBAAkB,KAAK;EACpD,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,wBAAwB,IAAI,SAAS;GACxC,KAAK,KAAK;GACV,QAAQ,OAAO,0BAA0B;EAC3C,CAAC;EACD,KAAK,2BAA2B,IAAI,SAAS;GAC3C,KAAK,KAAK;GACV,QAAQ,OAAO,6BAA6B;EAC9C,CAAC;EACD,KAAK,cAAc,OAAO,eAAe,IAAI,oBAAoB;EACjE,KAAK,cAAc,OAAO,eAAe,KAAK;EAC9C,KAAK,IAAI,OAAO,KAAK,KAAK;CAC5B;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,cAAc;CAC7B;CAGA,IAAI,kBAA4B;EAC9B,OAAO,CAAC,KAAK,aAAa,KAAK,cAAc;CAC/C;;;;;;CAQA,MAAM,oBAAoB,QAA+C;EACvE,MAAM,iBACJ,KAAK,YAAY,kBAAkB,QAAQ,KAAK,eAAe;EACjE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,MAAM,qBAAqB,gBACzB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,SAAS,MAAM,KAAK,sBAAsB,QAAQ;GACtD,SAAS;GACT,OAAO,OAAO;EAChB,CAAC;EACD,MAAM,WACJ,OAAO,KAAK,MAAM,SAAS,CAAC,IAAI,OAAO,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,CAAC;EACvE,MAAM,kBAAyD,CAAC;EAEhE,KAAK,MAAM,UAAU,UACnB,gBAAgB,UAAU,MAAM,KAAK,YAAY,IAC/C,QACA,+BACF;EAEF,KAAK,cAAc,CAAC,GAAG,QAAQ;EAC/B,MAAM,SAAS,KAAK,iBAChB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,IAC1B;EAEJ,OAAO;IACJ,KAAK,iBAAiB;IACtB,KAAK,cAAc;EACtB;CACF;;;;;;;;CAUA,MAAM,YAAY,QAAqB,SAAsC;EAC3E,MAAM,MAAM,YAAY,QAAQ,OAAO;EAEvC,MAAM,iBACJ,KAAK,YAAY,kBAAkB,QAAQ,KAAK,eAAe;EACjE,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,MAAM,qBAAqB,gBACzB,SAAS,MAAM,CAAC,KAAK,IAAI,CAAC,GAC1B,KAAK,aACL,KAAK,QACP;EACA,MAAM,YAAY,OAAO;EAEzB,KAAK,MAAM,UAAU,KAAK,aAAa;GACrC,MAAM,kBAAkB,MAAM,KAAK,YAAY,IAC7C,QACA,+BACF;GACA,MAAM,SAAS,MAAM,KAAK,yBAAyB,QAAQ;IACzD,SAAS;IACT;IACA,SAAS;IACT,OAAO;GACT,CAAC;GACD,IAAI,OAAO,KAAK,MAAM,aACpB,MAAM,KAAK,YAAY,IAAI,QAAQ,OAAO,KAAK,CAAC;EAEpD;CACF;;;;;CAOA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,MAAM,KAAK,YAAY,MAAM;CAC/B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"summary.cjs","names":["BaseChatMemory","SUMMARY_PROMPT","SystemMessage","LLMChain"],"sources":["../../src/memory/summary.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n BaseMessage,\n SystemMessage,\n getBufferString,\n} from \"@langchain/core/messages\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport { SUMMARY_PROMPT } from \"./prompt.js\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the ConversationSummaryMemory\n * class.\n */\nexport interface ConversationSummaryMemoryInput extends BaseConversationSummaryMemoryInput {}\n\n/**\n * Interface for the input parameters of the BaseConversationSummaryMemory\n * class.\n */\nexport interface BaseConversationSummaryMemoryInput extends BaseChatMemoryInput {\n llm: BaseLanguageModelInterface;\n memoryKey?: string;\n humanPrefix?: string;\n aiPrefix?: string;\n prompt?: BasePromptTemplate;\n summaryChatMessageClass?: new (content: string) => BaseMessage;\n}\n\n/**\n * Abstract class that provides a structure for storing and managing the\n * memory of a conversation. It includes methods for predicting a new\n * summary for the conversation given the existing messages and summary.\n */\nexport abstract class BaseConversationSummaryMemory extends BaseChatMemory {\n memoryKey = \"history\";\n\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n llm: BaseLanguageModelInterface;\n\n prompt: BasePromptTemplate = SUMMARY_PROMPT;\n\n summaryChatMessageClass: new (content: string) => BaseMessage = SystemMessage;\n\n constructor(fields: BaseConversationSummaryMemoryInput) {\n const {\n returnMessages,\n inputKey,\n outputKey,\n chatHistory,\n humanPrefix,\n aiPrefix,\n llm,\n prompt,\n summaryChatMessageClass,\n } = fields;\n\n super({ returnMessages, inputKey, outputKey, chatHistory });\n\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n this.humanPrefix = humanPrefix ?? this.humanPrefix;\n this.aiPrefix = aiPrefix ?? this.aiPrefix;\n this.llm = llm;\n this.prompt = prompt ?? this.prompt;\n this.summaryChatMessageClass =\n summaryChatMessageClass ?? this.summaryChatMessageClass;\n }\n\n /**\n * Predicts a new summary for the conversation given the existing messages\n * and summary.\n * @param messages Existing messages in the conversation.\n * @param existingSummary Current summary of the conversation.\n * @returns A promise that resolves to a new summary string.\n */\n async predictNewSummary(\n messages: BaseMessage[],\n existingSummary: string\n ): Promise<string> {\n const newLines = getBufferString(messages, this.humanPrefix, this.aiPrefix);\n const chain = new LLMChain({ llm: this.llm, prompt: this.prompt });\n return await chain.predict({\n summary: existingSummary,\n new_lines: newLines,\n });\n }\n}\n\n/**\n * Class that provides a concrete implementation of the conversation\n * memory. It includes methods for loading memory variables, saving\n * context, and clearing the memory.\n * @example\n * ```typescript\n * const memory = new ConversationSummaryMemory({\n * memoryKey: \"chat_history\",\n * llm: new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 }),\n * });\n *\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n * const prompt =\n * PromptTemplate.fromTemplate(`The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n *\n * Current conversation:\n * {chat_history}\n * Human: {input}\n * AI:`);\n * const chain = new LLMChain({ llm: model, prompt, memory });\n *\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({ res1, memory: await memory.loadMemoryVariables({}) });\n *\n * const res2 = await chain.call({ input: \"What's my name?\" });\n * console.log({ res2, memory: await memory.loadMemoryVariables({}) });\n *\n * ```\n */\nexport class ConversationSummaryMemory extends BaseConversationSummaryMemory {\n buffer = \"\";\n\n constructor(fields: ConversationSummaryMemoryInput) {\n super(fields);\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Loads the memory variables for the conversation memory.\n * @returns A promise that resolves to an object containing the memory variables.\n */\n async loadMemoryVariables(_: InputValues): Promise<MemoryVariables> {\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: [new this.summaryChatMessageClass(this.buffer)],\n };\n return result;\n }\n const result = { [this.memoryKey]: this.buffer };\n return result;\n }\n\n /**\n * Saves the context of the conversation memory.\n * @param inputValues Input values for the conversation.\n * @param outputValues Output values from the conversation.\n * @returns A promise that resolves when the context has been saved.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n await super.saveContext(inputValues, outputValues);\n const messages = await this.chatHistory.getMessages();\n this.buffer = await this.predictNewSummary(messages.slice(-2), this.buffer);\n }\n\n /**\n * Clears the conversation memory.\n * @returns A promise that resolves when the memory has been cleared.\n */\n async clear() {\n await super.clear();\n this.buffer = \"\";\n }\n}\n"],"mappings":";;;;;;;;;;AAwCA,IAAsB,gCAAtB,cAA4DA,2BAAAA,eAAe;CACzE,YAAY;CAEZ,cAAc;CAEd,WAAW;CAEX;CAEA,SAA6BC,eAAAA;CAE7B,0BAAgEC,yBAAAA;CAEhE,YAAY,QAA4C;EACtD,MAAM,EACJ,gBACA,UACA,WACA,aACA,aACA,UACA,KACA,QACA,4BACE;EAEJ,MAAM;GAAE;GAAgB;GAAU;GAAW;EAAY,CAAC;EAE1D,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,cAAc,eAAe,KAAK;EACvC,KAAK,WAAW,YAAY,KAAK;EACjC,KAAK,MAAM;EACX,KAAK,SAAS,UAAU,KAAK;EAC7B,KAAK,0BACH,2BAA2B,KAAK;CACpC;;;;;;;;CASA,MAAM,kBACJ,UACA,iBACiB;EACjB,MAAM,YAAA,GAAA,yBAAA,gBAAA,CAA2B,UAAU,KAAK,aAAa,KAAK,QAAQ;EAE1E,OAAO,MAAM,IADKC,kBAAAA,SAAS;GAAE,KAAK,KAAK;GAAK,QAAQ,KAAK;EAAO,CAC/C,CAAC,CAAC,QAAQ;GACzB,SAAS;GACT,WAAW;EACb,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAa,4BAAb,cAA+C,8BAA8B;CAC3E,SAAS;CAET,YAAY,QAAwC;EAClD,MAAM,MAAM;CACd;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;CAMA,MAAM,oBAAoB,GAA0C;EAClE,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,CAAC,IAAI,KAAK,wBAAwB,KAAK,MAAM,CAAC,EAEtD;EAGd,OAAO,GADW,KAAK,YAAY,KAAK,OAC5B;CACd;;;;;;;CAQA,MAAM,YACJ,aACA,cACe;EACf,MAAM,MAAM,YAAY,aAAa,YAAY;EACjD,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,KAAK,SAAS,MAAM,KAAK,kBAAkB,SAAS,MAAM,EAAE,GAAG,KAAK,MAAM;CAC5E;;;;;CAMA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,KAAK,SAAS;CAChB;AACF"}
1
+ {"version":3,"file":"summary.cjs","names":["BaseChatMemory","SUMMARY_PROMPT","SystemMessage","getBufferString","LLMChain"],"sources":["../../src/memory/summary.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport {\n BaseMessage,\n SystemMessage,\n getBufferString,\n} from \"@langchain/core/messages\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport { SUMMARY_PROMPT } from \"./prompt.js\";\nimport { BaseChatMemory, BaseChatMemoryInput } from \"./chat_memory.js\";\n\n/**\n * Interface for the input parameters of the ConversationSummaryMemory\n * class.\n */\nexport interface ConversationSummaryMemoryInput extends BaseConversationSummaryMemoryInput {}\n\n/**\n * Interface for the input parameters of the BaseConversationSummaryMemory\n * class.\n */\nexport interface BaseConversationSummaryMemoryInput extends BaseChatMemoryInput {\n llm: BaseLanguageModelInterface;\n memoryKey?: string;\n humanPrefix?: string;\n aiPrefix?: string;\n prompt?: BasePromptTemplate;\n summaryChatMessageClass?: new (content: string) => BaseMessage;\n}\n\n/**\n * Abstract class that provides a structure for storing and managing the\n * memory of a conversation. It includes methods for predicting a new\n * summary for the conversation given the existing messages and summary.\n */\nexport abstract class BaseConversationSummaryMemory extends BaseChatMemory {\n memoryKey = \"history\";\n\n humanPrefix = \"Human\";\n\n aiPrefix = \"AI\";\n\n llm: BaseLanguageModelInterface;\n\n prompt: BasePromptTemplate = SUMMARY_PROMPT;\n\n summaryChatMessageClass: new (content: string) => BaseMessage = SystemMessage;\n\n constructor(fields: BaseConversationSummaryMemoryInput) {\n const {\n returnMessages,\n inputKey,\n outputKey,\n chatHistory,\n humanPrefix,\n aiPrefix,\n llm,\n prompt,\n summaryChatMessageClass,\n } = fields;\n\n super({ returnMessages, inputKey, outputKey, chatHistory });\n\n this.memoryKey = fields?.memoryKey ?? this.memoryKey;\n this.humanPrefix = humanPrefix ?? this.humanPrefix;\n this.aiPrefix = aiPrefix ?? this.aiPrefix;\n this.llm = llm;\n this.prompt = prompt ?? this.prompt;\n this.summaryChatMessageClass =\n summaryChatMessageClass ?? this.summaryChatMessageClass;\n }\n\n /**\n * Predicts a new summary for the conversation given the existing messages\n * and summary.\n * @param messages Existing messages in the conversation.\n * @param existingSummary Current summary of the conversation.\n * @returns A promise that resolves to a new summary string.\n */\n async predictNewSummary(\n messages: BaseMessage[],\n existingSummary: string\n ): Promise<string> {\n const newLines = getBufferString(messages, this.humanPrefix, this.aiPrefix);\n const chain = new LLMChain({ llm: this.llm, prompt: this.prompt });\n return await chain.predict({\n summary: existingSummary,\n new_lines: newLines,\n });\n }\n}\n\n/**\n * Class that provides a concrete implementation of the conversation\n * memory. It includes methods for loading memory variables, saving\n * context, and clearing the memory.\n * @example\n * ```typescript\n * const memory = new ConversationSummaryMemory({\n * memoryKey: \"chat_history\",\n * llm: new ChatOpenAI({ model: \"gpt-3.5-turbo\", temperature: 0 }),\n * });\n *\n * const model = new ChatOpenAI({ model: \"gpt-4o-mini\" });\n * const prompt =\n * PromptTemplate.fromTemplate(`The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\n *\n * Current conversation:\n * {chat_history}\n * Human: {input}\n * AI:`);\n * const chain = new LLMChain({ llm: model, prompt, memory });\n *\n * const res1 = await chain.call({ input: \"Hi! I'm Jim.\" });\n * console.log({ res1, memory: await memory.loadMemoryVariables({}) });\n *\n * const res2 = await chain.call({ input: \"What's my name?\" });\n * console.log({ res2, memory: await memory.loadMemoryVariables({}) });\n *\n * ```\n */\nexport class ConversationSummaryMemory extends BaseConversationSummaryMemory {\n buffer = \"\";\n\n constructor(fields: ConversationSummaryMemoryInput) {\n super(fields);\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Loads the memory variables for the conversation memory.\n * @returns A promise that resolves to an object containing the memory variables.\n */\n async loadMemoryVariables(_: InputValues): Promise<MemoryVariables> {\n if (this.returnMessages) {\n const result = {\n [this.memoryKey]: [new this.summaryChatMessageClass(this.buffer)],\n };\n return result;\n }\n const result = { [this.memoryKey]: this.buffer };\n return result;\n }\n\n /**\n * Saves the context of the conversation memory.\n * @param inputValues Input values for the conversation.\n * @param outputValues Output values from the conversation.\n * @returns A promise that resolves when the context has been saved.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n await super.saveContext(inputValues, outputValues);\n const messages = await this.chatHistory.getMessages();\n this.buffer = await this.predictNewSummary(messages.slice(-2), this.buffer);\n }\n\n /**\n * Clears the conversation memory.\n * @returns A promise that resolves when the memory has been cleared.\n */\n async clear() {\n await super.clear();\n this.buffer = \"\";\n }\n}\n"],"mappings":";;;;;;;;;;AAwCA,IAAsB,gCAAtB,cAA4DA,2BAAAA,eAAe;CACzE,YAAY;CAEZ,cAAc;CAEd,WAAW;CAEX;CAEA,SAA6BC,eAAAA;CAE7B,0BAAgEC,yBAAAA;CAEhE,YAAY,QAA4C;EACtD,MAAM,EACJ,gBACA,UACA,WACA,aACA,aACA,UACA,KACA,QACA,4BACE;EAEJ,MAAM;GAAE;GAAgB;GAAU;GAAW;EAAY,CAAC;EAE1D,KAAK,YAAY,QAAQ,aAAa,KAAK;EAC3C,KAAK,cAAc,eAAe,KAAK;EACvC,KAAK,WAAW,YAAY,KAAK;EACjC,KAAK,MAAM;EACX,KAAK,SAAS,UAAU,KAAK;EAC7B,KAAK,0BACH,2BAA2B,KAAK;CACpC;;;;;;;;CASA,MAAM,kBACJ,UACA,iBACiB;EACjB,MAAM,YAAA,GAAWC,yBAAAA,gBAAAA,CAAgB,UAAU,KAAK,aAAa,KAAK,QAAQ;EAE1E,OAAO,MAAM,IADKC,kBAAAA,SAAS;GAAE,KAAK,KAAK;GAAK,QAAQ,KAAK;EAAO,CAC/C,CAAC,CAAC,QAAQ;GACzB,SAAS;GACT,WAAW;EACb,CAAC;CACH;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAa,4BAAb,cAA+C,8BAA8B;CAC3E,SAAS;CAET,YAAY,QAAwC;EAClD,MAAM,MAAM;CACd;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;CAMA,MAAM,oBAAoB,GAA0C;EAClE,IAAI,KAAK,gBAIP,OAAO,GAFJ,KAAK,YAAY,CAAC,IAAI,KAAK,wBAAwB,KAAK,MAAM,CAAC,EAEtD;EAGd,OAAO,GADW,KAAK,YAAY,KAAK,OAC5B;CACd;;;;;;;CAQA,MAAM,YACJ,aACA,cACe;EACf,MAAM,MAAM,YAAY,aAAa,YAAY;EACjD,MAAM,WAAW,MAAM,KAAK,YAAY,YAAY;EACpD,KAAK,SAAS,MAAM,KAAK,kBAAkB,SAAS,MAAM,EAAE,GAAG,KAAK,MAAM;CAC5E;;;;;CAMA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,KAAK,SAAS;CAChB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"summary_buffer.cjs","names":["BaseConversationSummaryMemory"],"sources":["../../src/memory/summary_buffer.ts"],"sourcesContent":["import { getBufferString } from \"@langchain/core/messages\";\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport {\n BaseConversationSummaryMemory,\n BaseConversationSummaryMemoryInput,\n} from \"./summary.js\";\n\n/**\n * Interface for the input parameters of the\n * ConversationSummaryBufferMemory class.\n */\nexport interface ConversationSummaryBufferMemoryInput extends BaseConversationSummaryMemoryInput {\n maxTokenLimit?: number;\n}\n\n/**\n * Class that extends BaseConversationSummaryMemory and implements\n * ConversationSummaryBufferMemoryInput. It manages the conversation\n * history in a LangChain application by maintaining a buffer of chat\n * messages and providing methods to load, save, prune, and clear the\n * memory.\n * @example\n * ```typescript\n * // Initialize the memory with a specific model and token limit\n * const memory = new ConversationSummaryBufferMemory({\n * llm: new ChatOpenAI({ model: \"gpt-3.5-turbo-instruct\", temperature: 0 }),\n * maxTokenLimit: 10,\n * });\n *\n * // Save conversation context to memory\n * await memory.saveContext({ input: \"hi\" }, { output: \"whats up\" });\n * await memory.saveContext({ input: \"not much you\" }, { output: \"not much\" });\n *\n * // Load the conversation history from memory\n * const history = await memory.loadMemoryVariables({});\n * console.log({ history });\n *\n * // Create a chat prompt using the conversation history\n * const chatPrompt = ChatPromptTemplate.fromMessages([\n * SystemMessagePromptTemplate.fromTemplate(\n * \"The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\",\n * ),\n * new MessagesPlaceholder(\"history\"),\n * HumanMessagePromptTemplate.fromTemplate(\"{input}\"),\n * ]);\n *\n * // Initialize the conversation chain with the model, memory, and prompt\n * const chain = new ConversationChain({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9, verbose: true }),\n * memory: memory,\n * prompt: chatPrompt,\n * });\n * ```\n */\nexport class ConversationSummaryBufferMemory\n extends BaseConversationSummaryMemory\n implements ConversationSummaryBufferMemoryInput\n{\n movingSummaryBuffer = \"\";\n\n maxTokenLimit = 2000;\n\n constructor(fields: ConversationSummaryBufferMemoryInput) {\n super(fields);\n\n this.maxTokenLimit = fields?.maxTokenLimit ?? this.maxTokenLimit;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Method that loads the chat messages from the memory and returns them as\n * a string or as a list of messages, depending on the returnMessages\n * property.\n * @param _ InputValues object, not used in this method.\n * @returns Promise that resolves with MemoryVariables object containing the loaded chat messages.\n */\n async loadMemoryVariables(_?: InputValues): Promise<MemoryVariables> {\n let buffer = await this.chatHistory.getMessages();\n if (this.movingSummaryBuffer) {\n buffer = [\n new this.summaryChatMessageClass(this.movingSummaryBuffer),\n ...buffer,\n ];\n }\n\n let finalBuffer;\n if (this.returnMessages) {\n finalBuffer = buffer;\n } else {\n finalBuffer = getBufferString(buffer, this.humanPrefix, this.aiPrefix);\n }\n\n return { [this.memoryKey]: finalBuffer };\n }\n\n /**\n * Method that saves the context of the conversation, including the input\n * and output values, and prunes the memory if it exceeds the maximum\n * token limit.\n * @param inputValues InputValues object containing the input values of the conversation.\n * @param outputValues OutputValues object containing the output values of the conversation.\n * @returns Promise that resolves when the context is saved and the memory is pruned.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n await super.saveContext(inputValues, outputValues);\n await this.prune();\n }\n\n /**\n * Method that prunes the memory if the total number of tokens in the\n * buffer exceeds the maxTokenLimit. It removes messages from the\n * beginning of the buffer until the total number of tokens is within the\n * limit.\n * @returns Promise that resolves when the memory is pruned.\n */\n async prune() {\n // Prune buffer if it exceeds max token limit\n let buffer = await this.chatHistory.getMessages();\n if (this.movingSummaryBuffer) {\n buffer = [\n new this.summaryChatMessageClass(this.movingSummaryBuffer),\n ...buffer,\n ];\n }\n\n let currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n\n if (currBufferLength > this.maxTokenLimit) {\n const prunedMemory = [];\n while (currBufferLength > this.maxTokenLimit) {\n const poppedMessage = buffer.shift();\n if (poppedMessage) {\n prunedMemory.push(poppedMessage);\n currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n }\n }\n this.movingSummaryBuffer = await this.predictNewSummary(\n prunedMemory,\n this.movingSummaryBuffer\n );\n }\n }\n\n /**\n * Method that clears the memory and resets the movingSummaryBuffer.\n * @returns Promise that resolves when the memory is cleared.\n */\n async clear() {\n await super.clear();\n this.movingSummaryBuffer = \"\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DA,IAAa,kCAAb,cACUA,gBAAAA,8BAEV;CACE,sBAAsB;CAEtB,gBAAgB;CAEhB,YAAY,QAA8C;EACxD,MAAM,MAAM;EAEZ,KAAK,gBAAgB,QAAQ,iBAAiB,KAAK;CACrD;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,GAA2C;EACnE,IAAI,SAAS,MAAM,KAAK,YAAY,YAAY;EAChD,IAAI,KAAK,qBACP,SAAS,CACP,IAAI,KAAK,wBAAwB,KAAK,mBAAmB,GACzD,GAAG,MACL;EAGF,IAAI;EACJ,IAAI,KAAK,gBACP,cAAc;OAEd,eAAA,GAAA,yBAAA,gBAAA,CAA8B,QAAQ,KAAK,aAAa,KAAK,QAAQ;EAGvE,OAAO,GAAG,KAAK,YAAY,YAAY;CACzC;;;;;;;;;CAUA,MAAM,YACJ,aACA,cACe;EACf,MAAM,MAAM,YAAY,aAAa,YAAY;EACjD,MAAM,KAAK,MAAM;CACnB;;;;;;;;CASA,MAAM,QAAQ;EAEZ,IAAI,SAAS,MAAM,KAAK,YAAY,YAAY;EAChD,IAAI,KAAK,qBACP,SAAS,CACP,IAAI,KAAK,wBAAwB,KAAK,mBAAmB,GACzD,GAAG,MACL;EAGF,IAAI,mBAAmB,MAAM,KAAK,IAAI,cAAA,GAAA,yBAAA,gBAAA,CACpB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;EAEA,IAAI,mBAAmB,KAAK,eAAe;GACzC,MAAM,eAAe,CAAC;GACtB,OAAO,mBAAmB,KAAK,eAAe;IAC5C,MAAM,gBAAgB,OAAO,MAAM;IACnC,IAAI,eAAe;KACjB,aAAa,KAAK,aAAa;KAC/B,mBAAmB,MAAM,KAAK,IAAI,cAAA,GAAA,yBAAA,gBAAA,CAChB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;IACF;GACF;GACA,KAAK,sBAAsB,MAAM,KAAK,kBACpC,cACA,KAAK,mBACP;EACF;CACF;;;;;CAMA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,KAAK,sBAAsB;CAC7B;AACF"}
1
+ {"version":3,"file":"summary_buffer.cjs","names":["BaseConversationSummaryMemory","getBufferString"],"sources":["../../src/memory/summary_buffer.ts"],"sourcesContent":["import { getBufferString } from \"@langchain/core/messages\";\nimport {\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport {\n BaseConversationSummaryMemory,\n BaseConversationSummaryMemoryInput,\n} from \"./summary.js\";\n\n/**\n * Interface for the input parameters of the\n * ConversationSummaryBufferMemory class.\n */\nexport interface ConversationSummaryBufferMemoryInput extends BaseConversationSummaryMemoryInput {\n maxTokenLimit?: number;\n}\n\n/**\n * Class that extends BaseConversationSummaryMemory and implements\n * ConversationSummaryBufferMemoryInput. It manages the conversation\n * history in a LangChain application by maintaining a buffer of chat\n * messages and providing methods to load, save, prune, and clear the\n * memory.\n * @example\n * ```typescript\n * // Initialize the memory with a specific model and token limit\n * const memory = new ConversationSummaryBufferMemory({\n * llm: new ChatOpenAI({ model: \"gpt-3.5-turbo-instruct\", temperature: 0 }),\n * maxTokenLimit: 10,\n * });\n *\n * // Save conversation context to memory\n * await memory.saveContext({ input: \"hi\" }, { output: \"whats up\" });\n * await memory.saveContext({ input: \"not much you\" }, { output: \"not much\" });\n *\n * // Load the conversation history from memory\n * const history = await memory.loadMemoryVariables({});\n * console.log({ history });\n *\n * // Create a chat prompt using the conversation history\n * const chatPrompt = ChatPromptTemplate.fromMessages([\n * SystemMessagePromptTemplate.fromTemplate(\n * \"The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.\",\n * ),\n * new MessagesPlaceholder(\"history\"),\n * HumanMessagePromptTemplate.fromTemplate(\"{input}\"),\n * ]);\n *\n * // Initialize the conversation chain with the model, memory, and prompt\n * const chain = new ConversationChain({\n * llm: new ChatOpenAI({ model: \"gpt-4o-mini\", temperature: 0.9, verbose: true }),\n * memory: memory,\n * prompt: chatPrompt,\n * });\n * ```\n */\nexport class ConversationSummaryBufferMemory\n extends BaseConversationSummaryMemory\n implements ConversationSummaryBufferMemoryInput\n{\n movingSummaryBuffer = \"\";\n\n maxTokenLimit = 2000;\n\n constructor(fields: ConversationSummaryBufferMemoryInput) {\n super(fields);\n\n this.maxTokenLimit = fields?.maxTokenLimit ?? this.maxTokenLimit;\n }\n\n get memoryKeys() {\n return [this.memoryKey];\n }\n\n /**\n * Method that loads the chat messages from the memory and returns them as\n * a string or as a list of messages, depending on the returnMessages\n * property.\n * @param _ InputValues object, not used in this method.\n * @returns Promise that resolves with MemoryVariables object containing the loaded chat messages.\n */\n async loadMemoryVariables(_?: InputValues): Promise<MemoryVariables> {\n let buffer = await this.chatHistory.getMessages();\n if (this.movingSummaryBuffer) {\n buffer = [\n new this.summaryChatMessageClass(this.movingSummaryBuffer),\n ...buffer,\n ];\n }\n\n let finalBuffer;\n if (this.returnMessages) {\n finalBuffer = buffer;\n } else {\n finalBuffer = getBufferString(buffer, this.humanPrefix, this.aiPrefix);\n }\n\n return { [this.memoryKey]: finalBuffer };\n }\n\n /**\n * Method that saves the context of the conversation, including the input\n * and output values, and prunes the memory if it exceeds the maximum\n * token limit.\n * @param inputValues InputValues object containing the input values of the conversation.\n * @param outputValues OutputValues object containing the output values of the conversation.\n * @returns Promise that resolves when the context is saved and the memory is pruned.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n await super.saveContext(inputValues, outputValues);\n await this.prune();\n }\n\n /**\n * Method that prunes the memory if the total number of tokens in the\n * buffer exceeds the maxTokenLimit. It removes messages from the\n * beginning of the buffer until the total number of tokens is within the\n * limit.\n * @returns Promise that resolves when the memory is pruned.\n */\n async prune() {\n // Prune buffer if it exceeds max token limit\n let buffer = await this.chatHistory.getMessages();\n if (this.movingSummaryBuffer) {\n buffer = [\n new this.summaryChatMessageClass(this.movingSummaryBuffer),\n ...buffer,\n ];\n }\n\n let currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n\n if (currBufferLength > this.maxTokenLimit) {\n const prunedMemory = [];\n while (currBufferLength > this.maxTokenLimit) {\n const poppedMessage = buffer.shift();\n if (poppedMessage) {\n prunedMemory.push(poppedMessage);\n currBufferLength = await this.llm.getNumTokens(\n getBufferString(buffer, this.humanPrefix, this.aiPrefix)\n );\n }\n }\n this.movingSummaryBuffer = await this.predictNewSummary(\n prunedMemory,\n this.movingSummaryBuffer\n );\n }\n }\n\n /**\n * Method that clears the memory and resets the movingSummaryBuffer.\n * @returns Promise that resolves when the memory is cleared.\n */\n async clear() {\n await super.clear();\n this.movingSummaryBuffer = \"\";\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DA,IAAa,kCAAb,cACUA,gBAAAA,8BAEV;CACE,sBAAsB;CAEtB,gBAAgB;CAEhB,YAAY,QAA8C;EACxD,MAAM,MAAM;EAEZ,KAAK,gBAAgB,QAAQ,iBAAiB,KAAK;CACrD;CAEA,IAAI,aAAa;EACf,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,GAA2C;EACnE,IAAI,SAAS,MAAM,KAAK,YAAY,YAAY;EAChD,IAAI,KAAK,qBACP,SAAS,CACP,IAAI,KAAK,wBAAwB,KAAK,mBAAmB,GACzD,GAAG,MACL;EAGF,IAAI;EACJ,IAAI,KAAK,gBACP,cAAc;OAEd,eAAA,GAAcC,yBAAAA,gBAAAA,CAAgB,QAAQ,KAAK,aAAa,KAAK,QAAQ;EAGvE,OAAO,GAAG,KAAK,YAAY,YAAY;CACzC;;;;;;;;;CAUA,MAAM,YACJ,aACA,cACe;EACf,MAAM,MAAM,YAAY,aAAa,YAAY;EACjD,MAAM,KAAK,MAAM;CACnB;;;;;;;;CASA,MAAM,QAAQ;EAEZ,IAAI,SAAS,MAAM,KAAK,YAAY,YAAY;EAChD,IAAI,KAAK,qBACP,SAAS,CACP,IAAI,KAAK,wBAAwB,KAAK,mBAAmB,GACzD,GAAG,MACL;EAGF,IAAI,mBAAmB,MAAM,KAAK,IAAI,cAAA,GACpCA,yBAAAA,gBAAAA,CAAgB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;EAEA,IAAI,mBAAmB,KAAK,eAAe;GACzC,MAAM,eAAe,CAAC;GACtB,OAAO,mBAAmB,KAAK,eAAe;IAC5C,MAAM,gBAAgB,OAAO,MAAM;IACnC,IAAI,eAAe;KACjB,aAAa,KAAK,aAAa;KAC/B,mBAAmB,MAAM,KAAK,IAAI,cAAA,GAChCA,yBAAAA,gBAAAA,CAAgB,QAAQ,KAAK,aAAa,KAAK,QAAQ,CACzD;IACF;GACF;GACA,KAAK,sBAAsB,MAAM,KAAK,kBACpC,cACA,KAAK,mBACP;EACF;CACF;;;;;CAMA,MAAM,QAAQ;EACZ,MAAM,MAAM,MAAM;EAClB,KAAK,sBAAsB;CAC7B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"vector_store.cjs","names":["BaseMemory","formatDocumentsAsString","Document"],"sources":["../../src/memory/vector_store.ts"],"sourcesContent":["import type { VectorStoreRetrieverInterface } from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport {\n BaseMemory,\n getInputValue,\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport { formatDocumentsAsString } from \"../util/document.js\";\n\ntype Metadata = Record<string, unknown>;\ntype MetadataFunction = (\n inputValues?: InputValues,\n outputValues?: OutputValues\n) => Metadata;\n\n/**\n * Interface for the parameters required to initialize a\n * VectorStoreRetrieverMemory instance.\n */\nexport interface VectorStoreRetrieverMemoryParams {\n vectorStoreRetriever: VectorStoreRetrieverInterface;\n inputKey?: string;\n outputKey?: string;\n memoryKey?: string;\n returnDocs?: boolean;\n /**\n * Metadata to be added to the document when saving context.\n */\n metadata?: Metadata | MetadataFunction;\n}\n\n/**\n * Class for managing long-term memory in Large Language Model (LLM)\n * applications. It provides a way to persist and retrieve relevant\n * documents from a vector store database, which can be useful for\n * maintaining conversation history or other types of memory in an LLM\n * application.\n * @example\n * ```typescript\n * const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings());\n * const memory = new VectorStoreRetrieverMemory({\n * vectorStoreRetriever: vectorStore.asRetriever(1),\n * memoryKey: \"history\",\n * });\n *\n * // Saving context to memory\n * await memory.saveContext(\n * { input: \"My favorite food is pizza\" },\n * { output: \"thats good to know\" },\n * );\n * await memory.saveContext(\n * { input: \"My favorite sport is soccer\" },\n * { output: \"...\" },\n * );\n * await memory.saveContext({ input: \"I don't the Celtics\" }, { output: \"ok\" });\n *\n * // Loading memory variables\n * console.log(\n * await memory.loadMemoryVariables({ prompt: \"what sport should i watch?\" }),\n * );\n * ```\n */\nexport class VectorStoreRetrieverMemory\n extends BaseMemory\n implements VectorStoreRetrieverMemoryParams\n{\n vectorStoreRetriever: VectorStoreRetrieverInterface;\n\n inputKey?: string;\n\n memoryKey: string;\n\n returnDocs: boolean;\n\n metadata?: Metadata | MetadataFunction;\n\n constructor(fields: VectorStoreRetrieverMemoryParams) {\n super();\n this.vectorStoreRetriever = fields.vectorStoreRetriever;\n this.inputKey = fields.inputKey;\n this.memoryKey = fields.memoryKey ?? \"memory\";\n this.returnDocs = fields.returnDocs ?? false;\n this.metadata = fields.metadata;\n }\n\n get memoryKeys(): string[] {\n return [this.memoryKey];\n }\n\n /**\n * Method to load memory variables. It uses the vectorStoreRetriever to\n * get relevant documents based on the query obtained from the input\n * values.\n * @param values An InputValues object.\n * @returns A Promise that resolves to a MemoryVariables object.\n */\n async loadMemoryVariables(values: InputValues): Promise<MemoryVariables> {\n const query = getInputValue(values, this.inputKey);\n const results = await this.vectorStoreRetriever.invoke(query);\n return {\n [this.memoryKey]: this.returnDocs\n ? results\n : formatDocumentsAsString(results),\n };\n }\n\n /**\n * Method to save context. It constructs a document from the input and\n * output values (excluding the memory key) and adds it to the vector\n * store database using the vectorStoreRetriever.\n * @param inputValues An InputValues object.\n * @param outputValues An OutputValues object.\n * @returns A Promise that resolves to void.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n const metadata =\n typeof this.metadata === \"function\"\n ? this.metadata(inputValues, outputValues)\n : this.metadata;\n const text = Object.entries(inputValues)\n .filter(([k]) => k !== this.memoryKey)\n .concat(Object.entries(outputValues))\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"\\n\");\n await this.vectorStoreRetriever.addDocuments([\n new Document({ pageContent: text, metadata }),\n ]);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,IAAa,6BAAb,cACUA,uBAAAA,WAEV;CACE;CAEA;CAEA;CAEA;CAEA;CAEA,YAAY,QAA0C;EACpD,MAAM;EACN,KAAK,uBAAuB,OAAO;EACnC,KAAK,WAAW,OAAO;EACvB,KAAK,YAAY,OAAO,aAAa;EACrC,KAAK,aAAa,OAAO,cAAc;EACvC,KAAK,WAAW,OAAO;CACzB;CAEA,IAAI,aAAuB;EACzB,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,QAA+C;EACvE,MAAM,SAAA,GAAA,uBAAA,cAAA,CAAsB,QAAQ,KAAK,QAAQ;EACjD,MAAM,UAAU,MAAM,KAAK,qBAAqB,OAAO,KAAK;EAC5D,OAAO,GACJ,KAAK,YAAY,KAAK,aACnB,UACAC,sBAAAA,wBAAwB,OAAO,EACrC;CACF;;;;;;;;;CAUA,MAAM,YACJ,aACA,cACe;EACf,MAAM,WACJ,OAAO,KAAK,aAAa,aACrB,KAAK,SAAS,aAAa,YAAY,IACvC,KAAK;EACX,MAAM,OAAO,OAAO,QAAQ,WAAW,CAAC,CACrC,QAAQ,CAAC,OAAO,MAAM,KAAK,SAAS,CAAC,CACrC,OAAO,OAAO,QAAQ,YAAY,CAAC,CAAC,CACpC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,IAAI,GAAG,CAAC,CAC7B,KAAK,IAAI;EACZ,MAAM,KAAK,qBAAqB,aAAa,CAC3C,IAAIC,0BAAAA,SAAS;GAAE,aAAa;GAAM;EAAS,CAAC,CAC9C,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"vector_store.cjs","names":["BaseMemory","getInputValue","formatDocumentsAsString","Document"],"sources":["../../src/memory/vector_store.ts"],"sourcesContent":["import type { VectorStoreRetrieverInterface } from \"@langchain/core/vectorstores\";\nimport { Document } from \"@langchain/core/documents\";\nimport {\n BaseMemory,\n getInputValue,\n InputValues,\n MemoryVariables,\n OutputValues,\n} from \"@langchain/core/memory\";\nimport { formatDocumentsAsString } from \"../util/document.js\";\n\ntype Metadata = Record<string, unknown>;\ntype MetadataFunction = (\n inputValues?: InputValues,\n outputValues?: OutputValues\n) => Metadata;\n\n/**\n * Interface for the parameters required to initialize a\n * VectorStoreRetrieverMemory instance.\n */\nexport interface VectorStoreRetrieverMemoryParams {\n vectorStoreRetriever: VectorStoreRetrieverInterface;\n inputKey?: string;\n outputKey?: string;\n memoryKey?: string;\n returnDocs?: boolean;\n /**\n * Metadata to be added to the document when saving context.\n */\n metadata?: Metadata | MetadataFunction;\n}\n\n/**\n * Class for managing long-term memory in Large Language Model (LLM)\n * applications. It provides a way to persist and retrieve relevant\n * documents from a vector store database, which can be useful for\n * maintaining conversation history or other types of memory in an LLM\n * application.\n * @example\n * ```typescript\n * const vectorStore = new MemoryVectorStore(new OpenAIEmbeddings());\n * const memory = new VectorStoreRetrieverMemory({\n * vectorStoreRetriever: vectorStore.asRetriever(1),\n * memoryKey: \"history\",\n * });\n *\n * // Saving context to memory\n * await memory.saveContext(\n * { input: \"My favorite food is pizza\" },\n * { output: \"thats good to know\" },\n * );\n * await memory.saveContext(\n * { input: \"My favorite sport is soccer\" },\n * { output: \"...\" },\n * );\n * await memory.saveContext({ input: \"I don't the Celtics\" }, { output: \"ok\" });\n *\n * // Loading memory variables\n * console.log(\n * await memory.loadMemoryVariables({ prompt: \"what sport should i watch?\" }),\n * );\n * ```\n */\nexport class VectorStoreRetrieverMemory\n extends BaseMemory\n implements VectorStoreRetrieverMemoryParams\n{\n vectorStoreRetriever: VectorStoreRetrieverInterface;\n\n inputKey?: string;\n\n memoryKey: string;\n\n returnDocs: boolean;\n\n metadata?: Metadata | MetadataFunction;\n\n constructor(fields: VectorStoreRetrieverMemoryParams) {\n super();\n this.vectorStoreRetriever = fields.vectorStoreRetriever;\n this.inputKey = fields.inputKey;\n this.memoryKey = fields.memoryKey ?? \"memory\";\n this.returnDocs = fields.returnDocs ?? false;\n this.metadata = fields.metadata;\n }\n\n get memoryKeys(): string[] {\n return [this.memoryKey];\n }\n\n /**\n * Method to load memory variables. It uses the vectorStoreRetriever to\n * get relevant documents based on the query obtained from the input\n * values.\n * @param values An InputValues object.\n * @returns A Promise that resolves to a MemoryVariables object.\n */\n async loadMemoryVariables(values: InputValues): Promise<MemoryVariables> {\n const query = getInputValue(values, this.inputKey);\n const results = await this.vectorStoreRetriever.invoke(query);\n return {\n [this.memoryKey]: this.returnDocs\n ? results\n : formatDocumentsAsString(results),\n };\n }\n\n /**\n * Method to save context. It constructs a document from the input and\n * output values (excluding the memory key) and adds it to the vector\n * store database using the vectorStoreRetriever.\n * @param inputValues An InputValues object.\n * @param outputValues An OutputValues object.\n * @returns A Promise that resolves to void.\n */\n async saveContext(\n inputValues: InputValues,\n outputValues: OutputValues\n ): Promise<void> {\n const metadata =\n typeof this.metadata === \"function\"\n ? this.metadata(inputValues, outputValues)\n : this.metadata;\n const text = Object.entries(inputValues)\n .filter(([k]) => k !== this.memoryKey)\n .concat(Object.entries(outputValues))\n .map(([k, v]) => `${k}: ${v}`)\n .join(\"\\n\");\n await this.vectorStoreRetriever.addDocuments([\n new Document({ pageContent: text, metadata }),\n ]);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,IAAa,6BAAb,cACUA,uBAAAA,WAEV;CACE;CAEA;CAEA;CAEA;CAEA;CAEA,YAAY,QAA0C;EACpD,MAAM;EACN,KAAK,uBAAuB,OAAO;EACnC,KAAK,WAAW,OAAO;EACvB,KAAK,YAAY,OAAO,aAAa;EACrC,KAAK,aAAa,OAAO,cAAc;EACvC,KAAK,WAAW,OAAO;CACzB;CAEA,IAAI,aAAuB;EACzB,OAAO,CAAC,KAAK,SAAS;CACxB;;;;;;;;CASA,MAAM,oBAAoB,QAA+C;EACvE,MAAM,SAAA,GAAQC,uBAAAA,cAAAA,CAAc,QAAQ,KAAK,QAAQ;EACjD,MAAM,UAAU,MAAM,KAAK,qBAAqB,OAAO,KAAK;EAC5D,OAAO,GACJ,KAAK,YAAY,KAAK,aACnB,UACAC,sBAAAA,wBAAwB,OAAO,EACrC;CACF;;;;;;;;;CAUA,MAAM,YACJ,aACA,cACe;EACf,MAAM,WACJ,OAAO,KAAK,aAAa,aACrB,KAAK,SAAS,aAAa,YAAY,IACvC,KAAK;EACX,MAAM,OAAO,OAAO,QAAQ,WAAW,CAAC,CACrC,QAAQ,CAAC,OAAO,MAAM,KAAK,SAAS,CAAC,CACrC,OAAO,OAAO,QAAQ,YAAY,CAAC,CAAC,CACpC,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,IAAI,GAAG,CAAC,CAC7B,KAAK,IAAI;EACZ,MAAM,KAAK,qBAAqB,aAAa,CAC3C,IAAIC,0BAAAA,SAAS;GAAE,aAAa;GAAM;EAAS,CAAC,CAC9C,CAAC;CACH;AACF"}
@@ -31,9 +31,10 @@ var OutputFixingParser = class OutputFixingParser extends _langchain_core_output
31
31
  * @returns A new instance of OutputFixingParser.
32
32
  */
33
33
  static fromLLM(llm, parser, fields) {
34
+ const prompt = fields?.prompt ?? require_prompts.NAIVE_FIX_PROMPT;
34
35
  const chain = new require_llm_chain.LLMChain({
35
36
  llm,
36
- prompt: fields?.prompt ?? require_prompts.NAIVE_FIX_PROMPT
37
+ prompt
37
38
  });
38
39
  return new OutputFixingParser({
39
40
  parser,
@@ -1 +1 @@
1
- {"version":3,"file":"fix.cjs","names":["BaseOutputParser","LLMChain","NAIVE_FIX_PROMPT","OutputParserException"],"sources":["../../src/output_parsers/fix.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Callbacks } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseOutputParser,\n OutputParserException,\n} from \"@langchain/core/output_parsers\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport { NAIVE_FIX_PROMPT } from \"./prompts.js\";\n\ninterface OutputFixingParserRetryInput {\n instructions: string;\n completion: string;\n error: OutputParserException;\n}\n\nfunction isLLMChain<T>(\n x: LLMChain | Runnable<OutputFixingParserRetryInput, T>\n): x is LLMChain {\n return (\n (x as LLMChain).prompt !== undefined && (x as LLMChain).llm !== undefined\n );\n}\n\n/**\n * Class that extends the BaseOutputParser to handle situations where the\n * initial parsing attempt fails. It contains a retryChain for retrying\n * the parsing process in case of a failure.\n */\nexport class OutputFixingParser<T> extends BaseOutputParser<T> {\n static lc_name() {\n return \"OutputFixingParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"fix\"];\n\n lc_serializable = true;\n\n parser: BaseOutputParser<T>;\n\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n\n /**\n * Static method to create a new instance of OutputFixingParser using a\n * given language model, parser, and optional fields.\n * @param llm The language model to be used.\n * @param parser The parser to be used.\n * @param fields Optional fields which may contain a prompt.\n * @returns A new instance of OutputFixingParser.\n */\n static fromLLM<T>(\n llm: BaseLanguageModelInterface,\n parser: BaseOutputParser<T>,\n fields?: {\n prompt?: BasePromptTemplate;\n }\n ) {\n const prompt = fields?.prompt ?? NAIVE_FIX_PROMPT;\n const chain = new LLMChain({ llm, prompt });\n return new OutputFixingParser<T>({ parser, retryChain: chain });\n }\n\n constructor({\n parser,\n retryChain,\n }: {\n parser: BaseOutputParser<T>;\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n }) {\n super(...arguments);\n this.parser = parser;\n this.retryChain = retryChain;\n }\n\n /**\n * Method to parse the completion using the parser. If the initial parsing\n * fails, it uses the retryChain to attempt to fix the output and retry\n * the parsing process.\n * @param completion The completion to be parsed.\n * @param callbacks Optional callbacks to be used during parsing.\n * @returns The parsed output.\n */\n async parse(completion: string, callbacks?: Callbacks) {\n try {\n return await this.parser.parse(completion, callbacks);\n } catch (e) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (e instanceof OutputParserException) {\n const retryInput = {\n instructions: this.parser.getFormatInstructions(),\n completion,\n error: e,\n };\n\n if (isLLMChain(this.retryChain)) {\n const result = await this.retryChain.call(retryInput, callbacks);\n const newCompletion: string = result[this.retryChain.outputKey];\n return this.parser.parse(newCompletion, callbacks);\n } else {\n const result = await this.retryChain.invoke(retryInput, {\n callbacks,\n });\n return result;\n }\n }\n throw e;\n }\n }\n\n /**\n * Method to get the format instructions for the parser.\n * @returns The format instructions for the parser.\n */\n getFormatInstructions() {\n return this.parser.getFormatInstructions();\n }\n}\n"],"mappings":";;;;AAiBA,SAAS,WACP,GACe;CACf,OACG,EAAe,WAAW,KAAA,KAAc,EAAe,QAAQ,KAAA;AAEpE;;;;;;AAOA,IAAa,qBAAb,MAAa,2BAA8BA,+BAAAA,iBAAoB;CAC7D,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAK;CAEpD,kBAAkB;CAElB;CAEA;;;;;;;;;CAUA,OAAO,QACL,KACA,QACA,QAGA;EAEA,MAAM,QAAQ,IAAIC,kBAAAA,SAAS;GAAE;GAAK,QADnB,QAAQ,UAAUC,gBAAAA;EACQ,CAAC;EAC1C,OAAO,IAAI,mBAAsB;GAAE;GAAQ,YAAY;EAAM,CAAC;CAChE;CAEA,YAAY,EACV,QACA,cAIC;EACD,MAAM,GAAG,SAAS;EAClB,KAAK,SAAS;EACd,KAAK,aAAa;CACpB;;;;;;;;;CAUA,MAAM,MAAM,YAAoB,WAAuB;EACrD,IAAI;GACF,OAAO,MAAM,KAAK,OAAO,MAAM,YAAY,SAAS;EACtD,SAAS,GAAG;GAEV,IAAI,aAAaC,+BAAAA,uBAAuB;IACtC,MAAM,aAAa;KACjB,cAAc,KAAK,OAAO,sBAAsB;KAChD;KACA,OAAO;IACT;IAEA,IAAI,WAAW,KAAK,UAAU,GAAG;KAE/B,MAAM,iBAAwB,MADT,KAAK,WAAW,KAAK,YAAY,SAAS,EAAA,CAC1B,KAAK,WAAW;KACrD,OAAO,KAAK,OAAO,MAAM,eAAe,SAAS;IACnD,OAIE,OAAO,MAHc,KAAK,WAAW,OAAO,YAAY,EACtD,UACF,CAAC;GAGL;GACA,MAAM;EACR;CACF;;;;;CAMA,wBAAwB;EACtB,OAAO,KAAK,OAAO,sBAAsB;CAC3C;AACF"}
1
+ {"version":3,"file":"fix.cjs","names":["BaseOutputParser","NAIVE_FIX_PROMPT","LLMChain","OutputParserException"],"sources":["../../src/output_parsers/fix.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Callbacks } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseOutputParser,\n OutputParserException,\n} from \"@langchain/core/output_parsers\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport { NAIVE_FIX_PROMPT } from \"./prompts.js\";\n\ninterface OutputFixingParserRetryInput {\n instructions: string;\n completion: string;\n error: OutputParserException;\n}\n\nfunction isLLMChain<T>(\n x: LLMChain | Runnable<OutputFixingParserRetryInput, T>\n): x is LLMChain {\n return (\n (x as LLMChain).prompt !== undefined && (x as LLMChain).llm !== undefined\n );\n}\n\n/**\n * Class that extends the BaseOutputParser to handle situations where the\n * initial parsing attempt fails. It contains a retryChain for retrying\n * the parsing process in case of a failure.\n */\nexport class OutputFixingParser<T> extends BaseOutputParser<T> {\n static lc_name() {\n return \"OutputFixingParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"fix\"];\n\n lc_serializable = true;\n\n parser: BaseOutputParser<T>;\n\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n\n /**\n * Static method to create a new instance of OutputFixingParser using a\n * given language model, parser, and optional fields.\n * @param llm The language model to be used.\n * @param parser The parser to be used.\n * @param fields Optional fields which may contain a prompt.\n * @returns A new instance of OutputFixingParser.\n */\n static fromLLM<T>(\n llm: BaseLanguageModelInterface,\n parser: BaseOutputParser<T>,\n fields?: {\n prompt?: BasePromptTemplate;\n }\n ) {\n const prompt = fields?.prompt ?? NAIVE_FIX_PROMPT;\n const chain = new LLMChain({ llm, prompt });\n return new OutputFixingParser<T>({ parser, retryChain: chain });\n }\n\n constructor({\n parser,\n retryChain,\n }: {\n parser: BaseOutputParser<T>;\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n }) {\n super(...arguments);\n this.parser = parser;\n this.retryChain = retryChain;\n }\n\n /**\n * Method to parse the completion using the parser. If the initial parsing\n * fails, it uses the retryChain to attempt to fix the output and retry\n * the parsing process.\n * @param completion The completion to be parsed.\n * @param callbacks Optional callbacks to be used during parsing.\n * @returns The parsed output.\n */\n async parse(completion: string, callbacks?: Callbacks) {\n try {\n return await this.parser.parse(completion, callbacks);\n } catch (e) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (e instanceof OutputParserException) {\n const retryInput = {\n instructions: this.parser.getFormatInstructions(),\n completion,\n error: e,\n };\n\n if (isLLMChain(this.retryChain)) {\n const result = await this.retryChain.call(retryInput, callbacks);\n const newCompletion: string = result[this.retryChain.outputKey];\n return this.parser.parse(newCompletion, callbacks);\n } else {\n const result = await this.retryChain.invoke(retryInput, {\n callbacks,\n });\n return result;\n }\n }\n throw e;\n }\n }\n\n /**\n * Method to get the format instructions for the parser.\n * @returns The format instructions for the parser.\n */\n getFormatInstructions() {\n return this.parser.getFormatInstructions();\n }\n}\n"],"mappings":";;;;AAiBA,SAAS,WACP,GACe;CACf,OACG,EAAe,WAAW,KAAA,KAAc,EAAe,QAAQ,KAAA;AAEpE;;;;;;AAOA,IAAa,qBAAb,MAAa,2BAA8BA,+BAAAA,iBAAoB;CAC7D,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAK;CAEpD,kBAAkB;CAElB;CAEA;;;;;;;;;CAUA,OAAO,QACL,KACA,QACA,QAGA;EACA,MAAM,SAAS,QAAQ,UAAUC,gBAAAA;EACjC,MAAM,QAAQ,IAAIC,kBAAAA,SAAS;GAAE;GAAK;EAAO,CAAC;EAC1C,OAAO,IAAI,mBAAsB;GAAE;GAAQ,YAAY;EAAM,CAAC;CAChE;CAEA,YAAY,EACV,QACA,cAIC;EACD,MAAM,GAAG,SAAS;EAClB,KAAK,SAAS;EACd,KAAK,aAAa;CACpB;;;;;;;;;CAUA,MAAM,MAAM,YAAoB,WAAuB;EACrD,IAAI;GACF,OAAO,MAAM,KAAK,OAAO,MAAM,YAAY,SAAS;EACtD,SAAS,GAAG;GAEV,IAAI,aAAaC,+BAAAA,uBAAuB;IACtC,MAAM,aAAa;KACjB,cAAc,KAAK,OAAO,sBAAsB;KAChD;KACA,OAAO;IACT;IAEA,IAAI,WAAW,KAAK,UAAU,GAAG;KAE/B,MAAM,iBAAwB,MADT,KAAK,WAAW,KAAK,YAAY,SAAS,EAAA,CAC1B,KAAK,WAAW;KACrD,OAAO,KAAK,OAAO,MAAM,eAAe,SAAS;IACnD,OAIE,OAAO,MAHc,KAAK,WAAW,OAAO,YAAY,EACtD,UACF,CAAC;GAGL;GACA,MAAM;EACR;CACF;;;;;CAMA,wBAAwB;EACtB,OAAO,KAAK,OAAO,sBAAsB;CAC3C;AACF"}
@@ -31,9 +31,10 @@ var OutputFixingParser = class OutputFixingParser extends BaseOutputParser {
31
31
  * @returns A new instance of OutputFixingParser.
32
32
  */
33
33
  static fromLLM(llm, parser, fields) {
34
+ const prompt = fields?.prompt ?? NAIVE_FIX_PROMPT;
34
35
  const chain = new LLMChain({
35
36
  llm,
36
- prompt: fields?.prompt ?? NAIVE_FIX_PROMPT
37
+ prompt
37
38
  });
38
39
  return new OutputFixingParser({
39
40
  parser,
@@ -1 +1 @@
1
- {"version":3,"file":"fix.js","names":[],"sources":["../../src/output_parsers/fix.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Callbacks } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseOutputParser,\n OutputParserException,\n} from \"@langchain/core/output_parsers\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport { NAIVE_FIX_PROMPT } from \"./prompts.js\";\n\ninterface OutputFixingParserRetryInput {\n instructions: string;\n completion: string;\n error: OutputParserException;\n}\n\nfunction isLLMChain<T>(\n x: LLMChain | Runnable<OutputFixingParserRetryInput, T>\n): x is LLMChain {\n return (\n (x as LLMChain).prompt !== undefined && (x as LLMChain).llm !== undefined\n );\n}\n\n/**\n * Class that extends the BaseOutputParser to handle situations where the\n * initial parsing attempt fails. It contains a retryChain for retrying\n * the parsing process in case of a failure.\n */\nexport class OutputFixingParser<T> extends BaseOutputParser<T> {\n static lc_name() {\n return \"OutputFixingParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"fix\"];\n\n lc_serializable = true;\n\n parser: BaseOutputParser<T>;\n\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n\n /**\n * Static method to create a new instance of OutputFixingParser using a\n * given language model, parser, and optional fields.\n * @param llm The language model to be used.\n * @param parser The parser to be used.\n * @param fields Optional fields which may contain a prompt.\n * @returns A new instance of OutputFixingParser.\n */\n static fromLLM<T>(\n llm: BaseLanguageModelInterface,\n parser: BaseOutputParser<T>,\n fields?: {\n prompt?: BasePromptTemplate;\n }\n ) {\n const prompt = fields?.prompt ?? NAIVE_FIX_PROMPT;\n const chain = new LLMChain({ llm, prompt });\n return new OutputFixingParser<T>({ parser, retryChain: chain });\n }\n\n constructor({\n parser,\n retryChain,\n }: {\n parser: BaseOutputParser<T>;\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n }) {\n super(...arguments);\n this.parser = parser;\n this.retryChain = retryChain;\n }\n\n /**\n * Method to parse the completion using the parser. If the initial parsing\n * fails, it uses the retryChain to attempt to fix the output and retry\n * the parsing process.\n * @param completion The completion to be parsed.\n * @param callbacks Optional callbacks to be used during parsing.\n * @returns The parsed output.\n */\n async parse(completion: string, callbacks?: Callbacks) {\n try {\n return await this.parser.parse(completion, callbacks);\n } catch (e) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (e instanceof OutputParserException) {\n const retryInput = {\n instructions: this.parser.getFormatInstructions(),\n completion,\n error: e,\n };\n\n if (isLLMChain(this.retryChain)) {\n const result = await this.retryChain.call(retryInput, callbacks);\n const newCompletion: string = result[this.retryChain.outputKey];\n return this.parser.parse(newCompletion, callbacks);\n } else {\n const result = await this.retryChain.invoke(retryInput, {\n callbacks,\n });\n return result;\n }\n }\n throw e;\n }\n }\n\n /**\n * Method to get the format instructions for the parser.\n * @returns The format instructions for the parser.\n */\n getFormatInstructions() {\n return this.parser.getFormatInstructions();\n }\n}\n"],"mappings":";;;;AAiBA,SAAS,WACP,GACe;CACf,OACG,EAAe,WAAW,KAAA,KAAc,EAAe,QAAQ,KAAA;AAEpE;;;;;;AAOA,IAAa,qBAAb,MAAa,2BAA8B,iBAAoB;CAC7D,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAK;CAEpD,kBAAkB;CAElB;CAEA;;;;;;;;;CAUA,OAAO,QACL,KACA,QACA,QAGA;EAEA,MAAM,QAAQ,IAAI,SAAS;GAAE;GAAK,QADnB,QAAQ,UAAU;EACQ,CAAC;EAC1C,OAAO,IAAI,mBAAsB;GAAE;GAAQ,YAAY;EAAM,CAAC;CAChE;CAEA,YAAY,EACV,QACA,cAIC;EACD,MAAM,GAAG,SAAS;EAClB,KAAK,SAAS;EACd,KAAK,aAAa;CACpB;;;;;;;;;CAUA,MAAM,MAAM,YAAoB,WAAuB;EACrD,IAAI;GACF,OAAO,MAAM,KAAK,OAAO,MAAM,YAAY,SAAS;EACtD,SAAS,GAAG;GAEV,IAAI,aAAa,uBAAuB;IACtC,MAAM,aAAa;KACjB,cAAc,KAAK,OAAO,sBAAsB;KAChD;KACA,OAAO;IACT;IAEA,IAAI,WAAW,KAAK,UAAU,GAAG;KAE/B,MAAM,iBAAwB,MADT,KAAK,WAAW,KAAK,YAAY,SAAS,EAAA,CAC1B,KAAK,WAAW;KACrD,OAAO,KAAK,OAAO,MAAM,eAAe,SAAS;IACnD,OAIE,OAAO,MAHc,KAAK,WAAW,OAAO,YAAY,EACtD,UACF,CAAC;GAGL;GACA,MAAM;EACR;CACF;;;;;CAMA,wBAAwB;EACtB,OAAO,KAAK,OAAO,sBAAsB;CAC3C;AACF"}
1
+ {"version":3,"file":"fix.js","names":[],"sources":["../../src/output_parsers/fix.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { Callbacks } from \"@langchain/core/callbacks/manager\";\nimport {\n BaseOutputParser,\n OutputParserException,\n} from \"@langchain/core/output_parsers\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { LLMChain } from \"../chains/llm_chain.js\";\nimport { NAIVE_FIX_PROMPT } from \"./prompts.js\";\n\ninterface OutputFixingParserRetryInput {\n instructions: string;\n completion: string;\n error: OutputParserException;\n}\n\nfunction isLLMChain<T>(\n x: LLMChain | Runnable<OutputFixingParserRetryInput, T>\n): x is LLMChain {\n return (\n (x as LLMChain).prompt !== undefined && (x as LLMChain).llm !== undefined\n );\n}\n\n/**\n * Class that extends the BaseOutputParser to handle situations where the\n * initial parsing attempt fails. It contains a retryChain for retrying\n * the parsing process in case of a failure.\n */\nexport class OutputFixingParser<T> extends BaseOutputParser<T> {\n static lc_name() {\n return \"OutputFixingParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"fix\"];\n\n lc_serializable = true;\n\n parser: BaseOutputParser<T>;\n\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n\n /**\n * Static method to create a new instance of OutputFixingParser using a\n * given language model, parser, and optional fields.\n * @param llm The language model to be used.\n * @param parser The parser to be used.\n * @param fields Optional fields which may contain a prompt.\n * @returns A new instance of OutputFixingParser.\n */\n static fromLLM<T>(\n llm: BaseLanguageModelInterface,\n parser: BaseOutputParser<T>,\n fields?: {\n prompt?: BasePromptTemplate;\n }\n ) {\n const prompt = fields?.prompt ?? NAIVE_FIX_PROMPT;\n const chain = new LLMChain({ llm, prompt });\n return new OutputFixingParser<T>({ parser, retryChain: chain });\n }\n\n constructor({\n parser,\n retryChain,\n }: {\n parser: BaseOutputParser<T>;\n retryChain: LLMChain | Runnable<OutputFixingParserRetryInput, T>;\n }) {\n super(...arguments);\n this.parser = parser;\n this.retryChain = retryChain;\n }\n\n /**\n * Method to parse the completion using the parser. If the initial parsing\n * fails, it uses the retryChain to attempt to fix the output and retry\n * the parsing process.\n * @param completion The completion to be parsed.\n * @param callbacks Optional callbacks to be used during parsing.\n * @returns The parsed output.\n */\n async parse(completion: string, callbacks?: Callbacks) {\n try {\n return await this.parser.parse(completion, callbacks);\n } catch (e) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (e instanceof OutputParserException) {\n const retryInput = {\n instructions: this.parser.getFormatInstructions(),\n completion,\n error: e,\n };\n\n if (isLLMChain(this.retryChain)) {\n const result = await this.retryChain.call(retryInput, callbacks);\n const newCompletion: string = result[this.retryChain.outputKey];\n return this.parser.parse(newCompletion, callbacks);\n } else {\n const result = await this.retryChain.invoke(retryInput, {\n callbacks,\n });\n return result;\n }\n }\n throw e;\n }\n }\n\n /**\n * Method to get the format instructions for the parser.\n * @returns The format instructions for the parser.\n */\n getFormatInstructions() {\n return this.parser.getFormatInstructions();\n }\n}\n"],"mappings":";;;;AAiBA,SAAS,WACP,GACe;CACf,OACG,EAAe,WAAW,KAAA,KAAc,EAAe,QAAQ,KAAA;AAEpE;;;;;;AAOA,IAAa,qBAAb,MAAa,2BAA8B,iBAAoB;CAC7D,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAK;CAEpD,kBAAkB;CAElB;CAEA;;;;;;;;;CAUA,OAAO,QACL,KACA,QACA,QAGA;EACA,MAAM,SAAS,QAAQ,UAAU;EACjC,MAAM,QAAQ,IAAI,SAAS;GAAE;GAAK;EAAO,CAAC;EAC1C,OAAO,IAAI,mBAAsB;GAAE;GAAQ,YAAY;EAAM,CAAC;CAChE;CAEA,YAAY,EACV,QACA,cAIC;EACD,MAAM,GAAG,SAAS;EAClB,KAAK,SAAS;EACd,KAAK,aAAa;CACpB;;;;;;;;;CAUA,MAAM,MAAM,YAAoB,WAAuB;EACrD,IAAI;GACF,OAAO,MAAM,KAAK,OAAO,MAAM,YAAY,SAAS;EACtD,SAAS,GAAG;GAEV,IAAI,aAAa,uBAAuB;IACtC,MAAM,aAAa;KACjB,cAAc,KAAK,OAAO,sBAAsB;KAChD;KACA,OAAO;IACT;IAEA,IAAI,WAAW,KAAK,UAAU,GAAG;KAE/B,MAAM,iBAAwB,MADT,KAAK,WAAW,KAAK,YAAY,SAAS,EAAA,CAC1B,KAAK,WAAW;KACrD,OAAO,KAAK,OAAO,MAAM,eAAe,SAAS;IACnD,OAIE,OAAO,MAHc,KAAK,WAAW,OAAO,YAAY,EACtD,UACF,CAAC;GAGL;GACA,MAAM;EACR;CACF;;;;;CAMA,wBAAwB;EACtB,OAAO,KAAK,OAAO,sBAAsB;CAC3C;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai_functions.cjs","names":["BaseLLMOutputParser","BaseCumulativeTransformOutputParser","OutputParserException"],"sources":["../../src/output_parsers/openai_functions.ts"],"sourcesContent":["import { type JsonSchema7ObjectType } from \"@langchain/core/utils/json_schema\";\nimport {\n compare,\n type Operation as JSONPatchOperation,\n} from \"@langchain/core/utils/json_patch\";\n\nimport { ChatGeneration, Generation } from \"@langchain/core/outputs\";\nimport {\n BaseCumulativeTransformOutputParser,\n type BaseCumulativeTransformOutputParserInput,\n BaseLLMOutputParser,\n OutputParserException,\n} from \"@langchain/core/output_parsers\";\nimport { parsePartialJson } from \"@langchain/core/output_parsers\";\nimport { Optional } from \"../types/type-utils.js\";\n\n/**\n * Represents optional parameters for a function in a JSON Schema.\n */\nexport type FunctionParameters = Optional<\n JsonSchema7ObjectType,\n \"additionalProperties\"\n>;\n\n/**\n * Class for parsing the output of an LLM. Can be configured to return\n * only the arguments of the function call in the output.\n */\nexport class OutputFunctionsParser extends BaseLLMOutputParser<string> {\n static lc_name() {\n return \"OutputFunctionsParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"openai_functions\"];\n\n lc_serializable = true;\n\n argsOnly = true;\n\n constructor(config?: { argsOnly?: boolean }) {\n super();\n this.argsOnly = config?.argsOnly ?? this.argsOnly;\n }\n\n /**\n * Parses the output and returns a string representation of the function\n * call or its arguments.\n * @param generations The output of the LLM to parse.\n * @returns A string representation of the function call or its arguments.\n */\n async parseResult(\n generations: Generation[] | ChatGeneration[]\n ): Promise<string> {\n if (\"message\" in generations[0]) {\n const gen = generations[0] as ChatGeneration;\n const functionCall = gen.message.additional_kwargs.function_call;\n if (!functionCall) {\n throw new Error(\n `No function_call in message ${JSON.stringify(generations)}`\n );\n }\n if (!functionCall.arguments) {\n throw new Error(\n `No arguments in function_call ${JSON.stringify(generations)}`\n );\n }\n if (this.argsOnly) {\n return functionCall.arguments;\n }\n return JSON.stringify(functionCall);\n } else {\n throw new Error(\n `No message in generations ${JSON.stringify(generations)}`\n );\n }\n }\n}\n\n/**\n * Class for parsing the output of an LLM into a JSON object. Uses an\n * instance of `OutputFunctionsParser` to parse the output.\n */\nexport class JsonOutputFunctionsParser<\n Output extends object = object,\n> extends BaseCumulativeTransformOutputParser<Output> {\n static lc_name() {\n return \"JsonOutputFunctionsParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"openai_functions\"];\n\n lc_serializable = true;\n\n outputParser: OutputFunctionsParser;\n\n argsOnly = true;\n\n constructor(\n config?: { argsOnly?: boolean } & BaseCumulativeTransformOutputParserInput\n ) {\n super(config);\n this.argsOnly = config?.argsOnly ?? this.argsOnly;\n this.outputParser = new OutputFunctionsParser(config);\n }\n\n protected _diff(\n prev: unknown | undefined,\n next: unknown\n ): JSONPatchOperation[] | undefined {\n if (!next) {\n return undefined;\n }\n const ops = compare(prev ?? {}, next);\n return ops;\n }\n\n async parsePartialResult(\n generations: ChatGeneration[]\n ): Promise<Output | undefined> {\n const generation = generations[0];\n if (!generation.message) {\n return undefined;\n }\n const { message } = generation;\n const functionCall = message.additional_kwargs.function_call;\n if (!functionCall) {\n return undefined;\n }\n if (this.argsOnly) {\n return parsePartialJson(functionCall.arguments);\n }\n\n return {\n ...functionCall,\n arguments: parsePartialJson(functionCall.arguments),\n } as Output;\n }\n\n /**\n * Parses the output and returns a JSON object. If `argsOnly` is true,\n * only the arguments of the function call are returned.\n * @param generations The output of the LLM to parse.\n * @returns A JSON object representation of the function call or its arguments.\n */\n async parseResult(\n generations: Generation[] | ChatGeneration[]\n ): Promise<Output> {\n const result = await this.outputParser.parseResult(generations);\n if (!result) {\n throw new Error(\n `No result from \"OutputFunctionsParser\" ${JSON.stringify(generations)}`\n );\n }\n return this.parse(result);\n }\n\n async parse(text: string): Promise<Output> {\n try {\n const parsedResult = JSON.parse(text);\n if (this.argsOnly) {\n return parsedResult;\n }\n parsedResult.arguments = JSON.parse(parsedResult.arguments);\n return parsedResult;\n } catch (e) {\n throw new OutputParserException(\n `Failed to parse. Text: \"${text}\". Error: ${e}`\n );\n }\n }\n\n getFormatInstructions(): string {\n return \"\";\n }\n}\n\n/**\n * Class for parsing the output of an LLM into a JSON object and returning\n * a specific attribute. Uses an instance of `JsonOutputFunctionsParser`\n * to parse the output.\n */\nexport class JsonKeyOutputFunctionsParser<\n T = object,\n> extends BaseLLMOutputParser<T> {\n static lc_name() {\n return \"JsonKeyOutputFunctionsParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"openai_functions\"];\n\n lc_serializable = true;\n\n outputParser = new JsonOutputFunctionsParser();\n\n attrName: string;\n\n get lc_aliases() {\n return {\n attrName: \"key_name\",\n };\n }\n\n constructor(fields: { attrName: string }) {\n super(fields);\n this.attrName = fields.attrName;\n }\n\n /**\n * Parses the output and returns a specific attribute of the parsed JSON\n * object.\n * @param generations The output of the LLM to parse.\n * @returns The value of a specific attribute of the parsed JSON object.\n */\n async parseResult(generations: Generation[] | ChatGeneration[]): Promise<T> {\n const result = await this.outputParser.parseResult(generations);\n return result[this.attrName as keyof typeof result] as T;\n }\n}\n"],"mappings":";;;;;;;AA4BA,IAAa,wBAAb,cAA2CA,+BAAAA,oBAA4B;CACrE,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAkB;CAEjE,kBAAkB;CAElB,WAAW;CAEX,YAAY,QAAiC;EAC3C,MAAM;EACN,KAAK,WAAW,QAAQ,YAAY,KAAK;CAC3C;;;;;;;CAQA,MAAM,YACJ,aACiB;EACjB,IAAI,aAAa,YAAY,IAAI;GAE/B,MAAM,eADM,YAAY,EACA,CAAC,QAAQ,kBAAkB;GACnD,IAAI,CAAC,cACH,MAAM,IAAI,MACR,+BAA+B,KAAK,UAAU,WAAW,GAC3D;GAEF,IAAI,CAAC,aAAa,WAChB,MAAM,IAAI,MACR,iCAAiC,KAAK,UAAU,WAAW,GAC7D;GAEF,IAAI,KAAK,UACP,OAAO,aAAa;GAEtB,OAAO,KAAK,UAAU,YAAY;EACpC,OACE,MAAM,IAAI,MACR,6BAA6B,KAAK,UAAU,WAAW,GACzD;CAEJ;AACF;;;;;AAMA,IAAa,4BAAb,cAEUC,+BAAAA,oCAA4C;CACpD,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAkB;CAEjE,kBAAkB;CAElB;CAEA,WAAW;CAEX,YACE,QACA;EACA,MAAM,MAAM;EACZ,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,eAAe,IAAI,sBAAsB,MAAM;CACtD;CAEA,MACE,MACA,MACkC;EAClC,IAAI,CAAC,MACH;EAGF,QAAA,GAAA,iCAAA,QAAA,CADoB,QAAQ,CAAC,GAAG,IACvB;CACX;CAEA,MAAM,mBACJ,aAC6B;EAC7B,MAAM,aAAa,YAAY;EAC/B,IAAI,CAAC,WAAW,SACd;EAEF,MAAM,EAAE,YAAY;EACpB,MAAM,eAAe,QAAQ,kBAAkB;EAC/C,IAAI,CAAC,cACH;EAEF,IAAI,KAAK,UACP,QAAA,GAAA,+BAAA,iBAAA,CAAwB,aAAa,SAAS;EAGhD,OAAO;GACL,GAAG;GACH,YAAA,GAAA,+BAAA,iBAAA,CAA4B,aAAa,SAAS;EACpD;CACF;;;;;;;CAQA,MAAM,YACJ,aACiB;EACjB,MAAM,SAAS,MAAM,KAAK,aAAa,YAAY,WAAW;EAC9D,IAAI,CAAC,QACH,MAAM,IAAI,MACR,0CAA0C,KAAK,UAAU,WAAW,GACtE;EAEF,OAAO,KAAK,MAAM,MAAM;CAC1B;CAEA,MAAM,MAAM,MAA+B;EACzC,IAAI;GACF,MAAM,eAAe,KAAK,MAAM,IAAI;GACpC,IAAI,KAAK,UACP,OAAO;GAET,aAAa,YAAY,KAAK,MAAM,aAAa,SAAS;GAC1D,OAAO;EACT,SAAS,GAAG;GACV,MAAM,IAAIC,+BAAAA,sBACR,2BAA2B,KAAK,YAAY,GAC9C;EACF;CACF;CAEA,wBAAgC;EAC9B,OAAO;CACT;AACF;;;;;;AAOA,IAAa,+BAAb,cAEUF,+BAAAA,oBAAuB;CAC/B,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAkB;CAEjE,kBAAkB;CAElB,eAAe,IAAI,0BAA0B;CAE7C;CAEA,IAAI,aAAa;EACf,OAAO,EACL,UAAU,WACZ;CACF;CAEA,YAAY,QAA8B;EACxC,MAAM,MAAM;EACZ,KAAK,WAAW,OAAO;CACzB;;;;;;;CAQA,MAAM,YAAY,aAA0D;EAE1E,QAAO,MADc,KAAK,aAAa,YAAY,WAAW,EAAA,CAChD,KAAK;CACrB;AACF"}
1
+ {"version":3,"file":"openai_functions.cjs","names":["BaseLLMOutputParser","BaseCumulativeTransformOutputParser","compare","parsePartialJson","OutputParserException"],"sources":["../../src/output_parsers/openai_functions.ts"],"sourcesContent":["import { type JsonSchema7ObjectType } from \"@langchain/core/utils/json_schema\";\nimport {\n compare,\n type Operation as JSONPatchOperation,\n} from \"@langchain/core/utils/json_patch\";\n\nimport { ChatGeneration, Generation } from \"@langchain/core/outputs\";\nimport {\n BaseCumulativeTransformOutputParser,\n type BaseCumulativeTransformOutputParserInput,\n BaseLLMOutputParser,\n OutputParserException,\n} from \"@langchain/core/output_parsers\";\nimport { parsePartialJson } from \"@langchain/core/output_parsers\";\nimport { Optional } from \"../types/type-utils.js\";\n\n/**\n * Represents optional parameters for a function in a JSON Schema.\n */\nexport type FunctionParameters = Optional<\n JsonSchema7ObjectType,\n \"additionalProperties\"\n>;\n\n/**\n * Class for parsing the output of an LLM. Can be configured to return\n * only the arguments of the function call in the output.\n */\nexport class OutputFunctionsParser extends BaseLLMOutputParser<string> {\n static lc_name() {\n return \"OutputFunctionsParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"openai_functions\"];\n\n lc_serializable = true;\n\n argsOnly = true;\n\n constructor(config?: { argsOnly?: boolean }) {\n super();\n this.argsOnly = config?.argsOnly ?? this.argsOnly;\n }\n\n /**\n * Parses the output and returns a string representation of the function\n * call or its arguments.\n * @param generations The output of the LLM to parse.\n * @returns A string representation of the function call or its arguments.\n */\n async parseResult(\n generations: Generation[] | ChatGeneration[]\n ): Promise<string> {\n if (\"message\" in generations[0]) {\n const gen = generations[0] as ChatGeneration;\n const functionCall = gen.message.additional_kwargs.function_call;\n if (!functionCall) {\n throw new Error(\n `No function_call in message ${JSON.stringify(generations)}`\n );\n }\n if (!functionCall.arguments) {\n throw new Error(\n `No arguments in function_call ${JSON.stringify(generations)}`\n );\n }\n if (this.argsOnly) {\n return functionCall.arguments;\n }\n return JSON.stringify(functionCall);\n } else {\n throw new Error(\n `No message in generations ${JSON.stringify(generations)}`\n );\n }\n }\n}\n\n/**\n * Class for parsing the output of an LLM into a JSON object. Uses an\n * instance of `OutputFunctionsParser` to parse the output.\n */\nexport class JsonOutputFunctionsParser<\n Output extends object = object,\n> extends BaseCumulativeTransformOutputParser<Output> {\n static lc_name() {\n return \"JsonOutputFunctionsParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"openai_functions\"];\n\n lc_serializable = true;\n\n outputParser: OutputFunctionsParser;\n\n argsOnly = true;\n\n constructor(\n config?: { argsOnly?: boolean } & BaseCumulativeTransformOutputParserInput\n ) {\n super(config);\n this.argsOnly = config?.argsOnly ?? this.argsOnly;\n this.outputParser = new OutputFunctionsParser(config);\n }\n\n protected _diff(\n prev: unknown | undefined,\n next: unknown\n ): JSONPatchOperation[] | undefined {\n if (!next) {\n return undefined;\n }\n const ops = compare(prev ?? {}, next);\n return ops;\n }\n\n async parsePartialResult(\n generations: ChatGeneration[]\n ): Promise<Output | undefined> {\n const generation = generations[0];\n if (!generation.message) {\n return undefined;\n }\n const { message } = generation;\n const functionCall = message.additional_kwargs.function_call;\n if (!functionCall) {\n return undefined;\n }\n if (this.argsOnly) {\n return parsePartialJson(functionCall.arguments);\n }\n\n return {\n ...functionCall,\n arguments: parsePartialJson(functionCall.arguments),\n } as Output;\n }\n\n /**\n * Parses the output and returns a JSON object. If `argsOnly` is true,\n * only the arguments of the function call are returned.\n * @param generations The output of the LLM to parse.\n * @returns A JSON object representation of the function call or its arguments.\n */\n async parseResult(\n generations: Generation[] | ChatGeneration[]\n ): Promise<Output> {\n const result = await this.outputParser.parseResult(generations);\n if (!result) {\n throw new Error(\n `No result from \"OutputFunctionsParser\" ${JSON.stringify(generations)}`\n );\n }\n return this.parse(result);\n }\n\n async parse(text: string): Promise<Output> {\n try {\n const parsedResult = JSON.parse(text);\n if (this.argsOnly) {\n return parsedResult;\n }\n parsedResult.arguments = JSON.parse(parsedResult.arguments);\n return parsedResult;\n } catch (e) {\n throw new OutputParserException(\n `Failed to parse. Text: \"${text}\". Error: ${e}`\n );\n }\n }\n\n getFormatInstructions(): string {\n return \"\";\n }\n}\n\n/**\n * Class for parsing the output of an LLM into a JSON object and returning\n * a specific attribute. Uses an instance of `JsonOutputFunctionsParser`\n * to parse the output.\n */\nexport class JsonKeyOutputFunctionsParser<\n T = object,\n> extends BaseLLMOutputParser<T> {\n static lc_name() {\n return \"JsonKeyOutputFunctionsParser\";\n }\n\n lc_namespace = [\"langchain\", \"output_parsers\", \"openai_functions\"];\n\n lc_serializable = true;\n\n outputParser = new JsonOutputFunctionsParser();\n\n attrName: string;\n\n get lc_aliases() {\n return {\n attrName: \"key_name\",\n };\n }\n\n constructor(fields: { attrName: string }) {\n super(fields);\n this.attrName = fields.attrName;\n }\n\n /**\n * Parses the output and returns a specific attribute of the parsed JSON\n * object.\n * @param generations The output of the LLM to parse.\n * @returns The value of a specific attribute of the parsed JSON object.\n */\n async parseResult(generations: Generation[] | ChatGeneration[]): Promise<T> {\n const result = await this.outputParser.parseResult(generations);\n return result[this.attrName as keyof typeof result] as T;\n }\n}\n"],"mappings":";;;;;;;AA4BA,IAAa,wBAAb,cAA2CA,+BAAAA,oBAA4B;CACrE,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAkB;CAEjE,kBAAkB;CAElB,WAAW;CAEX,YAAY,QAAiC;EAC3C,MAAM;EACN,KAAK,WAAW,QAAQ,YAAY,KAAK;CAC3C;;;;;;;CAQA,MAAM,YACJ,aACiB;EACjB,IAAI,aAAa,YAAY,IAAI;GAE/B,MAAM,eADM,YAAY,EACA,CAAC,QAAQ,kBAAkB;GACnD,IAAI,CAAC,cACH,MAAM,IAAI,MACR,+BAA+B,KAAK,UAAU,WAAW,GAC3D;GAEF,IAAI,CAAC,aAAa,WAChB,MAAM,IAAI,MACR,iCAAiC,KAAK,UAAU,WAAW,GAC7D;GAEF,IAAI,KAAK,UACP,OAAO,aAAa;GAEtB,OAAO,KAAK,UAAU,YAAY;EACpC,OACE,MAAM,IAAI,MACR,6BAA6B,KAAK,UAAU,WAAW,GACzD;CAEJ;AACF;;;;;AAMA,IAAa,4BAAb,cAEUC,+BAAAA,oCAA4C;CACpD,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAkB;CAEjE,kBAAkB;CAElB;CAEA,WAAW;CAEX,YACE,QACA;EACA,MAAM,MAAM;EACZ,KAAK,WAAW,QAAQ,YAAY,KAAK;EACzC,KAAK,eAAe,IAAI,sBAAsB,MAAM;CACtD;CAEA,MACE,MACA,MACkC;EAClC,IAAI,CAAC,MACH;EAGF,QAAA,GADYC,iCAAAA,QAAAA,CAAQ,QAAQ,CAAC,GAAG,IACvB;CACX;CAEA,MAAM,mBACJ,aAC6B;EAC7B,MAAM,aAAa,YAAY;EAC/B,IAAI,CAAC,WAAW,SACd;EAEF,MAAM,EAAE,YAAY;EACpB,MAAM,eAAe,QAAQ,kBAAkB;EAC/C,IAAI,CAAC,cACH;EAEF,IAAI,KAAK,UACP,QAAA,GAAOC,+BAAAA,iBAAAA,CAAiB,aAAa,SAAS;EAGhD,OAAO;GACL,GAAG;GACH,YAAA,GAAWA,+BAAAA,iBAAAA,CAAiB,aAAa,SAAS;EACpD;CACF;;;;;;;CAQA,MAAM,YACJ,aACiB;EACjB,MAAM,SAAS,MAAM,KAAK,aAAa,YAAY,WAAW;EAC9D,IAAI,CAAC,QACH,MAAM,IAAI,MACR,0CAA0C,KAAK,UAAU,WAAW,GACtE;EAEF,OAAO,KAAK,MAAM,MAAM;CAC1B;CAEA,MAAM,MAAM,MAA+B;EACzC,IAAI;GACF,MAAM,eAAe,KAAK,MAAM,IAAI;GACpC,IAAI,KAAK,UACP,OAAO;GAET,aAAa,YAAY,KAAK,MAAM,aAAa,SAAS;GAC1D,OAAO;EACT,SAAS,GAAG;GACV,MAAM,IAAIC,+BAAAA,sBACR,2BAA2B,KAAK,YAAY,GAC9C;EACF;CACF;CAEA,wBAAgC;EAC9B,OAAO;CACT;AACF;;;;;;AAOA,IAAa,+BAAb,cAEUJ,+BAAAA,oBAAuB;CAC/B,OAAO,UAAU;EACf,OAAO;CACT;CAEA,eAAe;EAAC;EAAa;EAAkB;CAAkB;CAEjE,kBAAkB;CAElB,eAAe,IAAI,0BAA0B;CAE7C;CAEA,IAAI,aAAa;EACf,OAAO,EACL,UAAU,WACZ;CACF;CAEA,YAAY,QAA8B;EACxC,MAAM,MAAM;EACZ,KAAK,WAAW,OAAO;CACzB;;;;;;;CAQA,MAAM,YAAY,aAA0D;EAE1E,QAAO,MADc,KAAK,aAAa,YAAY,WAAW,EAAA,CAChD,KAAK;CACrB;AACF"}