@langchain/classic 1.0.8 → 1.0.9

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 (117) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/agents/agent.cjs.map +1 -1
  3. package/dist/agents/agent.js.map +1 -1
  4. package/dist/agents/chat/outputParser.d.cts +2 -2
  5. package/dist/agents/chat/outputParser.d.cts.map +1 -1
  6. package/dist/agents/helpers.cjs.map +1 -1
  7. package/dist/agents/helpers.js.map +1 -1
  8. package/dist/agents/openai_functions/index.cjs.map +1 -1
  9. package/dist/agents/openai_functions/index.js.map +1 -1
  10. package/dist/agents/react/index.d.cts +2 -2
  11. package/dist/agents/react/index.d.cts.map +1 -1
  12. package/dist/agents/react/index.d.ts +2 -2
  13. package/dist/agents/react/index.d.ts.map +1 -1
  14. package/dist/agents/structured_chat/index.d.cts +2 -2
  15. package/dist/agents/structured_chat/index.d.cts.map +1 -1
  16. package/dist/agents/structured_chat/index.d.ts +2 -2
  17. package/dist/agents/structured_chat/index.d.ts.map +1 -1
  18. package/dist/agents/tool_calling/index.d.cts +2 -2
  19. package/dist/agents/tool_calling/index.d.cts.map +1 -1
  20. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.cts +1 -1
  21. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.cts.map +1 -1
  22. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.ts +1 -1
  23. package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.ts.map +1 -1
  24. package/dist/agents/toolkits/conversational_retrieval/tool.d.cts +1 -1
  25. package/dist/agents/toolkits/conversational_retrieval/tool.d.cts.map +1 -1
  26. package/dist/agents/toolkits/conversational_retrieval/tool.d.ts +1 -1
  27. package/dist/agents/toolkits/conversational_retrieval/tool.d.ts.map +1 -1
  28. package/dist/agents/types.cjs.map +1 -1
  29. package/dist/agents/types.js.map +1 -1
  30. package/dist/chains/base.cjs.map +1 -1
  31. package/dist/chains/base.js.map +1 -1
  32. package/dist/chains/combine_docs_chain.cjs.map +1 -1
  33. package/dist/chains/combine_docs_chain.js.map +1 -1
  34. package/dist/chains/llm_chain.cjs.map +1 -1
  35. package/dist/chains/llm_chain.js.map +1 -1
  36. package/dist/chains/openai_functions/base.cjs.map +1 -1
  37. package/dist/chains/openai_functions/base.js.map +1 -1
  38. package/dist/chains/openai_functions/openapi.cjs.map +1 -1
  39. package/dist/chains/openai_functions/openapi.js.map +1 -1
  40. package/dist/chains/query_constructor/index.cjs.map +1 -1
  41. package/dist/chains/query_constructor/index.js.map +1 -1
  42. package/dist/chains/query_constructor/parser.cjs.map +1 -1
  43. package/dist/chains/query_constructor/parser.js.map +1 -1
  44. package/dist/chains/router/multi_prompt.cjs.map +1 -1
  45. package/dist/chains/router/multi_prompt.js.map +1 -1
  46. package/dist/chains/transform.cjs.map +1 -1
  47. package/dist/chains/transform.js.map +1 -1
  48. package/dist/chat_models/universal.cjs.map +1 -1
  49. package/dist/chat_models/universal.js.map +1 -1
  50. package/dist/document_loaders/fs/json.cjs.map +1 -1
  51. package/dist/document_loaders/fs/json.js.map +1 -1
  52. package/dist/embeddings/cache_backed.cjs.map +1 -1
  53. package/dist/embeddings/cache_backed.js.map +1 -1
  54. package/dist/evaluation/base.cjs.map +1 -1
  55. package/dist/evaluation/base.js.map +1 -1
  56. package/dist/evaluation/comparison/pairwise.d.ts +3 -3
  57. package/dist/evaluation/comparison/pairwise.d.ts.map +1 -1
  58. package/dist/evaluation/criteria/criteria.d.ts +3 -3
  59. package/dist/evaluation/criteria/criteria.d.ts.map +1 -1
  60. package/dist/experimental/autogpt/prompt.d.cts +2 -2
  61. package/dist/experimental/autogpt/prompt.d.cts.map +1 -1
  62. package/dist/experimental/autogpt/prompt.d.ts +2 -2
  63. package/dist/experimental/autogpt/prompt.d.ts.map +1 -1
  64. package/dist/experimental/masking/regex_masking_transformer.cjs.map +1 -1
  65. package/dist/experimental/masking/regex_masking_transformer.js.map +1 -1
  66. package/dist/experimental/openai_assistant/index.cjs.map +1 -1
  67. package/dist/experimental/openai_assistant/index.js.map +1 -1
  68. package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
  69. package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
  70. package/dist/experimental/prompts/custom_format.cjs.map +1 -1
  71. package/dist/experimental/prompts/custom_format.js.map +1 -1
  72. package/dist/experimental/prompts/handlebars.cjs.map +1 -1
  73. package/dist/experimental/prompts/handlebars.js.map +1 -1
  74. package/dist/load/import_constants.cjs +24 -24
  75. package/dist/load/import_constants.cjs.map +1 -1
  76. package/dist/load/import_constants.js +24 -24
  77. package/dist/load/import_constants.js.map +1 -1
  78. package/dist/load/import_map.cjs +44 -44
  79. package/dist/load/import_map.cjs.map +1 -1
  80. package/dist/load/import_map.js +52 -52
  81. package/dist/load/import_map.js.map +1 -1
  82. package/dist/output_parsers/openai_functions.cjs.map +1 -1
  83. package/dist/output_parsers/openai_functions.js.map +1 -1
  84. package/dist/output_parsers/regex.cjs.map +1 -1
  85. package/dist/output_parsers/regex.js.map +1 -1
  86. package/dist/output_parsers/router.cjs.map +1 -1
  87. package/dist/output_parsers/router.js.map +1 -1
  88. package/dist/output_parsers/structured.cjs.map +1 -1
  89. package/dist/output_parsers/structured.js.map +1 -1
  90. package/dist/retrievers/document_compressors/index.cjs.map +1 -1
  91. package/dist/retrievers/document_compressors/index.js.map +1 -1
  92. package/dist/retrievers/hyde.cjs +1 -1
  93. package/dist/retrievers/hyde.cjs.map +1 -1
  94. package/dist/retrievers/hyde.js +1 -1
  95. package/dist/retrievers/hyde.js.map +1 -1
  96. package/dist/retrievers/matryoshka_retriever.cjs +1 -1
  97. package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
  98. package/dist/retrievers/matryoshka_retriever.js +1 -1
  99. package/dist/retrievers/matryoshka_retriever.js.map +1 -1
  100. package/dist/retrievers/score_threshold.cjs.map +1 -1
  101. package/dist/retrievers/score_threshold.js.map +1 -1
  102. package/dist/retrievers/self_query/index.cjs +1 -1
  103. package/dist/retrievers/self_query/index.d.ts +1 -1
  104. package/dist/retrievers/self_query/index.js +1 -1
  105. package/dist/smith/config.cjs.map +1 -1
  106. package/dist/smith/config.js.map +1 -1
  107. package/dist/smith/runner_utils.cjs.map +1 -1
  108. package/dist/smith/runner_utils.js.map +1 -1
  109. package/dist/tools/retriever.d.cts +1 -1
  110. package/dist/tools/retriever.d.cts.map +1 -1
  111. package/dist/tools/retriever.d.ts +1 -1
  112. package/dist/tools/retriever.d.ts.map +1 -1
  113. package/dist/util/sql_utils.cjs.map +1 -1
  114. package/dist/util/sql_utils.js.map +1 -1
  115. package/dist/vectorstores/memory.cjs +1 -1
  116. package/dist/vectorstores/memory.js +1 -1
  117. package/package.json +17 -18
@@ -6,7 +6,7 @@ import { ChatGeneration, Generation } from "@langchain/core/outputs";
6
6
  import { BaseCallbackConfig, Callbacks } from "@langchain/core/callbacks/manager";
7
7
  import { BaseLLMOutputParser } from "@langchain/core/output_parsers";
8
8
  import { ChainValues } from "@langchain/core/utils/types";
9
- import * as _langchain_core_prompt_values4 from "@langchain/core/prompt_values";
9
+ import * as _langchain_core_prompt_values2 from "@langchain/core/prompt_values";
10
10
 
11
11
  //#region src/evaluation/criteria/criteria.d.ts
12
12
  /**
@@ -50,7 +50,7 @@ declare class CriteriaEvalChain extends LLMStringEvaluator {
50
50
  * Resolve the prompt to use for the evaluation.
51
51
  * @param prompt
52
52
  */
53
- static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, _langchain_core_prompt_values4.BasePromptValueInterface, any>;
53
+ static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, _langchain_core_prompt_values2.BasePromptValueInterface, any>;
54
54
  /**
55
55
  * Create a new instance of the CriteriaEvalChain.
56
56
  * @param llm
@@ -76,7 +76,7 @@ declare class CriteriaEvalChain extends LLMStringEvaluator {
76
76
  declare class LabeledCriteriaEvalChain extends CriteriaEvalChain {
77
77
  static lc_name(): string;
78
78
  requiresReference: boolean;
79
- static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, _langchain_core_prompt_values4.BasePromptValueInterface, any>;
79
+ static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, _langchain_core_prompt_values2.BasePromptValueInterface, any>;
80
80
  }
81
81
  //#endregion
82
82
  export { Criteria, CriteriaEvalChain, CriteriaEvalInput, CriteriaLike, CriteriaResultOutputParser, LabeledCriteriaEvalChain };
@@ -1 +1 @@
1
- {"version":3,"file":"criteria.d.ts","names":["BaseLanguageModelInterface","BaseLLMOutputParser","ChainValues","ChatGeneration","Generation","BasePromptTemplate","Callbacks","BaseCallbackConfig","EvalOutputType","LLMEvalChainInput","LLMStringEvaluator","StringEvaluatorArgs","ExtractLLMCallOptions","ConstitutionalPrinciple","Criteria","CriteriaLike","CriteriaResultOutputParser","Promise","CriteriaEvalInput","CriteriaEvalChain","Record","_langchain_core_prompt_values4","BasePromptValueInterface","Omit","Partial","input","prediction","reference","LabeledCriteriaEvalChain"],"sources":["../../../src/evaluation/criteria/criteria.d.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { BaseLLMOutputParser } from \"@langchain/core/output_parsers\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { ChatGeneration, Generation } from \"@langchain/core/outputs\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { Callbacks, BaseCallbackConfig } from \"@langchain/core/callbacks/manager\";\nimport { EvalOutputType, LLMEvalChainInput, LLMStringEvaluator, StringEvaluatorArgs, type ExtractLLMCallOptions } from \"../base.js\";\nimport { ConstitutionalPrinciple } from \"../../chains/constitutional_ai/constitutional_principle.js\";\n/**\n * A Criteria to evaluate.\n */\nexport type Criteria = \"conciseness\" | \"relevance\" | \"correctness\" | \"coherence\" | \"harmfulness\" | \"maliciousness\" | \"helpfulness\" | \"controversiality\" | \"misogyny\" | \"criminality\" | \"insensitivity\" | \"depth\" | \"creativity\" | \"detail\";\nexport type CriteriaLike = {\n [key: string]: string;\n} | Criteria | ConstitutionalPrinciple;\n/**\n * A parser for the output of the CriteriaEvalChain.\n */\nexport declare class CriteriaResultOutputParser extends BaseLLMOutputParser<EvalOutputType> {\n lc_namespace: string[];\n parseResult(generations: Generation[] | ChatGeneration[], _callbacks: Callbacks | undefined): Promise<EvalOutputType>;\n}\nexport interface CriteriaEvalInput {\n input?: string;\n output: string;\n reference?: string;\n}\nexport declare class CriteriaEvalChain extends LLMStringEvaluator {\n static lc_name(): string;\n criterionName?: string;\n evaluationName?: string;\n requiresInput: boolean;\n requiresReference: boolean;\n skipReferenceWarning: string;\n outputParser: BaseLLMOutputParser<EvalOutputType>;\n /**\n * Resolve the criteria to evaluate.\n * @param criteria The criteria to evaluate the runs against. It can be:\n * - a mapping of a criterion name to its description\n * - a single criterion name present in one of the default criteria\n * - a single `ConstitutionalPrinciple` instance\n *\n * @return A dictionary mapping criterion names to descriptions.\n */\n static resolveCriteria(criteria?: CriteriaLike): Record<string, string>;\n /**\n * Resolve the prompt to use for the evaluation.\n * @param prompt\n */\n static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, import(\"@langchain/core/prompt_values\").BasePromptValueInterface, any>;\n /**\n * Create a new instance of the CriteriaEvalChain.\n * @param llm\n * @param criteria\n * @param chainOptions Options to pass to the constructor of the LLMChain.\n */\n static fromLLM(llm: BaseLanguageModelInterface, criteria?: CriteriaLike, chainOptions?: Partial<Omit<LLMEvalChainInput, \"llm\">>): Promise<CriteriaEvalChain>;\n getEvalInput({ input, prediction, reference }: StringEvaluatorArgs): CriteriaEvalInput;\n /**\n * Prepare the output of the evaluation.\n * @param result\n */\n _prepareOutput(result: ChainValues): any;\n _evaluateStrings(args: StringEvaluatorArgs & ExtractLLMCallOptions<this[\"llm\"]>, config?: Callbacks | BaseCallbackConfig): Promise<ChainValues>;\n}\n/**\n * Criteria evaluation chain that requires references.\n */\nexport declare class LabeledCriteriaEvalChain extends CriteriaEvalChain {\n static lc_name(): string;\n requiresReference: boolean;\n static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, import(\"@langchain/core/prompt_values\").BasePromptValueInterface, any>;\n}\n//# sourceMappingURL=criteria.d.ts.map"],"mappings":";;;;;;;;;;;;;;AAWYc,KAAAA,QAAAA,GAAQ,aAAA,GAAA,WAAA,GAAA,aAAA,GAAA,WAAA,GAAA,aAAA,GAAA,eAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,UAAA,GAAA,aAAA,GAAA,eAAA,GAAA,OAAA,GAAA,YAAA,GAAA,QAAA;AACRC,KAAAA,YAAAA,GAAY;EAMHC,CAAAA,GAAAA,EAAAA,MAAAA,CAAAA,EAAAA,MAAAA;CAAuDR,GAJxEM,QAIwEN,GAJ7DK,uBAI6DL;;;;AAE8BA,cAFrFQ,0BAAAA,SAAmCf,mBAEkDO,CAF9BA,cAE8BA,CAAAA,CAAAA;EAARS,YAAAA,EAAAA,MAAAA,EAAAA;EAF1ChB,WAAAA,CAAAA,WAAAA,EAE3BG,UAF2BH,EAAAA,GAEZE,cAFYF,EAAAA,EAAAA,UAAAA,EAEkBK,SAFlBL,GAAAA,SAAAA,CAAAA,EAE0CgB,OAF1ChB,CAEkDO,cAFlDP,CAAAA;AAAmB;AAI1DiB,UAAAA,iBAAAA,CAAiB;EAKbC,KAAAA,CAAAA,EAAAA,MAAAA;EAOiBX,MAAAA,EAAAA,MAAAA;EAApBP,SAAAA,CAAAA,EAAAA,MAAAA;;AAUmCmB,cAjBhCD,iBAAAA,SAA0BT,kBAAAA,CAiBMU;EAKnBf,OAAAA,OAAAA,CAAAA,CAAAA,EAAAA,MAAAA;EAAkBgB,aAAAA,CAAAA,EAAAA,MAAAA;EAAGhB,cAAAA,CAAAA,EAAAA,MAAAA;EAO/BL,aAAAA,EAAAA,OAAAA;EAAuCe,iBAAAA,EAAAA,OAAAA;EAA0CN,oBAAAA,EAAAA,MAAAA;EAALc,YAAAA,EAtBlFtB,mBAsBkFsB,CAtB9Df,cAsB8De,CAAAA;EAARC;;;;;;;;;EAOjEb,OAAAA,eAAAA,CAAAA,QAAAA,CAAAA,EAnBWI,YAmBXJ,CAAAA,EAnB0BS,MAmB1BT,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA;EAAsBC;;;;EAA8EK,OAAAA,aAAAA,CAAAA,MAAAA,CAAAA,EAd7FZ,kBAc6FY,CAAAA,EAdxEZ,kBAcwEY,CAAAA,GAAAA,EAd3EI,8BAAAA,CAAmEC,wBAAAA,EAcQL,GAAAA,CAAAA;EApChFP;AAAkB;AAyCjE;;;;EAAsDS,OAAAA,OAAAA,CAAAA,GAAAA,EAZ9BnB,0BAY8BmB,EAAAA,QAAAA,CAAAA,EAZSJ,YAYTI,EAAAA,YAAAA,CAAAA,EAZsCK,OAYtCL,CAZ8CI,IAY9CJ,CAZmDV,iBAYnDU,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA,EAZgFF,OAYhFE,CAZwFA,iBAYxFA,CAAAA;EAAiB,YAAA,CAAA;IAAA,KAAA;IAAA,UAAA;IAAA;EAAA,CAAA,EAXpBR,mBAWoB,CAAA,EAXEO,iBAWF;;;;;yBAN5ChB;yBACAS,sBAAsBC,6CAA6CN,YAAYC,qBAAqBU,QAAQf;;;;;cAKlH0B,wBAAAA,SAAiCT,iBAAAA;;;gCAGpBd,qBAAqBA,wBAAHgB,8BAAAA,CAAmEC,wBAAAA"}
1
+ {"version":3,"file":"criteria.d.ts","names":["BaseLanguageModelInterface","BaseLLMOutputParser","ChainValues","ChatGeneration","Generation","BasePromptTemplate","Callbacks","BaseCallbackConfig","EvalOutputType","LLMEvalChainInput","LLMStringEvaluator","StringEvaluatorArgs","ExtractLLMCallOptions","ConstitutionalPrinciple","Criteria","CriteriaLike","CriteriaResultOutputParser","Promise","CriteriaEvalInput","CriteriaEvalChain","Record","_langchain_core_prompt_values2","BasePromptValueInterface","Omit","Partial","input","prediction","reference","LabeledCriteriaEvalChain"],"sources":["../../../src/evaluation/criteria/criteria.d.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { BaseLLMOutputParser } from \"@langchain/core/output_parsers\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { ChatGeneration, Generation } from \"@langchain/core/outputs\";\nimport { BasePromptTemplate } from \"@langchain/core/prompts\";\nimport { Callbacks, BaseCallbackConfig } from \"@langchain/core/callbacks/manager\";\nimport { EvalOutputType, LLMEvalChainInput, LLMStringEvaluator, StringEvaluatorArgs, type ExtractLLMCallOptions } from \"../base.js\";\nimport { ConstitutionalPrinciple } from \"../../chains/constitutional_ai/constitutional_principle.js\";\n/**\n * A Criteria to evaluate.\n */\nexport type Criteria = \"conciseness\" | \"relevance\" | \"correctness\" | \"coherence\" | \"harmfulness\" | \"maliciousness\" | \"helpfulness\" | \"controversiality\" | \"misogyny\" | \"criminality\" | \"insensitivity\" | \"depth\" | \"creativity\" | \"detail\";\nexport type CriteriaLike = {\n [key: string]: string;\n} | Criteria | ConstitutionalPrinciple;\n/**\n * A parser for the output of the CriteriaEvalChain.\n */\nexport declare class CriteriaResultOutputParser extends BaseLLMOutputParser<EvalOutputType> {\n lc_namespace: string[];\n parseResult(generations: Generation[] | ChatGeneration[], _callbacks: Callbacks | undefined): Promise<EvalOutputType>;\n}\nexport interface CriteriaEvalInput {\n input?: string;\n output: string;\n reference?: string;\n}\nexport declare class CriteriaEvalChain extends LLMStringEvaluator {\n static lc_name(): string;\n criterionName?: string;\n evaluationName?: string;\n requiresInput: boolean;\n requiresReference: boolean;\n skipReferenceWarning: string;\n outputParser: BaseLLMOutputParser<EvalOutputType>;\n /**\n * Resolve the criteria to evaluate.\n * @param criteria The criteria to evaluate the runs against. It can be:\n * - a mapping of a criterion name to its description\n * - a single criterion name present in one of the default criteria\n * - a single `ConstitutionalPrinciple` instance\n *\n * @return A dictionary mapping criterion names to descriptions.\n */\n static resolveCriteria(criteria?: CriteriaLike): Record<string, string>;\n /**\n * Resolve the prompt to use for the evaluation.\n * @param prompt\n */\n static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, import(\"@langchain/core/prompt_values\").BasePromptValueInterface, any>;\n /**\n * Create a new instance of the CriteriaEvalChain.\n * @param llm\n * @param criteria\n * @param chainOptions Options to pass to the constructor of the LLMChain.\n */\n static fromLLM(llm: BaseLanguageModelInterface, criteria?: CriteriaLike, chainOptions?: Partial<Omit<LLMEvalChainInput, \"llm\">>): Promise<CriteriaEvalChain>;\n getEvalInput({ input, prediction, reference }: StringEvaluatorArgs): CriteriaEvalInput;\n /**\n * Prepare the output of the evaluation.\n * @param result\n */\n _prepareOutput(result: ChainValues): any;\n _evaluateStrings(args: StringEvaluatorArgs & ExtractLLMCallOptions<this[\"llm\"]>, config?: Callbacks | BaseCallbackConfig): Promise<ChainValues>;\n}\n/**\n * Criteria evaluation chain that requires references.\n */\nexport declare class LabeledCriteriaEvalChain extends CriteriaEvalChain {\n static lc_name(): string;\n requiresReference: boolean;\n static resolvePrompt(prompt?: BasePromptTemplate): BasePromptTemplate<any, import(\"@langchain/core/prompt_values\").BasePromptValueInterface, any>;\n}\n//# sourceMappingURL=criteria.d.ts.map"],"mappings":";;;;;;;;;;;;;;AAWYc,KAAAA,QAAAA,GAAQ,aAAA,GAAA,WAAA,GAAA,aAAA,GAAA,WAAA,GAAA,aAAA,GAAA,eAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,UAAA,GAAA,aAAA,GAAA,eAAA,GAAA,OAAA,GAAA,YAAA,GAAA,QAAA;AACRC,KAAAA,YAAAA,GAAY;EAMHC,CAAAA,GAAAA,EAAAA,MAAAA,CAAAA,EAAAA,MAAAA;CAAuDR,GAJxEM,QAIwEN,GAJ7DK,uBAI6DL;;;;AAE8BA,cAFrFQ,0BAAAA,SAAmCf,mBAEkDO,CAF9BA,cAE8BA,CAAAA,CAAAA;EAARS,YAAAA,EAAAA,MAAAA,EAAAA;EAF1ChB,WAAAA,CAAAA,WAAAA,EAE3BG,UAF2BH,EAAAA,GAEZE,cAFYF,EAAAA,EAAAA,UAAAA,EAEkBK,SAFlBL,GAAAA,SAAAA,CAAAA,EAE0CgB,OAF1ChB,CAEkDO,cAFlDP,CAAAA;AAAmB;AAI1DiB,UAAAA,iBAAAA,CAAiB;EAKbC,KAAAA,CAAAA,EAAAA,MAAAA;EAOiBX,MAAAA,EAAAA,MAAAA;EAApBP,SAAAA,CAAAA,EAAAA,MAAAA;;AAUmCmB,cAjBhCD,iBAAAA,SAA0BT,kBAAAA,CAiBMU;EAKnBf,OAAAA,OAAAA,CAAAA,CAAAA,EAAAA,MAAAA;EAAkBgB,aAAAA,CAAAA,EAAAA,MAAAA;EAAGhB,cAAAA,CAAAA,EAAAA,MAAAA;EAO/BL,aAAAA,EAAAA,OAAAA;EAAuCe,iBAAAA,EAAAA,OAAAA;EAA0CN,oBAAAA,EAAAA,MAAAA;EAALc,YAAAA,EAtBlFtB,mBAsBkFsB,CAtB9Df,cAsB8De,CAAAA;EAARC;;;;;;;;;EAOjEb,OAAAA,eAAAA,CAAAA,QAAAA,CAAAA,EAnBWI,YAmBXJ,CAAAA,EAnB0BS,MAmB1BT,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA;EAAsBC;;;;EAA8EK,OAAAA,aAAAA,CAAAA,MAAAA,CAAAA,EAd7FZ,kBAc6FY,CAAAA,EAdxEZ,kBAcwEY,CAAAA,GAAAA,EAd3EI,8BAAAA,CAAmEC,wBAAAA,EAcQL,GAAAA,CAAAA;EApChFP;AAAkB;AAyCjE;;;;EAAsDS,OAAAA,OAAAA,CAAAA,GAAAA,EAZ9BnB,0BAY8BmB,EAAAA,QAAAA,CAAAA,EAZSJ,YAYTI,EAAAA,YAAAA,CAAAA,EAZsCK,OAYtCL,CAZ8CI,IAY9CJ,CAZmDV,iBAYnDU,EAAAA,KAAAA,CAAAA,CAAAA,CAAAA,EAZgFF,OAYhFE,CAZwFA,iBAYxFA,CAAAA;EAAiB,YAAA,CAAA;IAAA,KAAA;IAAA,UAAA;IAAA;EAAA,CAAA,EAXpBR,mBAWoB,CAAA,EAXEO,iBAWF;;;;;yBAN5ChB;yBACAS,sBAAsBC,6CAA6CN,YAAYC,qBAAqBU,QAAQf;;;;;cAKlH0B,wBAAAA,SAAiCT,iBAAAA;;;gCAGpBd,qBAAqBA,wBAAHgB,8BAAAA,CAAmEC,wBAAAA"}
@@ -1,5 +1,5 @@
1
1
  import { ObjectTool } from "./schema.cjs";
