@langchain/classic 1.0.34 → 1.0.36
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.
- package/CHANGELOG.md +14 -0
- package/dist/agents/chat/index.cjs.map +1 -1
- package/dist/agents/chat/index.js.map +1 -1
- package/dist/agents/chat/outputParser.cjs.map +1 -1
- package/dist/agents/chat/outputParser.js.map +1 -1
- package/dist/agents/chat_convo/index.cjs.map +1 -1
- package/dist/agents/chat_convo/index.js.map +1 -1
- package/dist/agents/chat_convo/outputParser.cjs.map +1 -1
- package/dist/agents/chat_convo/outputParser.js.map +1 -1
- package/dist/agents/executor.cjs.map +1 -1
- package/dist/agents/executor.js.map +1 -1
- package/dist/agents/format_scratchpad/log.cjs.map +1 -1
- package/dist/agents/format_scratchpad/log.js.map +1 -1
- package/dist/agents/format_scratchpad/log_to_message.cjs.map +1 -1
- package/dist/agents/format_scratchpad/log_to_message.js.map +1 -1
- package/dist/agents/initialize.cjs.map +1 -1
- package/dist/agents/initialize.js.map +1 -1
- package/dist/agents/mrkl/index.cjs.map +1 -1
- package/dist/agents/mrkl/index.js.map +1 -1
- package/dist/agents/mrkl/outputParser.cjs.map +1 -1
- package/dist/agents/mrkl/outputParser.js.map +1 -1
- package/dist/agents/openai_functions/index.cjs.map +1 -1
- package/dist/agents/openai_functions/index.js.map +1 -1
- package/dist/agents/openai_tools/index.cjs.map +1 -1
- package/dist/agents/openai_tools/index.js.map +1 -1
- package/dist/agents/react/index.cjs.map +1 -1
- package/dist/agents/react/index.js.map +1 -1
- package/dist/agents/react/output_parser.cjs.map +1 -1
- package/dist/agents/react/output_parser.js.map +1 -1
- package/dist/agents/structured_chat/index.cjs.map +1 -1
- package/dist/agents/structured_chat/index.js.map +1 -1
- package/dist/agents/structured_chat/outputParser.cjs.map +1 -1
- package/dist/agents/structured_chat/outputParser.js.map +1 -1
- package/dist/agents/tool_calling/index.cjs.map +1 -1
- package/dist/agents/tool_calling/index.js.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/openai_functions.cjs.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/openai_functions.js.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.cjs.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/tool.js.map +1 -1
- package/dist/agents/toolkits/json/json.cjs.map +1 -1
- package/dist/agents/toolkits/json/json.js.map +1 -1
- package/dist/agents/toolkits/openapi/openapi.cjs.map +1 -1
- package/dist/agents/toolkits/openapi/openapi.js.map +1 -1
- package/dist/agents/toolkits/sql/sql.cjs.map +1 -1
- package/dist/agents/toolkits/sql/sql.js.map +1 -1
- package/dist/agents/toolkits/vectorstore/vectorstore.cjs.map +1 -1
- package/dist/agents/toolkits/vectorstore/vectorstore.js.map +1 -1
- package/dist/agents/xml/index.cjs.map +1 -1
- package/dist/agents/xml/index.js.map +1 -1
- package/dist/chains/analyze_documents_chain.cjs.map +1 -1
- package/dist/chains/analyze_documents_chain.js.map +1 -1
- package/dist/chains/api/api_chain.cjs.map +1 -1
- package/dist/chains/api/api_chain.js.map +1 -1
- package/dist/chains/api/prompts.js.map +1 -1
- package/dist/chains/base.cjs.map +1 -1
- package/dist/chains/base.js.map +1 -1
- package/dist/chains/chat_vector_db_chain.cjs.map +1 -1
- package/dist/chains/chat_vector_db_chain.js.map +1 -1
- package/dist/chains/combine_docs_chain.cjs.map +1 -1
- package/dist/chains/combine_docs_chain.js.map +1 -1
- package/dist/chains/combine_documents/base.cjs.map +1 -1
- package/dist/chains/combine_documents/base.js.map +1 -1
- package/dist/chains/combine_documents/reduce.cjs.map +1 -1
- package/dist/chains/combine_documents/reduce.js.map +1 -1
- package/dist/chains/constitutional_ai/constitutional_prompts.cjs.map +1 -1
- package/dist/chains/constitutional_ai/constitutional_prompts.js.map +1 -1
- package/dist/chains/conversational_retrieval_chain.cjs.map +1 -1
- package/dist/chains/conversational_retrieval_chain.js.map +1 -1
- package/dist/chains/graph_qa/cypher.cjs.map +1 -1
- package/dist/chains/graph_qa/cypher.js.map +1 -1
- package/dist/chains/graph_qa/prompts.cjs.map +1 -1
- package/dist/chains/graph_qa/prompts.js.map +1 -1
- package/dist/chains/history_aware_retriever.cjs.map +1 -1
- package/dist/chains/history_aware_retriever.js.map +1 -1
- package/dist/chains/llm_chain.cjs.map +1 -1
- package/dist/chains/llm_chain.js.map +1 -1
- package/dist/chains/openai_functions/base.cjs.map +1 -1
- package/dist/chains/openai_functions/base.js.map +1 -1
- package/dist/chains/openai_functions/openapi.cjs.map +1 -1
- package/dist/chains/openai_functions/openapi.js.map +1 -1
- package/dist/chains/query_constructor/index.cjs.map +1 -1
- package/dist/chains/query_constructor/index.js.map +1 -1
- package/dist/chains/query_constructor/parser.cjs.map +1 -1
- package/dist/chains/query_constructor/parser.js.map +1 -1
- package/dist/chains/query_constructor/prompt.cjs.map +1 -1
- package/dist/chains/query_constructor/prompt.js.map +1 -1
- package/dist/chains/question_answering/load.cjs.map +1 -1
- package/dist/chains/question_answering/load.js.map +1 -1
- package/dist/chains/question_answering/map_reduce_prompts.cjs.map +1 -1
- package/dist/chains/question_answering/map_reduce_prompts.js.map +1 -1
- package/dist/chains/question_answering/refine_prompts.cjs.map +1 -1
- package/dist/chains/question_answering/refine_prompts.js.map +1 -1
- package/dist/chains/question_answering/stuff_prompts.cjs.map +1 -1
- package/dist/chains/question_answering/stuff_prompts.js.map +1 -1
- package/dist/chains/retrieval.cjs.map +1 -1
- package/dist/chains/retrieval.js.map +1 -1
- package/dist/chains/router/multi_prompt.cjs.map +1 -1
- package/dist/chains/router/multi_prompt.js.map +1 -1
- package/dist/chains/router/multi_retrieval_qa.cjs.map +1 -1
- package/dist/chains/router/multi_retrieval_qa.js.map +1 -1
- package/dist/chains/sql_db/sql_db_chain.cjs.map +1 -1
- package/dist/chains/sql_db/sql_db_chain.js.map +1 -1
- package/dist/chains/summarization/load.cjs.map +1 -1
- package/dist/chains/summarization/load.js.map +1 -1
- package/dist/chains/summarization/refine_prompts.cjs.map +1 -1
- package/dist/chains/summarization/refine_prompts.js.map +1 -1
- package/dist/chains/summarization/stuff_prompts.cjs.map +1 -1
- package/dist/chains/summarization/stuff_prompts.js.map +1 -1
- package/dist/chat_models/universal.cjs.map +1 -1
- package/dist/chat_models/universal.js.map +1 -1
- package/dist/document_loaders/fs/json.cjs.map +1 -1
- package/dist/document_loaders/fs/json.js.map +1 -1
- package/dist/document_loaders/fs/multi_file.cjs.map +1 -1
- package/dist/document_loaders/fs/multi_file.js.map +1 -1
- package/dist/document_transformers/openai_functions.cjs.map +1 -1
- package/dist/document_transformers/openai_functions.js.map +1 -1
- package/dist/evaluation/agents/prompt.cjs.map +1 -1
- package/dist/evaluation/agents/prompt.js.map +1 -1
- package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
- package/dist/evaluation/comparison/pairwise.js.map +1 -1
- package/dist/evaluation/comparison/prompt.cjs.map +1 -1
- package/dist/evaluation/comparison/prompt.js.map +1 -1
- package/dist/evaluation/criteria/criteria.cjs.map +1 -1
- package/dist/evaluation/criteria/criteria.js.map +1 -1
- package/dist/evaluation/criteria/prompt.cjs.map +1 -1
- package/dist/evaluation/criteria/prompt.js.map +1 -1
- package/dist/evaluation/embedding_distance/base.cjs.map +1 -1
- package/dist/evaluation/embedding_distance/base.js.map +1 -1
- package/dist/evaluation/qa/eval_chain.cjs.map +1 -1
- package/dist/evaluation/qa/eval_chain.js.map +1 -1
- package/dist/evaluation/qa/prompt.cjs.map +1 -1
- package/dist/evaluation/qa/prompt.js.map +1 -1
- package/dist/experimental/autogpt/agent.cjs.map +1 -1
- package/dist/experimental/autogpt/agent.js.map +1 -1
- package/dist/experimental/autogpt/prompt.cjs.map +1 -1
- package/dist/experimental/autogpt/prompt.js.map +1 -1
- package/dist/experimental/autogpt/prompt_generator.cjs.map +1 -1
- package/dist/experimental/autogpt/prompt_generator.js.map +1 -1
- package/dist/experimental/babyagi/agent.cjs.map +1 -1
- package/dist/experimental/babyagi/agent.js.map +1 -1
- package/dist/experimental/babyagi/task_creation.cjs.map +1 -1
- package/dist/experimental/babyagi/task_creation.js.map +1 -1
- package/dist/experimental/babyagi/task_execution.cjs.map +1 -1
- package/dist/experimental/babyagi/task_execution.js.map +1 -1
- package/dist/experimental/babyagi/task_prioritization.cjs.map +1 -1
- package/dist/experimental/babyagi/task_prioritization.js.map +1 -1
- package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.cjs.map +1 -1
- package/dist/experimental/chains/violation_of_expectations/violation_of_expectations_chain.js.map +1 -1
- package/dist/experimental/generative_agents/generative_agent.cjs.map +1 -1
- package/dist/experimental/generative_agents/generative_agent.js.map +1 -1
- package/dist/experimental/generative_agents/generative_agent_memory.cjs.map +1 -1
- package/dist/experimental/generative_agents/generative_agent_memory.js.map +1 -1
- package/dist/experimental/masking/regex_masking_transformer.cjs.map +1 -1
- package/dist/experimental/masking/regex_masking_transformer.js.map +1 -1
- package/dist/experimental/openai_assistant/index.cjs.map +1 -1
- package/dist/experimental/openai_assistant/index.js.map +1 -1
- package/dist/experimental/plan_and_execute/agent_executor.cjs.map +1 -1
- package/dist/experimental/plan_and_execute/agent_executor.js.map +1 -1
- package/dist/experimental/plan_and_execute/base.cjs.map +1 -1
- package/dist/experimental/plan_and_execute/base.js.map +1 -1
- package/dist/experimental/prompts/handlebars.cjs.map +1 -1
- package/dist/experimental/prompts/handlebars.js.map +1 -1
- package/dist/hub/base.cjs.map +1 -1
- package/dist/hub/base.js.map +1 -1
- package/dist/hub/index.cjs.map +1 -1
- package/dist/hub/index.js.map +1 -1
- package/dist/hub/node.cjs.map +1 -1
- package/dist/hub/node.js.map +1 -1
- package/dist/memory/buffer_memory.cjs.map +1 -1
- package/dist/memory/buffer_memory.js.map +1 -1
- package/dist/memory/buffer_token_memory.cjs.map +1 -1
- package/dist/memory/buffer_token_memory.js.map +1 -1
- package/dist/memory/buffer_window_memory.cjs.map +1 -1
- package/dist/memory/buffer_window_memory.js.map +1 -1
- package/dist/memory/entity_memory.cjs.map +1 -1
- package/dist/memory/entity_memory.js.map +1 -1
- package/dist/memory/prompt.cjs.map +1 -1
- package/dist/memory/prompt.js.map +1 -1
- package/dist/memory/summary.cjs.map +1 -1
- package/dist/memory/summary.js.map +1 -1
- package/dist/output_parsers/expression.cjs.map +1 -1
- package/dist/output_parsers/expression.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/factory.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/factory.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/identifier_handler.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/identifier_handler.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/property_assignment_handler.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/property_assignment_handler.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/string_literal_handler.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/string_literal_handler.js.map +1 -1
- package/dist/output_parsers/fix.cjs.map +1 -1
- package/dist/output_parsers/fix.js.map +1 -1
- package/dist/output_parsers/http_response.cjs.map +1 -1
- package/dist/output_parsers/http_response.js.map +1 -1
- package/dist/output_parsers/openai_functions.cjs.map +1 -1
- package/dist/output_parsers/openai_functions.js.map +1 -1
- package/dist/output_parsers/openai_tools.cjs.map +1 -1
- package/dist/output_parsers/openai_tools.js.map +1 -1
- package/dist/output_parsers/prompts.cjs.map +1 -1
- package/dist/output_parsers/prompts.js.map +1 -1
- package/dist/output_parsers/structured.cjs.map +1 -1
- package/dist/output_parsers/structured.js.map +1 -1
- package/dist/retrievers/contextual_compression.cjs.map +1 -1
- package/dist/retrievers/contextual_compression.js.map +1 -1
- package/dist/retrievers/document_compressors/chain_extract.cjs.map +1 -1
- package/dist/retrievers/document_compressors/chain_extract.js.map +1 -1
- package/dist/retrievers/ensemble.cjs.map +1 -1
- package/dist/retrievers/ensemble.js.map +1 -1
- package/dist/retrievers/hyde.cjs.map +1 -1
- package/dist/retrievers/hyde.js.map +1 -1
- package/dist/retrievers/multi_query.cjs.map +1 -1
- package/dist/retrievers/multi_query.js.map +1 -1
- package/dist/retrievers/multi_vector.cjs.map +1 -1
- package/dist/retrievers/multi_vector.js.map +1 -1
- package/dist/retrievers/parent_document.cjs.map +1 -1
- package/dist/retrievers/parent_document.js.map +1 -1
- package/dist/retrievers/score_threshold.cjs.map +1 -1
- package/dist/retrievers/score_threshold.js.map +1 -1
- package/dist/smith/runner_utils.cjs.map +1 -1
- package/dist/smith/runner_utils.js.map +1 -1
- package/dist/storage/encoder_backed.cjs.map +1 -1
- package/dist/storage/encoder_backed.js.map +1 -1
- package/dist/storage/file_system.cjs.map +1 -1
- package/dist/storage/file_system.js.map +1 -1
- package/dist/tools/json.cjs.map +1 -1
- package/dist/tools/json.js.map +1 -1
- package/dist/tools/requests.cjs.map +1 -1
- package/dist/tools/requests.js.map +1 -1
- package/dist/tools/retriever.cjs.map +1 -1
- package/dist/tools/retriever.js.map +1 -1
- package/dist/tools/sql.cjs.map +1 -1
- package/dist/tools/sql.js.map +1 -1
- package/dist/tools/webbrowser.cjs.map +1 -1
- package/dist/tools/webbrowser.js.map +1 -1
- package/dist/util/hub.cjs.map +1 -1
- package/dist/util/hub.js.map +1 -1
- package/dist/util/load.cjs.map +1 -1
- package/dist/util/load.js.map +1 -1
- package/dist/util/openapi.cjs.map +1 -1
- package/dist/util/openapi.js.map +1 -1
- package/dist/util/sql_utils.cjs.map +1 -1
- package/dist/util/sql_utils.js.map +1 -1
- package/dist/vectorstores/memory.cjs.map +1 -1
- package/dist/vectorstores/memory.js.map +1 -1
- package/package.json +47 -48
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regex_masking_transformer.cjs","names":["MaskingTransformer"],"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 // oxlint-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 // oxlint-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 // oxlint-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,oBAAAA,mBAAmB;CAC9D;CAEA;;;;;;;;;;CAWA,YACE,UACA,cACA;AACA,SAAO;AAGP,OAAK,iBAAiB,SAAS;AAI/B,OAAK,WAAW;AAChB,OAAK,eAAe,gBAAgB,KAAK;;;;;;;;CAS3C,iBAAyB,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,iCAAiC;;;;;;;;;CAWvD,MAAM,UACJ,SACA,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;EAIH,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI,KAAqB;AAGzD,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;AAG9B,sBAAmB,iBAAiB,QAAQ,QAAQ,QAAQ,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GAClB,QAAQ,eAAe,KAAK,aAAa,MAAM;AAGpD,mBAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;KACP;;AAMJ,SAAO,CAAC,kBAAkB,eAAe;;;;;;;;CAS3C,MAAM,UACJ,SACA,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;AAiBH,SAb0B,MAAM,KAAK,MAAM,CAAC,QACzC,KAAK,CAAC,QAAQ,cAAc;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,IAAI,EAAE,SAAS;KAE9D,
|
|
1
|
+
{"version":3,"file":"regex_masking_transformer.cjs","names":["MaskingTransformer"],"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 // oxlint-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 // oxlint-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 // oxlint-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,oBAAAA,mBAAmB;CAC9D;CAEA;;;;;;;;;;CAWA,YACE,UACA,cACA;AACA,SAAO;AAGP,OAAK,iBAAiB,SAAS;AAI/B,OAAK,WAAW;AAChB,OAAK,eAAe,gBAAgB,KAAK;;;;;;;;CAS3C,iBAAyB,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,iCAAiC;;;;;;;;;CAWvD,MAAM,UACJ,SACA,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;EAIH,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI,KAAqB;AAGzD,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;AAG9B,sBAAmB,iBAAiB,QAAQ,QAAQ,QAAQ,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GAClB,QAAQ,eAAe,KAAK,aAAa,MAAM;AAGpD,mBAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;KACP;;AAMJ,SAAO,CAAC,kBAAkB,eAAe;;;;;;;;CAS3C,MAAM,UACJ,SACA,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;AAiBH,SAb0B,MAAM,KAAK,MAAM,CAAC,QACzC,KAAK,CAAC,QAAQ,cAAc;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,IAAI,EAAE,SAAS;KAE9D,QAGsB;;;;;;;CAQ1B,oBAA4B,OAAuB;EACjD,IAAI,OAAO;AAEX,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;GAExC,MAAM,OAAO,MAAM,WAAW,EAAE;AAEhC,WAAQ,QAAQ,KAAK,OAAO;AAI5B,WAAQ;;AAIV,SAAO,KAAK,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regex_masking_transformer.js","names":[],"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 // oxlint-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 // oxlint-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 // oxlint-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;CAEA;;;;;;;;;;CAWA,YACE,UACA,cACA;AACA,SAAO;AAGP,OAAK,iBAAiB,SAAS;AAI/B,OAAK,WAAW;AAChB,OAAK,eAAe,gBAAgB,KAAK;;;;;;;;CAS3C,iBAAyB,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,iCAAiC;;;;;;;;;CAWvD,MAAM,UACJ,SACA,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;EAIH,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI,KAAqB;AAGzD,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;AAG9B,sBAAmB,iBAAiB,QAAQ,QAAQ,QAAQ,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GAClB,QAAQ,eAAe,KAAK,aAAa,MAAM;AAGpD,mBAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;KACP;;AAMJ,SAAO,CAAC,kBAAkB,eAAe;;;;;;;;CAS3C,MAAM,UACJ,SACA,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;AAiBH,SAb0B,MAAM,KAAK,MAAM,CAAC,QACzC,KAAK,CAAC,QAAQ,cAAc;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,IAAI,EAAE,SAAS;KAE9D,
|
|
1
|
+
{"version":3,"file":"regex_masking_transformer.js","names":[],"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 // oxlint-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 // oxlint-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 // oxlint-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;CAEA;;;;;;;;;;CAWA,YACE,UACA,cACA;AACA,SAAO;AAGP,OAAK,iBAAiB,SAAS;AAI/B,OAAK,WAAW;AAChB,OAAK,eAAe,gBAAgB,KAAK;;;;;;;;CAS3C,iBAAyB,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,iCAAiC;;;;;;;;;CAWvD,MAAM,UACJ,SACA,OACwC;AACxC,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;EAIH,IAAI,mBAAmB;EAGvB,MAAM,iBAAiB,yBAAS,IAAI,KAAqB;AAGzD,OAAK,MAAM,OAAO,OAAO,KAAK,KAAK,SAAS,EAAE;GAC5C,MAAM,UAAU,KAAK,SAAS;AAG9B,sBAAmB,iBAAiB,QAAQ,QAAQ,QAAQ,UAAU;IAGpE,MAAM,cAAc,QAAQ,OACxB,QAAQ,KAAK,MAAM,GAClB,QAAQ,eAAe,KAAK,aAAa,MAAM;AAGpD,mBAAe,IAAI,aAAa,MAAM;AAGtC,WAAO;KACP;;AAMJ,SAAO,CAAC,kBAAkB,eAAe;;;;;;;;CAS3C,MAAM,UACJ,SACA,OACiB;AACjB,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,oFACD;AAIH,MAAI,EAAE,iBAAiB,KACrB,OAAM,IAAI,UACR,4FACD;AAiBH,SAb0B,MAAM,KAAK,MAAM,CAAC,QACzC,KAAK,CAAC,QAAQ,cAAc;GAG3B,MAAM,gBAAgB,OAAO,QAAQ,uBAAuB,OAAO;AAInE,UAAO,IAAI,QAAQ,IAAI,OAAO,eAAe,IAAI,EAAE,SAAS;KAE9D,QAGsB;;;;;;;CAQ1B,oBAA4B,OAAuB;EACjD,IAAI,OAAO;AAEX,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;GAExC,MAAM,OAAO,MAAM,WAAW,EAAE;AAEhC,WAAQ,QAAQ,KAAK,OAAO;AAI5B,WAAQ;;AAIV,SAAO,KAAK,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Runnable","OpenAIClient","StructuredTool","sleep"],"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// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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","OpenAIClient","StructuredTool","sleep"],"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// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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":";;;;;;;;;;;;;AAqCA,IAAa,0BAAb,cAIUA,0BAAAA,SAA8C;CACtD,eAAe;EAAC;EAAa;EAAgB;EAAmB;CAEhE;CAEA;CAEA,iBAAiB;CAEjB;CAEA,YAAY,QAA+C;AACzD,QAAM,OAAO;AACb,OAAK,SAAS,OAAO,UAAU,IAAIC,kBAAAA,aAAa,QAAQ,cAAc;AACtE,OAAK,cAAc,OAAO;AAC1B,OAAK,UAAU,OAAO,WAAW,KAAK;;CAGxC,aAAa,gBAAyC,EACpD,OACA,MACA,cACA,OACA,QACA,eACA,SACA,gBACA,WAOC;EACD,MAAM,iBACJ,OAAO,KAAK,SAAS;AAEnB,OAAI,gBAAgBC,sBAAAA,eAClB,QAAO,4BAA4B,KAAK;AAE1C,UAAO;IACP,IAAI,EAAE;EACV,MAAM,YAAY,UAAU,IAAID,kBAAAA,aAAa,cAAc;EAC3D,MAAM,YAAY,MAAM,UAAU,KAAK,WAAW,OAAO;GACvD;GACA;GACA,OAAO;GACP;GACA,UAAU;GAEX,CAAQ;AAET,SAAO,IAAI,KAAK;GACd,QAAQ;GACR,aAAa,UAAU;GACvB;GACA;GACD,CAAC;;CAGJ,MAAM,OACJ,OACA,UACoC;EAEpC,IAAI;AACJ,MAAI,KAAK,WAAW,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;GACzD,MAAM,mBAAmB,MAAM,KAAK,iBAAiB,MAAM;AAC3D,SAAM,MAAM,KAAK,OAAO,KAAK,QAAQ,KAAK,kBACxC,iBAAiB,OACjB;IACE,WAAW,iBAAiB;IAC5B,cAAc,iBAAiB;IAChC,CACF;aACQ,EAAE,cAAc,QAAQ;GACjC,MAAM,SAAS;IACb,UAAU,CACR;KACE,MAAM;KACN,SAAS,MAAM;KACf,aAAa,MAAM;KACnB,UAAU,MAAM;KACjB,CACF;IACD,UAAU,MAAM;IACjB;AACD,SAAM,MAAM,KAAK,oBAAoB;IACnC,GAAG;IACH;IACD,CAAC;aACO,EAAE,WAAW,QAAQ;AAC9B,SAAM,KAAK,OAAO,KAAK,QAAQ,SAAS,OAAO,MAAM,UAAU;IAC7D,SAAS,MAAM;IACf,MAAM;IACN,aAAa,MAAM;IACnB,UAAU,MAAM;IAEjB,CAAQ;AACT,SAAM,MAAM,KAAK,WAAW,MAAM;QAIlC,OAAM,MAAM,KAAK,OAAO,KAAK,QAAQ,KAAK,kBAAkB,MAAM,OAAO;GACvE,WAAW,MAAM;GACjB,cAAc,MAAM;GACrB,CAAC;AAGJ,SAAO,KAAK,aAAa,IAAI,IAAI,IAAI,UAAU;;;;;;;;CASjD,MAAa,kBAAkB;AAC7B,SAAO,MAAM,KAAK,OAAO,KAAK,WAAW,OAAO,KAAK,YAAY;;;;;;;;CASnE,MAAa,eAAe;AAC1B,SAAO,MAAM,KAAK,OAAO,KAAK,WAAW,SAAS,KAAK,YAAY;;;;;;;;CASrE,MAAa,gBAAyC,EACpD,OACA,MACA,cACA,WAMC;AACD,SAAO,MAAM,KAAK,OAAO,KAAK,WAAW,OAAO,KAAK,aAAa;GAChE;GACA;GACA;GACA,UAAU;GAEX,CAAQ;;CAGX,MAAc,iBAAiB,OAAoC;EACjE,MAAM,EACJ,QAAQ,EAAE,OAAO,eACf,MAAM,MAAM,MAAM,MAAM,SAAS;EAErC,MAAM,aAAY,MADA,KAAK,YAAY,OAAO,SAAS,EAC7B,iBAAiB,oBAAoB;AAC3D,MAAI,CAAC,UACH,QAAO;AAoBT,SAAO;GAAE,aAjBW,UAAU,SAAS,aAAkB;IACvD,MAAM,gBACJ,MAAM,MAIN,MAAM,SAAS,KAAK,OAAO,eAAe,SAAS,GAAG;AAExD,WAAO,gBACH,CACE;KACE,QAAQ,cAAc;KACtB,cAAc,cAAc,OAAO;KACpC,CACF,GACD,EAAE;KAEY;GAAE;GAAO;GAAU;;CAGzC,MAAc,WAAW,EACvB,cACA,OACA,OACA,UACA,YACW;AAQX,SAPY,KAAK,OAAO,KAAK,QAAQ,KAAK,OAAO,UAAU;GACzD,cAAc,KAAK;GACnB;GACA;GACA;GACA;GACD,CACS;;CAGZ,MAAc,oBAAoB,OAAiB;EACjD,MAAM,SAAkC;GACtC;GACA;GACA;GACA;GACD,CACE,QAAQ,QAAQ,OAAO,MAAM,CAC7B,QACE,KAAK,QAAQ;GACZ,MAAM,SAAS;AACf,UAAO,OAAO,MAAM;AACpB,UAAO;KAET,EAAE,CACH;AAMH,SALY,KAAK,OAAO,KAAK,QAAQ,aAAa;GAChD,GAAG;GACH,QAAQ,MAAM;GACd,cAAc,KAAK;GACpB,CACS;;CAGZ,MAAc,YAAY,OAAe,UAAkB;EACzD,IAAI,aAAa;EAEjB,IAAI,MAAM,EAAE;AACZ,SAAO,YAAY;AACjB,SAAM,MAAM,KAAK,OAAO,KAAK,QAAQ,KAAK,SAAS,OAAO,EACxD,WAAW,UACZ,CAAC;AACF,gBAAa,CAAC,eAAe,SAAS,CAAC,SAAS,IAAI,OAAO;AAC3D,OAAI,WACF,OAAME,kBAAAA,MAAM,KAAK,eAAe;;AAGpC,SAAO;;CAQT,MAAc,aACZ,OACA,UAMA;EACA,MAAM,MAAM,MAAM,KAAK,YAAY,OAAO,SAAS;AACnD,MAAI,IAAI,WAAW,aAAa;GAI9B,MAAM,eAAc,MAHG,KAAK,OAAO,KAAK,QAAQ,SAAS,KAAK,UAAU,EACtE,OAAO,QACR,CAAC,EAC2B,KAAK,QAAQ,QAAQ,IAAI,WAAW,MAAM;AACvE,OAAI,CAAC,KAAK,QACR,QAAO;GAET,MAAM,SAAS,YAAY,SAAS,QAAQ,IAAI,QAAQ;AACxD,OAAI,OAAO,OAAO,SAAS,KAAK,SAAS,OAAO,CAI9C,QAAO;IACL,cAAc;KACZ,QALiB,OAClB,KAAK,SAAS,KAAK,SAAS,UAAU,KAAK,KAAK,MAAM,CACtD,KAAK,KAGgB;KACpB;KACA;KACD;IACD,KAAK;IACL;IACA;IACD;aAEM,IAAI,WAAW,mBAAmB;AAC3C,OAAI,CAAC,KAAK,QACR,QAAO,IAAI,iBAAiB,oBAAoB,cAAc,EAAE;GAElE,MAAM,UAAmC,EAAE;AAC3C,OAAI,iBAAiB,oBAAoB,WAAW,SAEjD,SAAc;IACb,MAAM,eAAe,KAAK;IAC1B,MAAM,OAAO,KAAK,MAAM,aAAa,UAAU;AAC/C,YAAQ,KAAK;KACX,MAAM,aAAa;KACnB,WAAW;KACX,YAAY,KAAK;KACjB,KAAK;KACL;KACA;KACD,CAAC;KAEL;AACD,UAAO;;EAET,MAAM,UAAU,KAAK,UAAU,KAAK,MAAM,EAAE;AAC5C,QAAM,IAAI,MACR,yBAAyB,IAAI,OAAO,uBAAuB,UAC5D;;;AAIL,SAAgB,4BACd,MACgB;AAChB,QAAO;EACL,MAAM;EACN,UAAU;GACR,MAAM,KAAK;GACX,aAAa,KAAK;GAClB,aAAA,GAAA,4BAAA,oBAA+B,KAAK,OAAO,IAAA,GAAA,kCAAA,cAC1B,KAAK,OAAO,GACzB,KAAK;GACV;EACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"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// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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":[],"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// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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 // oxlint-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":["BaseChain","ListStepContainer","LLMPlanner","LLMChain","getPlannerChatPrompt","PlanOutputParser","DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE","StructuredChatAgent","ChainStepExecutor","AgentExecutor","ChatAgent"],"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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // oxlint-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,wBACd,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;;;;;;;;AAuB5C,IAAa,8BAAb,MAAa,oCAAoCA,aAAAA,UAAU;CACzD,OAAO,UAAU;AACf,SAAO;;CAGT;CAEA;CAEA,gBAA2C,IAAIC,eAAAA,mBAAmB;CAElE,WAAmB;CAEnB,YAAoB;CAEpB,YAAY,OAAyC;AACnD,QAAM,MAAM;AACZ,OAAK,UAAU,MAAM;AACrB,OAAK,eAAe,MAAM;AAC1B,OAAK,gBAAgB,MAAM,iBAAiB,KAAK;AACjD,OAAK,WAAW,MAAM,YAAY,KAAK;AACvC,OAAK,YAAY,MAAM,aAAa,KAAK;;CAG3C,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,SAAS;;CAGxB,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,UAAU;;;;;;;;;CAWzB,aAAa,kBAAkB,EAC7B,KACA,SAIC;AAKD,SAAO,IAAIC,eAAAA,
|
|
1
|
+
{"version":3,"file":"agent_executor.cjs","names":["BaseChain","ListStepContainer","LLMPlanner","LLMChain","getPlannerChatPrompt","PlanOutputParser","DEFAULT_STEP_EXECUTOR_HUMAN_CHAT_MESSAGE_TEMPLATE","StructuredChatAgent","ChainStepExecutor","AgentExecutor","ChatAgent"],"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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // oxlint-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,wBACd,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;;;;;;;;AAuB5C,IAAa,8BAAb,MAAa,oCAAoCA,aAAAA,UAAU;CACzD,OAAO,UAAU;AACf,SAAO;;CAGT;CAEA;CAEA,gBAA2C,IAAIC,eAAAA,mBAAmB;CAElE,WAAmB;CAEnB,YAAoB;CAEpB,YAAY,OAAyC;AACnD,QAAM,MAAM;AACZ,OAAK,UAAU,MAAM;AACrB,OAAK,eAAe,MAAM;AAC1B,OAAK,gBAAgB,MAAM,iBAAiB,KAAK;AACjD,OAAK,WAAW,MAAM,YAAY,KAAK;AACvC,OAAK,YAAY,MAAM,aAAa,KAAK;;CAG3C,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,SAAS;;CAGxB,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,UAAU;;;;;;;;;CAWzB,aAAa,kBAAkB,EAC7B,KACA,SAIC;AAKD,SAAO,IAAIC,eAAAA,WAAW,IAJMC,kBAAAA,SAAS;GACnC;GACA,QAAQ,MAAMC,eAAAA,qBAAqB,MAAM;GAC1C,CACoC,EAAE,IAAIC,qBAAAA,kBAAkB,CAAC;;;;;;;;;;;CAYhE,OAAO,uBAAuB,EAC5B,KACA,OACA,uBAAuBC,eAAAA,qDAKtB;EACD,IAAI;AAEJ,MAAI,MAAM,SAAS,KAAK,wBAAwB,MAAM,GAAG,EAAE;AACzD,WAAQC,gBAAAA,oBAAoB,gBAAgB,KAAK,OAAO;IACtD;IACA,gBAAgB;KAAC;KAAkB;KAAgB;KAAmB;IACvE,CAAC;AACF,UAAO,IAAIC,eAAAA,kBACTC,iBAAAA,cAAc,kBAAkB;IAC9B;IACA;IACD,CAAC,CACH;;AAGH,UAAQC,cAAAA,UAAU,gBAAgB,KAAK,OAAiB,EACtD,sBACD,CAAC;AACF,SAAO,IAAIF,eAAAA,kBACTC,iBAAAA,cAAc,kBAAkB;GAC9B;GACA;GACD,CAAC,CACH;;;;;;;;;;;;CAaH,aAAa,gBAAgB,EAC3B,KACA,OACA,wBAKsE;AAYtE,SAAO,IAXc,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;IACD,CAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;IACD,CAAC;GACH,CACc;;;CAIjB,MAAM,MACJ,QACA,YACsB;EACtB,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO,YAAY,UAAU,CAAC;AAC1E,MAAI,CAAC,KAAK,OAAO,OACf,OAAM,IAAI,MACR,gFACD;AAEH,OAAK,MAAM,KAAK,MAAM,SAAS,GAAG,QAChC,+BAA+B,OAAO,MAAM;AAC9C,OAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,YAAY;IAChB,GAAG;IACH,gBAAgB,KAAK,UAAU,KAAK,cAAc,UAAU,CAAC;IAC7D,cAAc,KAAK;IACpB;GACD,MAAM,WAAW,MAAM,KAAK,aAAa,KACvC,WACA,YAAY,UAAU,CACvB;AACD,QAAK,cAAc,QAAQ,MAAM,SAAS;;AAE5C,SAAO,GAAG,KAAK,YAAY,KAAK,cAAc,kBAAkB,EAAE;;CAGpE,aAAa;AACX,SAAO;;CAGT,YAAgC;AAC9B,QAAM,IAAI,MAAM,oCAAoC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent_executor.js","names":[],"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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // oxlint-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,wBACd,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;;;;;;;;AAuB5C,IAAa,8BAAb,MAAa,oCAAoC,UAAU;CACzD,OAAO,UAAU;AACf,SAAO;;CAGT;CAEA;CAEA,gBAA2C,IAAI,mBAAmB;CAElE,WAAmB;CAEnB,YAAoB;CAEpB,YAAY,OAAyC;AACnD,QAAM,MAAM;AACZ,OAAK,UAAU,MAAM;AACrB,OAAK,eAAe,MAAM;AAC1B,OAAK,gBAAgB,MAAM,iBAAiB,KAAK;AACjD,OAAK,WAAW,MAAM,YAAY,KAAK;AACvC,OAAK,YAAY,MAAM,aAAa,KAAK;;CAG3C,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,SAAS;;CAGxB,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,UAAU;;;;;;;;;CAWzB,aAAa,kBAAkB,EAC7B,KACA,SAIC;AAKD,SAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"agent_executor.js","names":[],"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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n typeof (tool.constructor as any).lc_name === \"function\" &&\n // oxlint-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,wBACd,MAC+B;AAE/B,QAEE,OAAQ,KAAK,YAAoB,YAAY,cAE5C,KAAK,YAAoB,SAAS,KAAK;;;;;;;;AAuB5C,IAAa,8BAAb,MAAa,oCAAoC,UAAU;CACzD,OAAO,UAAU;AACf,SAAO;;CAGT;CAEA;CAEA,gBAA2C,IAAI,mBAAmB;CAElE,WAAmB;CAEnB,YAAoB;CAEpB,YAAY,OAAyC;AACnD,QAAM,MAAM;AACZ,OAAK,UAAU,MAAM;AACrB,OAAK,eAAe,MAAM;AAC1B,OAAK,gBAAgB,MAAM,iBAAiB,KAAK;AACjD,OAAK,WAAW,MAAM,YAAY,KAAK;AACvC,OAAK,YAAY,MAAM,aAAa,KAAK;;CAG3C,IAAI,YAAY;AACd,SAAO,CAAC,KAAK,SAAS;;CAGxB,IAAI,aAAa;AACf,SAAO,CAAC,KAAK,UAAU;;;;;;;;;CAWzB,aAAa,kBAAkB,EAC7B,KACA,SAIC;AAKD,SAAO,IAAI,WAAW,IAJM,SAAS;GACnC;GACA,QAAQ,MAAM,qBAAqB,MAAM;GAC1C,CACoC,EAAE,IAAI,kBAAkB,CAAC;;;;;;;;;;;CAYhE,OAAO,uBAAuB,EAC5B,KACA,OACA,uBAAuB,qDAKtB;EACD,IAAI;AAEJ,MAAI,MAAM,SAAS,KAAK,wBAAwB,MAAM,GAAG,EAAE;AACzD,WAAQ,oBAAoB,gBAAgB,KAAK,OAAO;IACtD;IACA,gBAAgB;KAAC;KAAkB;KAAgB;KAAmB;IACvE,CAAC;AACF,UAAO,IAAI,kBACT,cAAc,kBAAkB;IAC9B;IACA;IACD,CAAC,CACH;;AAGH,UAAQ,UAAU,gBAAgB,KAAK,OAAiB,EACtD,sBACD,CAAC;AACF,SAAO,IAAI,kBACT,cAAc,kBAAkB;GAC9B;GACA;GACD,CAAC,CACH;;;;;;;;;;;;CAaH,aAAa,gBAAgB,EAC3B,KACA,OACA,wBAKsE;AAYtE,SAAO,IAXc,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;IACD,CAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;IACD,CAAC;GACH,CACc;;;CAIjB,MAAM,MACJ,QACA,YACsB;EACtB,MAAM,OAAO,MAAM,KAAK,QAAQ,KAAK,OAAO,OAAO,YAAY,UAAU,CAAC;AAC1E,MAAI,CAAC,KAAK,OAAO,OACf,OAAM,IAAI,MACR,gFACD;AAEH,OAAK,MAAM,KAAK,MAAM,SAAS,GAAG,QAChC,+BAA+B,OAAO,MAAM;AAC9C,OAAK,MAAM,QAAQ,KAAK,OAAO;GAC7B,MAAM,YAAY;IAChB,GAAG;IACH,gBAAgB,KAAK,UAAU,KAAK,cAAc,UAAU,CAAC;IAC7D,cAAc,KAAK;IACpB;GACD,MAAM,WAAW,MAAM,KAAK,aAAa,KACvC,WACA,YAAY,UAAU,CACvB;AACD,QAAK,cAAc,QAAQ,MAAM,SAAS;;AAE5C,SAAO,GAAG,KAAK,YAAY,KAAK,cAAc,kBAAkB,EAAE;;CAGpE,aAAa;AACX,SAAO;;CAGT,YAAgC;AAC9B,QAAM,IAAI,MAAM,oCAAoC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.cjs","names":[],"sources":["../../../src/experimental/plan_and_execute/base.ts"],"sourcesContent":["import { BaseOutputParser } from \"@langchain/core/output_parsers\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { CallbackManager } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\n\n/**\n * Represents an action to be performed in a step.\n */\nexport type StepAction = {\n text: string;\n};\n\n/**\n * Represents the result of a step.\n */\nexport type StepResult = {\n response: string;\n};\n\n/**\n * Represents a step, which includes an action and its result.\n */\nexport type Step = {\n action: StepAction;\n result: StepResult;\n};\n\n/**\n * Represents a plan, which is a sequence of step actions.\n */\nexport type Plan = {\n steps: StepAction[];\n};\n\n/**\n * Abstract class that defines the structure for a planner. Planners are\n * responsible for generating a plan based on inputs.\n */\nexport abstract class BasePlanner {\n abstract plan(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<Plan>;\n}\n\n/**\n * Abstract class that defines the structure for a step executor. Step\n * executors are responsible for executing a step based on inputs.\n */\nexport abstract class BaseStepExecutor {\n abstract step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult>;\n}\n\n/**\n * Abstract class that defines the structure for a step container. Step\n * containers are responsible for managing steps.\n */\nexport abstract class BaseStepContainer {\n abstract addStep(action: StepAction, result: StepResult): void;\n\n abstract getSteps(): Step[];\n\n abstract getFinalResponse(): string;\n}\n\n/**\n * Class that extends BaseStepContainer and provides an implementation for\n * its methods. It maintains a list of steps and provides methods to add a\n * step, get all steps, and get the final response.\n */\nexport class ListStepContainer extends BaseStepContainer {\n private steps: Step[] = [];\n\n addStep(action: StepAction, result: StepResult) {\n this.steps.push({ action, result });\n }\n\n getSteps() {\n return this.steps;\n }\n\n getFinalResponse(): string {\n return this.steps[this.steps.length - 1]?.result?.response;\n }\n}\n\n/**\n * Class that extends BasePlanner and provides an implementation for the\n * plan method. It uses an instance of LLMChain and an output parser to\n * generate a plan.\n */\nexport class LLMPlanner extends BasePlanner {\n constructor(\n private llmChain: LLMChain,\n private outputParser: BaseOutputParser<Plan>\n ) {\n super();\n }\n\n async plan(inputs: ChainValues, runManager?: CallbackManager): Promise<Plan> {\n const output = await this.llmChain.run(inputs, runManager);\n return this.outputParser.parse(output);\n }\n}\n\n/**\n * Class that extends BaseStepExecutor and provides an implementation for\n * the step method. It uses an instance of BaseChain to execute a step.\n */\nexport class ChainStepExecutor extends BaseStepExecutor {\n constructor(private chain: BaseChain) {\n super();\n }\n\n async step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult> {\n const chainResponse = await this.chain.call(inputs, runManager);\n return { response: chainResponse.output };\n }\n}\n"],"mappings":";;;;;AAuCA,IAAsB,cAAtB,MAAkC;;;;;AAWlC,IAAsB,mBAAtB,MAAuC;;;;;AAWvC,IAAsB,oBAAtB,MAAwC;;;;;;AAaxC,IAAa,oBAAb,cAAuC,kBAAkB;CACvD,QAAwB,EAAE;CAE1B,QAAQ,QAAoB,QAAoB;AAC9C,OAAK,MAAM,KAAK;GAAE;GAAQ;GAAQ,CAAC;;CAGrC,WAAW;AACT,SAAO,KAAK;;CAGd,mBAA2B;AACzB,SAAO,KAAK,MAAM,KAAK,MAAM,SAAS,IAAI,QAAQ;;;;;;;;AAStD,IAAa,aAAb,cAAgC,YAAY;CAC1C,YACE,UACA,cACA;AACA,SAAO;AAHC,OAAA,WAAA;AACA,OAAA,eAAA;;CAKV,MAAM,KAAK,QAAqB,YAA6C;EAC3E,MAAM,SAAS,MAAM,KAAK,SAAS,IAAI,QAAQ,WAAW;AAC1D,SAAO,KAAK,aAAa,MAAM,OAAO;;;;;;;AAQ1C,IAAa,oBAAb,cAAuC,iBAAiB;CACtD,YAAY,OAA0B;AACpC,SAAO;AADW,OAAA,QAAA;;CAIpB,MAAM,KACJ,QACA,YACqB;AAErB,SAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"base.cjs","names":[],"sources":["../../../src/experimental/plan_and_execute/base.ts"],"sourcesContent":["import { BaseOutputParser } from \"@langchain/core/output_parsers\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { CallbackManager } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\n\n/**\n * Represents an action to be performed in a step.\n */\nexport type StepAction = {\n text: string;\n};\n\n/**\n * Represents the result of a step.\n */\nexport type StepResult = {\n response: string;\n};\n\n/**\n * Represents a step, which includes an action and its result.\n */\nexport type Step = {\n action: StepAction;\n result: StepResult;\n};\n\n/**\n * Represents a plan, which is a sequence of step actions.\n */\nexport type Plan = {\n steps: StepAction[];\n};\n\n/**\n * Abstract class that defines the structure for a planner. Planners are\n * responsible for generating a plan based on inputs.\n */\nexport abstract class BasePlanner {\n abstract plan(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<Plan>;\n}\n\n/**\n * Abstract class that defines the structure for a step executor. Step\n * executors are responsible for executing a step based on inputs.\n */\nexport abstract class BaseStepExecutor {\n abstract step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult>;\n}\n\n/**\n * Abstract class that defines the structure for a step container. Step\n * containers are responsible for managing steps.\n */\nexport abstract class BaseStepContainer {\n abstract addStep(action: StepAction, result: StepResult): void;\n\n abstract getSteps(): Step[];\n\n abstract getFinalResponse(): string;\n}\n\n/**\n * Class that extends BaseStepContainer and provides an implementation for\n * its methods. It maintains a list of steps and provides methods to add a\n * step, get all steps, and get the final response.\n */\nexport class ListStepContainer extends BaseStepContainer {\n private steps: Step[] = [];\n\n addStep(action: StepAction, result: StepResult) {\n this.steps.push({ action, result });\n }\n\n getSteps() {\n return this.steps;\n }\n\n getFinalResponse(): string {\n return this.steps[this.steps.length - 1]?.result?.response;\n }\n}\n\n/**\n * Class that extends BasePlanner and provides an implementation for the\n * plan method. It uses an instance of LLMChain and an output parser to\n * generate a plan.\n */\nexport class LLMPlanner extends BasePlanner {\n constructor(\n private llmChain: LLMChain,\n private outputParser: BaseOutputParser<Plan>\n ) {\n super();\n }\n\n async plan(inputs: ChainValues, runManager?: CallbackManager): Promise<Plan> {\n const output = await this.llmChain.run(inputs, runManager);\n return this.outputParser.parse(output);\n }\n}\n\n/**\n * Class that extends BaseStepExecutor and provides an implementation for\n * the step method. It uses an instance of BaseChain to execute a step.\n */\nexport class ChainStepExecutor extends BaseStepExecutor {\n constructor(private chain: BaseChain) {\n super();\n }\n\n async step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult> {\n const chainResponse = await this.chain.call(inputs, runManager);\n return { response: chainResponse.output };\n }\n}\n"],"mappings":";;;;;AAuCA,IAAsB,cAAtB,MAAkC;;;;;AAWlC,IAAsB,mBAAtB,MAAuC;;;;;AAWvC,IAAsB,oBAAtB,MAAwC;;;;;;AAaxC,IAAa,oBAAb,cAAuC,kBAAkB;CACvD,QAAwB,EAAE;CAE1B,QAAQ,QAAoB,QAAoB;AAC9C,OAAK,MAAM,KAAK;GAAE;GAAQ;GAAQ,CAAC;;CAGrC,WAAW;AACT,SAAO,KAAK;;CAGd,mBAA2B;AACzB,SAAO,KAAK,MAAM,KAAK,MAAM,SAAS,IAAI,QAAQ;;;;;;;;AAStD,IAAa,aAAb,cAAgC,YAAY;CAC1C,YACE,UACA,cACA;AACA,SAAO;AAHC,OAAA,WAAA;AACA,OAAA,eAAA;;CAKV,MAAM,KAAK,QAAqB,YAA6C;EAC3E,MAAM,SAAS,MAAM,KAAK,SAAS,IAAI,QAAQ,WAAW;AAC1D,SAAO,KAAK,aAAa,MAAM,OAAO;;;;;;;AAQ1C,IAAa,oBAAb,cAAuC,iBAAiB;CACtD,YAAY,OAA0B;AACpC,SAAO;AADW,OAAA,QAAA;;CAIpB,MAAM,KACJ,QACA,YACqB;AAErB,SAAO,EAAE,WAAU,MADS,KAAK,MAAM,KAAK,QAAQ,WAAW,EAC9B,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":[],"sources":["../../../src/experimental/plan_and_execute/base.ts"],"sourcesContent":["import { BaseOutputParser } from \"@langchain/core/output_parsers\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { CallbackManager } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\n\n/**\n * Represents an action to be performed in a step.\n */\nexport type StepAction = {\n text: string;\n};\n\n/**\n * Represents the result of a step.\n */\nexport type StepResult = {\n response: string;\n};\n\n/**\n * Represents a step, which includes an action and its result.\n */\nexport type Step = {\n action: StepAction;\n result: StepResult;\n};\n\n/**\n * Represents a plan, which is a sequence of step actions.\n */\nexport type Plan = {\n steps: StepAction[];\n};\n\n/**\n * Abstract class that defines the structure for a planner. Planners are\n * responsible for generating a plan based on inputs.\n */\nexport abstract class BasePlanner {\n abstract plan(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<Plan>;\n}\n\n/**\n * Abstract class that defines the structure for a step executor. Step\n * executors are responsible for executing a step based on inputs.\n */\nexport abstract class BaseStepExecutor {\n abstract step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult>;\n}\n\n/**\n * Abstract class that defines the structure for a step container. Step\n * containers are responsible for managing steps.\n */\nexport abstract class BaseStepContainer {\n abstract addStep(action: StepAction, result: StepResult): void;\n\n abstract getSteps(): Step[];\n\n abstract getFinalResponse(): string;\n}\n\n/**\n * Class that extends BaseStepContainer and provides an implementation for\n * its methods. It maintains a list of steps and provides methods to add a\n * step, get all steps, and get the final response.\n */\nexport class ListStepContainer extends BaseStepContainer {\n private steps: Step[] = [];\n\n addStep(action: StepAction, result: StepResult) {\n this.steps.push({ action, result });\n }\n\n getSteps() {\n return this.steps;\n }\n\n getFinalResponse(): string {\n return this.steps[this.steps.length - 1]?.result?.response;\n }\n}\n\n/**\n * Class that extends BasePlanner and provides an implementation for the\n * plan method. It uses an instance of LLMChain and an output parser to\n * generate a plan.\n */\nexport class LLMPlanner extends BasePlanner {\n constructor(\n private llmChain: LLMChain,\n private outputParser: BaseOutputParser<Plan>\n ) {\n super();\n }\n\n async plan(inputs: ChainValues, runManager?: CallbackManager): Promise<Plan> {\n const output = await this.llmChain.run(inputs, runManager);\n return this.outputParser.parse(output);\n }\n}\n\n/**\n * Class that extends BaseStepExecutor and provides an implementation for\n * the step method. It uses an instance of BaseChain to execute a step.\n */\nexport class ChainStepExecutor extends BaseStepExecutor {\n constructor(private chain: BaseChain) {\n super();\n }\n\n async step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult> {\n const chainResponse = await this.chain.call(inputs, runManager);\n return { response: chainResponse.output };\n }\n}\n"],"mappings":";;;;;AAuCA,IAAsB,cAAtB,MAAkC;;;;;AAWlC,IAAsB,mBAAtB,MAAuC;;;;;AAWvC,IAAsB,oBAAtB,MAAwC;;;;;;AAaxC,IAAa,oBAAb,cAAuC,kBAAkB;CACvD,QAAwB,EAAE;CAE1B,QAAQ,QAAoB,QAAoB;AAC9C,OAAK,MAAM,KAAK;GAAE;GAAQ;GAAQ,CAAC;;CAGrC,WAAW;AACT,SAAO,KAAK;;CAGd,mBAA2B;AACzB,SAAO,KAAK,MAAM,KAAK,MAAM,SAAS,IAAI,QAAQ;;;;;;;;AAStD,IAAa,aAAb,cAAgC,YAAY;CAC1C,YACE,UACA,cACA;AACA,SAAO;AAHC,OAAA,WAAA;AACA,OAAA,eAAA;;CAKV,MAAM,KAAK,QAAqB,YAA6C;EAC3E,MAAM,SAAS,MAAM,KAAK,SAAS,IAAI,QAAQ,WAAW;AAC1D,SAAO,KAAK,aAAa,MAAM,OAAO;;;;;;;AAQ1C,IAAa,oBAAb,cAAuC,iBAAiB;CACtD,YAAY,OAA0B;AACpC,SAAO;AADW,OAAA,QAAA;;CAIpB,MAAM,KACJ,QACA,YACqB;AAErB,SAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"base.js","names":[],"sources":["../../../src/experimental/plan_and_execute/base.ts"],"sourcesContent":["import { BaseOutputParser } from \"@langchain/core/output_parsers\";\nimport { ChainValues } from \"@langchain/core/utils/types\";\nimport { CallbackManager } from \"@langchain/core/callbacks/manager\";\nimport { BaseChain } from \"../../chains/base.js\";\nimport { LLMChain } from \"../../chains/llm_chain.js\";\n\n/**\n * Represents an action to be performed in a step.\n */\nexport type StepAction = {\n text: string;\n};\n\n/**\n * Represents the result of a step.\n */\nexport type StepResult = {\n response: string;\n};\n\n/**\n * Represents a step, which includes an action and its result.\n */\nexport type Step = {\n action: StepAction;\n result: StepResult;\n};\n\n/**\n * Represents a plan, which is a sequence of step actions.\n */\nexport type Plan = {\n steps: StepAction[];\n};\n\n/**\n * Abstract class that defines the structure for a planner. Planners are\n * responsible for generating a plan based on inputs.\n */\nexport abstract class BasePlanner {\n abstract plan(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<Plan>;\n}\n\n/**\n * Abstract class that defines the structure for a step executor. Step\n * executors are responsible for executing a step based on inputs.\n */\nexport abstract class BaseStepExecutor {\n abstract step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult>;\n}\n\n/**\n * Abstract class that defines the structure for a step container. Step\n * containers are responsible for managing steps.\n */\nexport abstract class BaseStepContainer {\n abstract addStep(action: StepAction, result: StepResult): void;\n\n abstract getSteps(): Step[];\n\n abstract getFinalResponse(): string;\n}\n\n/**\n * Class that extends BaseStepContainer and provides an implementation for\n * its methods. It maintains a list of steps and provides methods to add a\n * step, get all steps, and get the final response.\n */\nexport class ListStepContainer extends BaseStepContainer {\n private steps: Step[] = [];\n\n addStep(action: StepAction, result: StepResult) {\n this.steps.push({ action, result });\n }\n\n getSteps() {\n return this.steps;\n }\n\n getFinalResponse(): string {\n return this.steps[this.steps.length - 1]?.result?.response;\n }\n}\n\n/**\n * Class that extends BasePlanner and provides an implementation for the\n * plan method. It uses an instance of LLMChain and an output parser to\n * generate a plan.\n */\nexport class LLMPlanner extends BasePlanner {\n constructor(\n private llmChain: LLMChain,\n private outputParser: BaseOutputParser<Plan>\n ) {\n super();\n }\n\n async plan(inputs: ChainValues, runManager?: CallbackManager): Promise<Plan> {\n const output = await this.llmChain.run(inputs, runManager);\n return this.outputParser.parse(output);\n }\n}\n\n/**\n * Class that extends BaseStepExecutor and provides an implementation for\n * the step method. It uses an instance of BaseChain to execute a step.\n */\nexport class ChainStepExecutor extends BaseStepExecutor {\n constructor(private chain: BaseChain) {\n super();\n }\n\n async step(\n inputs: ChainValues,\n runManager?: CallbackManager\n ): Promise<StepResult> {\n const chainResponse = await this.chain.call(inputs, runManager);\n return { response: chainResponse.output };\n }\n}\n"],"mappings":";;;;;AAuCA,IAAsB,cAAtB,MAAkC;;;;;AAWlC,IAAsB,mBAAtB,MAAuC;;;;;AAWvC,IAAsB,oBAAtB,MAAwC;;;;;;AAaxC,IAAa,oBAAb,cAAuC,kBAAkB;CACvD,QAAwB,EAAE;CAE1B,QAAQ,QAAoB,QAAoB;AAC9C,OAAK,MAAM,KAAK;GAAE;GAAQ;GAAQ,CAAC;;CAGrC,WAAW;AACT,SAAO,KAAK;;CAGd,mBAA2B;AACzB,SAAO,KAAK,MAAM,KAAK,MAAM,SAAS,IAAI,QAAQ;;;;;;;;AAStD,IAAa,aAAb,cAAgC,YAAY;CAC1C,YACE,UACA,cACA;AACA,SAAO;AAHC,OAAA,WAAA;AACA,OAAA,eAAA;;CAKV,MAAM,KAAK,QAAqB,YAA6C;EAC3E,MAAM,SAAS,MAAM,KAAK,SAAS,IAAI,QAAQ,WAAW;AAC1D,SAAO,KAAK,aAAa,MAAM,OAAO;;;;;;;AAQ1C,IAAa,oBAAb,cAAuC,iBAAiB;CACtD,YAAY,OAA0B;AACpC,SAAO;AADW,OAAA,QAAA;;CAIpB,MAAM,KACJ,QACA,YACqB;AAErB,SAAO,EAAE,WAAU,MADS,KAAK,MAAM,KAAK,QAAQ,WAAW,EAC9B,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlebars.cjs","names":["Handlebars","CustomFormatPromptTemplate"],"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 // oxlint-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 // oxlint-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,mBAAmB,aAA0C;CACxE,MAAM,SAA8B,EAAE;CACtC,MAAM,QAA4B,CAAC,GAAGA,WAAAA,QAAW,MAAM,SAAS,CAAC,KAAK;AACtE,QAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAK,SAAS,oBAAoB;GAEpC,MAAM,OAAO,KAAK;AAClB,UAAO,KAAK;IAAE,MAAM;IAAW;IAAM,CAAC;aAC7B,KAAK,SAAS,qBAAqB;GAE5C,MAAM,OAAe,KAAK,KAAK,MAAM;GAErC,MAAM,EAAE,aAAa,KAAK;AAC1B,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,kBAAkB;GAEzC,MAAM,OAAe,KAAK,MAAM;GAEhC,MAAM,EAAE,aAAa;AACrB,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,iBAEvB,OAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,KAAK;;AAIpD,QAAO;;AAGT,MAAa,yBACX,UACA,WACG;AAEH,QADiBA,WAAAA,QAAW,QAAQ,UAAU,EAAE,UAAU,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"handlebars.cjs","names":["Handlebars","CustomFormatPromptTemplate"],"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 // oxlint-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 // oxlint-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,mBAAmB,aAA0C;CACxE,MAAM,SAA8B,EAAE;CACtC,MAAM,QAA4B,CAAC,GAAGA,WAAAA,QAAW,MAAM,SAAS,CAAC,KAAK;AACtE,QAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAK,SAAS,oBAAoB;GAEpC,MAAM,OAAO,KAAK;AAClB,UAAO,KAAK;IAAE,MAAM;IAAW;IAAM,CAAC;aAC7B,KAAK,SAAS,qBAAqB;GAE5C,MAAM,OAAe,KAAK,KAAK,MAAM;GAErC,MAAM,EAAE,aAAa,KAAK;AAC1B,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,kBAAkB;GAEzC,MAAM,OAAe,KAAK,MAAM;GAEhC,MAAM,EAAE,aAAa;AACrB,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,iBAEvB,OAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,KAAK;;AAIpD,QAAO;;AAGT,MAAa,yBACX,UACA,WACG;AAEH,QADiBA,WAAAA,QAAW,QAAQ,UAAU,EAAE,UAAU,MAAM,CACjD,CAAC,OAAO;;AAMzB,IAAa,2BAAb,cAGUC,2CAAAA,2BAAqC;CAC7C,OAAO,UAAU;AACf,SAAO;;;;;CAMT,OAAO,aAIL,UACA,QAQA;AACA,SAAO,MAAM,aAAuB,UAAU;GAC5C,GAAG;GACH,kBAAkB;GAClB,cAAc;GACd,UAAU;GACX,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlebars.js","names":[],"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 // oxlint-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 // oxlint-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,mBAAmB,aAA0C;CACxE,MAAM,SAA8B,EAAE;CACtC,MAAM,QAA4B,CAAC,GAAG,WAAW,MAAM,SAAS,CAAC,KAAK;AACtE,QAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAK,SAAS,oBAAoB;GAEpC,MAAM,OAAO,KAAK;AAClB,UAAO,KAAK;IAAE,MAAM;IAAW;IAAM,CAAC;aAC7B,KAAK,SAAS,qBAAqB;GAE5C,MAAM,OAAe,KAAK,KAAK,MAAM;GAErC,MAAM,EAAE,aAAa,KAAK;AAC1B,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,kBAAkB;GAEzC,MAAM,OAAe,KAAK,MAAM;GAEhC,MAAM,EAAE,aAAa;AACrB,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,iBAEvB,OAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,KAAK;;AAIpD,QAAO;;AAGT,MAAa,yBACX,UACA,WACG;AAEH,QADiB,WAAW,QAAQ,UAAU,EAAE,UAAU,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"handlebars.js","names":[],"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 // oxlint-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 // oxlint-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,mBAAmB,aAA0C;CACxE,MAAM,SAA8B,EAAE;CACtC,MAAM,QAA4B,CAAC,GAAG,WAAW,MAAM,SAAS,CAAC,KAAK;AACtE,QAAO,MAAM,QAAQ;EACnB,MAAM,OAAO,MAAM,KAAK;AACxB,MAAI,KAAK,SAAS,oBAAoB;GAEpC,MAAM,OAAO,KAAK;AAClB,UAAO,KAAK;IAAE,MAAM;IAAW;IAAM,CAAC;aAC7B,KAAK,SAAS,qBAAqB;GAE5C,MAAM,OAAe,KAAK,KAAK,MAAM;GAErC,MAAM,EAAE,aAAa,KAAK;AAC1B,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,kBAAkB;GAEzC,MAAM,OAAe,KAAK,MAAM;GAEhC,MAAM,EAAE,aAAa;AACrB,OACE,CAAC,CAAC,QACF,CAAC,SAAS,WAAW,QAAQ,IAC7B,CAAC,SAAS,WAAW,IAAI,CAEzB,QAAO,KAAK;IAAE,MAAM;IAAY;IAAM,CAAC;aAEhC,KAAK,SAAS,iBAEvB,OAAM,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK,QAAQ,KAAK;;AAIpD,QAAO;;AAGT,MAAa,yBACX,UACA,WACG;AAEH,QADiB,WAAW,QAAQ,UAAU,EAAE,UAAU,MAAM,CACjD,CAAC,OAAO;;AAMzB,IAAa,2BAAb,cAGU,2BAAqC;CAC7C,OAAO,UAAU;AACf,SAAO;;;;;CAMT,OAAO,aAIL,UACA,QAQA;AACA,SAAO,MAAM,aAAuB,UAAU;GAC5C,GAAG;GACH,kBAAkB;GAClB,cAAc;GACd,UAAU;GACX,CAAC"}
|
package/dist/hub/base.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.cjs","names":[],"sources":["../../src/hub/base.ts"],"sourcesContent":["import type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport type { Runnable } from \"@langchain/core/runnables\";\n\nimport type { Client, ClientConfig } from \"langsmith\";\nimport type { PromptCommit } from \"langsmith/schemas\";\n\n/**\n * Push a prompt to the hub.\n * If the specified repo doesn't already exist, it will be created.\n * @param repoFullName The full name of the repo.\n * @param runnable The prompt to push.\n * @param options\n * @returns The URL of the newly pushed prompt in the hub.\n */\nexport async function basePush(\n repoFullName: string,\n runnable: Runnable,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n parentCommitHash?: string;\n /** @deprecated Use isPublic instead. */\n newRepoIsPublic?: boolean;\n isPublic?: boolean;\n /** @deprecated Use description instead. */\n newRepoDescription?: string;\n description?: string;\n readme?: string;\n tags?: string[];\n }\n): Promise<string> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n const payloadOptions = {\n object: runnable,\n parentCommitHash: options?.parentCommitHash,\n isPublic: options?.isPublic ?? options?.newRepoIsPublic,\n description: options?.description ?? options?.newRepoDescription,\n readme: options?.readme,\n tags: options?.tags,\n };\n return client.pushPrompt(repoFullName, payloadOptions);\n}\n\nexport async function basePull(\n ownerRepoCommit: string,\n options?: { apiKey?: string; apiUrl?: string; includeModel?: boolean }\n): Promise<PromptCommit> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n\n const promptObject = await client.pullPromptCommit(ownerRepoCommit, {\n includeModel: options?.includeModel,\n });\n\n if (promptObject.manifest.kwargs?.metadata === undefined) {\n promptObject.manifest.kwargs = {\n ...promptObject.manifest.kwargs,\n metadata: {},\n };\n }\n\n promptObject.manifest.kwargs.metadata = {\n ...promptObject.manifest.kwargs.metadata,\n lc_hub_owner: promptObject.owner,\n lc_hub_repo: promptObject.repo,\n lc_hub_commit_hash: promptObject.commit_hash,\n };\n\n // Some nested mustache prompts have improperly parsed variables that include a dot.\n if (promptObject.manifest.kwargs.template_format === \"mustache\") {\n const stripDotNotation = (varName: string) => varName.split(\".\")[0];\n\n const { input_variables } = promptObject.manifest.kwargs;\n if (Array.isArray(input_variables)) {\n promptObject.manifest.kwargs.input_variables =\n input_variables.map(stripDotNotation);\n }\n\n const { messages } = promptObject.manifest.kwargs;\n if (Array.isArray(messages)) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n promptObject.manifest.kwargs.messages = messages.map((message: any) => {\n const nestedVars = message?.kwargs?.prompt?.kwargs?.input_variables;\n if (Array.isArray(nestedVars)) {\n message.kwargs.prompt.kwargs.input_variables =\n nestedVars.map(stripDotNotation);\n }\n return message;\n });\n }\n }\n return promptObject;\n}\n\nexport function generateModelImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let importMapKey;\n if (modelLcName === \"ChatOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatAnthropic\") {\n importMapKey = \"chat_models__anthropic\";\n } else if (modelLcName === \"ChatAzureOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatVertexAI\") {\n importMapKey = \"chat_models__vertexai\";\n } else if (modelLcName === \"ChatGoogleGenerativeAI\") {\n importMapKey = \"chat_models__google_genai\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n importMapKey = \"chat_models__chat_bedrock_converse\";\n } else if (modelLcName === \"ChatMistral\") {\n importMapKey = \"chat_models__mistralai\";\n } else if (modelLcName === \"ChatFireworks\") {\n importMapKey = \"chat_models__fireworks\";\n } else if (modelLcName === \"ChatGroq\") {\n importMapKey = \"chat_models__groq\";\n } else {\n throw new Error(\"Received unsupported model class when pulling prompt.\");\n }\n modelImportMap[importMapKey] = {\n ...modelImportMap[importMapKey],\n [modelLcName]: modelClass,\n };\n }\n return modelImportMap;\n}\n\nexport function generateOptionalImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const optionalImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let optionalImportMapKey;\n if (modelLcName === \"ChatGoogleGenerativeAI\") {\n optionalImportMapKey = \"langchain_google_genai/chat_models\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n optionalImportMapKey = \"langchain_aws/chat_models\";\n } else if (modelLcName === \"ChatGroq\") {\n optionalImportMapKey = \"langchain_groq/chat_models\";\n }\n if (optionalImportMapKey !== undefined) {\n optionalImportMap[optionalImportMapKey] = {\n [modelLcName]: modelClass,\n };\n }\n }\n return optionalImportMap;\n}\n\nexport function bindOutputSchema<T extends Runnable>(loadedSequence: T) {\n if (\n \"first\" in loadedSequence &&\n loadedSequence.first !== null &&\n typeof loadedSequence.first === \"object\" &&\n \"schema\" in loadedSequence.first &&\n \"last\" in loadedSequence &&\n loadedSequence.last !== null &&\n typeof loadedSequence.last === \"object\"\n ) {\n if (\n \"bound\" in loadedSequence.last &&\n loadedSequence.last.bound !== null &&\n typeof loadedSequence.last.bound === \"object\" &&\n \"withStructuredOutput\" in loadedSequence.last.bound &&\n typeof loadedSequence.last.bound.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last.bound =\n loadedSequence.last.bound.withStructuredOutput(\n loadedSequence.first.schema\n );\n } else if (\n \"withStructuredOutput\" in loadedSequence.last &&\n typeof loadedSequence.last.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last = loadedSequence.last.withStructuredOutput(\n loadedSequence.first.schema\n );\n }\n }\n return loadedSequence;\n}\n\n/**\n * Dynamically load the LangSmith client.\n * @returns The LangSmith client.\n */\nasync function loadLangSmith(): Promise<new (config?: ClientConfig) => Client> {\n try {\n const { Client } = await import(\"langsmith\");\n return Client;\n } catch (error) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Error loading \"langsmith\" package, install it via \\`npm install langsmith\\` before you use this function.\\nError: ${errorMessage}`\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base.cjs","names":[],"sources":["../../src/hub/base.ts"],"sourcesContent":["import type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport type { Runnable } from \"@langchain/core/runnables\";\n\nimport type { Client, ClientConfig } from \"langsmith\";\nimport type { PromptCommit } from \"langsmith/schemas\";\n\n/**\n * Push a prompt to the hub.\n * If the specified repo doesn't already exist, it will be created.\n * @param repoFullName The full name of the repo.\n * @param runnable The prompt to push.\n * @param options\n * @returns The URL of the newly pushed prompt in the hub.\n */\nexport async function basePush(\n repoFullName: string,\n runnable: Runnable,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n parentCommitHash?: string;\n /** @deprecated Use isPublic instead. */\n newRepoIsPublic?: boolean;\n isPublic?: boolean;\n /** @deprecated Use description instead. */\n newRepoDescription?: string;\n description?: string;\n readme?: string;\n tags?: string[];\n }\n): Promise<string> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n const payloadOptions = {\n object: runnable,\n parentCommitHash: options?.parentCommitHash,\n isPublic: options?.isPublic ?? options?.newRepoIsPublic,\n description: options?.description ?? options?.newRepoDescription,\n readme: options?.readme,\n tags: options?.tags,\n };\n return client.pushPrompt(repoFullName, payloadOptions);\n}\n\nexport async function basePull(\n ownerRepoCommit: string,\n options?: { apiKey?: string; apiUrl?: string; includeModel?: boolean }\n): Promise<PromptCommit> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n\n const promptObject = await client.pullPromptCommit(ownerRepoCommit, {\n includeModel: options?.includeModel,\n });\n\n if (promptObject.manifest.kwargs?.metadata === undefined) {\n promptObject.manifest.kwargs = {\n ...promptObject.manifest.kwargs,\n metadata: {},\n };\n }\n\n promptObject.manifest.kwargs.metadata = {\n ...promptObject.manifest.kwargs.metadata,\n lc_hub_owner: promptObject.owner,\n lc_hub_repo: promptObject.repo,\n lc_hub_commit_hash: promptObject.commit_hash,\n };\n\n // Some nested mustache prompts have improperly parsed variables that include a dot.\n if (promptObject.manifest.kwargs.template_format === \"mustache\") {\n const stripDotNotation = (varName: string) => varName.split(\".\")[0];\n\n const { input_variables } = promptObject.manifest.kwargs;\n if (Array.isArray(input_variables)) {\n promptObject.manifest.kwargs.input_variables =\n input_variables.map(stripDotNotation);\n }\n\n const { messages } = promptObject.manifest.kwargs;\n if (Array.isArray(messages)) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n promptObject.manifest.kwargs.messages = messages.map((message: any) => {\n const nestedVars = message?.kwargs?.prompt?.kwargs?.input_variables;\n if (Array.isArray(nestedVars)) {\n message.kwargs.prompt.kwargs.input_variables =\n nestedVars.map(stripDotNotation);\n }\n return message;\n });\n }\n }\n return promptObject;\n}\n\nexport function generateModelImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let importMapKey;\n if (modelLcName === \"ChatOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatAnthropic\") {\n importMapKey = \"chat_models__anthropic\";\n } else if (modelLcName === \"ChatAzureOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatVertexAI\") {\n importMapKey = \"chat_models__vertexai\";\n } else if (modelLcName === \"ChatGoogleGenerativeAI\") {\n importMapKey = \"chat_models__google_genai\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n importMapKey = \"chat_models__chat_bedrock_converse\";\n } else if (modelLcName === \"ChatMistral\") {\n importMapKey = \"chat_models__mistralai\";\n } else if (modelLcName === \"ChatFireworks\") {\n importMapKey = \"chat_models__fireworks\";\n } else if (modelLcName === \"ChatGroq\") {\n importMapKey = \"chat_models__groq\";\n } else {\n throw new Error(\"Received unsupported model class when pulling prompt.\");\n }\n modelImportMap[importMapKey] = {\n ...modelImportMap[importMapKey],\n [modelLcName]: modelClass,\n };\n }\n return modelImportMap;\n}\n\nexport function generateOptionalImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const optionalImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let optionalImportMapKey;\n if (modelLcName === \"ChatGoogleGenerativeAI\") {\n optionalImportMapKey = \"langchain_google_genai/chat_models\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n optionalImportMapKey = \"langchain_aws/chat_models\";\n } else if (modelLcName === \"ChatGroq\") {\n optionalImportMapKey = \"langchain_groq/chat_models\";\n }\n if (optionalImportMapKey !== undefined) {\n optionalImportMap[optionalImportMapKey] = {\n [modelLcName]: modelClass,\n };\n }\n }\n return optionalImportMap;\n}\n\nexport function bindOutputSchema<T extends Runnable>(loadedSequence: T) {\n if (\n \"first\" in loadedSequence &&\n loadedSequence.first !== null &&\n typeof loadedSequence.first === \"object\" &&\n \"schema\" in loadedSequence.first &&\n \"last\" in loadedSequence &&\n loadedSequence.last !== null &&\n typeof loadedSequence.last === \"object\"\n ) {\n if (\n \"bound\" in loadedSequence.last &&\n loadedSequence.last.bound !== null &&\n typeof loadedSequence.last.bound === \"object\" &&\n \"withStructuredOutput\" in loadedSequence.last.bound &&\n typeof loadedSequence.last.bound.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last.bound =\n loadedSequence.last.bound.withStructuredOutput(\n loadedSequence.first.schema\n );\n } else if (\n \"withStructuredOutput\" in loadedSequence.last &&\n typeof loadedSequence.last.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last = loadedSequence.last.withStructuredOutput(\n loadedSequence.first.schema\n );\n }\n }\n return loadedSequence;\n}\n\n/**\n * Dynamically load the LangSmith client.\n * @returns The LangSmith client.\n */\nasync function loadLangSmith(): Promise<new (config?: ClientConfig) => Client> {\n try {\n const { Client } = await import(\"langsmith\");\n return Client;\n } catch (error) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Error loading \"langsmith\" package, install it via \\`npm install langsmith\\` before you use this function.\\nError: ${errorMessage}`\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/hub/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","names":[],"sources":["../../src/hub/base.ts"],"sourcesContent":["import type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport type { Runnable } from \"@langchain/core/runnables\";\n\nimport type { Client, ClientConfig } from \"langsmith\";\nimport type { PromptCommit } from \"langsmith/schemas\";\n\n/**\n * Push a prompt to the hub.\n * If the specified repo doesn't already exist, it will be created.\n * @param repoFullName The full name of the repo.\n * @param runnable The prompt to push.\n * @param options\n * @returns The URL of the newly pushed prompt in the hub.\n */\nexport async function basePush(\n repoFullName: string,\n runnable: Runnable,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n parentCommitHash?: string;\n /** @deprecated Use isPublic instead. */\n newRepoIsPublic?: boolean;\n isPublic?: boolean;\n /** @deprecated Use description instead. */\n newRepoDescription?: string;\n description?: string;\n readme?: string;\n tags?: string[];\n }\n): Promise<string> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n const payloadOptions = {\n object: runnable,\n parentCommitHash: options?.parentCommitHash,\n isPublic: options?.isPublic ?? options?.newRepoIsPublic,\n description: options?.description ?? options?.newRepoDescription,\n readme: options?.readme,\n tags: options?.tags,\n };\n return client.pushPrompt(repoFullName, payloadOptions);\n}\n\nexport async function basePull(\n ownerRepoCommit: string,\n options?: { apiKey?: string; apiUrl?: string; includeModel?: boolean }\n): Promise<PromptCommit> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n\n const promptObject = await client.pullPromptCommit(ownerRepoCommit, {\n includeModel: options?.includeModel,\n });\n\n if (promptObject.manifest.kwargs?.metadata === undefined) {\n promptObject.manifest.kwargs = {\n ...promptObject.manifest.kwargs,\n metadata: {},\n };\n }\n\n promptObject.manifest.kwargs.metadata = {\n ...promptObject.manifest.kwargs.metadata,\n lc_hub_owner: promptObject.owner,\n lc_hub_repo: promptObject.repo,\n lc_hub_commit_hash: promptObject.commit_hash,\n };\n\n // Some nested mustache prompts have improperly parsed variables that include a dot.\n if (promptObject.manifest.kwargs.template_format === \"mustache\") {\n const stripDotNotation = (varName: string) => varName.split(\".\")[0];\n\n const { input_variables } = promptObject.manifest.kwargs;\n if (Array.isArray(input_variables)) {\n promptObject.manifest.kwargs.input_variables =\n input_variables.map(stripDotNotation);\n }\n\n const { messages } = promptObject.manifest.kwargs;\n if (Array.isArray(messages)) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n promptObject.manifest.kwargs.messages = messages.map((message: any) => {\n const nestedVars = message?.kwargs?.prompt?.kwargs?.input_variables;\n if (Array.isArray(nestedVars)) {\n message.kwargs.prompt.kwargs.input_variables =\n nestedVars.map(stripDotNotation);\n }\n return message;\n });\n }\n }\n return promptObject;\n}\n\nexport function generateModelImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let importMapKey;\n if (modelLcName === \"ChatOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatAnthropic\") {\n importMapKey = \"chat_models__anthropic\";\n } else if (modelLcName === \"ChatAzureOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatVertexAI\") {\n importMapKey = \"chat_models__vertexai\";\n } else if (modelLcName === \"ChatGoogleGenerativeAI\") {\n importMapKey = \"chat_models__google_genai\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n importMapKey = \"chat_models__chat_bedrock_converse\";\n } else if (modelLcName === \"ChatMistral\") {\n importMapKey = \"chat_models__mistralai\";\n } else if (modelLcName === \"ChatFireworks\") {\n importMapKey = \"chat_models__fireworks\";\n } else if (modelLcName === \"ChatGroq\") {\n importMapKey = \"chat_models__groq\";\n } else {\n throw new Error(\"Received unsupported model class when pulling prompt.\");\n }\n modelImportMap[importMapKey] = {\n ...modelImportMap[importMapKey],\n [modelLcName]: modelClass,\n };\n }\n return modelImportMap;\n}\n\nexport function generateOptionalImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const optionalImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let optionalImportMapKey;\n if (modelLcName === \"ChatGoogleGenerativeAI\") {\n optionalImportMapKey = \"langchain_google_genai/chat_models\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n optionalImportMapKey = \"langchain_aws/chat_models\";\n } else if (modelLcName === \"ChatGroq\") {\n optionalImportMapKey = \"langchain_groq/chat_models\";\n }\n if (optionalImportMapKey !== undefined) {\n optionalImportMap[optionalImportMapKey] = {\n [modelLcName]: modelClass,\n };\n }\n }\n return optionalImportMap;\n}\n\nexport function bindOutputSchema<T extends Runnable>(loadedSequence: T) {\n if (\n \"first\" in loadedSequence &&\n loadedSequence.first !== null &&\n typeof loadedSequence.first === \"object\" &&\n \"schema\" in loadedSequence.first &&\n \"last\" in loadedSequence &&\n loadedSequence.last !== null &&\n typeof loadedSequence.last === \"object\"\n ) {\n if (\n \"bound\" in loadedSequence.last &&\n loadedSequence.last.bound !== null &&\n typeof loadedSequence.last.bound === \"object\" &&\n \"withStructuredOutput\" in loadedSequence.last.bound &&\n typeof loadedSequence.last.bound.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last.bound =\n loadedSequence.last.bound.withStructuredOutput(\n loadedSequence.first.schema\n );\n } else if (\n \"withStructuredOutput\" in loadedSequence.last &&\n typeof loadedSequence.last.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last = loadedSequence.last.withStructuredOutput(\n loadedSequence.first.schema\n );\n }\n }\n return loadedSequence;\n}\n\n/**\n * Dynamically load the LangSmith client.\n * @returns The LangSmith client.\n */\nasync function loadLangSmith(): Promise<new (config?: ClientConfig) => Client> {\n try {\n const { Client } = await import(\"langsmith\");\n return Client;\n } catch (error) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Error loading \"langsmith\" package, install it via \\`npm install langsmith\\` before you use this function.\\nError: ${errorMessage}`\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base.js","names":[],"sources":["../../src/hub/base.ts"],"sourcesContent":["import type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport type { Runnable } from \"@langchain/core/runnables\";\n\nimport type { Client, ClientConfig } from \"langsmith\";\nimport type { PromptCommit } from \"langsmith/schemas\";\n\n/**\n * Push a prompt to the hub.\n * If the specified repo doesn't already exist, it will be created.\n * @param repoFullName The full name of the repo.\n * @param runnable The prompt to push.\n * @param options\n * @returns The URL of the newly pushed prompt in the hub.\n */\nexport async function basePush(\n repoFullName: string,\n runnable: Runnable,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n parentCommitHash?: string;\n /** @deprecated Use isPublic instead. */\n newRepoIsPublic?: boolean;\n isPublic?: boolean;\n /** @deprecated Use description instead. */\n newRepoDescription?: string;\n description?: string;\n readme?: string;\n tags?: string[];\n }\n): Promise<string> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n const payloadOptions = {\n object: runnable,\n parentCommitHash: options?.parentCommitHash,\n isPublic: options?.isPublic ?? options?.newRepoIsPublic,\n description: options?.description ?? options?.newRepoDescription,\n readme: options?.readme,\n tags: options?.tags,\n };\n return client.pushPrompt(repoFullName, payloadOptions);\n}\n\nexport async function basePull(\n ownerRepoCommit: string,\n options?: { apiKey?: string; apiUrl?: string; includeModel?: boolean }\n): Promise<PromptCommit> {\n const Client = await loadLangSmith();\n const client = new Client(options);\n\n const promptObject = await client.pullPromptCommit(ownerRepoCommit, {\n includeModel: options?.includeModel,\n });\n\n if (promptObject.manifest.kwargs?.metadata === undefined) {\n promptObject.manifest.kwargs = {\n ...promptObject.manifest.kwargs,\n metadata: {},\n };\n }\n\n promptObject.manifest.kwargs.metadata = {\n ...promptObject.manifest.kwargs.metadata,\n lc_hub_owner: promptObject.owner,\n lc_hub_repo: promptObject.repo,\n lc_hub_commit_hash: promptObject.commit_hash,\n };\n\n // Some nested mustache prompts have improperly parsed variables that include a dot.\n if (promptObject.manifest.kwargs.template_format === \"mustache\") {\n const stripDotNotation = (varName: string) => varName.split(\".\")[0];\n\n const { input_variables } = promptObject.manifest.kwargs;\n if (Array.isArray(input_variables)) {\n promptObject.manifest.kwargs.input_variables =\n input_variables.map(stripDotNotation);\n }\n\n const { messages } = promptObject.manifest.kwargs;\n if (Array.isArray(messages)) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n promptObject.manifest.kwargs.messages = messages.map((message: any) => {\n const nestedVars = message?.kwargs?.prompt?.kwargs?.input_variables;\n if (Array.isArray(nestedVars)) {\n message.kwargs.prompt.kwargs.input_variables =\n nestedVars.map(stripDotNotation);\n }\n return message;\n });\n }\n }\n return promptObject;\n}\n\nexport function generateModelImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let importMapKey;\n if (modelLcName === \"ChatOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatAnthropic\") {\n importMapKey = \"chat_models__anthropic\";\n } else if (modelLcName === \"ChatAzureOpenAI\") {\n importMapKey = \"chat_models__openai\";\n } else if (modelLcName === \"ChatVertexAI\") {\n importMapKey = \"chat_models__vertexai\";\n } else if (modelLcName === \"ChatGoogleGenerativeAI\") {\n importMapKey = \"chat_models__google_genai\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n importMapKey = \"chat_models__chat_bedrock_converse\";\n } else if (modelLcName === \"ChatMistral\") {\n importMapKey = \"chat_models__mistralai\";\n } else if (modelLcName === \"ChatFireworks\") {\n importMapKey = \"chat_models__fireworks\";\n } else if (modelLcName === \"ChatGroq\") {\n importMapKey = \"chat_models__groq\";\n } else {\n throw new Error(\"Received unsupported model class when pulling prompt.\");\n }\n modelImportMap[importMapKey] = {\n ...modelImportMap[importMapKey],\n [modelLcName]: modelClass,\n };\n }\n return modelImportMap;\n}\n\nexport function generateOptionalImportMap(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel\n) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const optionalImportMap: Record<string, any> = {};\n if (modelClass !== undefined) {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const modelLcName = (modelClass as any)?.lc_name();\n let optionalImportMapKey;\n if (modelLcName === \"ChatGoogleGenerativeAI\") {\n optionalImportMapKey = \"langchain_google_genai/chat_models\";\n } else if (modelLcName === \"ChatBedrockConverse\") {\n optionalImportMapKey = \"langchain_aws/chat_models\";\n } else if (modelLcName === \"ChatGroq\") {\n optionalImportMapKey = \"langchain_groq/chat_models\";\n }\n if (optionalImportMapKey !== undefined) {\n optionalImportMap[optionalImportMapKey] = {\n [modelLcName]: modelClass,\n };\n }\n }\n return optionalImportMap;\n}\n\nexport function bindOutputSchema<T extends Runnable>(loadedSequence: T) {\n if (\n \"first\" in loadedSequence &&\n loadedSequence.first !== null &&\n typeof loadedSequence.first === \"object\" &&\n \"schema\" in loadedSequence.first &&\n \"last\" in loadedSequence &&\n loadedSequence.last !== null &&\n typeof loadedSequence.last === \"object\"\n ) {\n if (\n \"bound\" in loadedSequence.last &&\n loadedSequence.last.bound !== null &&\n typeof loadedSequence.last.bound === \"object\" &&\n \"withStructuredOutput\" in loadedSequence.last.bound &&\n typeof loadedSequence.last.bound.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last.bound =\n loadedSequence.last.bound.withStructuredOutput(\n loadedSequence.first.schema\n );\n } else if (\n \"withStructuredOutput\" in loadedSequence.last &&\n typeof loadedSequence.last.withStructuredOutput === \"function\"\n ) {\n loadedSequence.last = loadedSequence.last.withStructuredOutput(\n loadedSequence.first.schema\n );\n }\n }\n return loadedSequence;\n}\n\n/**\n * Dynamically load the LangSmith client.\n * @returns The LangSmith client.\n */\nasync function loadLangSmith(): Promise<new (config?: ClientConfig) => Client> {\n try {\n const { Client } = await import(\"langsmith\");\n return Client;\n } catch (error) {\n // oxlint-disable-next-line no-instanceof/no-instanceof\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Error loading \"langsmith\" package, install it via \\`npm install langsmith\\` before you use this function.\\nError: ${errorMessage}`\n );\n }\n}\n"],"mappings":"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"}
|
package/dist/hub/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["basePull","bindOutputSchema","load","generateOptionalImportMap","generateModelImportMap"],"sources":["../../src/hub/index.ts"],"sourcesContent":["import { Runnable } from \"@langchain/core/runnables\";\nimport type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport { load } from \"../load/index.js\";\nimport {\n basePush,\n basePull,\n generateModelImportMap,\n generateOptionalImportMap,\n bindOutputSchema,\n} from \"./base.js\";\n\nexport { basePush as push };\n\n/**\n * Pull a prompt from the hub.\n *\n * @param ownerRepoCommit The name of the repo containing the prompt, as well as an optional commit hash separated by a slash.\n * @param options.apiKey LangSmith API key to use when pulling the prompt\n * @param options.apiUrl LangSmith API URL to use when pulling the prompt\n * @param options.includeModel Whether to also instantiate and attach a model instance to the prompt,\n * if the prompt has associated model metadata. If set to true, invoking the resulting pulled prompt will\n * also invoke the instantiated model. For non-OpenAI models, you must also set \"modelClass\" to the\n * correct class of the model.\n * @param options.modelClass If includeModel is true, the class of the model to instantiate. Required\n * for non-OpenAI models. If you are running in Node or another environment that supports dynamic imports,\n * you may instead import this function from \"langchain/hub/node\" and pass \"includeModel: true\" instead\n * of specifying this parameter.\n * @param options.secrets A map of secrets to use when loading, e.g.\n * {'OPENAI_API_KEY': 'sk-...'}`.\n * If a secret is not found in the map, it will be loaded from the\n * environment if `secrets_from_env` is `True`. Should only be needed when\n * `includeModel` is `true`.\n * @param options.secretsFromEnv Whether to load secrets from environment variables.\n * Use with caution and only with trusted prompts.\n * @returns\n */\nexport async function pull<T extends Runnable>(\n ownerRepoCommit: string,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n includeModel?: boolean;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel;\n secrets?: Record<string, string>;\n secretsFromEnv?: boolean;\n }\n) {\n const promptObject = await basePull(ownerRepoCommit, options);\n try {\n const loadedPrompt = await load<T>(\n JSON.stringify(promptObject.manifest),\n options?.secrets,\n generateOptionalImportMap(options?.modelClass),\n generateModelImportMap(options?.modelClass),\n options?.secretsFromEnv\n );\n return bindOutputSchema(loadedPrompt);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (options?.includeModel) {\n throw new Error(\n [\n e.message,\n \"\",\n `To load prompts with an associated non-OpenAI model, you must use the \"langchain/hub/node\" entrypoint, or pass a \"modelClass\" parameter like this:`,\n \"\",\n \"```\",\n `import { pull } from \"langchain/hub\";`,\n `import { ChatAnthropic } from \"@langchain/anthropic\";`,\n \"\",\n `const prompt = await pull(\"my-prompt\", {`,\n ` includeModel: true,`,\n ` modelClass: ChatAnthropic,`,\n `});`,\n \"```\",\n ].join(\"\\n\")\n );\n } else {\n throw e;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,eAAsB,KACpB,iBACA,SASA;CACA,MAAM,eAAe,MAAMA,aAAAA,SAAS,iBAAiB,QAAQ;AAC7D,KAAI;AAQF,SAAOC,aAAAA,
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["basePull","bindOutputSchema","load","generateOptionalImportMap","generateModelImportMap"],"sources":["../../src/hub/index.ts"],"sourcesContent":["import { Runnable } from \"@langchain/core/runnables\";\nimport type { BaseLanguageModel } from \"@langchain/core/language_models/base\";\nimport { load } from \"../load/index.js\";\nimport {\n basePush,\n basePull,\n generateModelImportMap,\n generateOptionalImportMap,\n bindOutputSchema,\n} from \"./base.js\";\n\nexport { basePush as push };\n\n/**\n * Pull a prompt from the hub.\n *\n * @param ownerRepoCommit The name of the repo containing the prompt, as well as an optional commit hash separated by a slash.\n * @param options.apiKey LangSmith API key to use when pulling the prompt\n * @param options.apiUrl LangSmith API URL to use when pulling the prompt\n * @param options.includeModel Whether to also instantiate and attach a model instance to the prompt,\n * if the prompt has associated model metadata. If set to true, invoking the resulting pulled prompt will\n * also invoke the instantiated model. For non-OpenAI models, you must also set \"modelClass\" to the\n * correct class of the model.\n * @param options.modelClass If includeModel is true, the class of the model to instantiate. Required\n * for non-OpenAI models. If you are running in Node or another environment that supports dynamic imports,\n * you may instead import this function from \"langchain/hub/node\" and pass \"includeModel: true\" instead\n * of specifying this parameter.\n * @param options.secrets A map of secrets to use when loading, e.g.\n * {'OPENAI_API_KEY': 'sk-...'}`.\n * If a secret is not found in the map, it will be loaded from the\n * environment if `secrets_from_env` is `True`. Should only be needed when\n * `includeModel` is `true`.\n * @param options.secretsFromEnv Whether to load secrets from environment variables.\n * Use with caution and only with trusted prompts.\n * @returns\n */\nexport async function pull<T extends Runnable>(\n ownerRepoCommit: string,\n options?: {\n apiKey?: string;\n apiUrl?: string;\n includeModel?: boolean;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n modelClass?: new (...args: any[]) => BaseLanguageModel;\n secrets?: Record<string, string>;\n secretsFromEnv?: boolean;\n }\n) {\n const promptObject = await basePull(ownerRepoCommit, options);\n try {\n const loadedPrompt = await load<T>(\n JSON.stringify(promptObject.manifest),\n options?.secrets,\n generateOptionalImportMap(options?.modelClass),\n generateModelImportMap(options?.modelClass),\n options?.secretsFromEnv\n );\n return bindOutputSchema(loadedPrompt);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any) {\n if (options?.includeModel) {\n throw new Error(\n [\n e.message,\n \"\",\n `To load prompts with an associated non-OpenAI model, you must use the \"langchain/hub/node\" entrypoint, or pass a \"modelClass\" parameter like this:`,\n \"\",\n \"```\",\n `import { pull } from \"langchain/hub\";`,\n `import { ChatAnthropic } from \"@langchain/anthropic\";`,\n \"\",\n `const prompt = await pull(\"my-prompt\", {`,\n ` includeModel: true,`,\n ` modelClass: ChatAnthropic,`,\n `});`,\n \"```\",\n ].join(\"\\n\")\n );\n } else {\n throw e;\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,eAAsB,KACpB,iBACA,SASA;CACA,MAAM,eAAe,MAAMA,aAAAA,SAAS,iBAAiB,QAAQ;AAC7D,KAAI;AAQF,SAAOC,aAAAA,iBAAiB,MAPGC,mBAAAA,KACzB,KAAK,UAAU,aAAa,SAAS,EACrC,SAAS,SACTC,aAAAA,0BAA0B,SAAS,WAAW,EAC9CC,aAAAA,uBAAuB,SAAS,WAAW,EAC3C,SAAS,eACV,CACoC;UAE9B,GAAQ;AACf,MAAI,SAAS,aACX,OAAM,IAAI,MACR;GACE,EAAE;GACF;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC,KAAK,KAAK,CACb;MAED,OAAM"}
|