2
- import * as _langchain_core_messages2 from "@langchain/core/messages";
2
+ import * as _langchain_core_messages3 from "@langchain/core/messages";
3
3
  import { BaseMessage } from "@langchain/core/messages";
4
4
  import { PartialValues } from "@langchain/core/utils/types";
5
5
  import { BaseChatPromptTemplate, SerializedBasePromptTemplate } from "@langchain/core/prompts";
@@ -54,7 +54,7 @@ declare class AutoGPTPrompt extends BaseChatPromptTemplate implements AutoGPTPro
54
54
  memory: VectorStoreRetrieverInterface;
55
55
  messages: BaseMessage[];
56
56
  user_input: string;
57
- }): Promise<BaseMessage<_langchain_core_messages2.MessageStructure, _langchain_core_messages2.MessageType>[]>;
57
+ }): Promise<BaseMessage<_langchain_core_messages3.MessageStructure<_langchain_core_messages3.MessageToolSet>, _langchain_core_messages3.MessageType>[]>;
58
58
  /**
59
59
  * This method is not implemented in the AutoGPTPrompt class and will
60
60
  * throw an error if called.
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.cts","names":["VectorStoreRetrieverInterface","BaseChatPromptTemplate","SerializedBasePromptTemplate","BaseMessage","PartialValues","ObjectTool","AutoGPTPromptInput","Promise","AutoGPTPrompt","goals","memory","previousMessages","user_input","_langchain_core_messages2","MessageStructure","MessageType"],"sources":["../../../src/experimental/autogpt/prompt.d.ts"],"sourcesContent":["import type { VectorStoreRetrieverInterface } from \"@langchain/core/vectorstores\";\nimport { BaseChatPromptTemplate, SerializedBasePromptTemplate } from \"@langchain/core/prompts\";\nimport { BaseMessage } from \"@langchain/core/messages\";\nimport { PartialValues } from \"@langchain/core/utils/types\";\nimport { ObjectTool } from \"./schema.js\";\n/**\n * Interface for the input parameters of the AutoGPTPrompt class.\n */\nexport interface AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit?: number;\n}\n/**\n * Class used to generate prompts for the AutoGPT model. It takes into\n * account the AI's name, role, tools, token counter, and send token\n * limit. The class also handles the formatting of messages and the\n * construction of the full prompt.\n */\nexport declare class AutoGPTPrompt extends BaseChatPromptTemplate implements AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit: number;\n constructor(fields: AutoGPTPromptInput);\n _getPromptType(): \"autogpt\";\n /**\n * Constructs the full prompt based on the provided goals.\n * @param goals An array of goals.\n * @returns The full prompt as a string.\n */\n constructFullPrompt(goals: string[]): string;\n /**\n * Formats the messages based on the provided parameters.\n * @param goals An array of goals.\n * @param memory A VectorStoreRetriever instance.\n * @param messages An array of previous messages.\n * @param user_input The user's input.\n * @returns An array of formatted messages.\n */\n formatMessages({ goals, memory, messages: previousMessages, user_input }: {\n goals: string[];\n memory: VectorStoreRetrieverInterface;\n messages: BaseMessage[];\n user_input: string;\n }): Promise<BaseMessage<import(\"@langchain/core/messages\").MessageStructure, import(\"@langchain/core/messages\").MessageType>[]>;\n /**\n * This method is not implemented in the AutoGPTPrompt class and will\n * throw an error if called.\n * @param _values Partial values.\n * @returns Throws an error.\n */\n partial(_values: PartialValues): Promise<BaseChatPromptTemplate>;\n serialize(): SerializedBasePromptTemplate;\n}\n//# sourceMappingURL=prompt.d.ts.map"],"mappings":";;;;;;;;;;;AAQiBM,UAAAA,kBAAAA,CAAkB;EAadE,MAAAA,EAAAA,MAAAA;EAGVH,MAAAA,EAAAA,MAAAA;EACyBE,KAAAA,EAdzBF,UAcyBE,EAAAA;EAEZD,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GAfYC,OAeZD,CAAAA,MAAAA,CAAAA;EAgBHG,cAAAA,CAAAA,EAAAA,MAAAA;;;;;;;;AAKLN,cA3BKK,aAAAA,SAAsBP,sBAAAA,YAAkCK,kBA2B7DH,CAAAA;EAARI,MAAAA,EAAAA,MAAAA;EAOaH,MAAAA,EAAAA,MAAAA;EAAwBH,KAAAA,EA/BlCI,UA+BkCJ,EAAAA;EAARM,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GA9BDA,OA8BCA,CAAAA,MAAAA,CAAAA;EACpBL,cAAAA,EAAAA,MAAAA;EAnC0BD,WAAAA,CAAAA,MAAAA,EAMnBK,kBANmBL;EAAkCK,cAAAA,CAAAA,CAAAA,EAAAA,SAAAA;EAAkB;;;;;;;;;;;;;;;;;cAsBjDK;;;;YAE9BX;cACEG;;MAEVI,QAAQJ,YAFaU,yBAAAA,CAEkCC,gBAAAA,EAAgBD,yBAAAA,CAAqCE,WAAAA;;;;;;;mBAO/FX,gBAAgBG,QAAQN;eAC5BC"}
1
+ {"version":3,"file":"prompt.d.cts","names":["VectorStoreRetrieverInterface","BaseChatPromptTemplate","SerializedBasePromptTemplate","BaseMessage","PartialValues","ObjectTool","AutoGPTPromptInput","Promise","AutoGPTPrompt","goals","memory","previousMessages","user_input","_langchain_core_messages3","MessageToolSet","MessageStructure","MessageType"],"sources":["../../../src/experimental/autogpt/prompt.d.ts"],"sourcesContent":["import type { VectorStoreRetrieverInterface } from \"@langchain/core/vectorstores\";\nimport { BaseChatPromptTemplate, SerializedBasePromptTemplate } from \"@langchain/core/prompts\";\nimport { BaseMessage } from \"@langchain/core/messages\";\nimport { PartialValues } from \"@langchain/core/utils/types\";\nimport { ObjectTool } from \"./schema.js\";\n/**\n * Interface for the input parameters of the AutoGPTPrompt class.\n */\nexport interface AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit?: number;\n}\n/**\n * Class used to generate prompts for the AutoGPT model. It takes into\n * account the AI's name, role, tools, token counter, and send token\n * limit. The class also handles the formatting of messages and the\n * construction of the full prompt.\n */\nexport declare class AutoGPTPrompt extends BaseChatPromptTemplate implements AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit: number;\n constructor(fields: AutoGPTPromptInput);\n _getPromptType(): \"autogpt\";\n /**\n * Constructs the full prompt based on the provided goals.\n * @param goals An array of goals.\n * @returns The full prompt as a string.\n */\n constructFullPrompt(goals: string[]): string;\n /**\n * Formats the messages based on the provided parameters.\n * @param goals An array of goals.\n * @param memory A VectorStoreRetriever instance.\n * @param messages An array of previous messages.\n * @param user_input The user's input.\n * @returns An array of formatted messages.\n */\n formatMessages({ goals, memory, messages: previousMessages, user_input }: {\n goals: string[];\n memory: VectorStoreRetrieverInterface;\n messages: BaseMessage[];\n user_input: string;\n }): Promise<BaseMessage<import(\"@langchain/core/messages\").MessageStructure<import(\"@langchain/core/messages\").MessageToolSet>, import(\"@langchain/core/messages\").MessageType>[]>;\n /**\n * This method is not implemented in the AutoGPTPrompt class and will\n * throw an error if called.\n * @param _values Partial values.\n * @returns Throws an error.\n */\n partial(_values: PartialValues): Promise<BaseChatPromptTemplate>;\n serialize(): SerializedBasePromptTemplate;\n}\n//# sourceMappingURL=prompt.d.ts.map"],"mappings":";;;;;;;;;;;AAQiBM,UAAAA,kBAAAA,CAAkB;EAadE,MAAAA,EAAAA,MAAAA;EAGVH,MAAAA,EAAAA,MAAAA;EACyBE,KAAAA,EAdzBF,UAcyBE,EAAAA;EAEZD,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GAfYC,OAeZD,CAAAA,MAAAA,CAAAA;EAgBHG,cAAAA,CAAAA,EAAAA,MAAAA;;;;;;;;AAK0DI,cA3B1DL,aAAAA,SAAsBP,sBAAAA,YAAkCK,kBA2B0FU,CAAAA;EAAvJb,MAAAA,EAAAA,MAAAA;EAARI,MAAAA,EAAAA,MAAAA;EAOaH,KAAAA,EA/BVC,UA+BUD,EAAAA;EAAwBH,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GA9BTM,OA8BSN,CAAAA,MAAAA,CAAAA;EAARM,cAAAA,EAAAA,MAAAA;EACpBL,WAAAA,CAAAA,MAAAA,EA7BOI,kBA6BPJ;EAnC0BD,cAAAA,CAAAA,CAAAA,EAAAA,SAAAA;EAAkCK;AAAkB;;;;;;;;;;;;;;;;cAsBjDK;;;;YAE9BX;cACEG;;MAEVI,QAAQJ,YAAiHU,yBAAAA,CAAlEE,iBAFlCF,yBAAAA,CAEsFC,cAAAA,GAApCD,yBAAAA,CAAwFG,WAAAA;;;;;;;mBAOlJZ,gBAAgBG,QAAQN;eAC5BC"}
@@ -1,6 +1,6 @@
1
1
  import { ObjectTool } from "./schema.js";
2
2
  import { BaseChatPromptTemplate, SerializedBasePromptTemplate } from "@langchain/core/prompts";
3
- import * as _langchain_core_messages2 from "@langchain/core/messages";
3
+ import * as _langchain_core_messages3 from "@langchain/core/messages";
4
4
  import { BaseMessage } from "@langchain/core/messages";
5
5
  import { PartialValues } from "@langchain/core/utils/types";
6
6
  import { VectorStoreRetrieverInterface } from "@langchain/core/vectorstores";
@@ -54,7 +54,7 @@ declare class AutoGPTPrompt extends BaseChatPromptTemplate implements AutoGPTPro
54
54
  memory: VectorStoreRetrieverInterface;
55
55
  messages: BaseMessage[];
56
56
  user_input: string;
57
- }): Promise<BaseMessage<_langchain_core_messages2.MessageStructure, _langchain_core_messages2.MessageType>[]>;
57
+ }): Promise<BaseMessage<_langchain_core_messages3.MessageStructure<_langchain_core_messages3.MessageToolSet>, _langchain_core_messages3.MessageType>[]>;
58
58
  /**
59
59
  * This method is not implemented in the AutoGPTPrompt class and will
60
60
  * throw an error if called.
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","names":["VectorStoreRetrieverInterface","BaseChatPromptTemplate","SerializedBasePromptTemplate","BaseMessage","PartialValues","ObjectTool","AutoGPTPromptInput","Promise","AutoGPTPrompt","goals","memory","previousMessages","user_input","_langchain_core_messages2","MessageStructure","MessageType"],"sources":["../../../src/experimental/autogpt/prompt.d.ts"],"sourcesContent":["import type { VectorStoreRetrieverInterface } from \"@langchain/core/vectorstores\";\nimport { BaseChatPromptTemplate, SerializedBasePromptTemplate } from \"@langchain/core/prompts\";\nimport { BaseMessage } from \"@langchain/core/messages\";\nimport { PartialValues } from \"@langchain/core/utils/types\";\nimport { ObjectTool } from \"./schema.js\";\n/**\n * Interface for the input parameters of the AutoGPTPrompt class.\n */\nexport interface AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit?: number;\n}\n/**\n * Class used to generate prompts for the AutoGPT model. It takes into\n * account the AI's name, role, tools, token counter, and send token\n * limit. The class also handles the formatting of messages and the\n * construction of the full prompt.\n */\nexport declare class AutoGPTPrompt extends BaseChatPromptTemplate implements AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit: number;\n constructor(fields: AutoGPTPromptInput);\n _getPromptType(): \"autogpt\";\n /**\n * Constructs the full prompt based on the provided goals.\n * @param goals An array of goals.\n * @returns The full prompt as a string.\n */\n constructFullPrompt(goals: string[]): string;\n /**\n * Formats the messages based on the provided parameters.\n * @param goals An array of goals.\n * @param memory A VectorStoreRetriever instance.\n * @param messages An array of previous messages.\n * @param user_input The user's input.\n * @returns An array of formatted messages.\n */\n formatMessages({ goals, memory, messages: previousMessages, user_input }: {\n goals: string[];\n memory: VectorStoreRetrieverInterface;\n messages: BaseMessage[];\n user_input: string;\n }): Promise<BaseMessage<import(\"@langchain/core/messages\").MessageStructure, import(\"@langchain/core/messages\").MessageType>[]>;\n /**\n * This method is not implemented in the AutoGPTPrompt class and will\n * throw an error if called.\n * @param _values Partial values.\n * @returns Throws an error.\n */\n partial(_values: PartialValues): Promise<BaseChatPromptTemplate>;\n serialize(): SerializedBasePromptTemplate;\n}\n//# sourceMappingURL=prompt.d.ts.map"],"mappings":";;;;;;;;;;;AAQiBM,UAAAA,kBAAAA,CAAkB;EAadE,MAAAA,EAAAA,MAAAA;EAGVH,MAAAA,EAAAA,MAAAA;EACyBE,KAAAA,EAdzBF,UAcyBE,EAAAA;EAEZD,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GAfYC,OAeZD,CAAAA,MAAAA,CAAAA;EAgBHG,cAAAA,CAAAA,EAAAA,MAAAA;;;;;;;;AAKLN,cA3BKK,aAAAA,SAAsBP,sBAAAA,YAAkCK,kBA2B7DH,CAAAA;EAARI,MAAAA,EAAAA,MAAAA;EAOaH,MAAAA,EAAAA,MAAAA;EAAwBH,KAAAA,EA/BlCI,UA+BkCJ,EAAAA;EAARM,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GA9BDA,OA8BCA,CAAAA,MAAAA,CAAAA;EACpBL,cAAAA,EAAAA,MAAAA;EAnC0BD,WAAAA,CAAAA,MAAAA,EAMnBK,kBANmBL;EAAkCK,cAAAA,CAAAA,CAAAA,EAAAA,SAAAA;EAAkB;;;;;;;;;;;;;;;;;cAsBjDK;;;;YAE9BX;cACEG;;MAEVI,QAAQJ,YAFaU,yBAAAA,CAEkCC,gBAAAA,EAAgBD,yBAAAA,CAAqCE,WAAAA;;;;;;;mBAO/FX,gBAAgBG,QAAQN;eAC5BC"}
1
+ {"version":3,"file":"prompt.d.ts","names":["VectorStoreRetrieverInterface","BaseChatPromptTemplate","SerializedBasePromptTemplate","BaseMessage","PartialValues","ObjectTool","AutoGPTPromptInput","Promise","AutoGPTPrompt","goals","memory","previousMessages","user_input","_langchain_core_messages3","MessageToolSet","MessageStructure","MessageType"],"sources":["../../../src/experimental/autogpt/prompt.d.ts"],"sourcesContent":["import type { VectorStoreRetrieverInterface } from \"@langchain/core/vectorstores\";\nimport { BaseChatPromptTemplate, SerializedBasePromptTemplate } from \"@langchain/core/prompts\";\nimport { BaseMessage } from \"@langchain/core/messages\";\nimport { PartialValues } from \"@langchain/core/utils/types\";\nimport { ObjectTool } from \"./schema.js\";\n/**\n * Interface for the input parameters of the AutoGPTPrompt class.\n */\nexport interface AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit?: number;\n}\n/**\n * Class used to generate prompts for the AutoGPT model. It takes into\n * account the AI's name, role, tools, token counter, and send token\n * limit. The class also handles the formatting of messages and the\n * construction of the full prompt.\n */\nexport declare class AutoGPTPrompt extends BaseChatPromptTemplate implements AutoGPTPromptInput {\n aiName: string;\n aiRole: string;\n tools: ObjectTool[];\n tokenCounter: (text: string) => Promise<number>;\n sendTokenLimit: number;\n constructor(fields: AutoGPTPromptInput);\n _getPromptType(): \"autogpt\";\n /**\n * Constructs the full prompt based on the provided goals.\n * @param goals An array of goals.\n * @returns The full prompt as a string.\n */\n constructFullPrompt(goals: string[]): string;\n /**\n * Formats the messages based on the provided parameters.\n * @param goals An array of goals.\n * @param memory A VectorStoreRetriever instance.\n * @param messages An array of previous messages.\n * @param user_input The user's input.\n * @returns An array of formatted messages.\n */\n formatMessages({ goals, memory, messages: previousMessages, user_input }: {\n goals: string[];\n memory: VectorStoreRetrieverInterface;\n messages: BaseMessage[];\n user_input: string;\n }): Promise<BaseMessage<import(\"@langchain/core/messages\").MessageStructure<import(\"@langchain/core/messages\").MessageToolSet>, import(\"@langchain/core/messages\").MessageType>[]>;\n /**\n * This method is not implemented in the AutoGPTPrompt class and will\n * throw an error if called.\n * @param _values Partial values.\n * @returns Throws an error.\n */\n partial(_values: PartialValues): Promise<BaseChatPromptTemplate>;\n serialize(): SerializedBasePromptTemplate;\n}\n//# sourceMappingURL=prompt.d.ts.map"],"mappings":";;;;;;;;;;;AAQiBM,UAAAA,kBAAAA,CAAkB;EAadE,MAAAA,EAAAA,MAAAA;EAGVH,MAAAA,EAAAA,MAAAA;EACyBE,KAAAA,EAdzBF,UAcyBE,EAAAA;EAEZD,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GAfYC,OAeZD,CAAAA,MAAAA,CAAAA;EAgBHG,cAAAA,CAAAA,EAAAA,MAAAA;;;;;;;;AAK0DI,cA3B1DL,aAAAA,SAAsBP,sBAAAA,YAAkCK,kBA2B0FU,CAAAA;EAAvJb,MAAAA,EAAAA,MAAAA;EAARI,MAAAA,EAAAA,MAAAA;EAOaH,KAAAA,EA/BVC,UA+BUD,EAAAA;EAAwBH,YAAAA,EAAAA,CAAAA,IAAAA,EAAAA,MAAAA,EAAAA,GA9BTM,OA8BSN,CAAAA,MAAAA,CAAAA;EAARM,cAAAA,EAAAA,MAAAA;EACpBL,WAAAA,CAAAA,MAAAA,EA7BOI,kBA6BPJ;EAnC0BD,cAAAA,CAAAA,CAAAA,EAAAA,SAAAA;EAAkCK;AAAkB;;;;;;;;;;;;;;;;cAsBjDK;;;;YAE9BX;cACEG;;MAEVI,QAAQJ,YAAiHU,yBAAAA,CAAlEE,iBAFlCF,yBAAAA,CAEsFC,cAAAA,GAApCD,yBAAAA,CAAwFG,WAAAA;;;;;;;mBAOlJZ,gBAAgBG,QAAQN;eAC5BC"}
@@ -1 +1 @@
1
- {"version":3,"file":"regex_masking_transformer.cjs","names":["MaskingTransformer","patterns: { [key: string]: MaskingPattern }","hashFunction?: HashFunction","message: string","state: Map<string, string>","input: string"],"sources":["../../../src/experimental/masking/regex_masking_transformer.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { HashFunction, MaskingPattern } from \"./types.js\";\n/**\n * RegexMaskingTransformer class for masking and rehydrating messages with Regex.\n */\nexport class RegexMaskingTransformer extends MaskingTransformer {\n private patterns: { [key: string]: MaskingPattern };\n\n private hashFunction: HashFunction;\n\n /**\n * Constructs a RegexMaskingTransformer with given patterns and an optional hash function.\n * Validates the provided patterns to ensure they conform to the expected structure.\n *\n * @param patterns - An object containing masking patterns. Each pattern should include\n * a regular expression (`regex`) and optionally a `replacement` string\n * or a `mask` function.\n * @param hashFunction - An optional custom hash function to be used for masking.\n */\n constructor(\n patterns: { [key: string]: MaskingPattern },\n hashFunction?: HashFunction\n ) {\n super();\n // Validates the provided masking patterns before initializing the transformer.\n // This ensures that each pattern has a valid regular expression.\n this.validatePatterns(patterns);\n\n // Assigns the validated patterns and the hash function to the transformer.\n // If no custom hash function is provided, the default hash function is used.\n this.patterns = patterns;\n this.hashFunction = hashFunction || this.defaultHashFunction;\n }\n\n /**\n * Validates the given masking patterns to ensure each pattern has a valid regular expression.\n * Throws an error if any pattern is found to be invalid.\n *\n * @param patterns - The patterns object to validate.\n */\n private validatePatterns(patterns: { [key: string]: MaskingPattern }) {\n for (const key of Object.keys(patterns)) {\n const pattern = patterns[key];\n // Checks that each pattern is an object and has a regex property that is an instance of RegExp.\n // Throws an error if these conditions are not met, indicating an invalid pattern configuration.\n if (\n !pattern ||\n typeof pattern !== \"object\" ||\n // eslint-disable-next-line no-instanceof/no-instanceof\n !(pattern.regex instanceof RegExp)\n ) {\n throw new Error(\"Invalid pattern configuration.\");\n }\n }\n }\n\n /**\n * Masks content in a message based on the defined patterns.\n * @param message - The message to be masked.\n * @param state - The current state containing original values.\n * @returns A tuple of the masked message and the updated state.\n */\n async transform(\n message: string,\n state: Map<string, string>\n ): Promise<[string, Map<string, string>]> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Holds the progressively masked message\n let processedMessage = message;\n\n // Initialize original values map with the current state or a new map\n const originalValues = state || new Map<string, string>();\n\n // Iterate over each pattern defined in the transformer\n for (const key of Object.keys(this.patterns)) {\n const pattern = this.patterns[key];\n\n // Apply the current pattern's regex to the message\n processedMessage = processedMessage.replace(pattern.regex, (match) => {\n // Determine the masked value: use the mask function if provided, else use the replacement string,\n // else use the hash function.\n const maskedValue = pattern.mask\n ? pattern.mask(match)\n : pattern.replacement ?? this.hashFunction(match);\n\n // Store the mapping of the masked value to the original value (match)\n originalValues.set(maskedValue, match);\n\n // Return the masked value to replace the original value in the message\n return maskedValue;\n });\n }\n\n // Return the fully masked message and the state map with all original values\n // Wrap the synchronous return values in Promise.resolve() to maintain compatibility\n // with the MaskingParser's expectation of a Promise return type.\n return [processedMessage, originalValues];\n }\n\n /**\n * Rehydrates a masked message back to its original form using the provided state.\n * @param message - The masked message to be rehydrated.\n * @param state - The state map containing mappings of masked values to their original values.\n * @returns The rehydrated (original) message.\n */\n async rehydrate(\n message: string,\n state: Map<string, string>\n ): Promise<string> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Convert the state map to an array and use reduce to sequentially replace masked values with original values.\n const rehydratedMessage = Array.from(state).reduce(\n (msg, [masked, original]) => {\n // Escape special characters in the masked string to ensure it can be used in a regular expression safely.\n // This is necessary because masked values might contain characters that have special meanings in regex.\n const escapedMasked = masked.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // Replace all instances of the escaped masked value in the message with the original value.\n // The 'g' flag in the RegExp ensures that all occurrences of the masked value are replaced.\n return msg.replace(new RegExp(escapedMasked, \"g\"), original);\n },\n message\n );\n\n return rehydratedMessage;\n }\n\n /**\n * Default hash function for creating unique hash values.\n * @param input - The input string to hash.\n * @returns The resulting hash as a string.\n */\n private defaultHashFunction(input: string): string {\n let hash = 0;\n // Iterate over each character in the input string\n for (let i = 0; i < input.length; i += 1) {\n // Get ASCII value of the character\n const char = input.charCodeAt(i);\n // Combine the current hash with the new character and ensure it remains a 32-bit integer\n hash = (hash << 5) - hash + char;\n // Bitwise OR operation to convert to a 32-bit integer.\n // This is a common technique to ensure the final hash value stays within the 32-bit limit,\n // effectively wrapping the value when it becomes too large.\n hash |= 0;\n }\n\n // Convert the numerical hash value to a string and return\n return hash.toString();\n }\n}\n"],"mappings":";;;;;;AAKA,IAAa,0BAAb,cAA6CA,uCAAmB;CAC9D,AAAQ;CAER,AAAQ;;;;;;;;;;CAWR,YACEC,UACAC,cACA;EACA,OAAO;EAGP,KAAK,iBAAiB,SAAS;EAI/B,KAAK,WAAW;EAChB,KAAK,eAAe,gBAAgB,KAAK;CAC1C;;;;;;;CAQD,AAAQ,iBAAiBD,UAA6C;AACpE,OAAK,MAAM,OAAO,OAAO,KAAK,SAAS,EAAE;GACvC,MAAM,UAAU,SAAS;AAGzB,OACE,CAAC,WACD,OAAO,YAAY,YAEnB,EAAE,QAAQ,iBAAiB,QAE3B,OAAM,IAAI,MAAM;EAEnB;CACF;;;;;;;CAQD,MAAM,UACJE,SACAC,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI;AAGpC,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;GAG9B,mBAAmB,iBAAiB,QAAQ,QAAQ,OAAO,CAAC,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GACnB,QAAQ,eAAe,KAAK,aAAa,MAAM;IAGnD,eAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;GACR,EAAC;EACH;AAKD,SAAO,CAAC,kBAAkB,cAAe;CAC1C;;;;;;;CAQD,MAAM,UACJD,SACAC,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,MAAM,oBAAoB,MAAM,KAAK,MAAM,CAAC,OAC1C,CAAC,KAAK,CAAC,QAAQ,SAAS,KAAK;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,MAAM,SAAS;EAC7D,GACD,QACD;AAED,SAAO;CACR;;;;;;CAOD,AAAQ,oBAAoBC,OAAuB;EACjD,IAAI,OAAO;AAEX,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;GAExC,MAAM,OAAO,MAAM,WAAW,EAAE;GAEhC,QAAQ,QAAQ,KAAK,OAAO;GAI5B,QAAQ;EACT;AAGD,SAAO,KAAK,UAAU;CACvB;AACF"}
1
+ {"version":3,"file":"regex_masking_transformer.cjs","names":["MaskingTransformer","patterns: { [key: string]: MaskingPattern }","hashFunction?: HashFunction","message: string","state: Map<string, string>","input: string"],"sources":["../../../src/experimental/masking/regex_masking_transformer.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { HashFunction, MaskingPattern } from \"./types.js\";\n/**\n * RegexMaskingTransformer class for masking and rehydrating messages with Regex.\n */\nexport class RegexMaskingTransformer extends MaskingTransformer {\n private patterns: { [key: string]: MaskingPattern };\n\n private hashFunction: HashFunction;\n\n /**\n * Constructs a RegexMaskingTransformer with given patterns and an optional hash function.\n * Validates the provided patterns to ensure they conform to the expected structure.\n *\n * @param patterns - An object containing masking patterns. Each pattern should include\n * a regular expression (`regex`) and optionally a `replacement` string\n * or a `mask` function.\n * @param hashFunction - An optional custom hash function to be used for masking.\n */\n constructor(\n patterns: { [key: string]: MaskingPattern },\n hashFunction?: HashFunction\n ) {\n super();\n // Validates the provided masking patterns before initializing the transformer.\n // This ensures that each pattern has a valid regular expression.\n this.validatePatterns(patterns);\n\n // Assigns the validated patterns and the hash function to the transformer.\n // If no custom hash function is provided, the default hash function is used.\n this.patterns = patterns;\n this.hashFunction = hashFunction || this.defaultHashFunction;\n }\n\n /**\n * Validates the given masking patterns to ensure each pattern has a valid regular expression.\n * Throws an error if any pattern is found to be invalid.\n *\n * @param patterns - The patterns object to validate.\n */\n private validatePatterns(patterns: { [key: string]: MaskingPattern }) {\n for (const key of Object.keys(patterns)) {\n const pattern = patterns[key];\n // Checks that each pattern is an object and has a regex property that is an instance of RegExp.\n // Throws an error if these conditions are not met, indicating an invalid pattern configuration.\n if (\n !pattern ||\n typeof pattern !== \"object\" ||\n // eslint-disable-next-line no-instanceof/no-instanceof\n !(pattern.regex instanceof RegExp)\n ) {\n throw new Error(\"Invalid pattern configuration.\");\n }\n }\n }\n\n /**\n * Masks content in a message based on the defined patterns.\n * @param message - The message to be masked.\n * @param state - The current state containing original values.\n * @returns A tuple of the masked message and the updated state.\n */\n async transform(\n message: string,\n state: Map<string, string>\n ): Promise<[string, Map<string, string>]> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Holds the progressively masked message\n let processedMessage = message;\n\n // Initialize original values map with the current state or a new map\n const originalValues = state || new Map<string, string>();\n\n // Iterate over each pattern defined in the transformer\n for (const key of Object.keys(this.patterns)) {\n const pattern = this.patterns[key];\n\n // Apply the current pattern's regex to the message\n processedMessage = processedMessage.replace(pattern.regex, (match) => {\n // Determine the masked value: use the mask function if provided, else use the replacement string,\n // else use the hash function.\n const maskedValue = pattern.mask\n ? pattern.mask(match)\n : (pattern.replacement ?? this.hashFunction(match));\n\n // Store the mapping of the masked value to the original value (match)\n originalValues.set(maskedValue, match);\n\n // Return the masked value to replace the original value in the message\n return maskedValue;\n });\n }\n\n // Return the fully masked message and the state map with all original values\n // Wrap the synchronous return values in Promise.resolve() to maintain compatibility\n // with the MaskingParser's expectation of a Promise return type.\n return [processedMessage, originalValues];\n }\n\n /**\n * Rehydrates a masked message back to its original form using the provided state.\n * @param message - The masked message to be rehydrated.\n * @param state - The state map containing mappings of masked values to their original values.\n * @returns The rehydrated (original) message.\n */\n async rehydrate(\n message: string,\n state: Map<string, string>\n ): Promise<string> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Convert the state map to an array and use reduce to sequentially replace masked values with original values.\n const rehydratedMessage = Array.from(state).reduce(\n (msg, [masked, original]) => {\n // Escape special characters in the masked string to ensure it can be used in a regular expression safely.\n // This is necessary because masked values might contain characters that have special meanings in regex.\n const escapedMasked = masked.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // Replace all instances of the escaped masked value in the message with the original value.\n // The 'g' flag in the RegExp ensures that all occurrences of the masked value are replaced.\n return msg.replace(new RegExp(escapedMasked, \"g\"), original);\n },\n message\n );\n\n return rehydratedMessage;\n }\n\n /**\n * Default hash function for creating unique hash values.\n * @param input - The input string to hash.\n * @returns The resulting hash as a string.\n */\n private defaultHashFunction(input: string): string {\n let hash = 0;\n // Iterate over each character in the input string\n for (let i = 0; i < input.length; i += 1) {\n // Get ASCII value of the character\n const char = input.charCodeAt(i);\n // Combine the current hash with the new character and ensure it remains a 32-bit integer\n hash = (hash << 5) - hash + char;\n // Bitwise OR operation to convert to a 32-bit integer.\n // This is a common technique to ensure the final hash value stays within the 32-bit limit,\n // effectively wrapping the value when it becomes too large.\n hash |= 0;\n }\n\n // Convert the numerical hash value to a string and return\n return hash.toString();\n }\n}\n"],"mappings":";;;;;;AAKA,IAAa,0BAAb,cAA6CA,uCAAmB;CAC9D,AAAQ;CAER,AAAQ;;;;;;;;;;CAWR,YACEC,UACAC,cACA;EACA,OAAO;EAGP,KAAK,iBAAiB,SAAS;EAI/B,KAAK,WAAW;EAChB,KAAK,eAAe,gBAAgB,KAAK;CAC1C;;;;;;;CAQD,AAAQ,iBAAiBD,UAA6C;AACpE,OAAK,MAAM,OAAO,OAAO,KAAK,SAAS,EAAE;GACvC,MAAM,UAAU,SAAS;AAGzB,OACE,CAAC,WACD,OAAO,YAAY,YAEnB,EAAE,QAAQ,iBAAiB,QAE3B,OAAM,IAAI,MAAM;EAEnB;CACF;;;;;;;CAQD,MAAM,UACJE,SACAC,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI;AAGpC,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;GAG9B,mBAAmB,iBAAiB,QAAQ,QAAQ,OAAO,CAAC,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GAClB,QAAQ,eAAe,KAAK,aAAa,MAAM;IAGpD,eAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;GACR,EAAC;EACH;AAKD,SAAO,CAAC,kBAAkB,cAAe;CAC1C;;;;;;;CAQD,MAAM,UACJD,SACAC,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,MAAM,oBAAoB,MAAM,KAAK,MAAM,CAAC,OAC1C,CAAC,KAAK,CAAC,QAAQ,SAAS,KAAK;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,MAAM,SAAS;EAC7D,GACD,QACD;AAED,SAAO;CACR;;;;;;CAOD,AAAQ,oBAAoBC,OAAuB;EACjD,IAAI,OAAO;AAEX,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;GAExC,MAAM,OAAO,MAAM,WAAW,EAAE;GAEhC,QAAQ,QAAQ,KAAK,OAAO;GAI5B,QAAQ;EACT;AAGD,SAAO,KAAK,UAAU;CACvB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"regex_masking_transformer.js","names":["patterns: { [key: string]: MaskingPattern }","hashFunction?: HashFunction","message: string","state: Map<string, string>","input: string"],"sources":["../../../src/experimental/masking/regex_masking_transformer.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { HashFunction, MaskingPattern } from \"./types.js\";\n/**\n * RegexMaskingTransformer class for masking and rehydrating messages with Regex.\n */\nexport class RegexMaskingTransformer extends MaskingTransformer {\n private patterns: { [key: string]: MaskingPattern };\n\n private hashFunction: HashFunction;\n\n /**\n * Constructs a RegexMaskingTransformer with given patterns and an optional hash function.\n * Validates the provided patterns to ensure they conform to the expected structure.\n *\n * @param patterns - An object containing masking patterns. Each pattern should include\n * a regular expression (`regex`) and optionally a `replacement` string\n * or a `mask` function.\n * @param hashFunction - An optional custom hash function to be used for masking.\n */\n constructor(\n patterns: { [key: string]: MaskingPattern },\n hashFunction?: HashFunction\n ) {\n super();\n // Validates the provided masking patterns before initializing the transformer.\n // This ensures that each pattern has a valid regular expression.\n this.validatePatterns(patterns);\n\n // Assigns the validated patterns and the hash function to the transformer.\n // If no custom hash function is provided, the default hash function is used.\n this.patterns = patterns;\n this.hashFunction = hashFunction || this.defaultHashFunction;\n }\n\n /**\n * Validates the given masking patterns to ensure each pattern has a valid regular expression.\n * Throws an error if any pattern is found to be invalid.\n *\n * @param patterns - The patterns object to validate.\n */\n private validatePatterns(patterns: { [key: string]: MaskingPattern }) {\n for (const key of Object.keys(patterns)) {\n const pattern = patterns[key];\n // Checks that each pattern is an object and has a regex property that is an instance of RegExp.\n // Throws an error if these conditions are not met, indicating an invalid pattern configuration.\n if (\n !pattern ||\n typeof pattern !== \"object\" ||\n // eslint-disable-next-line no-instanceof/no-instanceof\n !(pattern.regex instanceof RegExp)\n ) {\n throw new Error(\"Invalid pattern configuration.\");\n }\n }\n }\n\n /**\n * Masks content in a message based on the defined patterns.\n * @param message - The message to be masked.\n * @param state - The current state containing original values.\n * @returns A tuple of the masked message and the updated state.\n */\n async transform(\n message: string,\n state: Map<string, string>\n ): Promise<[string, Map<string, string>]> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Holds the progressively masked message\n let processedMessage = message;\n\n // Initialize original values map with the current state or a new map\n const originalValues = state || new Map<string, string>();\n\n // Iterate over each pattern defined in the transformer\n for (const key of Object.keys(this.patterns)) {\n const pattern = this.patterns[key];\n\n // Apply the current pattern's regex to the message\n processedMessage = processedMessage.replace(pattern.regex, (match) => {\n // Determine the masked value: use the mask function if provided, else use the replacement string,\n // else use the hash function.\n const maskedValue = pattern.mask\n ? pattern.mask(match)\n : pattern.replacement ?? this.hashFunction(match);\n\n // Store the mapping of the masked value to the original value (match)\n originalValues.set(maskedValue, match);\n\n // Return the masked value to replace the original value in the message\n return maskedValue;\n });\n }\n\n // Return the fully masked message and the state map with all original values\n // Wrap the synchronous return values in Promise.resolve() to maintain compatibility\n // with the MaskingParser's expectation of a Promise return type.\n return [processedMessage, originalValues];\n }\n\n /**\n * Rehydrates a masked message back to its original form using the provided state.\n * @param message - The masked message to be rehydrated.\n * @param state - The state map containing mappings of masked values to their original values.\n * @returns The rehydrated (original) message.\n */\n async rehydrate(\n message: string,\n state: Map<string, string>\n ): Promise<string> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Convert the state map to an array and use reduce to sequentially replace masked values with original values.\n const rehydratedMessage = Array.from(state).reduce(\n (msg, [masked, original]) => {\n // Escape special characters in the masked string to ensure it can be used in a regular expression safely.\n // This is necessary because masked values might contain characters that have special meanings in regex.\n const escapedMasked = masked.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // Replace all instances of the escaped masked value in the message with the original value.\n // The 'g' flag in the RegExp ensures that all occurrences of the masked value are replaced.\n return msg.replace(new RegExp(escapedMasked, \"g\"), original);\n },\n message\n );\n\n return rehydratedMessage;\n }\n\n /**\n * Default hash function for creating unique hash values.\n * @param input - The input string to hash.\n * @returns The resulting hash as a string.\n */\n private defaultHashFunction(input: string): string {\n let hash = 0;\n // Iterate over each character in the input string\n for (let i = 0; i < input.length; i += 1) {\n // Get ASCII value of the character\n const char = input.charCodeAt(i);\n // Combine the current hash with the new character and ensure it remains a 32-bit integer\n hash = (hash << 5) - hash + char;\n // Bitwise OR operation to convert to a 32-bit integer.\n // This is a common technique to ensure the final hash value stays within the 32-bit limit,\n // effectively wrapping the value when it becomes too large.\n hash |= 0;\n }\n\n // Convert the numerical hash value to a string and return\n return hash.toString();\n }\n}\n"],"mappings":";;;;;;AAKA,IAAa,0BAAb,cAA6C,mBAAmB;CAC9D,AAAQ;CAER,AAAQ;;;;;;;;;;CAWR,YACEA,UACAC,cACA;EACA,OAAO;EAGP,KAAK,iBAAiB,SAAS;EAI/B,KAAK,WAAW;EAChB,KAAK,eAAe,gBAAgB,KAAK;CAC1C;;;;;;;CAQD,AAAQ,iBAAiBD,UAA6C;AACpE,OAAK,MAAM,OAAO,OAAO,KAAK,SAAS,EAAE;GACvC,MAAM,UAAU,SAAS;AAGzB,OACE,CAAC,WACD,OAAO,YAAY,YAEnB,EAAE,QAAQ,iBAAiB,QAE3B,OAAM,IAAI,MAAM;EAEnB;CACF;;;;;;;CAQD,MAAM,UACJE,SACAC,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI;AAGpC,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;GAG9B,mBAAmB,iBAAiB,QAAQ,QAAQ,OAAO,CAAC,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GACnB,QAAQ,eAAe,KAAK,aAAa,MAAM;IAGnD,eAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;GACR,EAAC;EACH;AAKD,SAAO,CAAC,kBAAkB,cAAe;CAC1C;;;;;;;CAQD,MAAM,UACJD,SACAC,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,MAAM,oBAAoB,MAAM,KAAK,MAAM,CAAC,OAC1C,CAAC,KAAK,CAAC,QAAQ,SAAS,KAAK;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,MAAM,SAAS;EAC7D,GACD,QACD;AAED,SAAO;CACR;;;;;;CAOD,AAAQ,oBAAoBC,OAAuB;EACjD,IAAI,OAAO;AAEX,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;GAExC,MAAM,OAAO,MAAM,WAAW,EAAE;GAEhC,QAAQ,QAAQ,KAAK,OAAO;GAI5B,QAAQ;EACT;AAGD,SAAO,KAAK,UAAU;CACvB;AACF"}
1
+ {"version":3,"file":"regex_masking_transformer.js","names":["patterns: { [key: string]: MaskingPattern }","hashFunction?: HashFunction","message: string","state: Map<string, string>","input: string"],"sources":["../../../src/experimental/masking/regex_masking_transformer.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { HashFunction, MaskingPattern } from \"./types.js\";\n/**\n * RegexMaskingTransformer class for masking and rehydrating messages with Regex.\n */\nexport class RegexMaskingTransformer extends MaskingTransformer {\n private patterns: { [key: string]: MaskingPattern };\n\n private hashFunction: HashFunction;\n\n /**\n * Constructs a RegexMaskingTransformer with given patterns and an optional hash function.\n * Validates the provided patterns to ensure they conform to the expected structure.\n *\n * @param patterns - An object containing masking patterns. Each pattern should include\n * a regular expression (`regex`) and optionally a `replacement` string\n * or a `mask` function.\n * @param hashFunction - An optional custom hash function to be used for masking.\n */\n constructor(\n patterns: { [key: string]: MaskingPattern },\n hashFunction?: HashFunction\n ) {\n super();\n // Validates the provided masking patterns before initializing the transformer.\n // This ensures that each pattern has a valid regular expression.\n this.validatePatterns(patterns);\n\n // Assigns the validated patterns and the hash function to the transformer.\n // If no custom hash function is provided, the default hash function is used.\n this.patterns = patterns;\n this.hashFunction = hashFunction || this.defaultHashFunction;\n }\n\n /**\n * Validates the given masking patterns to ensure each pattern has a valid regular expression.\n * Throws an error if any pattern is found to be invalid.\n *\n * @param patterns - The patterns object to validate.\n */\n private validatePatterns(patterns: { [key: string]: MaskingPattern }) {\n for (const key of Object.keys(patterns)) {\n const pattern = patterns[key];\n // Checks that each pattern is an object and has a regex property that is an instance of RegExp.\n // Throws an error if these conditions are not met, indicating an invalid pattern configuration.\n if (\n !pattern ||\n typeof pattern !== \"object\" ||\n // eslint-disable-next-line no-instanceof/no-instanceof\n !(pattern.regex instanceof RegExp)\n ) {\n throw new Error(\"Invalid pattern configuration.\");\n }\n }\n }\n\n /**\n * Masks content in a message based on the defined patterns.\n * @param message - The message to be masked.\n * @param state - The current state containing original values.\n * @returns A tuple of the masked message and the updated state.\n */\n async transform(\n message: string,\n state: Map<string, string>\n ): Promise<[string, Map<string, string>]> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.transform Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Holds the progressively masked message\n let processedMessage = message;\n\n // Initialize original values map with the current state or a new map\n const originalValues = state || new Map<string, string>();\n\n // Iterate over each pattern defined in the transformer\n for (const key of Object.keys(this.patterns)) {\n const pattern = this.patterns[key];\n\n // Apply the current pattern's regex to the message\n processedMessage = processedMessage.replace(pattern.regex, (match) => {\n // Determine the masked value: use the mask function if provided, else use the replacement string,\n // else use the hash function.\n const maskedValue = pattern.mask\n ? pattern.mask(match)\n : (pattern.replacement ?? this.hashFunction(match));\n\n // Store the mapping of the masked value to the original value (match)\n originalValues.set(maskedValue, match);\n\n // Return the masked value to replace the original value in the message\n return maskedValue;\n });\n }\n\n // Return the fully masked message and the state map with all original values\n // Wrap the synchronous return values in Promise.resolve() to maintain compatibility\n // with the MaskingParser's expectation of a Promise return type.\n return [processedMessage, originalValues];\n }\n\n /**\n * Rehydrates a masked message back to its original form using the provided state.\n * @param message - The masked message to be rehydrated.\n * @param state - The state map containing mappings of masked values to their original values.\n * @returns The rehydrated (original) message.\n */\n async rehydrate(\n message: string,\n state: Map<string, string>\n ): Promise<string> {\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (!(state instanceof Map)) {\n throw new TypeError(\n \"RegexMaskingTransformer.rehydrate Error: The 'state' argument must be an instance of Map.\"\n );\n }\n\n // Convert the state map to an array and use reduce to sequentially replace masked values with original values.\n const rehydratedMessage = Array.from(state).reduce(\n (msg, [masked, original]) => {\n // Escape special characters in the masked string to ensure it can be used in a regular expression safely.\n // This is necessary because masked values might contain characters that have special meanings in regex.\n const escapedMasked = masked.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // Replace all instances of the escaped masked value in the message with the original value.\n // The 'g' flag in the RegExp ensures that all occurrences of the masked value are replaced.\n return msg.replace(new RegExp(escapedMasked, \"g\"), original);\n },\n message\n );\n\n return rehydratedMessage;\n }\n\n /**\n * Default hash function for creating unique hash values.\n * @param input - The input string to hash.\n * @returns The resulting hash as a string.\n */\n private defaultHashFunction(input: string): string {\n let hash = 0;\n // Iterate over each character in the input string\n for (let i = 0; i < input.length; i += 1) {\n // Get ASCII value of the character\n const char = input.charCodeAt(i);\n // Combine the current hash with the new character and ensure it remains a 32-bit integer\n hash = (hash << 5) - hash + char;\n // Bitwise OR operation to convert to a 32-bit integer.\n // This is a common technique to ensure the final hash value stays within the 32-bit limit,\n // effectively wrapping the value when it becomes too large.\n hash |= 0;\n }\n\n // Convert the numerical hash value to a string and return\n return hash.toString();\n }\n}\n"],"mappings":";;;;;;AAKA,IAAa,0BAAb,cAA6C,mBAAmB;CAC9D,AAAQ;CAER,AAAQ;;;;;;;;;;CAWR,YACEA,UACAC,cACA;EACA,OAAO;EAGP,KAAK,iBAAiB,SAAS;EAI/B,KAAK,WAAW;EAChB,KAAK,eAAe,gBAAgB,KAAK;CAC1C;;;;;;;CAQD,AAAQ,iBAAiBD,UAA6C;AACpE,OAAK,MAAM,OAAO,OAAO,KAAK,SAAS,EAAE;GACvC,MAAM,UAAU,SAAS;AAGzB,OACE,CAAC,WACD,OAAO,YAAY,YAEnB,EAAE,QAAQ,iBAAiB,QAE3B,OAAM,IAAI,MAAM;EAEnB;CACF;;;;;;;CAQD,MAAM,UACJE,SACAC,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI;AAGpC,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;GAG9B,mBAAmB,iBAAiB,QAAQ,QAAQ,OAAO,CAAC,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GAClB,QAAQ,eAAe,KAAK,aAAa,MAAM;IAGpD,eAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;GACR,EAAC;EACH;AAKD,SAAO,CAAC,kBAAkB,cAAe;CAC1C;;;;;;;CAQD,MAAM,UACJD,SACAC,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR;AAKJ,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR;EAKJ,MAAM,oBAAoB,MAAM,KAAK,MAAM,CAAC,OAC1C,CAAC,KAAK,CAAC,QAAQ,SAAS,KAAK;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,MAAM,SAAS;EAC7D,GACD,QACD;AAED,SAAO;CACR;;;;;;CAOD,AAAQ,oBAAoBC,OAAuB;EACjD,IAAI,OAAO;AAEX,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;GAExC,MAAM,OAAO,MAAM,WAAW,EAAE;GAEhC,QAAQ,QAAQ,KAAK,OAAO;GAI5B,QAAQ;EACT;AAGD,SAAO,KAAK,UAAU;CACvB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Runnable","fields: OpenAIAssistantRunnableInput<AsAgent>","OpenAIClient","StructuredTool","input: RunInput","_options?: RunnableConfig","run: any","toolCall: any","params: Record<string, unknown>","runId: string","threadId: string","sleep","actions: OpenAIAssistantAction[]","item: any","tool: StructuredToolInterface"],"sources":["../../../src/experimental/openai_assistant/index.ts"],"sourcesContent":["import {\n type ClientOptions,\n type OpenAIChatModelId,\n OpenAIClient,\n} from \"@langchain/openai\";\nimport { StructuredTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { sleep } from \"../../util/time.js\";\nimport type {\n OpenAIAssistantFinish,\n OpenAIAssistantAction,\n OpenAIToolType,\n} from \"./schema.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RequiredActionFunctionToolCall = any;\n\ntype ExtractRunOutput<AsAgent extends boolean | undefined> =\n AsAgent extends true\n ? OpenAIAssistantFinish | OpenAIAssistantAction[]\n : ThreadMessage[] | RequiredActionFunctionToolCall[];\n\nexport type OpenAIAssistantRunnableInput<\n AsAgent extends boolean | undefined = undefined\n> = {\n client?: OpenAIClient;\n clientOptions?: ClientOptions;\n assistantId: string;\n pollIntervalMs?: number;\n asAgent?: AsAgent;\n};\n\nexport class OpenAIAssistantRunnable<\n AsAgent extends boolean | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends Record<string, any> = Record<string, any>\n> extends Runnable<RunInput, ExtractRunOutput<AsAgent>> {\n lc_namespace = [\"langchain\", \"experimental\", \"openai_assistant\"];\n\n private client: OpenAIClient;\n\n assistantId: string;\n\n pollIntervalMs = 1000;\n\n asAgent?: AsAgent;\n\n constructor(fields: OpenAIAssistantRunnableInput<AsAgent>) {\n super(fields);\n this.client = fields.client ?? new OpenAIClient(fields?.clientOptions);\n this.assistantId = fields.assistantId;\n this.asAgent = fields.asAgent ?? this.asAgent;\n }\n\n static async createAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n tools,\n client,\n clientOptions,\n asAgent,\n pollIntervalMs,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\"> & {\n model: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n tools?: OpenAIToolType | Array<StructuredTool>;\n fileIds?: string[];\n }) {\n const formattedTools =\n tools?.map((tool) => {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (tool instanceof StructuredTool) {\n return formatToOpenAIAssistantTool(tool);\n }\n return tool;\n }) ?? [];\n const oaiClient = client ?? new OpenAIClient(clientOptions);\n const assistant = await oaiClient.beta.assistants.create({\n name,\n instructions,\n tools: formattedTools,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n\n return new this({\n client: oaiClient,\n assistantId: assistant.id,\n asAgent,\n pollIntervalMs,\n });\n }\n\n async invoke(\n input: RunInput,\n _options?: RunnableConfig\n ): Promise<ExtractRunOutput<AsAgent>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run: any;\n if (this.asAgent && input.steps && input.steps.length > 0) {\n const parsedStepsInput = await this._parseStepsInput(input);\n run = await this.client.beta.threads.runs.submitToolOutputs(\n parsedStepsInput.runId,\n {\n thread_id: parsedStepsInput.threadId,\n tool_outputs: parsedStepsInput.toolOutputs,\n }\n );\n } else if (!(\"threadId\" in input)) {\n const thread = {\n messages: [\n {\n role: \"user\",\n content: input.content,\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n },\n ],\n metadata: input.threadMetadata,\n };\n run = await this._createThreadAndRun({\n ...input,\n thread,\n });\n } else if (!(\"runId\" in input)) {\n await this.client.beta.threads.messages.create(input.threadId, {\n content: input.content,\n role: \"user\",\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n run = await this._createRun(input);\n } else {\n // Submitting tool outputs to an existing run, outside the AgentExecutor\n // framework.\n run = await this.client.beta.threads.runs.submitToolOutputs(input.runId, {\n thread_id: input.threadId,\n tool_outputs: input.toolOutputs,\n });\n }\n\n return this._getResponse(run.id, run.thread_id);\n }\n\n /**\n * Delete an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/deleteAssistant}\n * @returns {Promise<AssistantDeleted>}\n */\n public async deleteAssistant() {\n return await this.client.beta.assistants.delete(this.assistantId);\n }\n\n /**\n * Retrieves an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/getAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async getAssistant() {\n return await this.client.beta.assistants.retrieve(this.assistantId);\n }\n\n /**\n * Modifies an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/modifyAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async modifyAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\" | \"tools\"> & {\n model?: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n fileIds?: string[];\n }) {\n return await this.client.beta.assistants.update(this.assistantId, {\n name,\n instructions,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n }\n\n private async _parseStepsInput(input: RunInput): Promise<RunInput> {\n const {\n action: { runId, threadId },\n } = input.steps[input.steps.length - 1];\n const run = await this._waitForRun(runId, threadId);\n const toolCalls = run.required_action?.submit_tool_outputs.tool_calls;\n if (!toolCalls) {\n return input;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toolOutputs = toolCalls.flatMap((toolCall: any) => {\n const matchedAction = (\n input.steps as {\n action: OpenAIAssistantAction;\n observation: string;\n }[]\n ).find((step) => step.action.toolCallId === toolCall.id);\n\n return matchedAction\n ? [\n {\n output: matchedAction.observation,\n tool_call_id: matchedAction.action.toolCallId,\n },\n ]\n : [];\n });\n return { toolOutputs, runId, threadId } as unknown as RunInput;\n }\n\n private async _createRun({\n instructions,\n model,\n tools,\n metadata,\n threadId,\n }: RunInput) {\n const run = this.client.beta.threads.runs.create(threadId, {\n assistant_id: this.assistantId,\n instructions,\n model,\n tools,\n metadata,\n });\n return run;\n }\n\n private async _createThreadAndRun(input: RunInput) {\n const params: Record<string, unknown> = [\n \"instructions\",\n \"model\",\n \"tools\",\n \"run_metadata\",\n ]\n .filter((key) => key in input)\n .reduce((obj, key) => {\n const newObj = obj;\n newObj[key] = input[key];\n return newObj;\n }, {} as Record<string, unknown>);\n const run = this.client.beta.threads.createAndRun({\n ...params,\n thread: input.thread,\n assistant_id: this.assistantId,\n });\n return run;\n }\n\n private async _waitForRun(runId: string, threadId: string) {\n let inProgress = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run = {} as any;\n while (inProgress) {\n run = await this.client.beta.threads.runs.retrieve(runId, {\n thread_id: threadId,\n });\n inProgress = [\"in_progress\", \"queued\"].includes(run.status);\n if (inProgress) {\n await sleep(this.pollIntervalMs);\n }\n }\n return run;\n }\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<ExtractRunOutput<AsAgent>>;\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<\n | OpenAIAssistantFinish\n | OpenAIAssistantAction[]\n | ThreadMessage[]\n | RequiredActionFunctionToolCall[]\n > {\n const run = await this._waitForRun(runId, threadId);\n if (run.status === \"completed\") {\n const messages = await this.client.beta.threads.messages.list(threadId, {\n order: \"desc\",\n });\n const newMessages = messages.data.filter((msg) => msg.run_id === runId);\n if (!this.asAgent) {\n return newMessages;\n }\n const answer = newMessages.flatMap((msg) => msg.content);\n if (answer.every((item) => item.type === \"text\")) {\n const answerString = answer\n .map((item) => item.type === \"text\" && item.text.value)\n .join(\"\\n\");\n return {\n returnValues: {\n output: answerString,\n runId,\n threadId,\n },\n log: \"\",\n runId,\n threadId,\n };\n }\n } else if (run.status === \"requires_action\") {\n if (!this.asAgent) {\n return run.required_action?.submit_tool_outputs.tool_calls ?? [];\n }\n const actions: OpenAIAssistantAction[] = [];\n run.required_action?.submit_tool_outputs.tool_calls.forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => {\n const functionCall = item.function;\n const args = JSON.parse(functionCall.arguments);\n actions.push({\n tool: functionCall.name,\n toolInput: args,\n toolCallId: item.id,\n log: \"\",\n runId,\n threadId,\n });\n }\n );\n return actions;\n }\n const runInfo = JSON.stringify(run, null, 2);\n throw new Error(\n `Unexpected run status ${run.status}.\\nFull run info:\\n\\n${runInfo}`\n );\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["Runnable","fields: OpenAIAssistantRunnableInput<AsAgent>","OpenAIClient","StructuredTool","input: RunInput","_options?: RunnableConfig","run: any","toolCall: any","params: Record<string, unknown>","runId: string","threadId: string","sleep","actions: OpenAIAssistantAction[]","item: any","tool: StructuredToolInterface"],"sources":["../../../src/experimental/openai_assistant/index.ts"],"sourcesContent":["import {\n type ClientOptions,\n type OpenAIChatModelId,\n OpenAIClient,\n} from \"@langchain/openai\";\nimport { StructuredTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { sleep } from \"../../util/time.js\";\nimport type {\n OpenAIAssistantFinish,\n OpenAIAssistantAction,\n OpenAIToolType,\n} from \"./schema.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RequiredActionFunctionToolCall = any;\n\ntype ExtractRunOutput<AsAgent extends boolean | undefined> =\n AsAgent extends true\n ? OpenAIAssistantFinish | OpenAIAssistantAction[]\n : ThreadMessage[] | RequiredActionFunctionToolCall[];\n\nexport type OpenAIAssistantRunnableInput<\n AsAgent extends boolean | undefined = undefined,\n> = {\n client?: OpenAIClient;\n clientOptions?: ClientOptions;\n assistantId: string;\n pollIntervalMs?: number;\n asAgent?: AsAgent;\n};\n\nexport class OpenAIAssistantRunnable<\n AsAgent extends boolean | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends Record<string, any> = Record<string, any>,\n> extends Runnable<RunInput, ExtractRunOutput<AsAgent>> {\n lc_namespace = [\"langchain\", \"experimental\", \"openai_assistant\"];\n\n private client: OpenAIClient;\n\n assistantId: string;\n\n pollIntervalMs = 1000;\n\n asAgent?: AsAgent;\n\n constructor(fields: OpenAIAssistantRunnableInput<AsAgent>) {\n super(fields);\n this.client = fields.client ?? new OpenAIClient(fields?.clientOptions);\n this.assistantId = fields.assistantId;\n this.asAgent = fields.asAgent ?? this.asAgent;\n }\n\n static async createAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n tools,\n client,\n clientOptions,\n asAgent,\n pollIntervalMs,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\"> & {\n model: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n tools?: OpenAIToolType | Array<StructuredTool>;\n fileIds?: string[];\n }) {\n const formattedTools =\n tools?.map((tool) => {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (tool instanceof StructuredTool) {\n return formatToOpenAIAssistantTool(tool);\n }\n return tool;\n }) ?? [];\n const oaiClient = client ?? new OpenAIClient(clientOptions);\n const assistant = await oaiClient.beta.assistants.create({\n name,\n instructions,\n tools: formattedTools,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n\n return new this({\n client: oaiClient,\n assistantId: assistant.id,\n asAgent,\n pollIntervalMs,\n });\n }\n\n async invoke(\n input: RunInput,\n _options?: RunnableConfig\n ): Promise<ExtractRunOutput<AsAgent>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run: any;\n if (this.asAgent && input.steps && input.steps.length > 0) {\n const parsedStepsInput = await this._parseStepsInput(input);\n run = await this.client.beta.threads.runs.submitToolOutputs(\n parsedStepsInput.runId,\n {\n thread_id: parsedStepsInput.threadId,\n tool_outputs: parsedStepsInput.toolOutputs,\n }\n );\n } else if (!(\"threadId\" in input)) {\n const thread = {\n messages: [\n {\n role: \"user\",\n content: input.content,\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n },\n ],\n metadata: input.threadMetadata,\n };\n run = await this._createThreadAndRun({\n ...input,\n thread,\n });\n } else if (!(\"runId\" in input)) {\n await this.client.beta.threads.messages.create(input.threadId, {\n content: input.content,\n role: \"user\",\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n run = await this._createRun(input);\n } else {\n // Submitting tool outputs to an existing run, outside the AgentExecutor\n // framework.\n run = await this.client.beta.threads.runs.submitToolOutputs(input.runId, {\n thread_id: input.threadId,\n tool_outputs: input.toolOutputs,\n });\n }\n\n return this._getResponse(run.id, run.thread_id);\n }\n\n /**\n * Delete an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/deleteAssistant}\n * @returns {Promise<AssistantDeleted>}\n */\n public async deleteAssistant() {\n return await this.client.beta.assistants.delete(this.assistantId);\n }\n\n /**\n * Retrieves an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/getAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async getAssistant() {\n return await this.client.beta.assistants.retrieve(this.assistantId);\n }\n\n /**\n * Modifies an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/modifyAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async modifyAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\" | \"tools\"> & {\n model?: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n fileIds?: string[];\n }) {\n return await this.client.beta.assistants.update(this.assistantId, {\n name,\n instructions,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n }\n\n private async _parseStepsInput(input: RunInput): Promise<RunInput> {\n const {\n action: { runId, threadId },\n } = input.steps[input.steps.length - 1];\n const run = await this._waitForRun(runId, threadId);\n const toolCalls = run.required_action?.submit_tool_outputs.tool_calls;\n if (!toolCalls) {\n return input;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toolOutputs = toolCalls.flatMap((toolCall: any) => {\n const matchedAction = (\n input.steps as {\n action: OpenAIAssistantAction;\n observation: string;\n }[]\n ).find((step) => step.action.toolCallId === toolCall.id);\n\n return matchedAction\n ? [\n {\n output: matchedAction.observation,\n tool_call_id: matchedAction.action.toolCallId,\n },\n ]\n : [];\n });\n return { toolOutputs, runId, threadId } as unknown as RunInput;\n }\n\n private async _createRun({\n instructions,\n model,\n tools,\n metadata,\n threadId,\n }: RunInput) {\n const run = this.client.beta.threads.runs.create(threadId, {\n assistant_id: this.assistantId,\n instructions,\n model,\n tools,\n metadata,\n });\n return run;\n }\n\n private async _createThreadAndRun(input: RunInput) {\n const params: Record<string, unknown> = [\n \"instructions\",\n \"model\",\n \"tools\",\n \"run_metadata\",\n ]\n .filter((key) => key in input)\n .reduce(\n (obj, key) => {\n const newObj = obj;\n newObj[key] = input[key];\n return newObj;\n },\n {} as Record<string, unknown>\n );\n const run = this.client.beta.threads.createAndRun({\n ...params,\n thread: input.thread,\n assistant_id: this.assistantId,\n });\n return run;\n }\n\n private async _waitForRun(runId: string, threadId: string) {\n let inProgress = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run = {} as any;\n while (inProgress) {\n run = await this.client.beta.threads.runs.retrieve(runId, {\n thread_id: threadId,\n });\n inProgress = [\"in_progress\", \"queued\"].includes(run.status);\n if (inProgress) {\n await sleep(this.pollIntervalMs);\n }\n }\n return run;\n }\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<ExtractRunOutput<AsAgent>>;\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<\n | OpenAIAssistantFinish\n | OpenAIAssistantAction[]\n | ThreadMessage[]\n | RequiredActionFunctionToolCall[]\n > {\n const run = await this._waitForRun(runId, threadId);\n if (run.status === \"completed\") {\n const messages = await this.client.beta.threads.messages.list(threadId, {\n order: \"desc\",\n });\n const newMessages = messages.data.filter((msg) => msg.run_id === runId);\n if (!this.asAgent) {\n return newMessages;\n }\n const answer = newMessages.flatMap((msg) => msg.content);\n if (answer.every((item) => item.type === \"text\")) {\n const answerString = answer\n .map((item) => item.type === \"text\" && item.text.value)\n .join(\"\\n\");\n return {\n returnValues: {\n output: answerString,\n runId,\n threadId,\n },\n log: \"\",\n runId,\n threadId,\n };\n }\n } else if (run.status === \"requires_action\") {\n if (!this.asAgent) {\n return run.required_action?.submit_tool_outputs.tool_calls ?? [];\n }\n const actions: OpenAIAssistantAction[] = [];\n run.required_action?.submit_tool_outputs.tool_calls.forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => {\n const functionCall = item.function;\n const args = JSON.parse(functionCall.arguments);\n actions.push({\n tool: functionCall.name,\n toolInput: args,\n toolCallId: item.id,\n log: \"\",\n runId,\n threadId,\n });\n }\n );\n return actions;\n }\n const runInfo = JSON.stringify(run, null, 2);\n throw new Error(\n `Unexpected run status ${run.status}.\\nFull run info:\\n\\n${runInfo}`\n );\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["fields: OpenAIAssistantRunnableInput<AsAgent>","input: RunInput","_options?: RunnableConfig","run: any","toolCall: any","params: Record<string, unknown>","runId: string","threadId: string","actions: OpenAIAssistantAction[]","item: any","tool: StructuredToolInterface"],"sources":["../../../src/experimental/openai_assistant/index.ts"],"sourcesContent":["import {\n type ClientOptions,\n type OpenAIChatModelId,\n OpenAIClient,\n} from \"@langchain/openai\";\nimport { StructuredTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { sleep } from \"../../util/time.js\";\nimport type {\n OpenAIAssistantFinish,\n OpenAIAssistantAction,\n OpenAIToolType,\n} from \"./schema.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RequiredActionFunctionToolCall = any;\n\ntype ExtractRunOutput<AsAgent extends boolean | undefined> =\n AsAgent extends true\n ? OpenAIAssistantFinish | OpenAIAssistantAction[]\n : ThreadMessage[] | RequiredActionFunctionToolCall[];\n\nexport type OpenAIAssistantRunnableInput<\n AsAgent extends boolean | undefined = undefined\n> = {\n client?: OpenAIClient;\n clientOptions?: ClientOptions;\n assistantId: string;\n pollIntervalMs?: number;\n asAgent?: AsAgent;\n};\n\nexport class OpenAIAssistantRunnable<\n AsAgent extends boolean | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends Record<string, any> = Record<string, any>\n> extends Runnable<RunInput, ExtractRunOutput<AsAgent>> {\n lc_namespace = [\"langchain\", \"experimental\", \"openai_assistant\"];\n\n private client: OpenAIClient;\n\n assistantId: string;\n\n pollIntervalMs = 1000;\n\n asAgent?: AsAgent;\n\n constructor(fields: OpenAIAssistantRunnableInput<AsAgent>) {\n super(fields);\n this.client = fields.client ?? new OpenAIClient(fields?.clientOptions);\n this.assistantId = fields.assistantId;\n this.asAgent = fields.asAgent ?? this.asAgent;\n }\n\n static async createAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n tools,\n client,\n clientOptions,\n asAgent,\n pollIntervalMs,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\"> & {\n model: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n tools?: OpenAIToolType | Array<StructuredTool>;\n fileIds?: string[];\n }) {\n const formattedTools =\n tools?.map((tool) => {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (tool instanceof StructuredTool) {\n return formatToOpenAIAssistantTool(tool);\n }\n return tool;\n }) ?? [];\n const oaiClient = client ?? new OpenAIClient(clientOptions);\n const assistant = await oaiClient.beta.assistants.create({\n name,\n instructions,\n tools: formattedTools,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n\n return new this({\n client: oaiClient,\n assistantId: assistant.id,\n asAgent,\n pollIntervalMs,\n });\n }\n\n async invoke(\n input: RunInput,\n _options?: RunnableConfig\n ): Promise<ExtractRunOutput<AsAgent>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run: any;\n if (this.asAgent && input.steps && input.steps.length > 0) {\n const parsedStepsInput = await this._parseStepsInput(input);\n run = await this.client.beta.threads.runs.submitToolOutputs(\n parsedStepsInput.runId,\n {\n thread_id: parsedStepsInput.threadId,\n tool_outputs: parsedStepsInput.toolOutputs,\n }\n );\n } else if (!(\"threadId\" in input)) {\n const thread = {\n messages: [\n {\n role: \"user\",\n content: input.content,\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n },\n ],\n metadata: input.threadMetadata,\n };\n run = await this._createThreadAndRun({\n ...input,\n thread,\n });\n } else if (!(\"runId\" in input)) {\n await this.client.beta.threads.messages.create(input.threadId, {\n content: input.content,\n role: \"user\",\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n run = await this._createRun(input);\n } else {\n // Submitting tool outputs to an existing run, outside the AgentExecutor\n // framework.\n run = await this.client.beta.threads.runs.submitToolOutputs(input.runId, {\n thread_id: input.threadId,\n tool_outputs: input.toolOutputs,\n });\n }\n\n return this._getResponse(run.id, run.thread_id);\n }\n\n /**\n * Delete an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/deleteAssistant}\n * @returns {Promise<AssistantDeleted>}\n */\n public async deleteAssistant() {\n return await this.client.beta.assistants.delete(this.assistantId);\n }\n\n /**\n * Retrieves an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/getAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async getAssistant() {\n return await this.client.beta.assistants.retrieve(this.assistantId);\n }\n\n /**\n * Modifies an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/modifyAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async modifyAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\" | \"tools\"> & {\n model?: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n fileIds?: string[];\n }) {\n return await this.client.beta.assistants.update(this.assistantId, {\n name,\n instructions,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n }\n\n private async _parseStepsInput(input: RunInput): Promise<RunInput> {\n const {\n action: { runId, threadId },\n } = input.steps[input.steps.length - 1];\n const run = await this._waitForRun(runId, threadId);\n const toolCalls = run.required_action?.submit_tool_outputs.tool_calls;\n if (!toolCalls) {\n return input;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toolOutputs = toolCalls.flatMap((toolCall: any) => {\n const matchedAction = (\n input.steps as {\n action: OpenAIAssistantAction;\n observation: string;\n }[]\n ).find((step) => step.action.toolCallId === toolCall.id);\n\n return matchedAction\n ? [\n {\n output: matchedAction.observation,\n tool_call_id: matchedAction.action.toolCallId,\n },\n ]\n : [];\n });\n return { toolOutputs, runId, threadId } as unknown as RunInput;\n }\n\n private async _createRun({\n instructions,\n model,\n tools,\n metadata,\n threadId,\n }: RunInput) {\n const run = this.client.beta.threads.runs.create(threadId, {\n assistant_id: this.assistantId,\n instructions,\n model,\n tools,\n metadata,\n });\n return run;\n }\n\n private async _createThreadAndRun(input: RunInput) {\n const params: Record<string, unknown> = [\n \"instructions\",\n \"model\",\n \"tools\",\n \"run_metadata\",\n ]\n .filter((key) => key in input)\n .reduce((obj, key) => {\n const newObj = obj;\n newObj[key] = input[key];\n return newObj;\n }, {} as Record<string, unknown>);\n const run = this.client.beta.threads.createAndRun({\n ...params,\n thread: input.thread,\n assistant_id: this.assistantId,\n });\n return run;\n }\n\n private async _waitForRun(runId: string, threadId: string) {\n let inProgress = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run = {} as any;\n while (inProgress) {\n run = await this.client.beta.threads.runs.retrieve(runId, {\n thread_id: threadId,\n });\n inProgress = [\"in_progress\", \"queued\"].includes(run.status);\n if (inProgress) {\n await sleep(this.pollIntervalMs);\n }\n }\n return run;\n }\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<ExtractRunOutput<AsAgent>>;\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<\n | OpenAIAssistantFinish\n | OpenAIAssistantAction[]\n | ThreadMessage[]\n | RequiredActionFunctionToolCall[]\n > {\n const run = await this._waitForRun(runId, threadId);\n if (run.status === \"completed\") {\n const messages = await this.client.beta.threads.messages.list(threadId, {\n order: \"desc\",\n });\n const newMessages = messages.data.filter((msg) => msg.run_id === runId);\n if (!this.asAgent) {\n return newMessages;\n }\n const answer = newMessages.flatMap((msg) => msg.content);\n if (answer.every((item) => item.type === \"text\")) {\n const answerString = answer\n .map((item) => item.type === \"text\" && item.text.value)\n .join(\"\\n\");\n return {\n returnValues: {\n output: answerString,\n runId,\n threadId,\n },\n log: \"\",\n runId,\n threadId,\n };\n }\n } else if (run.status === \"requires_action\") {\n if (!this.asAgent) {\n return run.required_action?.submit_tool_outputs.tool_calls ?? [];\n }\n const actions: OpenAIAssistantAction[] = [];\n run.required_action?.submit_tool_outputs.tool_calls.forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => {\n const functionCall = item.function;\n const args = JSON.parse(functionCall.arguments);\n actions.push({\n tool: functionCall.name,\n toolInput: args,\n toolCallId: item.id,\n log: \"\",\n runId,\n threadId,\n });\n }\n );\n return actions;\n }\n const runInfo = JSON.stringify(run, null, 2);\n throw new Error(\n `Unexpected run status ${run.status}.\\nFull run info:\\n\\n${runInfo}`\n );\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["fields: OpenAIAssistantRunnableInput<AsAgent>","input: RunInput","_options?: RunnableConfig","run: any","toolCall: any","params: Record<string, unknown>","runId: string","threadId: string","actions: OpenAIAssistantAction[]","item: any","tool: StructuredToolInterface"],"sources":["../../../src/experimental/openai_assistant/index.ts"],"sourcesContent":["import {\n type ClientOptions,\n type OpenAIChatModelId,\n OpenAIClient,\n} from \"@langchain/openai\";\nimport { StructuredTool, StructuredToolInterface } from \"@langchain/core/tools\";\nimport { Runnable, RunnableConfig } from \"@langchain/core/runnables\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { ToolDefinition } from \"@langchain/core/language_models/base\";\nimport { sleep } from \"../../util/time.js\";\nimport type {\n OpenAIAssistantFinish,\n OpenAIAssistantAction,\n OpenAIToolType,\n} from \"./schema.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RequiredActionFunctionToolCall = any;\n\ntype ExtractRunOutput<AsAgent extends boolean | undefined> =\n AsAgent extends true\n ? OpenAIAssistantFinish | OpenAIAssistantAction[]\n : ThreadMessage[] | RequiredActionFunctionToolCall[];\n\nexport type OpenAIAssistantRunnableInput<\n AsAgent extends boolean | undefined = undefined,\n> = {\n client?: OpenAIClient;\n clientOptions?: ClientOptions;\n assistantId: string;\n pollIntervalMs?: number;\n asAgent?: AsAgent;\n};\n\nexport class OpenAIAssistantRunnable<\n AsAgent extends boolean | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends Record<string, any> = Record<string, any>,\n> extends Runnable<RunInput, ExtractRunOutput<AsAgent>> {\n lc_namespace = [\"langchain\", \"experimental\", \"openai_assistant\"];\n\n private client: OpenAIClient;\n\n assistantId: string;\n\n pollIntervalMs = 1000;\n\n asAgent?: AsAgent;\n\n constructor(fields: OpenAIAssistantRunnableInput<AsAgent>) {\n super(fields);\n this.client = fields.client ?? new OpenAIClient(fields?.clientOptions);\n this.assistantId = fields.assistantId;\n this.asAgent = fields.asAgent ?? this.asAgent;\n }\n\n static async createAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n tools,\n client,\n clientOptions,\n asAgent,\n pollIntervalMs,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\"> & {\n model: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n tools?: OpenAIToolType | Array<StructuredTool>;\n fileIds?: string[];\n }) {\n const formattedTools =\n tools?.map((tool) => {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (tool instanceof StructuredTool) {\n return formatToOpenAIAssistantTool(tool);\n }\n return tool;\n }) ?? [];\n const oaiClient = client ?? new OpenAIClient(clientOptions);\n const assistant = await oaiClient.beta.assistants.create({\n name,\n instructions,\n tools: formattedTools,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n\n return new this({\n client: oaiClient,\n assistantId: assistant.id,\n asAgent,\n pollIntervalMs,\n });\n }\n\n async invoke(\n input: RunInput,\n _options?: RunnableConfig\n ): Promise<ExtractRunOutput<AsAgent>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run: any;\n if (this.asAgent && input.steps && input.steps.length > 0) {\n const parsedStepsInput = await this._parseStepsInput(input);\n run = await this.client.beta.threads.runs.submitToolOutputs(\n parsedStepsInput.runId,\n {\n thread_id: parsedStepsInput.threadId,\n tool_outputs: parsedStepsInput.toolOutputs,\n }\n );\n } else if (!(\"threadId\" in input)) {\n const thread = {\n messages: [\n {\n role: \"user\",\n content: input.content,\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n },\n ],\n metadata: input.threadMetadata,\n };\n run = await this._createThreadAndRun({\n ...input,\n thread,\n });\n } else if (!(\"runId\" in input)) {\n await this.client.beta.threads.messages.create(input.threadId, {\n content: input.content,\n role: \"user\",\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n run = await this._createRun(input);\n } else {\n // Submitting tool outputs to an existing run, outside the AgentExecutor\n // framework.\n run = await this.client.beta.threads.runs.submitToolOutputs(input.runId, {\n thread_id: input.threadId,\n tool_outputs: input.toolOutputs,\n });\n }\n\n return this._getResponse(run.id, run.thread_id);\n }\n\n /**\n * Delete an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/deleteAssistant}\n * @returns {Promise<AssistantDeleted>}\n */\n public async deleteAssistant() {\n return await this.client.beta.assistants.delete(this.assistantId);\n }\n\n /**\n * Retrieves an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/getAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async getAssistant() {\n return await this.client.beta.assistants.retrieve(this.assistantId);\n }\n\n /**\n * Modifies an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/modifyAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async modifyAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\" | \"tools\"> & {\n model?: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n fileIds?: string[];\n }) {\n return await this.client.beta.assistants.update(this.assistantId, {\n name,\n instructions,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n }\n\n private async _parseStepsInput(input: RunInput): Promise<RunInput> {\n const {\n action: { runId, threadId },\n } = input.steps[input.steps.length - 1];\n const run = await this._waitForRun(runId, threadId);\n const toolCalls = run.required_action?.submit_tool_outputs.tool_calls;\n if (!toolCalls) {\n return input;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toolOutputs = toolCalls.flatMap((toolCall: any) => {\n const matchedAction = (\n input.steps as {\n action: OpenAIAssistantAction;\n observation: string;\n }[]\n ).find((step) => step.action.toolCallId === toolCall.id);\n\n return matchedAction\n ? [\n {\n output: matchedAction.observation,\n tool_call_id: matchedAction.action.toolCallId,\n },\n ]\n : [];\n });\n return { toolOutputs, runId, threadId } as unknown as RunInput;\n }\n\n private async _createRun({\n instructions,\n model,\n tools,\n metadata,\n threadId,\n }: RunInput) {\n const run = this.client.beta.threads.runs.create(threadId, {\n assistant_id: this.assistantId,\n instructions,\n model,\n tools,\n metadata,\n });\n return run;\n }\n\n private async _createThreadAndRun(input: RunInput) {\n const params: Record<string, unknown> = [\n \"instructions\",\n \"model\",\n \"tools\",\n \"run_metadata\",\n ]\n .filter((key) => key in input)\n .reduce(\n (obj, key) => {\n const newObj = obj;\n newObj[key] = input[key];\n return newObj;\n },\n {} as Record<string, unknown>\n );\n const run = this.client.beta.threads.createAndRun({\n ...params,\n thread: input.thread,\n assistant_id: this.assistantId,\n });\n return run;\n }\n\n private async _waitForRun(runId: string, threadId: string) {\n let inProgress = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run = {} as any;\n while (inProgress) {\n run = await this.client.beta.threads.runs.retrieve(runId, {\n thread_id: threadId,\n });\n inProgress = [\"in_progress\", \"queued\"].includes(run.status);\n if (inProgress) {\n await sleep(this.pollIntervalMs);\n }\n }\n return run;\n }\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<ExtractRunOutput<AsAgent>>;\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<\n | OpenAIAssistantFinish\n | OpenAIAssistantAction[]\n | ThreadMessage[]\n | RequiredActionFunctionToolCall[]\n > {\n const run = await this._waitForRun(runId, threadId);\n if (run.status === \"completed\") {\n const messages = await this.client.beta.threads.messages.list(threadId, {\n order: \"desc\",\n });\n const newMessages = messages.data.filter((msg) => msg.run_id === runId);\n if (!this.asAgent) {\n return newMessages;\n }\n const answer = newMessages.flatMap((msg) => msg.content);\n if (answer.every((item) => item.type === \"text\")) {\n const answerString = answer\n .map((item) => item.type === \"text\" && item.text.value)\n .join(\"\\n\");\n return {\n returnValues: {\n output: answerString,\n runId,\n threadId,\n },\n log: \"\",\n runId,\n threadId,\n };\n }\n } else if (run.status === \"requires_action\") {\n if (!this.asAgent) {\n return run.required_action?.submit_tool_outputs.tool_calls ?? [];\n }\n const actions: OpenAIAssistantAction[] = [];\n run.required_action?.submit_tool_outputs.tool_calls.forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => {\n const functionCall = item.function;\n const args = JSON.parse(functionCall.arguments);\n actions.push({\n tool: functionCall.name,\n toolInput: args,\n toolCallId: item.id,\n log: \"\",\n runId,\n threadId,\n });\n }\n );\n return actions;\n }\n const runInfo = JSON.stringify(run, null, 2);\n throw new Error(\n `Unexpected run status ${run.status}.\\nFull run info:\\n\\n${runInfo}`\n );\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent_executor.cjs","names":["tool: Tool | DynamicStructuredTool","BaseChain","ListStepContainer","input: PlanAndExecuteAgentExecutorInput","LLMChain","getPlannerChatPrompt","LLMPlanner","PlanOutputParser","DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE","StructuredChatAgent","ChainStepExecutor","AgentExecutor","ChatAgent","inputs: ChainValues","runManager?: CallbackManagerForChainRun"],"sources":["../../../src/experimental/plan_and_execute/agent_executor.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { Tool, DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain, ChainInputs } from \"../../chains/base.js\";\nimport {\n BasePlanner,\n BaseStepContainer,\n BaseStepExecutor,\n ListStepContainer,\n LLMPlanner,\n ChainStepExecutor,\n} from \"./base.js\";\nimport { AgentExecutor } from \"../../agents/executor.js\";\nimport {\n DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n getPlannerChatPrompt,\n} from \"./prompt.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\nimport { PlanOutputParser } from \"./outputParser.js\";\nimport { ChatAgent } from \"../../agents/chat/index.js\";\nimport { StructuredChatAgent } from \"../../agents/index.js\";\nimport { SerializedLLMChain } from \"../../chains/serde.js\";\n\n/**\n * A utility function to distiguish a dynamicstructuredtool over other tools.\n * @param tool the tool to test\n * @returns bool\n */\nexport function isDynamicStructuredTool(\n tool: Tool | DynamicStructuredTool\n): tool is DynamicStructuredTool {\n // We check for the existence of the static lc_name method in the object's constructor\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (tool.constructor as any).lc_name() === \"DynamicStructuredTool\"\n );\n}\n\n/**\n * Interface for the input to the PlanAndExecuteAgentExecutor class. It\n * extends ChainInputs and includes additional properties for the planner,\n * step executor, step container, and input and output keys.\n */\nexport interface PlanAndExecuteAgentExecutorInput extends ChainInputs {\n planner: BasePlanner;\n stepExecutor: BaseStepExecutor;\n stepContainer?: BaseStepContainer;\n inputKey?: string;\n outputKey?: string;\n}\n\n/**\n * Class representing a plan-and-execute agent executor. This agent\n * decides on the full sequence of actions upfront, then executes them all\n * without updating the plan. This is suitable for complex or long-running\n * tasks that require maintaining long-term objectives and focus.\n */\nexport class PlanAndExecuteAgentExecutor extends BaseChain {\n static lc_name() {\n return \"PlanAndExecuteAgentExecutor\";\n }\n\n private planner: BasePlanner;\n\n private stepExecutor: BaseStepExecutor;\n\n private stepContainer: BaseStepContainer = new ListStepContainer();\n\n private inputKey = \"input\";\n\n private outputKey = \"output\";\n\n constructor(input: PlanAndExecuteAgentExecutorInput) {\n super(input);\n this.planner = input.planner;\n this.stepExecutor = input.stepExecutor;\n this.stepContainer = input.stepContainer ?? this.stepContainer;\n this.inputKey = input.inputKey ?? this.inputKey;\n this.outputKey = input.outputKey ?? this.outputKey;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n /**\n * Static method that returns a default planner for the agent. It creates\n * a new LLMChain with a given LLM and a fixed prompt, and uses it to\n * create a new LLMPlanner with a PlanOutputParser.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @returns A new LLMPlanner instance.\n */\n\n static async getDefaultPlanner({\n llm,\n tools,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n }) {\n const plannerLlmChain = new LLMChain({\n llm,\n prompt: await getPlannerChatPrompt(tools),\n });\n return new LLMPlanner(plannerLlmChain, new PlanOutputParser());\n }\n\n /**\n * Static method that returns a default step executor for the agent. It\n * creates a new ChatAgent from a given LLM and a set of tools, and uses\n * it to create a new ChainStepExecutor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new ChainStepExecutor instance.\n */\n static getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate = DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n }) {\n let agent;\n\n if (tools.length > 0 && isDynamicStructuredTool(tools[0])) {\n agent = StructuredChatAgent.fromLLMAndTools(llm, tools, {\n humanMessageTemplate,\n inputVariables: [\"previous_steps\", \"current_step\", \"agent_scratchpad\"],\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n agent = ChatAgent.fromLLMAndTools(llm, tools as Tool[], {\n humanMessageTemplate,\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n /**\n * Static method that creates a new PlanAndExecuteAgentExecutor from a\n * given LLM, a set of tools, and optionally a human message template. It\n * uses the getDefaultPlanner and getDefaultStepExecutor methods to create\n * the planner and step executor for the new agent executor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new PlanAndExecuteAgentExecutor instance.\n */\n static async fromLLMAndTools({\n llm,\n tools,\n humanMessageTemplate,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n } & Omit<PlanAndExecuteAgentExecutorInput, \"planner\" | \"stepExecutor\">) {\n const executor = new PlanAndExecuteAgentExecutor({\n planner: await PlanAndExecuteAgentExecutor.getDefaultPlanner({\n llm,\n tools,\n }),\n stepExecutor: PlanAndExecuteAgentExecutor.getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate,\n }),\n });\n return executor;\n }\n\n /** @ignore */\n async _call(\n inputs: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const plan = await this.planner.plan(inputs.input, runManager?.getChild());\n if (!plan.steps?.length) {\n throw new Error(\n \"Could not create and parse a plan to answer your question - please try again.\"\n );\n }\n plan.steps[\n plan.steps.length - 1\n ].text += ` The original question was: ${inputs.input}.`;\n for (const step of plan.steps) {\n const newInputs = {\n ...inputs,\n previous_steps: JSON.stringify(this.stepContainer.getSteps()),\n current_step: step.text,\n };\n const response = await this.stepExecutor.step(\n newInputs,\n runManager?.getChild()\n );\n this.stepContainer.addStep(step, response);\n }\n return { [this.outputKey]: this.stepContainer.getFinalResponse() };\n }\n\n _chainType() {\n return \"agent_executor\" as const;\n }\n\n serialize(): SerializedLLMChain {\n throw new Error(\"Cannot serialize an AgentExecutor\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6BA,SAAgB,wBACdA,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;AAE3C;;;;;;;AAqBD,IAAa,8BAAb,MAAa,oCAAoCC,uBAAU;CACzD,OAAO,UAAU;AACf,SAAO;CACR;CAED,AAAQ;CAER,AAAQ;CAER,AAAQ,gBAAmC,IAAIC;CAE/C,AAAQ,WAAW;CAEnB,AAAQ,YAAY;CAEpB,YAAYC,OAAyC;EACnD,MAAM,MAAM;EACZ,KAAK,UAAU,MAAM;EACrB,KAAK,eAAe,MAAM;EAC1B,KAAK,gBAAgB,MAAM,iBAAiB,KAAK;EACjD,KAAK,WAAW,MAAM,YAAY,KAAK;EACvC,KAAK,YAAY,MAAM,aAAa,KAAK;CAC1C;CAED,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,QAAS;CACvB;CAED,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,SAAU;CACxB;;;;;;;;CAUD,aAAa,kBAAkB,EAC7B,KACA,OAID,EAAE;EACD,MAAM,kBAAkB,IAAIC,2BAAS;GACnC;GACA,QAAQ,MAAMC,oCAAqB,MAAM;EAC1C;AACD,SAAO,IAAIC,0BAAW,iBAAiB,IAAIC;CAC5C;;;;;;;;;;CAWD,OAAO,uBAAuB,EAC5B,KACA,OACA,uBAAuBC,kEAKxB,EAAE;EACD,IAAI;AAEJ,MAAI,MAAM,SAAS,KAAK,wBAAwB,MAAM,GAAG,EAAE;GACzD,QAAQC,oCAAoB,gBAAgB,KAAK,OAAO;IACtD;IACA,gBAAgB;KAAC;KAAkB;KAAgB;IAAmB;GACvE,EAAC;AACF,UAAO,IAAIC,iCACTC,+BAAc,kBAAkB;IAC9B;IACA;GACD,EAAC;EAEL;EAED,QAAQC,wBAAU,gBAAgB,KAAK,OAAiB,EACtD,qBACD,EAAC;AACF,SAAO,IAAIF,iCACTC,+BAAc,kBAAkB;GAC9B;GACA;EACD,EAAC;CAEL;;;;;;;;;;;CAYD,aAAa,gBAAgB,EAC3B,KACA,OACA,sBAKoE,EAAE;EACtE,MAAM,WAAW,IAAI,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;GACD,EAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;GACD,EAAC;EACH;AACD,SAAO;CACR;;CAGD,MAAM,MACJE,QACAC,YACsB;EACtB,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO,YAAY,UAAU,CAAC;AAC1E,MAAI,CAAC,KAAK,OAAO,OACf,OAAM,IAAI,MACR;EAGJ,KAAK,MACH,KAAK,MAAM,SAAS,GACpB,QAAQ,CAAC,4BAA4B,EAAE,OAAO,MAAM,CAAC,CAAC;AACxD,OAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,YAAY;IAChB,GAAG;IACH,gBAAgB,KAAK,UAAU,KAAK,cAAc,UAAU,CAAC;IAC7D,cAAc,KAAK;GACpB;GACD,MAAM,WAAW,MAAM,KAAK,aAAa,KACvC,WACA,YAAY,UAAU,CACvB;GACD,KAAK,cAAc,QAAQ,MAAM,SAAS;EAC3C;AACD,SAAO,GAAG,KAAK,YAAY,KAAK,cAAc,kBAAkB,CAAE;CACnE;CAED,aAAa;AACX,SAAO;CACR;CAED,YAAgC;AAC9B,QAAM,IAAI,MAAM;CACjB;AACF"}
1
+ {"version":3,"file":"agent_executor.cjs","names":["tool: Tool | DynamicStructuredTool","BaseChain","ListStepContainer","input: PlanAndExecuteAgentExecutorInput","LLMChain","getPlannerChatPrompt","LLMPlanner","PlanOutputParser","DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE","StructuredChatAgent","ChainStepExecutor","AgentExecutor","ChatAgent","inputs: ChainValues","runManager?: CallbackManagerForChainRun"],"sources":["../../../src/experimental/plan_and_execute/agent_executor.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { Tool, DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain, ChainInputs } from \"../../chains/base.js\";\nimport {\n BasePlanner,\n BaseStepContainer,\n BaseStepExecutor,\n ListStepContainer,\n LLMPlanner,\n ChainStepExecutor,\n} from \"./base.js\";\nimport { AgentExecutor } from \"../../agents/executor.js\";\nimport {\n DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n getPlannerChatPrompt,\n} from \"./prompt.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\nimport { PlanOutputParser } from \"./outputParser.js\";\nimport { ChatAgent } from \"../../agents/chat/index.js\";\nimport { StructuredChatAgent } from \"../../agents/index.js\";\nimport { SerializedLLMChain } from \"../../chains/serde.js\";\n\n/**\n * A utility function to distiguish a dynamicstructuredtool over other tools.\n * @param tool the tool to test\n * @returns bool\n */\nexport function isDynamicStructuredTool(\n tool: Tool | DynamicStructuredTool\n): tool is DynamicStructuredTool {\n // We check for the existence of the static lc_name method in the object's constructor\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (tool.constructor as any).lc_name() === \"DynamicStructuredTool\"\n );\n}\n\n/**\n * Interface for the input to the PlanAndExecuteAgentExecutor class. It\n * extends ChainInputs and includes additional properties for the planner,\n * step executor, step container, and input and output keys.\n */\nexport interface PlanAndExecuteAgentExecutorInput extends ChainInputs {\n planner: BasePlanner;\n stepExecutor: BaseStepExecutor;\n stepContainer?: BaseStepContainer;\n inputKey?: string;\n outputKey?: string;\n}\n\n/**\n * Class representing a plan-and-execute agent executor. This agent\n * decides on the full sequence of actions upfront, then executes them all\n * without updating the plan. This is suitable for complex or long-running\n * tasks that require maintaining long-term objectives and focus.\n */\nexport class PlanAndExecuteAgentExecutor extends BaseChain {\n static lc_name() {\n return \"PlanAndExecuteAgentExecutor\";\n }\n\n private planner: BasePlanner;\n\n private stepExecutor: BaseStepExecutor;\n\n private stepContainer: BaseStepContainer = new ListStepContainer();\n\n private inputKey = \"input\";\n\n private outputKey = \"output\";\n\n constructor(input: PlanAndExecuteAgentExecutorInput) {\n super(input);\n this.planner = input.planner;\n this.stepExecutor = input.stepExecutor;\n this.stepContainer = input.stepContainer ?? this.stepContainer;\n this.inputKey = input.inputKey ?? this.inputKey;\n this.outputKey = input.outputKey ?? this.outputKey;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n /**\n * Static method that returns a default planner for the agent. It creates\n * a new LLMChain with a given LLM and a fixed prompt, and uses it to\n * create a new LLMPlanner with a PlanOutputParser.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @returns A new LLMPlanner instance.\n */\n\n static async getDefaultPlanner({\n llm,\n tools,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n }) {\n const plannerLlmChain = new LLMChain({\n llm,\n prompt: await getPlannerChatPrompt(tools),\n });\n return new LLMPlanner(plannerLlmChain, new PlanOutputParser());\n }\n\n /**\n * Static method that returns a default step executor for the agent. It\n * creates a new ChatAgent from a given LLM and a set of tools, and uses\n * it to create a new ChainStepExecutor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new ChainStepExecutor instance.\n */\n static getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate = DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n }) {\n let agent;\n\n if (tools.length > 0 && isDynamicStructuredTool(tools[0])) {\n agent = StructuredChatAgent.fromLLMAndTools(llm, tools, {\n humanMessageTemplate,\n inputVariables: [\"previous_steps\", \"current_step\", \"agent_scratchpad\"],\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n agent = ChatAgent.fromLLMAndTools(llm, tools as Tool[], {\n humanMessageTemplate,\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n /**\n * Static method that creates a new PlanAndExecuteAgentExecutor from a\n * given LLM, a set of tools, and optionally a human message template. It\n * uses the getDefaultPlanner and getDefaultStepExecutor methods to create\n * the planner and step executor for the new agent executor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new PlanAndExecuteAgentExecutor instance.\n */\n static async fromLLMAndTools({\n llm,\n tools,\n humanMessageTemplate,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n } & Omit<PlanAndExecuteAgentExecutorInput, \"planner\" | \"stepExecutor\">) {\n const executor = new PlanAndExecuteAgentExecutor({\n planner: await PlanAndExecuteAgentExecutor.getDefaultPlanner({\n llm,\n tools,\n }),\n stepExecutor: PlanAndExecuteAgentExecutor.getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate,\n }),\n });\n return executor;\n }\n\n /** @ignore */\n async _call(\n inputs: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const plan = await this.planner.plan(inputs.input, runManager?.getChild());\n if (!plan.steps?.length) {\n throw new Error(\n \"Could not create and parse a plan to answer your question - please try again.\"\n );\n }\n plan.steps[plan.steps.length - 1].text +=\n ` The original question was: ${inputs.input}.`;\n for (const step of plan.steps) {\n const newInputs = {\n ...inputs,\n previous_steps: JSON.stringify(this.stepContainer.getSteps()),\n current_step: step.text,\n };\n const response = await this.stepExecutor.step(\n newInputs,\n runManager?.getChild()\n );\n this.stepContainer.addStep(step, response);\n }\n return { [this.outputKey]: this.stepContainer.getFinalResponse() };\n }\n\n _chainType() {\n return \"agent_executor\" as const;\n }\n\n serialize(): SerializedLLMChain {\n throw new Error(\"Cannot serialize an AgentExecutor\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6BA,SAAgB,wBACdA,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;AAE3C;;;;;;;AAqBD,IAAa,8BAAb,MAAa,oCAAoCC,uBAAU;CACzD,OAAO,UAAU;AACf,SAAO;CACR;CAED,AAAQ;CAER,AAAQ;CAER,AAAQ,gBAAmC,IAAIC;CAE/C,AAAQ,WAAW;CAEnB,AAAQ,YAAY;CAEpB,YAAYC,OAAyC;EACnD,MAAM,MAAM;EACZ,KAAK,UAAU,MAAM;EACrB,KAAK,eAAe,MAAM;EAC1B,KAAK,gBAAgB,MAAM,iBAAiB,KAAK;EACjD,KAAK,WAAW,MAAM,YAAY,KAAK;EACvC,KAAK,YAAY,MAAM,aAAa,KAAK;CAC1C;CAED,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,QAAS;CACvB;CAED,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,SAAU;CACxB;;;;;;;;CAUD,aAAa,kBAAkB,EAC7B,KACA,OAID,EAAE;EACD,MAAM,kBAAkB,IAAIC,2BAAS;GACnC;GACA,QAAQ,MAAMC,oCAAqB,MAAM;EAC1C;AACD,SAAO,IAAIC,0BAAW,iBAAiB,IAAIC;CAC5C;;;;;;;;;;CAWD,OAAO,uBAAuB,EAC5B,KACA,OACA,uBAAuBC,kEAKxB,EAAE;EACD,IAAI;AAEJ,MAAI,MAAM,SAAS,KAAK,wBAAwB,MAAM,GAAG,EAAE;GACzD,QAAQC,oCAAoB,gBAAgB,KAAK,OAAO;IACtD;IACA,gBAAgB;KAAC;KAAkB;KAAgB;IAAmB;GACvE,EAAC;AACF,UAAO,IAAIC,iCACTC,+BAAc,kBAAkB;IAC9B;IACA;GACD,EAAC;EAEL;EAED,QAAQC,wBAAU,gBAAgB,KAAK,OAAiB,EACtD,qBACD,EAAC;AACF,SAAO,IAAIF,iCACTC,+BAAc,kBAAkB;GAC9B;GACA;EACD,EAAC;CAEL;;;;;;;;;;;CAYD,aAAa,gBAAgB,EAC3B,KACA,OACA,sBAKoE,EAAE;EACtE,MAAM,WAAW,IAAI,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;GACD,EAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;GACD,EAAC;EACH;AACD,SAAO;CACR;;CAGD,MAAM,MACJE,QACAC,YACsB;EACtB,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO,YAAY,UAAU,CAAC;AAC1E,MAAI,CAAC,KAAK,OAAO,OACf,OAAM,IAAI,MACR;EAGJ,KAAK,MAAM,KAAK,MAAM,SAAS,GAAG,QAChC,CAAC,4BAA4B,EAAE,OAAO,MAAM,CAAC,CAAC;AAChD,OAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,YAAY;IAChB,GAAG;IACH,gBAAgB,KAAK,UAAU,KAAK,cAAc,UAAU,CAAC;IAC7D,cAAc,KAAK;GACpB;GACD,MAAM,WAAW,MAAM,KAAK,aAAa,KACvC,WACA,YAAY,UAAU,CACvB;GACD,KAAK,cAAc,QAAQ,MAAM,SAAS;EAC3C;AACD,SAAO,GAAG,KAAK,YAAY,KAAK,cAAc,kBAAkB,CAAE;CACnE;CAED,aAAa;AACX,SAAO;CACR;CAED,YAAgC;AAC9B,QAAM,IAAI,MAAM;CACjB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"agent_executor.js","names":["tool: Tool | DynamicStructuredTool","input: PlanAndExecuteAgentExecutorInput","inputs: ChainValues","runManager?: CallbackManagerForChainRun"],"sources":["../../../src/experimental/plan_and_execute/agent_executor.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { Tool, DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain, ChainInputs } from \"../../chains/base.js\";\nimport {\n BasePlanner,\n BaseStepContainer,\n BaseStepExecutor,\n ListStepContainer,\n LLMPlanner,\n ChainStepExecutor,\n} from \"./base.js\";\nimport { AgentExecutor } from \"../../agents/executor.js\";\nimport {\n DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n getPlannerChatPrompt,\n} from \"./prompt.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\nimport { PlanOutputParser } from \"./outputParser.js\";\nimport { ChatAgent } from \"../../agents/chat/index.js\";\nimport { StructuredChatAgent } from \"../../agents/index.js\";\nimport { SerializedLLMChain } from \"../../chains/serde.js\";\n\n/**\n * A utility function to distiguish a dynamicstructuredtool over other tools.\n * @param tool the tool to test\n * @returns bool\n */\nexport function isDynamicStructuredTool(\n tool: Tool | DynamicStructuredTool\n): tool is DynamicStructuredTool {\n // We check for the existence of the static lc_name method in the object's constructor\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (tool.constructor as any).lc_name() === \"DynamicStructuredTool\"\n );\n}\n\n/**\n * Interface for the input to the PlanAndExecuteAgentExecutor class. It\n * extends ChainInputs and includes additional properties for the planner,\n * step executor, step container, and input and output keys.\n */\nexport interface PlanAndExecuteAgentExecutorInput extends ChainInputs {\n planner: BasePlanner;\n stepExecutor: BaseStepExecutor;\n stepContainer?: BaseStepContainer;\n inputKey?: string;\n outputKey?: string;\n}\n\n/**\n * Class representing a plan-and-execute agent executor. This agent\n * decides on the full sequence of actions upfront, then executes them all\n * without updating the plan. This is suitable for complex or long-running\n * tasks that require maintaining long-term objectives and focus.\n */\nexport class PlanAndExecuteAgentExecutor extends BaseChain {\n static lc_name() {\n return \"PlanAndExecuteAgentExecutor\";\n }\n\n private planner: BasePlanner;\n\n private stepExecutor: BaseStepExecutor;\n\n private stepContainer: BaseStepContainer = new ListStepContainer();\n\n private inputKey = \"input\";\n\n private outputKey = \"output\";\n\n constructor(input: PlanAndExecuteAgentExecutorInput) {\n super(input);\n this.planner = input.planner;\n this.stepExecutor = input.stepExecutor;\n this.stepContainer = input.stepContainer ?? this.stepContainer;\n this.inputKey = input.inputKey ?? this.inputKey;\n this.outputKey = input.outputKey ?? this.outputKey;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n /**\n * Static method that returns a default planner for the agent. It creates\n * a new LLMChain with a given LLM and a fixed prompt, and uses it to\n * create a new LLMPlanner with a PlanOutputParser.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @returns A new LLMPlanner instance.\n */\n\n static async getDefaultPlanner({\n llm,\n tools,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n }) {\n const plannerLlmChain = new LLMChain({\n llm,\n prompt: await getPlannerChatPrompt(tools),\n });\n return new LLMPlanner(plannerLlmChain, new PlanOutputParser());\n }\n\n /**\n * Static method that returns a default step executor for the agent. It\n * creates a new ChatAgent from a given LLM and a set of tools, and uses\n * it to create a new ChainStepExecutor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new ChainStepExecutor instance.\n */\n static getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate = DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n }) {\n let agent;\n\n if (tools.length > 0 && isDynamicStructuredTool(tools[0])) {\n agent = StructuredChatAgent.fromLLMAndTools(llm, tools, {\n humanMessageTemplate,\n inputVariables: [\"previous_steps\", \"current_step\", \"agent_scratchpad\"],\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n agent = ChatAgent.fromLLMAndTools(llm, tools as Tool[], {\n humanMessageTemplate,\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n /**\n * Static method that creates a new PlanAndExecuteAgentExecutor from a\n * given LLM, a set of tools, and optionally a human message template. It\n * uses the getDefaultPlanner and getDefaultStepExecutor methods to create\n * the planner and step executor for the new agent executor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new PlanAndExecuteAgentExecutor instance.\n */\n static async fromLLMAndTools({\n llm,\n tools,\n humanMessageTemplate,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n } & Omit<PlanAndExecuteAgentExecutorInput, \"planner\" | \"stepExecutor\">) {\n const executor = new PlanAndExecuteAgentExecutor({\n planner: await PlanAndExecuteAgentExecutor.getDefaultPlanner({\n llm,\n tools,\n }),\n stepExecutor: PlanAndExecuteAgentExecutor.getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate,\n }),\n });\n return executor;\n }\n\n /** @ignore */\n async _call(\n inputs: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const plan = await this.planner.plan(inputs.input, runManager?.getChild());\n if (!plan.steps?.length) {\n throw new Error(\n \"Could not create and parse a plan to answer your question - please try again.\"\n );\n }\n plan.steps[\n plan.steps.length - 1\n ].text += ` The original question was: ${inputs.input}.`;\n for (const step of plan.steps) {\n const newInputs = {\n ...inputs,\n previous_steps: JSON.stringify(this.stepContainer.getSteps()),\n current_step: step.text,\n };\n const response = await this.stepExecutor.step(\n newInputs,\n runManager?.getChild()\n );\n this.stepContainer.addStep(step, response);\n }\n return { [this.outputKey]: this.stepContainer.getFinalResponse() };\n }\n\n _chainType() {\n return \"agent_executor\" as const;\n }\n\n serialize(): SerializedLLMChain {\n throw new Error(\"Cannot serialize an AgentExecutor\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6BA,SAAgB,wBACdA,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;AAE3C;;;;;;;AAqBD,IAAa,8BAAb,MAAa,oCAAoC,UAAU;CACzD,OAAO,UAAU;AACf,SAAO;CACR;CAED,AAAQ;CAER,AAAQ;CAER,AAAQ,gBAAmC,IAAI;CAE/C,AAAQ,WAAW;CAEnB,AAAQ,YAAY;CAEpB,YAAYC,OAAyC;EACnD,MAAM,MAAM;EACZ,KAAK,UAAU,MAAM;EACrB,KAAK,eAAe,MAAM;EAC1B,KAAK,gBAAgB,MAAM,iBAAiB,KAAK;EACjD,KAAK,WAAW,MAAM,YAAY,KAAK;EACvC,KAAK,YAAY,MAAM,aAAa,KAAK;CAC1C;CAED,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,QAAS;CACvB;CAED,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,SAAU;CACxB;;;;;;;;CAUD,aAAa,kBAAkB,EAC7B,KACA,OAID,EAAE;EACD,MAAM,kBAAkB,IAAI,SAAS;GACnC;GACA,QAAQ,MAAM,qBAAqB,MAAM;EAC1C;AACD,SAAO,IAAI,WAAW,iBAAiB,IAAI;CAC5C;;;;;;;;;;CAWD,OAAO,uBAAuB,EAC5B,KACA,OACA,uBAAuB,mDAKxB,EAAE;EACD,IAAI;AAEJ,MAAI,MAAM,SAAS,KAAK,wBAAwB,MAAM,GAAG,EAAE;GACzD,QAAQ,oBAAoB,gBAAgB,KAAK,OAAO;IACtD;IACA,gBAAgB;KAAC;KAAkB;KAAgB;IAAmB;GACvE,EAAC;AACF,UAAO,IAAI,kBACT,cAAc,kBAAkB;IAC9B;IACA;GACD,EAAC;EAEL;EAED,QAAQ,UAAU,gBAAgB,KAAK,OAAiB,EACtD,qBACD,EAAC;AACF,SAAO,IAAI,kBACT,cAAc,kBAAkB;GAC9B;GACA;EACD,EAAC;CAEL;;;;;;;;;;;CAYD,aAAa,gBAAgB,EAC3B,KACA,OACA,sBAKoE,EAAE;EACtE,MAAM,WAAW,IAAI,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;GACD,EAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;GACD,EAAC;EACH;AACD,SAAO;CACR;;CAGD,MAAM,MACJC,QACAC,YACsB;EACtB,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO,YAAY,UAAU,CAAC;AAC1E,MAAI,CAAC,KAAK,OAAO,OACf,OAAM,IAAI,MACR;EAGJ,KAAK,MACH,KAAK,MAAM,SAAS,GACpB,QAAQ,CAAC,4BAA4B,EAAE,OAAO,MAAM,CAAC,CAAC;AACxD,OAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,YAAY;IAChB,GAAG;IACH,gBAAgB,KAAK,UAAU,KAAK,cAAc,UAAU,CAAC;IAC7D,cAAc,KAAK;GACpB;GACD,MAAM,WAAW,MAAM,KAAK,aAAa,KACvC,WACA,YAAY,UAAU,CACvB;GACD,KAAK,cAAc,QAAQ,MAAM,SAAS;EAC3C;AACD,SAAO,GAAG,KAAK,YAAY,KAAK,cAAc,kBAAkB,CAAE;CACnE;CAED,aAAa;AACX,SAAO;CACR;CAED,YAAgC;AAC9B,QAAM,IAAI,MAAM;CACjB;AACF"}
1
+ {"version":3,"file":"agent_executor.js","names":["tool: Tool | DynamicStructuredTool","input: PlanAndExecuteAgentExecutorInput","inputs: ChainValues","runManager?: CallbackManagerForChainRun"],"sources":["../../../src/experimental/plan_and_execute/agent_executor.ts"],"sourcesContent":["import type { BaseLanguageModelInterface } from \"@langchain/core/language_models/base\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { Tool, DynamicStructuredTool } from \"@langchain/core/tools\";\nimport { CallbackManagerForChainRun } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain, ChainInputs } from \"../../chains/base.js\";\nimport {\n BasePlanner,\n BaseStepContainer,\n BaseStepExecutor,\n ListStepContainer,\n LLMPlanner,\n ChainStepExecutor,\n} from \"./base.js\";\nimport { AgentExecutor } from \"../../agents/executor.js\";\nimport {\n DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n getPlannerChatPrompt,\n} from \"./prompt.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\nimport { PlanOutputParser } from \"./outputParser.js\";\nimport { ChatAgent } from \"../../agents/chat/index.js\";\nimport { StructuredChatAgent } from \"../../agents/index.js\";\nimport { SerializedLLMChain } from \"../../chains/serde.js\";\n\n/**\n * A utility function to distiguish a dynamicstructuredtool over other tools.\n * @param tool the tool to test\n * @returns bool\n */\nexport function isDynamicStructuredTool(\n tool: Tool | DynamicStructuredTool\n): tool is DynamicStructuredTool {\n // We check for the existence of the static lc_name method in the object's constructor\n return (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (tool.constructor as any).lc_name() === \"DynamicStructuredTool\"\n );\n}\n\n/**\n * Interface for the input to the PlanAndExecuteAgentExecutor class. It\n * extends ChainInputs and includes additional properties for the planner,\n * step executor, step container, and input and output keys.\n */\nexport interface PlanAndExecuteAgentExecutorInput extends ChainInputs {\n planner: BasePlanner;\n stepExecutor: BaseStepExecutor;\n stepContainer?: BaseStepContainer;\n inputKey?: string;\n outputKey?: string;\n}\n\n/**\n * Class representing a plan-and-execute agent executor. This agent\n * decides on the full sequence of actions upfront, then executes them all\n * without updating the plan. This is suitable for complex or long-running\n * tasks that require maintaining long-term objectives and focus.\n */\nexport class PlanAndExecuteAgentExecutor extends BaseChain {\n static lc_name() {\n return \"PlanAndExecuteAgentExecutor\";\n }\n\n private planner: BasePlanner;\n\n private stepExecutor: BaseStepExecutor;\n\n private stepContainer: BaseStepContainer = new ListStepContainer();\n\n private inputKey = \"input\";\n\n private outputKey = \"output\";\n\n constructor(input: PlanAndExecuteAgentExecutorInput) {\n super(input);\n this.planner = input.planner;\n this.stepExecutor = input.stepExecutor;\n this.stepContainer = input.stepContainer ?? this.stepContainer;\n this.inputKey = input.inputKey ?? this.inputKey;\n this.outputKey = input.outputKey ?? this.outputKey;\n }\n\n get inputKeys() {\n return [this.inputKey];\n }\n\n get outputKeys() {\n return [this.outputKey];\n }\n\n /**\n * Static method that returns a default planner for the agent. It creates\n * a new LLMChain with a given LLM and a fixed prompt, and uses it to\n * create a new LLMPlanner with a PlanOutputParser.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @returns A new LLMPlanner instance.\n */\n\n static async getDefaultPlanner({\n llm,\n tools,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n }) {\n const plannerLlmChain = new LLMChain({\n llm,\n prompt: await getPlannerChatPrompt(tools),\n });\n return new LLMPlanner(plannerLlmChain, new PlanOutputParser());\n }\n\n /**\n * Static method that returns a default step executor for the agent. It\n * creates a new ChatAgent from a given LLM and a set of tools, and uses\n * it to create a new ChainStepExecutor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new ChainStepExecutor instance.\n */\n static getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate = DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n }) {\n let agent;\n\n if (tools.length > 0 && isDynamicStructuredTool(tools[0])) {\n agent = StructuredChatAgent.fromLLMAndTools(llm, tools, {\n humanMessageTemplate,\n inputVariables: [\"previous_steps\", \"current_step\", \"agent_scratchpad\"],\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n agent = ChatAgent.fromLLMAndTools(llm, tools as Tool[], {\n humanMessageTemplate,\n });\n return new ChainStepExecutor(\n AgentExecutor.fromAgentAndTools({\n agent,\n tools,\n })\n );\n }\n\n /**\n * Static method that creates a new PlanAndExecuteAgentExecutor from a\n * given LLM, a set of tools, and optionally a human message template. It\n * uses the getDefaultPlanner and getDefaultStepExecutor methods to create\n * the planner and step executor for the new agent executor.\n * @param llm The Large Language Model (LLM) used to generate responses.\n * @param tools The set of tools used by the agent.\n * @param humanMessageTemplate The template for human messages. If not provided, a default template is used.\n * @returns A new PlanAndExecuteAgentExecutor instance.\n */\n static async fromLLMAndTools({\n llm,\n tools,\n humanMessageTemplate,\n }: {\n llm: BaseLanguageModelInterface;\n tools: Tool[] | DynamicStructuredTool[];\n humanMessageTemplate?: string;\n } & Omit<PlanAndExecuteAgentExecutorInput, \"planner\" | \"stepExecutor\">) {\n const executor = new PlanAndExecuteAgentExecutor({\n planner: await PlanAndExecuteAgentExecutor.getDefaultPlanner({\n llm,\n tools,\n }),\n stepExecutor: PlanAndExecuteAgentExecutor.getDefaultStepExecutor({\n llm,\n tools,\n humanMessageTemplate,\n }),\n });\n return executor;\n }\n\n /** @ignore */\n async _call(\n inputs: ChainValues,\n runManager?: CallbackManagerForChainRun\n ): Promise<ChainValues> {\n const plan = await this.planner.plan(inputs.input, runManager?.getChild());\n if (!plan.steps?.length) {\n throw new Error(\n \"Could not create and parse a plan to answer your question - please try again.\"\n );\n }\n plan.steps[plan.steps.length - 1].text +=\n ` The original question was: ${inputs.input}.`;\n for (const step of plan.steps) {\n const newInputs = {\n ...inputs,\n previous_steps: JSON.stringify(this.stepContainer.getSteps()),\n current_step: step.text,\n };\n const response = await this.stepExecutor.step(\n newInputs,\n runManager?.getChild()\n );\n this.stepContainer.addStep(step, response);\n }\n return { [this.outputKey]: this.stepContainer.getFinalResponse() };\n }\n\n _chainType() {\n return \"agent_executor\" as const;\n }\n\n serialize(): SerializedLLMChain {\n throw new Error(\"Cannot serialize an AgentExecutor\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6BA,SAAgB,wBACdA,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;AAE3C;;;;;;;AAqBD,IAAa,8BAAb,MAAa,oCAAoC,UAAU;CACzD,OAAO,UAAU;AACf,SAAO;CACR;CAED,AAAQ;CAER,AAAQ;CAER,AAAQ,gBAAmC,IAAI;CAE/C,AAAQ,WAAW;CAEnB,AAAQ,YAAY;CAEpB,YAAYC,OAAyC;EACnD,MAAM,MAAM;EACZ,KAAK,UAAU,MAAM;EACrB,KAAK,eAAe,MAAM;EAC1B,KAAK,gBAAgB,MAAM,iBAAiB,KAAK;EACjD,KAAK,WAAW,MAAM,YAAY,KAAK;EACvC,KAAK,YAAY,MAAM,aAAa,KAAK;CAC1C;CAED,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,QAAS;CACvB;CAED,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,SAAU;CACxB;;;;;;;;CAUD,aAAa,kBAAkB,EAC7B,KACA,OAID,EAAE;EACD,MAAM,kBAAkB,IAAI,SAAS;GACnC;GACA,QAAQ,MAAM,qBAAqB,MAAM;EAC1C;AACD,SAAO,IAAI,WAAW,iBAAiB,IAAI;CAC5C;;;;;;;;;;CAWD,OAAO,uBAAuB,EAC5B,KACA,OACA,uBAAuB,mDAKxB,EAAE;EACD,IAAI;AAEJ,MAAI,MAAM,SAAS,KAAK,wBAAwB,MAAM,GAAG,EAAE;GACzD,QAAQ,oBAAoB,gBAAgB,KAAK,OAAO;IACtD;IACA,gBAAgB;KAAC;KAAkB;KAAgB;IAAmB;GACvE,EAAC;AACF,UAAO,IAAI,kBACT,cAAc,kBAAkB;IAC9B;IACA;GACD,EAAC;EAEL;EAED,QAAQ,UAAU,gBAAgB,KAAK,OAAiB,EACtD,qBACD,EAAC;AACF,SAAO,IAAI,kBACT,cAAc,kBAAkB;GAC9B;GACA;EACD,EAAC;CAEL;;;;;;;;;;;CAYD,aAAa,gBAAgB,EAC3B,KACA,OACA,sBAKoE,EAAE;EACtE,MAAM,WAAW,IAAI,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;GACD,EAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;GACD,EAAC;EACH;AACD,SAAO;CACR;;CAGD,MAAM,MACJC,QACAC,YACsB;EACtB,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO,YAAY,UAAU,CAAC;AAC1E,MAAI,CAAC,KAAK,OAAO,OACf,OAAM,IAAI,MACR;EAGJ,KAAK,MAAM,KAAK,MAAM,SAAS,GAAG,QAChC,CAAC,4BAA4B,EAAE,OAAO,MAAM,CAAC,CAAC;AAChD,OAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,YAAY;IAChB,GAAG;IACH,gBAAgB,KAAK,UAAU,KAAK,cAAc,UAAU,CAAC;IAC7D,cAAc,KAAK;GACpB;GACD,MAAM,WAAW,MAAM,KAAK,aAAa,KACvC,WACA,YAAY,UAAU,CACvB;GACD,KAAK,cAAc,QAAQ,MAAM,SAAS;EAC3C;AACD,SAAO,GAAG,KAAK,YAAY,KAAK,cAAc,kBAAkB,CAAE;CACnE;CAED,aAAa;AACX,SAAO;CACR;CAED,YAAgC;AAC9B,QAAM,IAAI,MAAM;CACjB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"custom_format.cjs","names":["PromptTemplate","input: CustomFormatPromptTemplateInput<RunInput>","totalInputVariables: string[]","template: string","values: TypedPromptInputValues<RunInput>"],"sources":["../../../src/experimental/prompts/custom_format.ts"],"sourcesContent":["import type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n type ParsedFStringNode,\n PromptTemplate,\n type PromptTemplateInput,\n TypedPromptInputValues,\n} from \"@langchain/core/prompts\";\n\nexport type CustomFormatPromptTemplateInput<RunInput extends InputValues> =\n Omit<PromptTemplateInput<RunInput, string>, \"templateFormat\"> & {\n customParser: (template: string) => ParsedFStringNode[];\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n renderer: (template: string, values: InputValues) => string;\n };\n\nexport class CustomFormatPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any\n> extends PromptTemplate<RunInput, PartialVariableName> {\n static lc_name() {\n return \"CustomPromptTemplate\";\n }\n\n lc_serializable = false;\n\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n\n renderer: (template: string, values: InputValues) => string;\n\n constructor(input: CustomFormatPromptTemplateInput<RunInput>) {\n super(input);\n Object.assign(this, input);\n\n if (this.validateTemplate && this.templateValidator !== undefined) {\n let totalInputVariables: string[] = this.inputVariables;\n if (this.partialVariables) {\n totalInputVariables = totalInputVariables.concat(\n Object.keys(this.partialVariables)\n );\n }\n if (typeof this.template === \"string\") {\n this.templateValidator(this.template, totalInputVariables);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n }\n\n /**\n * Load prompt template from a template\n */\n static fromTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = Record<string, any>\n >(\n template: string,\n {\n customParser,\n ...rest\n }: Omit<\n CustomFormatPromptTemplateInput<RunInput>,\n \"template\" | \"inputVariables\"\n >\n ) {\n const names = new Set<string>();\n const nodes = customParser(template);\n for (const node of nodes) {\n if (node.type === \"variable\") {\n names.add(node.name);\n }\n }\n return new this<RunInput extends Symbol ? never : RunInput>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputVariables: [...names] as any[],\n template,\n customParser,\n ...rest,\n });\n }\n\n /**\n * Formats the prompt template with the provided values.\n * @param values The values to be used to format the prompt template.\n * @returns A promise that resolves to a string which is the formatted prompt.\n */\n async format(values: TypedPromptInputValues<RunInput>): Promise<string> {\n const allValues = await this.mergePartialAndUserVariables(values);\n if (typeof this.template === \"string\") {\n return this.renderer(this.template, allValues);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,6BAAb,cAKUA,wCAA8C;CACtD,OAAO,UAAU;AACf,SAAO;CACR;CAED,kBAAkB;CAElB;CAEA;CAEA,YAAYC,OAAkD;EAC5D,MAAM,MAAM;EACZ,OAAO,OAAO,MAAM,MAAM;AAE1B,MAAI,KAAK,oBAAoB,KAAK,sBAAsB,QAAW;GACjE,IAAIC,sBAAgC,KAAK;AACzC,OAAI,KAAK,kBACP,sBAAsB,oBAAoB,OACxC,OAAO,KAAK,KAAK,iBAAiB,CACnC;AAEH,OAAI,OAAO,KAAK,aAAa,UAC3B,KAAK,kBAAkB,KAAK,UAAU,oBAAoB;OAE1D,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;EAGlE;CACF;;;;CAKD,OAAO,aAILC,UACA,EACE,aACA,GAAG,MAIJ,EACD;EACA,MAAM,wBAAQ,IAAI;EAClB,MAAM,QAAQ,aAAa,SAAS;AACpC,OAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,YAChB,MAAM,IAAI,KAAK,KAAK;AAGxB,SAAO,IAAI,KAAiD;GAE1D,gBAAgB,CAAC,GAAG,KAAM;GAC1B;GACA;GACA,GAAG;EACJ;CACF;;;;;;CAOD,MAAM,OAAOC,QAA2D;EACtE,MAAM,YAAY,MAAM,KAAK,6BAA6B,OAAO;AACjE,MAAI,OAAO,KAAK,aAAa,SAC3B,QAAO,KAAK,SAAS,KAAK,UAAU,UAAU;MAE9C,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;CAGlE;AACF"}
1
+ {"version":3,"file":"custom_format.cjs","names":["PromptTemplate","input: CustomFormatPromptTemplateInput<RunInput>","totalInputVariables: string[]","template: string","values: TypedPromptInputValues<RunInput>"],"sources":["../../../src/experimental/prompts/custom_format.ts"],"sourcesContent":["import type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n type ParsedFStringNode,\n PromptTemplate,\n type PromptTemplateInput,\n TypedPromptInputValues,\n} from \"@langchain/core/prompts\";\n\nexport type CustomFormatPromptTemplateInput<RunInput extends InputValues> =\n Omit<PromptTemplateInput<RunInput, string>, \"templateFormat\"> & {\n customParser: (template: string) => ParsedFStringNode[];\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n renderer: (template: string, values: InputValues) => string;\n };\n\nexport class CustomFormatPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any,\n> extends PromptTemplate<RunInput, PartialVariableName> {\n static lc_name() {\n return \"CustomPromptTemplate\";\n }\n\n lc_serializable = false;\n\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n\n renderer: (template: string, values: InputValues) => string;\n\n constructor(input: CustomFormatPromptTemplateInput<RunInput>) {\n super(input);\n Object.assign(this, input);\n\n if (this.validateTemplate && this.templateValidator !== undefined) {\n let totalInputVariables: string[] = this.inputVariables;\n if (this.partialVariables) {\n totalInputVariables = totalInputVariables.concat(\n Object.keys(this.partialVariables)\n );\n }\n if (typeof this.template === \"string\") {\n this.templateValidator(this.template, totalInputVariables);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n }\n\n /**\n * Load prompt template from a template\n */\n static fromTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = Record<string, any>,\n >(\n template: string,\n {\n customParser,\n ...rest\n }: Omit<\n CustomFormatPromptTemplateInput<RunInput>,\n \"template\" | \"inputVariables\"\n >\n ) {\n const names = new Set<string>();\n const nodes = customParser(template);\n for (const node of nodes) {\n if (node.type === \"variable\") {\n names.add(node.name);\n }\n }\n return new this<RunInput extends Symbol ? never : RunInput>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputVariables: [...names] as any[],\n template,\n customParser,\n ...rest,\n });\n }\n\n /**\n * Formats the prompt template with the provided values.\n * @param values The values to be used to format the prompt template.\n * @returns A promise that resolves to a string which is the formatted prompt.\n */\n async format(values: TypedPromptInputValues<RunInput>): Promise<string> {\n const allValues = await this.mergePartialAndUserVariables(values);\n if (typeof this.template === \"string\") {\n return this.renderer(this.template, allValues);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,6BAAb,cAKUA,wCAA8C;CACtD,OAAO,UAAU;AACf,SAAO;CACR;CAED,kBAAkB;CAElB;CAEA;CAEA,YAAYC,OAAkD;EAC5D,MAAM,MAAM;EACZ,OAAO,OAAO,MAAM,MAAM;AAE1B,MAAI,KAAK,oBAAoB,KAAK,sBAAsB,QAAW;GACjE,IAAIC,sBAAgC,KAAK;AACzC,OAAI,KAAK,kBACP,sBAAsB,oBAAoB,OACxC,OAAO,KAAK,KAAK,iBAAiB,CACnC;AAEH,OAAI,OAAO,KAAK,aAAa,UAC3B,KAAK,kBAAkB,KAAK,UAAU,oBAAoB;OAE1D,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;EAGlE;CACF;;;;CAKD,OAAO,aAILC,UACA,EACE,aACA,GAAG,MAIJ,EACD;EACA,MAAM,wBAAQ,IAAI;EAClB,MAAM,QAAQ,aAAa,SAAS;AACpC,OAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,YAChB,MAAM,IAAI,KAAK,KAAK;AAGxB,SAAO,IAAI,KAAiD;GAE1D,gBAAgB,CAAC,GAAG,KAAM;GAC1B;GACA;GACA,GAAG;EACJ;CACF;;;;;;CAOD,MAAM,OAAOC,QAA2D;EACtE,MAAM,YAAY,MAAM,KAAK,6BAA6B,OAAO;AACjE,MAAI,OAAO,KAAK,aAAa,SAC3B,QAAO,KAAK,SAAS,KAAK,UAAU,UAAU;MAE9C,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;CAGlE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"custom_format.js","names":["input: CustomFormatPromptTemplateInput<RunInput>","totalInputVariables: string[]","template: string","values: TypedPromptInputValues<RunInput>"],"sources":["../../../src/experimental/prompts/custom_format.ts"],"sourcesContent":["import type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n type ParsedFStringNode,\n PromptTemplate,\n type PromptTemplateInput,\n TypedPromptInputValues,\n} from \"@langchain/core/prompts\";\n\nexport type CustomFormatPromptTemplateInput<RunInput extends InputValues> =\n Omit<PromptTemplateInput<RunInput, string>, \"templateFormat\"> & {\n customParser: (template: string) => ParsedFStringNode[];\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n renderer: (template: string, values: InputValues) => string;\n };\n\nexport class CustomFormatPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any\n> extends PromptTemplate<RunInput, PartialVariableName> {\n static lc_name() {\n return \"CustomPromptTemplate\";\n }\n\n lc_serializable = false;\n\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n\n renderer: (template: string, values: InputValues) => string;\n\n constructor(input: CustomFormatPromptTemplateInput<RunInput>) {\n super(input);\n Object.assign(this, input);\n\n if (this.validateTemplate && this.templateValidator !== undefined) {\n let totalInputVariables: string[] = this.inputVariables;\n if (this.partialVariables) {\n totalInputVariables = totalInputVariables.concat(\n Object.keys(this.partialVariables)\n );\n }\n if (typeof this.template === \"string\") {\n this.templateValidator(this.template, totalInputVariables);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n }\n\n /**\n * Load prompt template from a template\n */\n static fromTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = Record<string, any>\n >(\n template: string,\n {\n customParser,\n ...rest\n }: Omit<\n CustomFormatPromptTemplateInput<RunInput>,\n \"template\" | \"inputVariables\"\n >\n ) {\n const names = new Set<string>();\n const nodes = customParser(template);\n for (const node of nodes) {\n if (node.type === \"variable\") {\n names.add(node.name);\n }\n }\n return new this<RunInput extends Symbol ? never : RunInput>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputVariables: [...names] as any[],\n template,\n customParser,\n ...rest,\n });\n }\n\n /**\n * Formats the prompt template with the provided values.\n * @param values The values to be used to format the prompt template.\n * @returns A promise that resolves to a string which is the formatted prompt.\n */\n async format(values: TypedPromptInputValues<RunInput>): Promise<string> {\n const allValues = await this.mergePartialAndUserVariables(values);\n if (typeof this.template === \"string\") {\n return this.renderer(this.template, allValues);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,6BAAb,cAKU,eAA8C;CACtD,OAAO,UAAU;AACf,SAAO;CACR;CAED,kBAAkB;CAElB;CAEA;CAEA,YAAYA,OAAkD;EAC5D,MAAM,MAAM;EACZ,OAAO,OAAO,MAAM,MAAM;AAE1B,MAAI,KAAK,oBAAoB,KAAK,sBAAsB,QAAW;GACjE,IAAIC,sBAAgC,KAAK;AACzC,OAAI,KAAK,kBACP,sBAAsB,oBAAoB,OACxC,OAAO,KAAK,KAAK,iBAAiB,CACnC;AAEH,OAAI,OAAO,KAAK,aAAa,UAC3B,KAAK,kBAAkB,KAAK,UAAU,oBAAoB;OAE1D,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;EAGlE;CACF;;;;CAKD,OAAO,aAILC,UACA,EACE,aACA,GAAG,MAIJ,EACD;EACA,MAAM,wBAAQ,IAAI;EAClB,MAAM,QAAQ,aAAa,SAAS;AACpC,OAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,YAChB,MAAM,IAAI,KAAK,KAAK;AAGxB,SAAO,IAAI,KAAiD;GAE1D,gBAAgB,CAAC,GAAG,KAAM;GAC1B;GACA;GACA,GAAG;EACJ;CACF;;;;;;CAOD,MAAM,OAAOC,QAA2D;EACtE,MAAM,YAAY,MAAM,KAAK,6BAA6B,OAAO;AACjE,MAAI,OAAO,KAAK,aAAa,SAC3B,QAAO,KAAK,SAAS,KAAK,UAAU,UAAU;MAE9C,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;CAGlE;AACF"}
1
+ {"version":3,"file":"custom_format.js","names":["input: CustomFormatPromptTemplateInput<RunInput>","totalInputVariables: string[]","template: string","values: TypedPromptInputValues<RunInput>"],"sources":["../../../src/experimental/prompts/custom_format.ts"],"sourcesContent":["import type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n type ParsedFStringNode,\n PromptTemplate,\n type PromptTemplateInput,\n TypedPromptInputValues,\n} from \"@langchain/core/prompts\";\n\nexport type CustomFormatPromptTemplateInput<RunInput extends InputValues> =\n Omit<PromptTemplateInput<RunInput, string>, \"templateFormat\"> & {\n customParser: (template: string) => ParsedFStringNode[];\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n renderer: (template: string, values: InputValues) => string;\n };\n\nexport class CustomFormatPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any,\n> extends PromptTemplate<RunInput, PartialVariableName> {\n static lc_name() {\n return \"CustomPromptTemplate\";\n }\n\n lc_serializable = false;\n\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n\n renderer: (template: string, values: InputValues) => string;\n\n constructor(input: CustomFormatPromptTemplateInput<RunInput>) {\n super(input);\n Object.assign(this, input);\n\n if (this.validateTemplate && this.templateValidator !== undefined) {\n let totalInputVariables: string[] = this.inputVariables;\n if (this.partialVariables) {\n totalInputVariables = totalInputVariables.concat(\n Object.keys(this.partialVariables)\n );\n }\n if (typeof this.template === \"string\") {\n this.templateValidator(this.template, totalInputVariables);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n }\n\n /**\n * Load prompt template from a template\n */\n static fromTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = Record<string, any>,\n >(\n template: string,\n {\n customParser,\n ...rest\n }: Omit<\n CustomFormatPromptTemplateInput<RunInput>,\n \"template\" | \"inputVariables\"\n >\n ) {\n const names = new Set<string>();\n const nodes = customParser(template);\n for (const node of nodes) {\n if (node.type === \"variable\") {\n names.add(node.name);\n }\n }\n return new this<RunInput extends Symbol ? never : RunInput>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputVariables: [...names] as any[],\n template,\n customParser,\n ...rest,\n });\n }\n\n /**\n * Formats the prompt template with the provided values.\n * @param values The values to be used to format the prompt template.\n * @returns A promise that resolves to a string which is the formatted prompt.\n */\n async format(values: TypedPromptInputValues<RunInput>): Promise<string> {\n const allValues = await this.mergePartialAndUserVariables(values);\n if (typeof this.template === \"string\") {\n return this.renderer(this.template, allValues);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n}\n"],"mappings":";;;;;;AAeA,IAAa,6BAAb,cAKU,eAA8C;CACtD,OAAO,UAAU;AACf,SAAO;CACR;CAED,kBAAkB;CAElB;CAEA;CAEA,YAAYA,OAAkD;EAC5D,MAAM,MAAM;EACZ,OAAO,OAAO,MAAM,MAAM;AAE1B,MAAI,KAAK,oBAAoB,KAAK,sBAAsB,QAAW;GACjE,IAAIC,sBAAgC,KAAK;AACzC,OAAI,KAAK,kBACP,sBAAsB,oBAAoB,OACxC,OAAO,KAAK,KAAK,iBAAiB,CACnC;AAEH,OAAI,OAAO,KAAK,aAAa,UAC3B,KAAK,kBAAkB,KAAK,UAAU,oBAAoB;OAE1D,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;EAGlE;CACF;;;;CAKD,OAAO,aAILC,UACA,EACE,aACA,GAAG,MAIJ,EACD;EACA,MAAM,wBAAQ,IAAI;EAClB,MAAM,QAAQ,aAAa,SAAS;AACpC,OAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,YAChB,MAAM,IAAI,KAAK,KAAK;AAGxB,SAAO,IAAI,KAAiD;GAE1D,gBAAgB,CAAC,GAAG,KAAM;GAC1B;GACA;GACA,GAAG;EACJ;CACF;;;;;;CAOD,MAAM,OAAOC,QAA2D;EACtE,MAAM,YAAY,MAAM,KAAK,6BAA6B,OAAO;AACjE,MAAI,OAAO,KAAK,aAAa,SAC3B,QAAO,KAAK,SAAS,KAAK,UAAU,UAAU;MAE9C,OAAM,IAAI,MACR,CAAC,2CAA2C,EAAE,KAAK,UAAU;CAGlE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlebars.cjs","names":["template: string","parsed: ParsedFStringNode[]","nodes: { type: string }[]","Handlebars","name: string","values: InputValues","CustomFormatPromptTemplate","params?: Omit<\n HandlebarsPromptTemplateInput<RunInput>,\n | \"template\"\n | \"inputVariables\"\n | \"customParser\"\n | \"templateValidator\"\n | \"renderer\"\n >"],"sources":["../../../src/experimental/prompts/handlebars.ts"],"sourcesContent":["import Handlebars from \"handlebars\";\nimport { type ParsedFStringNode } from \"@langchain/core/prompts\";\nimport type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n CustomFormatPromptTemplate,\n CustomFormatPromptTemplateInput,\n} from \"./custom_format.js\";\n\nexport const parseHandlebars = (template: string): ParsedFStringNode[] => {\n const parsed: ParsedFStringNode[] = [];\n const nodes: { type: string }[] = [...Handlebars.parse(template).body];\n while (nodes.length) {\n const node = nodes.pop()!;\n if (node.type === \"ContentStatement\") {\n // @ts-expect-error - handlebars' hbs.AST.ContentStatement isn't exported\n const text = node.value;\n parsed.push({ type: \"literal\", text });\n } else if (node.type === \"MustacheStatement\") {\n // @ts-expect-error - handlebars' hbs.AST.MustacheStatement isn't exported\n const name: string = node.path.parts[0];\n // @ts-expect-error - handlebars' hbs.AST.MustacheStatement isn't exported\n const { original } = node.path as { original: string };\n if (\n !!name &&\n !original.startsWith(\"this.\") &&\n !original.startsWith(\"@\")\n ) {\n parsed.push({ type: \"variable\", name });\n }\n } else if (node.type === \"PathExpression\") {\n // @ts-expect-error - handlebars' hbs.AST.PathExpression isn't exported\n const name: string = node.parts[0];\n // @ts-expect-error - handlebars' hbs.AST.PathExpression isn't exported\n const { original } = node;\n if (\n !!name &&\n !original.startsWith(\"this.\") &&\n !original.startsWith(\"@\")\n ) {\n parsed.push({ type: \"variable\", name });\n }\n } else if (node.type === \"BlockStatement\") {\n // @ts-expect-error - handlebars' hbs.AST.BlockStatement isn't exported\n nodes.push(...node.params, ...node.program.body);\n }\n }\n\n return parsed;\n};\n\nexport const interpolateHandlebars = (\n template: string,\n values: InputValues\n) => {\n const compiled = Handlebars.compile(template, { noEscape: true });\n return compiled(values);\n};\n\nexport type HandlebarsPromptTemplateInput<RunInput extends InputValues> =\n CustomFormatPromptTemplateInput<RunInput>;\n\nexport class HandlebarsPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any\n> extends CustomFormatPromptTemplate<RunInput> {\n static lc_name() {\n return \"HandlebarsPromptTemplate\";\n }\n\n /**\n * Load prompt template from a template\n */\n static fromTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = Record<string, any>\n >(\n template: string,\n params?: Omit<\n HandlebarsPromptTemplateInput<RunInput>,\n | \"template\"\n | \"inputVariables\"\n | \"customParser\"\n | \"templateValidator\"\n | \"renderer\"\n >\n ) {\n return super.fromTemplate<RunInput>(template, {\n ...params,\n validateTemplate: false,\n customParser: parseHandlebars,\n renderer: interpolateHandlebars,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;AAQA,MAAa,kBAAkB,CAACA,aAA0C;CACxE,MAAMC,SAA8B,CAAE;CACtC,MAAMC,QAA4B,CAAC,GAAGC,mBAAW,MAAM,SAAS,CAAC,IAAK;AACtE,QAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAK,SAAS,oBAAoB;GAEpC,MAAM,OAAO,KAAK;GAClB,OAAO,KAAK;IAAE,MAAM;IAAW;GAAM,EAAC;EACvC,WAAU,KAAK,SAAS,qBAAqB;GAE5C,MAAMC,OAAe,KAAK,KAAK,MAAM;GAErC,MAAM,EAAE,UAAU,GAAG,KAAK;AAC1B,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,EAEzB,OAAO,KAAK;IAAE,MAAM;IAAY;GAAM,EAAC;EAE1C,WAAU,KAAK,SAAS,kBAAkB;GAEzC,MAAMA,OAAe,KAAK,MAAM;GAEhC,MAAM,EAAE,UAAU,GAAG;AACrB,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,EAEzB,OAAO,KAAK;IAAE,MAAM;IAAY;GAAM,EAAC;EAE1C,WAAU,KAAK,SAAS,kBAEvB,MAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,KAAK;CAEnD;AAED,QAAO;AACR;AAED,MAAa,wBAAwB,CACnCJ,UACAK,WACG;CACH,MAAM,WAAWF,mBAAW,QAAQ,UAAU,EAAE,UAAU,KAAM,EAAC;AACjE,QAAO,SAAS,OAAO;AACxB;AAKD,IAAa,2BAAb,cAGUG,sEAAqC;CAC7C,OAAO,UAAU;AACf,SAAO;CACR;;;;CAKD,OAAO,aAILN,UACAO,QAQA;AACA,SAAO,MAAM,aAAuB,UAAU;GAC5C,GAAG;GACH,kBAAkB;GAClB,cAAc;GACd,UAAU;EACX,EAAC;CACH;AACF"}
1
+ {"version":3,"file":"handlebars.cjs","names":["template: string","parsed: ParsedFStringNode[]","nodes: { type: string }[]","Handlebars","name: string","values: InputValues","CustomFormatPromptTemplate","params?: Omit<\n HandlebarsPromptTemplateInput<RunInput>,\n | \"template\"\n | \"inputVariables\"\n | \"customParser\"\n | \"templateValidator\"\n | \"renderer\"\n >"],"sources":["../../../src/experimental/prompts/handlebars.ts"],"sourcesContent":["import Handlebars from \"handlebars\";\nimport { type ParsedFStringNode } from \"@langchain/core/prompts\";\nimport type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n CustomFormatPromptTemplate,\n CustomFormatPromptTemplateInput,\n} from \"./custom_format.js\";\n\nexport const parseHandlebars = (template: string): ParsedFStringNode[] => {\n const parsed: ParsedFStringNode[] = [];\n const nodes: { type: string }[] = [...Handlebars.parse(template).body];\n while (nodes.length) {\n const node = nodes.pop()!;\n if (node.type === \"ContentStatement\") {\n // @ts-expect-error - handlebars' hbs.AST.ContentStatement isn't exported\n const text = node.value;\n parsed.push({ type: \"literal\", text });\n } else if (node.type === \"MustacheStatement\") {\n // @ts-expect-error - handlebars' hbs.AST.MustacheStatement isn't exported\n const name: string = node.path.parts[0];\n // @ts-expect-error - handlebars' hbs.AST.MustacheStatement isn't exported\n const { original } = node.path as { original: string };\n if (\n !!name &&\n !original.startsWith(\"this.\") &&\n !original.startsWith(\"@\")\n ) {\n parsed.push({ type: \"variable\", name });\n }\n } else if (node.type === \"PathExpression\") {\n // @ts-expect-error - handlebars' hbs.AST.PathExpression isn't exported\n const name: string = node.parts[0];\n // @ts-expect-error - handlebars' hbs.AST.PathExpression isn't exported\n const { original } = node;\n if (\n !!name &&\n !original.startsWith(\"this.\") &&\n !original.startsWith(\"@\")\n ) {\n parsed.push({ type: \"variable\", name });\n }\n } else if (node.type === \"BlockStatement\") {\n // @ts-expect-error - handlebars' hbs.AST.BlockStatement isn't exported\n nodes.push(...node.params, ...node.program.body);\n }\n }\n\n return parsed;\n};\n\nexport const interpolateHandlebars = (\n template: string,\n values: InputValues\n) => {\n const compiled = Handlebars.compile(template, { noEscape: true });\n return compiled(values);\n};\n\nexport type HandlebarsPromptTemplateInput<RunInput extends InputValues> =\n CustomFormatPromptTemplateInput<RunInput>;\n\nexport class HandlebarsPromptTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n> extends CustomFormatPromptTemplate<RunInput> {\n static lc_name() {\n return \"HandlebarsPromptTemplate\";\n }\n\n /**\n * Load prompt template from a template\n */\n static fromTemplate<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = Record<string, any>,\n >(\n template: string,\n params?: Omit<\n HandlebarsPromptTemplateInput<RunInput>,\n | \"template\"\n | \"inputVariables\"\n | \"customParser\"\n | \"templateValidator\"\n | \"renderer\"\n >\n ) {\n return super.fromTemplate<RunInput>(template, {\n ...params,\n validateTemplate: false,\n customParser: parseHandlebars,\n renderer: interpolateHandlebars,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;AAQA,MAAa,kBAAkB,CAACA,aAA0C;CACxE,MAAMC,SAA8B,CAAE;CACtC,MAAMC,QAA4B,CAAC,GAAGC,mBAAW,MAAM,SAAS,CAAC,IAAK;AACtE,QAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAK,SAAS,oBAAoB;GAEpC,MAAM,OAAO,KAAK;GAClB,OAAO,KAAK;IAAE,MAAM;IAAW;GAAM,EAAC;EACvC,WAAU,KAAK,SAAS,qBAAqB;GAE5C,MAAMC,OAAe,KAAK,KAAK,MAAM;GAErC,MAAM,EAAE,UAAU,GAAG,KAAK;AAC1B,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,EAEzB,OAAO,KAAK;IAAE,MAAM;IAAY;GAAM,EAAC;EAE1C,WAAU,KAAK,SAAS,kBAAkB;GAEzC,MAAMA,OAAe,KAAK,MAAM;GAEhC,MAAM,EAAE,UAAU,GAAG;AACrB,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,EAEzB,OAAO,KAAK;IAAE,MAAM;IAAY;GAAM,EAAC;EAE1C,WAAU,KAAK,SAAS,kBAEvB,MAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,KAAK;CAEnD;AAED,QAAO;AACR;AAED,MAAa,wBAAwB,CACnCJ,UACAK,WACG;CACH,MAAM,WAAWF,mBAAW,QAAQ,UAAU,EAAE,UAAU,KAAM,EAAC;AACjE,QAAO,SAAS,OAAO;AACxB;AAKD,IAAa,2BAAb,cAGUG,sEAAqC;CAC7C,OAAO,UAAU;AACf,SAAO;CACR;;;;CAKD,OAAO,aAILN,UACAO,QAQA;AACA,SAAO,MAAM,aAAuB,UAAU;GAC5C,GAAG;GACH,kBAAkB;GAClB,cAAc;GACd,UAAU;EACX,EAAC;CACH;AACF"}