@langchain/classic 1.0.27 → 1.0.28
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 +13 -0
- package/dist/agents/agent.cjs.map +1 -1
- package/dist/agents/agent.js.map +1 -1
- package/dist/agents/executor.cjs.map +1 -1
- package/dist/agents/executor.js.map +1 -1
- package/dist/agents/openai_functions/index.cjs.map +1 -1
- package/dist/agents/openai_functions/index.d.cts.map +1 -1
- package/dist/agents/openai_functions/index.d.ts.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.d.cts +2 -2
- package/dist/agents/openai_tools/index.d.cts.map +1 -1
- package/dist/agents/openai_tools/index.d.ts +2 -2
- package/dist/agents/openai_tools/index.d.ts.map +1 -1
- package/dist/agents/openai_tools/index.js.map +1 -1
- package/dist/agents/react/index.d.cts +2 -2
- package/dist/agents/react/index.d.cts.map +1 -1
- package/dist/agents/react/index.d.ts +2 -2
- package/dist/agents/react/index.d.ts.map +1 -1
- package/dist/agents/structured_chat/index.d.cts +2 -2
- package/dist/agents/structured_chat/index.d.cts.map +1 -1
- package/dist/agents/structured_chat/index.d.ts +2 -2
- package/dist/agents/structured_chat/index.d.ts.map +1 -1
- package/dist/agents/tool_calling/index.d.cts +2 -2
- package/dist/agents/tool_calling/index.d.cts.map +1 -1
- package/dist/agents/tool_calling/index.d.ts +2 -2
- package/dist/agents/tool_calling/index.d.ts.map +1 -1
- package/dist/agents/tool_calling/output_parser.cjs.map +1 -1
- package/dist/agents/tool_calling/output_parser.d.cts.map +1 -1
- package/dist/agents/tool_calling/output_parser.js.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.cts +2 -2
- package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.cts.map +1 -1
- package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.ts +2 -2
- package/dist/agents/toolkits/conversational_retrieval/token_buffer_memory.d.ts.map +1 -1
- package/dist/agents/xml/index.d.cts.map +1 -1
- package/dist/agents/xml/index.d.ts.map +1 -1
- package/dist/cache/file_system.cjs.map +1 -1
- package/dist/cache/file_system.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/base.cjs.map +1 -1
- package/dist/chains/base.d.cts +2 -2
- package/dist/chains/base.d.cts.map +1 -1
- package/dist/chains/base.d.ts +2 -2
- package/dist/chains/base.d.ts.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.d.cts +2 -2
- package/dist/chains/combine_docs_chain.d.cts.map +1 -1
- package/dist/chains/combine_docs_chain.d.ts +2 -2
- package/dist/chains/combine_docs_chain.d.ts.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/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/llm_chain.cjs.map +1 -1
- package/dist/chains/llm_chain.js.map +1 -1
- package/dist/chains/load.d.cts +1 -2
- package/dist/chains/load.d.cts.map +1 -1
- package/dist/chains/load.d.ts +1 -2
- package/dist/chains/load.d.ts.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/openai_moderation.cjs.map +1 -1
- package/dist/chains/openai_moderation.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/question_answering/load.d.cts +1 -2
- package/dist/chains/question_answering/load.d.cts.map +1 -1
- package/dist/chains/question_answering/load.d.ts +1 -2
- package/dist/chains/question_answering/load.d.ts.map +1 -1
- package/dist/chains/retrieval.cjs.map +1 -1
- package/dist/chains/retrieval.js.map +1 -1
- package/dist/chains/retrieval_qa.cjs.map +1 -1
- package/dist/chains/retrieval_qa.js.map +1 -1
- package/dist/chains/router/utils.cjs.map +1 -1
- package/dist/chains/router/utils.js.map +1 -1
- package/dist/chains/summarization/load.d.cts +1 -2
- package/dist/chains/summarization/load.d.cts.map +1 -1
- package/dist/chains/summarization/load.d.ts +1 -2
- package/dist/chains/summarization/load.d.ts.map +1 -1
- package/dist/chains/vector_db_qa.cjs.map +1 -1
- package/dist/chains/vector_db_qa.js.map +1 -1
- package/dist/chat_models/universal.cjs +8 -10
- package/dist/chat_models/universal.cjs.map +1 -1
- package/dist/chat_models/universal.d.cts +3 -5
- package/dist/chat_models/universal.d.cts.map +1 -1
- package/dist/chat_models/universal.d.ts +3 -5
- package/dist/chat_models/universal.d.ts.map +1 -1
- package/dist/chat_models/universal.js +8 -10
- package/dist/chat_models/universal.js.map +1 -1
- package/dist/document_loaders/fs/directory.d.cts.map +1 -1
- package/dist/document_loaders/fs/directory.d.ts.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_transformers/openai_functions.d.cts.map +1 -1
- package/dist/evaluation/agents/index.d.cts +1 -0
- package/dist/evaluation/agents/trajectory.d.cts +2 -2
- package/dist/evaluation/agents/trajectory.d.cts.map +1 -1
- package/dist/evaluation/agents/trajectory.d.ts +2 -2
- package/dist/evaluation/agents/trajectory.d.ts.map +1 -1
- package/dist/evaluation/base.cjs.map +1 -1
- package/dist/evaluation/base.d.cts.map +1 -1
- package/dist/evaluation/base.js.map +1 -1
- package/dist/evaluation/comparison/index.d.cts +1 -0
- package/dist/evaluation/comparison/pairwise.cjs.map +1 -1
- package/dist/evaluation/comparison/pairwise.d.cts +3 -3
- package/dist/evaluation/comparison/pairwise.d.cts.map +1 -1
- package/dist/evaluation/comparison/pairwise.d.ts +3 -3
- package/dist/evaluation/comparison/pairwise.d.ts.map +1 -1
- package/dist/evaluation/comparison/pairwise.js.map +1 -1
- package/dist/evaluation/criteria/criteria.cjs.map +1 -1
- package/dist/evaluation/criteria/criteria.d.cts +3 -3
- package/dist/evaluation/criteria/criteria.d.cts.map +1 -1
- package/dist/evaluation/criteria/criteria.d.ts +3 -3
- package/dist/evaluation/criteria/criteria.d.ts.map +1 -1
- package/dist/evaluation/criteria/criteria.js.map +1 -1
- package/dist/evaluation/criteria/index.d.cts +1 -0
- package/dist/evaluation/embedding_distance/index.d.cts +1 -0
- package/dist/evaluation/loader.cjs.map +1 -1
- package/dist/evaluation/loader.d.cts.map +1 -1
- package/dist/evaluation/loader.js.map +1 -1
- package/dist/evaluation/qa/index.d.cts +1 -0
- package/dist/experimental/autogpt/prompt.d.cts +2 -2
- package/dist/experimental/autogpt/prompt.d.cts.map +1 -1
- package/dist/experimental/autogpt/prompt.d.ts +2 -2
- package/dist/experimental/autogpt/prompt.d.ts.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/autogpt/schema.cjs.map +1 -1
- package/dist/experimental/autogpt/schema.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/parser.cjs.map +1 -1
- package/dist/experimental/masking/parser.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.d.cts +3 -3
- package/dist/experimental/openai_assistant/index.d.ts +3 -3
- package/dist/experimental/openai_assistant/index.js.map +1 -1
- package/dist/experimental/openai_files/index.d.cts +4 -4
- package/dist/experimental/openai_files/index.d.ts +4 -4
- 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/prompts/custom_format.cjs.map +1 -1
- package/dist/experimental/prompts/custom_format.js.map +1 -1
- package/dist/experimental/prompts/handlebars.cjs.map +1 -1
- package/dist/experimental/prompts/handlebars.d.cts +2 -2
- package/dist/experimental/prompts/handlebars.d.cts.map +1 -1
- package/dist/experimental/prompts/handlebars.d.ts +2 -2
- package/dist/experimental/prompts/handlebars.d.ts.map +1 -1
- package/dist/experimental/prompts/handlebars.js.map +1 -1
- package/dist/hub/base.cjs.map +1 -1
- package/dist/hub/base.d.cts +0 -1
- package/dist/hub/base.d.cts.map +1 -1
- package/dist/hub/base.d.ts +0 -1
- package/dist/hub/base.d.ts.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/load/index.cjs.map +1 -1
- package/dist/load/index.js.map +1 -1
- package/dist/output_parsers/combining.cjs.map +1 -1
- package/dist/output_parsers/combining.js.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.cjs.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.d.cts.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.d.ts.map +1 -1
- package/dist/output_parsers/expression_type_handlers/base.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/openai_functions.d.cts.map +1 -1
- package/dist/output_parsers/openai_functions.d.ts.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/regex.cjs.map +1 -1
- package/dist/output_parsers/regex.js.map +1 -1
- package/dist/output_parsers/structured.d.cts +2 -2
- package/dist/output_parsers/structured.d.cts.map +1 -1
- package/dist/output_parsers/structured.d.ts +2 -2
- package/dist/output_parsers/structured.d.ts.map +1 -1
- package/dist/retrievers/document_compressors/index.cjs.map +1 -1
- package/dist/retrievers/document_compressors/index.js.map +1 -1
- package/dist/retrievers/matryoshka_retriever.cjs.map +1 -1
- package/dist/retrievers/matryoshka_retriever.d.cts +1 -1
- package/dist/retrievers/matryoshka_retriever.d.cts.map +1 -1
- package/dist/retrievers/matryoshka_retriever.d.ts +1 -1
- package/dist/retrievers/matryoshka_retriever.d.ts.map +1 -1
- package/dist/retrievers/matryoshka_retriever.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/parent_document.cjs.map +1 -1
- package/dist/retrievers/parent_document.js.map +1 -1
- package/dist/schema/prompt_template.d.cts +1 -2
- package/dist/schema/prompt_template.d.cts.map +1 -1
- package/dist/schema/prompt_template.d.ts +1 -2
- package/dist/schema/prompt_template.d.ts.map +1 -1
- package/dist/smith/config.cjs.map +1 -1
- package/dist/smith/config.d.cts +1 -1
- package/dist/smith/config.d.ts +1 -1
- package/dist/smith/config.d.ts.map +1 -1
- package/dist/smith/config.js.map +1 -1
- package/dist/smith/runner_utils.cjs.map +1 -1
- package/dist/smith/runner_utils.d.cts +1 -1
- package/dist/smith/runner_utils.d.cts.map +1 -1
- package/dist/smith/runner_utils.d.ts +1 -1
- package/dist/smith/runner_utils.d.ts.map +1 -1
- package/dist/smith/runner_utils.js.map +1 -1
- package/dist/sql_db.d.cts +2 -2
- package/dist/sql_db.d.cts.map +1 -1
- package/dist/sql_db.d.ts +2 -2
- package/dist/sql_db.d.ts.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/stores/doc/in_memory.cjs.map +1 -1
- package/dist/stores/doc/in_memory.js.map +1 -1
- package/dist/tools/json.cjs.map +1 -1
- package/dist/tools/json.js.map +1 -1
- package/dist/tools/webbrowser.cjs.map +1 -1
- package/dist/tools/webbrowser.d.cts.map +1 -1
- package/dist/tools/webbrowser.d.ts.map +1 -1
- package/dist/tools/webbrowser.js.map +1 -1
- package/dist/util/document.d.cts +1 -1
- package/dist/util/document.d.cts.map +1 -1
- package/dist/util/document.d.ts +1 -1
- package/dist/util/document.d.ts.map +1 -1
- package/dist/util/is-network-error/index.cjs.map +1 -1
- package/dist/util/is-network-error/index.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.d.cts +32 -32
- package/dist/util/openapi.d.cts.map +1 -1
- package/dist/util/openapi.d.ts +32 -32
- package/dist/util/openapi.d.ts.map +1 -1
- package/dist/util/openapi.js.map +1 -1
- package/dist/util/p-retry/index.cjs.map +1 -1
- package/dist/util/p-retry/index.js.map +1 -1
- package/dist/vectorstores/memory.cjs.map +1 -1
- package/dist/vectorstores/memory.js.map +1 -1
- package/package.json +25 -48
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/client.d.cts +0 -1494
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/client.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/client.d.ts +0 -1494
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/client.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/_runner.d.cts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/_runner.d.ts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/evaluate_comparative.d.cts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/evaluate_comparative.d.ts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/evaluator.d.cts +0 -66
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/evaluator.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/evaluator.d.ts +0 -66
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/evaluator.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/index.d.cts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/index.d.ts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/string_evaluator.d.cts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/evaluation/string_evaluator.d.ts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/index.d.cts +0 -4
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/index.d.ts +0 -4
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/run_trees.d.cts +0 -145
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/run_trees.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/run_trees.d.ts +0 -145
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/run_trees.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/schemas.d.cts +0 -437
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/schemas.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/schemas.d.ts +0 -437
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/schemas.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/traceable.d.cts +0 -7
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/traceable.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/traceable.d.ts +0 -7
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/traceable.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/types.d.cts +0 -38
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/types.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/types.d.ts +0 -38
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/singletons/types.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/async_caller.d.cts +0 -25
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/async_caller.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/async_caller.d.ts +0 -25
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/async_caller.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/p-queue.d.cts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/p-queue.d.ts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/prompt_cache/index.d.cts +0 -129
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/prompt_cache/index.d.cts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/prompt_cache/index.d.ts +0 -129
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/dist/utils/prompt_cache/index.d.ts.map +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/evaluation.d.cts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/evaluation.d.ts +0 -1
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/singletons/traceable.d.cts +0 -2
- package/dist/node_modules/.pnpm/langsmith@0.5.9_@opentelemetry_api@1.9.0_openai@6.22.0_ws@8.20.0_bufferutil@4.1.0__zod@4.3.6_/node_modules/langsmith/singletons/traceable.d.ts +0 -2
- package/dist/node_modules/.pnpm/p-queue@6.6.2/node_modules/p-queue/dist/index.d.cts +0 -1
- package/dist/node_modules/.pnpm/p-queue@6.6.2/node_modules/p-queue/dist/index.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.cjs","names":[],"sources":["../../../src/experimental/masking/parser.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { MaskingParserConfig } from \"./types.js\";\n\n/**\n * MaskingParser class for handling the masking and rehydrating of messages.\n */\nexport class MaskingParser {\n private transformers: MaskingTransformer[];\n\n private state: Map<string, string>;\n\n private config: MaskingParserConfig;\n\n constructor(config: MaskingParserConfig = {}) {\n this.transformers = config.transformers ?? [];\n this.state = new Map<string, string>();\n this.config = config;\n }\n\n /**\n * Adds a transformer to the parser.\n * @param transformer - An instance of a class extending MaskingTransformer.\n */\n addTransformer(transformer: MaskingTransformer) {\n this.transformers.push(transformer);\n }\n\n /**\n * Getter method for retrieving the current state.\n * @returns The current state map.\n */\n public getState(): Map<string, string> {\n return this.state;\n }\n\n /**\n * Masks the provided message using the added transformers.\n * This method sequentially applies each transformer's masking logic to the message.\n * It utilizes a state map to track original values corresponding to their masked versions.\n *\n * @param message - The message to be masked.\n * @returns A masked version of the message.\n * @throws {TypeError} If the message is not a string.\n * @throws {Error} If no transformers are added.\n */\n async mask(message: string): Promise<string> {\n // If onMaskingStart is a function, handle it accordingly\n if (this.config.onMaskingStart) {\n await this.config.onMaskingStart(message);\n }\n\n // Check if there are any transformers added to the parser. If not, throw an error\n // as masking requires at least one transformer to apply its logic.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.mask Error: No transformers have been added. Please add at least one transformer before parsing.\"\n );\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.mask Error: The 'message' argument must be a string.\"\n );\n }\n\n // Initialize the variable to hold the progressively masked message.\n // It starts as the original message and gets transformed by each transformer.\n let processedMessage = message;\n\n // Iterate through each transformer and apply their transform method.\n for (const transformer of this.transformers) {\n // Transform the message and get the transformer's state changes, ensuring no direct mutation of the shared state.\n const [transformedMessage, transformerState] =\n await transformer.transform(processedMessage, new Map(this.state));\n\n // Update the processed message for subsequent transformers.\n processedMessage = transformedMessage;\n\n // Merge state changes from the transformer into the parser's state.\n // This accumulates all transformations' effects on the state.\n transformerState.forEach((value, key) => this.state.set(key, value));\n }\n\n // Handle onMaskingEnd callback\n if (this.config.onMaskingEnd) {\n await this.config.onMaskingEnd(processedMessage);\n }\n // Return the fully masked message after all transformers have been applied.\n return processedMessage;\n }\n\n /**\n * Rehydrates a masked message back to its original form.\n * This method sequentially applies the rehydration logic of each added transformer in reverse order.\n * It relies on the state map to correctly map the masked values back to their original values.\n *\n * The rehydration process is essential for restoring the original content of a message\n * that has been transformed (masked) by the transformers. This process is the inverse of the masking process.\n *\n * @param message - The masked message to be rehydrated.\n * @returns The original (rehydrated) version of the message.\n */\n async rehydrate(\n message: string,\n state?: Map<string, string>\n ): Promise<string> {\n // Handle onRehydratingStart callback\n if (this.config.onRehydratingStart) {\n await this.config.onRehydratingStart(message);\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n // Check if any transformers have been added to the parser.\n // If no transformers are present, throw an error as rehydration requires at least one transformer.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.rehydrate Error: No transformers have been added. Please add at least one transformer before rehydrating.\"\n );\n }\n\n //
|
|
1
|
+
{"version":3,"file":"parser.cjs","names":[],"sources":["../../../src/experimental/masking/parser.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { MaskingParserConfig } from \"./types.js\";\n\n/**\n * MaskingParser class for handling the masking and rehydrating of messages.\n */\nexport class MaskingParser {\n private transformers: MaskingTransformer[];\n\n private state: Map<string, string>;\n\n private config: MaskingParserConfig;\n\n constructor(config: MaskingParserConfig = {}) {\n this.transformers = config.transformers ?? [];\n this.state = new Map<string, string>();\n this.config = config;\n }\n\n /**\n * Adds a transformer to the parser.\n * @param transformer - An instance of a class extending MaskingTransformer.\n */\n addTransformer(transformer: MaskingTransformer) {\n this.transformers.push(transformer);\n }\n\n /**\n * Getter method for retrieving the current state.\n * @returns The current state map.\n */\n public getState(): Map<string, string> {\n return this.state;\n }\n\n /**\n * Masks the provided message using the added transformers.\n * This method sequentially applies each transformer's masking logic to the message.\n * It utilizes a state map to track original values corresponding to their masked versions.\n *\n * @param message - The message to be masked.\n * @returns A masked version of the message.\n * @throws {TypeError} If the message is not a string.\n * @throws {Error} If no transformers are added.\n */\n async mask(message: string): Promise<string> {\n // If onMaskingStart is a function, handle it accordingly\n if (this.config.onMaskingStart) {\n await this.config.onMaskingStart(message);\n }\n\n // Check if there are any transformers added to the parser. If not, throw an error\n // as masking requires at least one transformer to apply its logic.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.mask Error: No transformers have been added. Please add at least one transformer before parsing.\"\n );\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.mask Error: The 'message' argument must be a string.\"\n );\n }\n\n // Initialize the variable to hold the progressively masked message.\n // It starts as the original message and gets transformed by each transformer.\n let processedMessage = message;\n\n // Iterate through each transformer and apply their transform method.\n for (const transformer of this.transformers) {\n // Transform the message and get the transformer's state changes, ensuring no direct mutation of the shared state.\n const [transformedMessage, transformerState] =\n await transformer.transform(processedMessage, new Map(this.state));\n\n // Update the processed message for subsequent transformers.\n processedMessage = transformedMessage;\n\n // Merge state changes from the transformer into the parser's state.\n // This accumulates all transformations' effects on the state.\n transformerState.forEach((value, key) => this.state.set(key, value));\n }\n\n // Handle onMaskingEnd callback\n if (this.config.onMaskingEnd) {\n await this.config.onMaskingEnd(processedMessage);\n }\n // Return the fully masked message after all transformers have been applied.\n return processedMessage;\n }\n\n /**\n * Rehydrates a masked message back to its original form.\n * This method sequentially applies the rehydration logic of each added transformer in reverse order.\n * It relies on the state map to correctly map the masked values back to their original values.\n *\n * The rehydration process is essential for restoring the original content of a message\n * that has been transformed (masked) by the transformers. This process is the inverse of the masking process.\n *\n * @param message - The masked message to be rehydrated.\n * @returns The original (rehydrated) version of the message.\n */\n async rehydrate(\n message: string,\n state?: Map<string, string>\n ): Promise<string> {\n // Handle onRehydratingStart callback\n if (this.config.onRehydratingStart) {\n await this.config.onRehydratingStart(message);\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n // Check if any transformers have been added to the parser.\n // If no transformers are present, throw an error as rehydration requires at least one transformer.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.rehydrate Error: No transformers have been added. Please add at least one transformer before rehydrating.\"\n );\n }\n\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (state && !(state instanceof Map)) {\n throw new TypeError(\n \"MaskingParser.rehydrate Error: The 'state' argument, if provided, must be an instance of Map.\"\n );\n }\n\n const rehydrationState = state || this.state; // Use provided state or fallback to internal state\n // Initialize the rehydratedMessage with the input masked message.\n // This variable will undergo rehydration by each transformer in reverse order.\n let rehydratedMessage = message;\n // Use a reverse for...of loop to accommodate asynchronous rehydrate methods\n const reversedTransformers = this.transformers.slice().reverse();\n for (const transformer of reversedTransformers) {\n // Check if the result is a Promise and use await, otherwise use it directly\n rehydratedMessage = await transformer.rehydrate(\n rehydratedMessage,\n rehydrationState\n );\n }\n\n // Handle onRehydratingEnd callback\n if (this.config.onRehydratingEnd) {\n await this.config.onRehydratingEnd(rehydratedMessage);\n }\n\n // Return the fully rehydrated message after all transformers have been applied.\n return rehydratedMessage;\n }\n}\n"],"mappings":";;;;AAMA,IAAa,gBAAb,MAA2B;CACzB;CAEA;CAEA;CAEA,YAAY,SAA8B,EAAE,EAAE;AAC5C,OAAK,eAAe,OAAO,gBAAgB,EAAE;AAC7C,OAAK,wBAAQ,IAAI,KAAqB;AACtC,OAAK,SAAS;;;;;;CAOhB,eAAe,aAAiC;AAC9C,OAAK,aAAa,KAAK,YAAY;;;;;;CAOrC,WAAuC;AACrC,SAAO,KAAK;;;;;;;;;;;;CAad,MAAM,KAAK,SAAkC;AAE3C,MAAI,KAAK,OAAO,eACd,OAAM,KAAK,OAAO,eAAe,QAAQ;AAK3C,MAAI,KAAK,aAAa,WAAW,EAC/B,OAAM,IAAI,MACR,iHACD;AAGH,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,qEACD;EAKH,IAAI,mBAAmB;AAGvB,OAAK,MAAM,eAAe,KAAK,cAAc;GAE3C,MAAM,CAAC,oBAAoB,oBACzB,MAAM,YAAY,UAAU,kBAAkB,IAAI,IAAI,KAAK,MAAM,CAAC;AAGpE,sBAAmB;AAInB,oBAAiB,SAAS,OAAO,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,CAAC;;AAItE,MAAI,KAAK,OAAO,aACd,OAAM,KAAK,OAAO,aAAa,iBAAiB;AAGlD,SAAO;;;;;;;;;;;;;CAcT,MAAM,UACJ,SACA,OACiB;AAEjB,MAAI,KAAK,OAAO,mBACd,OAAM,KAAK,OAAO,mBAAmB,QAAQ;AAG/C,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,0EACD;AAIH,MAAI,KAAK,aAAa,WAAW,EAC/B,OAAM,IAAI,MACR,0HACD;AAIH,MAAI,SAAS,EAAE,iBAAiB,KAC9B,OAAM,IAAI,UACR,gGACD;EAGH,MAAM,mBAAmB,SAAS,KAAK;EAGvC,IAAI,oBAAoB;EAExB,MAAM,uBAAuB,KAAK,aAAa,OAAO,CAAC,SAAS;AAChE,OAAK,MAAM,eAAe,qBAExB,qBAAoB,MAAM,YAAY,UACpC,mBACA,iBACD;AAIH,MAAI,KAAK,OAAO,iBACd,OAAM,KAAK,OAAO,iBAAiB,kBAAkB;AAIvD,SAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","names":[],"sources":["../../../src/experimental/masking/parser.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { MaskingParserConfig } from \"./types.js\";\n\n/**\n * MaskingParser class for handling the masking and rehydrating of messages.\n */\nexport class MaskingParser {\n private transformers: MaskingTransformer[];\n\n private state: Map<string, string>;\n\n private config: MaskingParserConfig;\n\n constructor(config: MaskingParserConfig = {}) {\n this.transformers = config.transformers ?? [];\n this.state = new Map<string, string>();\n this.config = config;\n }\n\n /**\n * Adds a transformer to the parser.\n * @param transformer - An instance of a class extending MaskingTransformer.\n */\n addTransformer(transformer: MaskingTransformer) {\n this.transformers.push(transformer);\n }\n\n /**\n * Getter method for retrieving the current state.\n * @returns The current state map.\n */\n public getState(): Map<string, string> {\n return this.state;\n }\n\n /**\n * Masks the provided message using the added transformers.\n * This method sequentially applies each transformer's masking logic to the message.\n * It utilizes a state map to track original values corresponding to their masked versions.\n *\n * @param message - The message to be masked.\n * @returns A masked version of the message.\n * @throws {TypeError} If the message is not a string.\n * @throws {Error} If no transformers are added.\n */\n async mask(message: string): Promise<string> {\n // If onMaskingStart is a function, handle it accordingly\n if (this.config.onMaskingStart) {\n await this.config.onMaskingStart(message);\n }\n\n // Check if there are any transformers added to the parser. If not, throw an error\n // as masking requires at least one transformer to apply its logic.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.mask Error: No transformers have been added. Please add at least one transformer before parsing.\"\n );\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.mask Error: The 'message' argument must be a string.\"\n );\n }\n\n // Initialize the variable to hold the progressively masked message.\n // It starts as the original message and gets transformed by each transformer.\n let processedMessage = message;\n\n // Iterate through each transformer and apply their transform method.\n for (const transformer of this.transformers) {\n // Transform the message and get the transformer's state changes, ensuring no direct mutation of the shared state.\n const [transformedMessage, transformerState] =\n await transformer.transform(processedMessage, new Map(this.state));\n\n // Update the processed message for subsequent transformers.\n processedMessage = transformedMessage;\n\n // Merge state changes from the transformer into the parser's state.\n // This accumulates all transformations' effects on the state.\n transformerState.forEach((value, key) => this.state.set(key, value));\n }\n\n // Handle onMaskingEnd callback\n if (this.config.onMaskingEnd) {\n await this.config.onMaskingEnd(processedMessage);\n }\n // Return the fully masked message after all transformers have been applied.\n return processedMessage;\n }\n\n /**\n * Rehydrates a masked message back to its original form.\n * This method sequentially applies the rehydration logic of each added transformer in reverse order.\n * It relies on the state map to correctly map the masked values back to their original values.\n *\n * The rehydration process is essential for restoring the original content of a message\n * that has been transformed (masked) by the transformers. This process is the inverse of the masking process.\n *\n * @param message - The masked message to be rehydrated.\n * @returns The original (rehydrated) version of the message.\n */\n async rehydrate(\n message: string,\n state?: Map<string, string>\n ): Promise<string> {\n // Handle onRehydratingStart callback\n if (this.config.onRehydratingStart) {\n await this.config.onRehydratingStart(message);\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n // Check if any transformers have been added to the parser.\n // If no transformers are present, throw an error as rehydration requires at least one transformer.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.rehydrate Error: No transformers have been added. Please add at least one transformer before rehydrating.\"\n );\n }\n\n //
|
|
1
|
+
{"version":3,"file":"parser.js","names":[],"sources":["../../../src/experimental/masking/parser.ts"],"sourcesContent":["import { MaskingTransformer } from \"./transformer.js\";\nimport type { MaskingParserConfig } from \"./types.js\";\n\n/**\n * MaskingParser class for handling the masking and rehydrating of messages.\n */\nexport class MaskingParser {\n private transformers: MaskingTransformer[];\n\n private state: Map<string, string>;\n\n private config: MaskingParserConfig;\n\n constructor(config: MaskingParserConfig = {}) {\n this.transformers = config.transformers ?? [];\n this.state = new Map<string, string>();\n this.config = config;\n }\n\n /**\n * Adds a transformer to the parser.\n * @param transformer - An instance of a class extending MaskingTransformer.\n */\n addTransformer(transformer: MaskingTransformer) {\n this.transformers.push(transformer);\n }\n\n /**\n * Getter method for retrieving the current state.\n * @returns The current state map.\n */\n public getState(): Map<string, string> {\n return this.state;\n }\n\n /**\n * Masks the provided message using the added transformers.\n * This method sequentially applies each transformer's masking logic to the message.\n * It utilizes a state map to track original values corresponding to their masked versions.\n *\n * @param message - The message to be masked.\n * @returns A masked version of the message.\n * @throws {TypeError} If the message is not a string.\n * @throws {Error} If no transformers are added.\n */\n async mask(message: string): Promise<string> {\n // If onMaskingStart is a function, handle it accordingly\n if (this.config.onMaskingStart) {\n await this.config.onMaskingStart(message);\n }\n\n // Check if there are any transformers added to the parser. If not, throw an error\n // as masking requires at least one transformer to apply its logic.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.mask Error: No transformers have been added. Please add at least one transformer before parsing.\"\n );\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.mask Error: The 'message' argument must be a string.\"\n );\n }\n\n // Initialize the variable to hold the progressively masked message.\n // It starts as the original message and gets transformed by each transformer.\n let processedMessage = message;\n\n // Iterate through each transformer and apply their transform method.\n for (const transformer of this.transformers) {\n // Transform the message and get the transformer's state changes, ensuring no direct mutation of the shared state.\n const [transformedMessage, transformerState] =\n await transformer.transform(processedMessage, new Map(this.state));\n\n // Update the processed message for subsequent transformers.\n processedMessage = transformedMessage;\n\n // Merge state changes from the transformer into the parser's state.\n // This accumulates all transformations' effects on the state.\n transformerState.forEach((value, key) => this.state.set(key, value));\n }\n\n // Handle onMaskingEnd callback\n if (this.config.onMaskingEnd) {\n await this.config.onMaskingEnd(processedMessage);\n }\n // Return the fully masked message after all transformers have been applied.\n return processedMessage;\n }\n\n /**\n * Rehydrates a masked message back to its original form.\n * This method sequentially applies the rehydration logic of each added transformer in reverse order.\n * It relies on the state map to correctly map the masked values back to their original values.\n *\n * The rehydration process is essential for restoring the original content of a message\n * that has been transformed (masked) by the transformers. This process is the inverse of the masking process.\n *\n * @param message - The masked message to be rehydrated.\n * @returns The original (rehydrated) version of the message.\n */\n async rehydrate(\n message: string,\n state?: Map<string, string>\n ): Promise<string> {\n // Handle onRehydratingStart callback\n if (this.config.onRehydratingStart) {\n await this.config.onRehydratingStart(message);\n }\n\n if (typeof message !== \"string\") {\n throw new TypeError(\n \"MaskingParser.rehydrate Error: The 'message' argument must be a string.\"\n );\n }\n // Check if any transformers have been added to the parser.\n // If no transformers are present, throw an error as rehydration requires at least one transformer.\n if (this.transformers.length === 0) {\n throw new Error(\n \"MaskingParser.rehydrate Error: No transformers have been added. Please add at least one transformer before rehydrating.\"\n );\n }\n\n // oxlint-disable-next-line no-instanceof/no-instanceof\n if (state && !(state instanceof Map)) {\n throw new TypeError(\n \"MaskingParser.rehydrate Error: The 'state' argument, if provided, must be an instance of Map.\"\n );\n }\n\n const rehydrationState = state || this.state; // Use provided state or fallback to internal state\n // Initialize the rehydratedMessage with the input masked message.\n // This variable will undergo rehydration by each transformer in reverse order.\n let rehydratedMessage = message;\n // Use a reverse for...of loop to accommodate asynchronous rehydrate methods\n const reversedTransformers = this.transformers.slice().reverse();\n for (const transformer of reversedTransformers) {\n // Check if the result is a Promise and use await, otherwise use it directly\n rehydratedMessage = await transformer.rehydrate(\n rehydratedMessage,\n rehydrationState\n );\n }\n\n // Handle onRehydratingEnd callback\n if (this.config.onRehydratingEnd) {\n await this.config.onRehydratingEnd(rehydratedMessage);\n }\n\n // Return the fully rehydrated message after all transformers have been applied.\n return rehydratedMessage;\n }\n}\n"],"mappings":";;;;AAMA,IAAa,gBAAb,MAA2B;CACzB;CAEA;CAEA;CAEA,YAAY,SAA8B,EAAE,EAAE;AAC5C,OAAK,eAAe,OAAO,gBAAgB,EAAE;AAC7C,OAAK,wBAAQ,IAAI,KAAqB;AACtC,OAAK,SAAS;;;;;;CAOhB,eAAe,aAAiC;AAC9C,OAAK,aAAa,KAAK,YAAY;;;;;;CAOrC,WAAuC;AACrC,SAAO,KAAK;;;;;;;;;;;;CAad,MAAM,KAAK,SAAkC;AAE3C,MAAI,KAAK,OAAO,eACd,OAAM,KAAK,OAAO,eAAe,QAAQ;AAK3C,MAAI,KAAK,aAAa,WAAW,EAC/B,OAAM,IAAI,MACR,iHACD;AAGH,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,qEACD;EAKH,IAAI,mBAAmB;AAGvB,OAAK,MAAM,eAAe,KAAK,cAAc;GAE3C,MAAM,CAAC,oBAAoB,oBACzB,MAAM,YAAY,UAAU,kBAAkB,IAAI,IAAI,KAAK,MAAM,CAAC;AAGpE,sBAAmB;AAInB,oBAAiB,SAAS,OAAO,QAAQ,KAAK,MAAM,IAAI,KAAK,MAAM,CAAC;;AAItE,MAAI,KAAK,OAAO,aACd,OAAM,KAAK,OAAO,aAAa,iBAAiB;AAGlD,SAAO;;;;;;;;;;;;;CAcT,MAAM,UACJ,SACA,OACiB;AAEjB,MAAI,KAAK,OAAO,mBACd,OAAM,KAAK,OAAO,mBAAmB,QAAQ;AAG/C,MAAI,OAAO,YAAY,SACrB,OAAM,IAAI,UACR,0EACD;AAIH,MAAI,KAAK,aAAa,WAAW,EAC/B,OAAM,IAAI,MACR,0HACD;AAIH,MAAI,SAAS,EAAE,iBAAiB,KAC9B,OAAM,IAAI,UACR,gGACD;EAGH,MAAM,mBAAmB,SAAS,KAAK;EAGvC,IAAI,oBAAoB;EAExB,MAAM,uBAAuB,KAAK,aAAa,OAAO,CAAC,SAAS;AAChE,OAAK,MAAM,eAAe,qBAExB,qBAAoB,MAAM,YAAY,UACpC,mBACA,iBACD;AAIH,MAAI,KAAK,OAAO,iBACd,OAAM,KAAK,OAAO,iBAAiB,kBAAkB;AAIvD,SAAO"}
|
|
@@ -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 //
|
|
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,QACD;;;;;;;CAUH,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 //
|
|
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,QACD;;;;;;;CAUH,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// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RequiredActionFunctionToolCall = any;\n\ntype ExtractRunOutput<AsAgent extends boolean | undefined> =\n AsAgent extends true\n ? OpenAIAssistantFinish | OpenAIAssistantAction[]\n : ThreadMessage[] | RequiredActionFunctionToolCall[];\n\nexport type OpenAIAssistantRunnableInput<\n AsAgent extends boolean | undefined = undefined,\n> = {\n client?: OpenAIClient;\n clientOptions?: ClientOptions;\n assistantId: string;\n pollIntervalMs?: number;\n asAgent?: AsAgent;\n};\n\nexport class OpenAIAssistantRunnable<\n AsAgent extends boolean | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends Record<string, any> = Record<string, any>,\n> extends Runnable<RunInput, ExtractRunOutput<AsAgent>> {\n lc_namespace = [\"langchain\", \"experimental\", \"openai_assistant\"];\n\n private client: OpenAIClient;\n\n assistantId: string;\n\n pollIntervalMs = 1000;\n\n asAgent?: AsAgent;\n\n constructor(fields: OpenAIAssistantRunnableInput<AsAgent>) {\n super(fields);\n this.client = fields.client ?? new OpenAIClient(fields?.clientOptions);\n this.assistantId = fields.assistantId;\n this.asAgent = fields.asAgent ?? this.asAgent;\n }\n\n static async createAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n tools,\n client,\n clientOptions,\n asAgent,\n pollIntervalMs,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\"> & {\n model: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n tools?: OpenAIToolType | Array<StructuredTool>;\n fileIds?: string[];\n }) {\n const formattedTools =\n tools?.map((tool) => {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (tool instanceof StructuredTool) {\n return formatToOpenAIAssistantTool(tool);\n }\n return tool;\n }) ?? [];\n const oaiClient = client ?? new OpenAIClient(clientOptions);\n const assistant = await oaiClient.beta.assistants.create({\n name,\n instructions,\n tools: formattedTools,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n\n return new this({\n client: oaiClient,\n assistantId: assistant.id,\n asAgent,\n pollIntervalMs,\n });\n }\n\n async invoke(\n input: RunInput,\n _options?: RunnableConfig\n ): Promise<ExtractRunOutput<AsAgent>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run: any;\n if (this.asAgent && input.steps && input.steps.length > 0) {\n const parsedStepsInput = await this._parseStepsInput(input);\n run = await this.client.beta.threads.runs.submitToolOutputs(\n parsedStepsInput.runId,\n {\n thread_id: parsedStepsInput.threadId,\n tool_outputs: parsedStepsInput.toolOutputs,\n }\n );\n } else if (!(\"threadId\" in input)) {\n const thread = {\n messages: [\n {\n role: \"user\",\n content: input.content,\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n },\n ],\n metadata: input.threadMetadata,\n };\n run = await this._createThreadAndRun({\n ...input,\n thread,\n });\n } else if (!(\"runId\" in input)) {\n await this.client.beta.threads.messages.create(input.threadId, {\n content: input.content,\n role: \"user\",\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n run = await this._createRun(input);\n } else {\n // Submitting tool outputs to an existing run, outside the AgentExecutor\n // framework.\n run = await this.client.beta.threads.runs.submitToolOutputs(input.runId, {\n thread_id: input.threadId,\n tool_outputs: input.toolOutputs,\n });\n }\n\n return this._getResponse(run.id, run.thread_id);\n }\n\n /**\n * Delete an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/deleteAssistant}\n * @returns {Promise<AssistantDeleted>}\n */\n public async deleteAssistant() {\n return await this.client.beta.assistants.delete(this.assistantId);\n }\n\n /**\n * Retrieves an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/getAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async getAssistant() {\n return await this.client.beta.assistants.retrieve(this.assistantId);\n }\n\n /**\n * Modifies an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/modifyAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async modifyAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\" | \"tools\"> & {\n model?: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n fileIds?: string[];\n }) {\n return await this.client.beta.assistants.update(this.assistantId, {\n name,\n instructions,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n }\n\n private async _parseStepsInput(input: RunInput): Promise<RunInput> {\n const {\n action: { runId, threadId },\n } = input.steps[input.steps.length - 1];\n const run = await this._waitForRun(runId, threadId);\n const toolCalls = run.required_action?.submit_tool_outputs.tool_calls;\n if (!toolCalls) {\n return input;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toolOutputs = toolCalls.flatMap((toolCall: any) => {\n const matchedAction = (\n input.steps as {\n action: OpenAIAssistantAction;\n observation: string;\n }[]\n ).find((step) => step.action.toolCallId === toolCall.id);\n\n return matchedAction\n ? [\n {\n output: matchedAction.observation,\n tool_call_id: matchedAction.action.toolCallId,\n },\n ]\n : [];\n });\n return { toolOutputs, runId, threadId } as unknown as RunInput;\n }\n\n private async _createRun({\n instructions,\n model,\n tools,\n metadata,\n threadId,\n }: RunInput) {\n const run = this.client.beta.threads.runs.create(threadId, {\n assistant_id: this.assistantId,\n instructions,\n model,\n tools,\n metadata,\n });\n return run;\n }\n\n private async _createThreadAndRun(input: RunInput) {\n const params: Record<string, unknown> = [\n \"instructions\",\n \"model\",\n \"tools\",\n \"run_metadata\",\n ]\n .filter((key) => key in input)\n .reduce(\n (obj, key) => {\n const newObj = obj;\n newObj[key] = input[key];\n return newObj;\n },\n {} as Record<string, unknown>\n );\n const run = this.client.beta.threads.createAndRun({\n ...params,\n thread: input.thread,\n assistant_id: this.assistantId,\n });\n return run;\n }\n\n private async _waitForRun(runId: string, threadId: string) {\n let inProgress = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run = {} as any;\n while (inProgress) {\n run = await this.client.beta.threads.runs.retrieve(runId, {\n thread_id: threadId,\n });\n inProgress = [\"in_progress\", \"queued\"].includes(run.status);\n if (inProgress) {\n await sleep(this.pollIntervalMs);\n }\n }\n return run;\n }\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<ExtractRunOutput<AsAgent>>;\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<\n | OpenAIAssistantFinish\n | OpenAIAssistantAction[]\n | ThreadMessage[]\n | RequiredActionFunctionToolCall[]\n > {\n const run = await this._waitForRun(runId, threadId);\n if (run.status === \"completed\") {\n const messages = await this.client.beta.threads.messages.list(threadId, {\n order: \"desc\",\n });\n const newMessages = messages.data.filter((msg) => msg.run_id === runId);\n if (!this.asAgent) {\n return newMessages;\n }\n const answer = newMessages.flatMap((msg) => msg.content);\n if (answer.every((item) => item.type === \"text\")) {\n const answerString = answer\n .map((item) => item.type === \"text\" && item.text.value)\n .join(\"\\n\");\n return {\n returnValues: {\n output: answerString,\n runId,\n threadId,\n },\n log: \"\",\n runId,\n threadId,\n };\n }\n } else if (run.status === \"requires_action\") {\n if (!this.asAgent) {\n return run.required_action?.submit_tool_outputs.tool_calls ?? [];\n }\n const actions: OpenAIAssistantAction[] = [];\n run.required_action?.submit_tool_outputs.tool_calls.forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => {\n const functionCall = item.function;\n const args = JSON.parse(functionCall.arguments);\n actions.push({\n tool: functionCall.name,\n toolInput: args,\n toolCallId: item.id,\n log: \"\",\n runId,\n threadId,\n });\n }\n );\n return actions;\n }\n const runInfo = JSON.stringify(run, null, 2);\n throw new Error(\n `Unexpected run status ${run.status}.\\nFull run info:\\n\\n${runInfo}`\n );\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"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,aADM,MAAM,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;KACN;GACoB;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,CAAC;;CAIJ,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,CAAC;;CAIJ,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,eAHW,MAAM,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,KAAK;KAIT;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"}
|
|
@@ -47,7 +47,7 @@ declare class OpenAIAssistantRunnable<AsAgent extends boolean | undefined, RunIn
|
|
|
47
47
|
* @returns {Promise<AssistantDeleted>}
|
|
48
48
|
*/
|
|
49
49
|
deleteAssistant(): Promise<OpenAIClient.Beta.AssistantDeleted & {
|
|
50
|
-
_request_id?: string | null
|
|
50
|
+
_request_id?: string | null;
|
|
51
51
|
}>;
|
|
52
52
|
/**
|
|
53
53
|
* Retrieves an assistant.
|
|
@@ -56,7 +56,7 @@ declare class OpenAIAssistantRunnable<AsAgent extends boolean | undefined, RunIn
|
|
|
56
56
|
* @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}
|
|
57
57
|
*/
|
|
58
58
|
getAssistant(): Promise<OpenAIClient.Beta.Assistant & {
|
|
59
|
-
_request_id?: string | null
|
|
59
|
+
_request_id?: string | null;
|
|
60
60
|
}>;
|
|
61
61
|
/**
|
|
62
62
|
* Modifies an assistant.
|
|
@@ -75,7 +75,7 @@ declare class OpenAIAssistantRunnable<AsAgent extends boolean | undefined, RunIn
|
|
|
75
75
|
instructions?: string;
|
|
76
76
|
fileIds?: string[];
|
|
77
77
|
}): Promise<OpenAIClient.Beta.Assistant & {
|
|
78
|
-
_request_id?: string | null
|
|
78
|
+
_request_id?: string | null;
|
|
79
79
|
}>;
|
|
80
80
|
private _parseStepsInput;
|
|
81
81
|
private _createRun;
|
|
@@ -47,7 +47,7 @@ declare class OpenAIAssistantRunnable<AsAgent extends boolean | undefined, RunIn
|
|
|
47
47
|
* @returns {Promise<AssistantDeleted>}
|
|
48
48
|
*/
|
|
49
49
|
deleteAssistant(): Promise<OpenAIClient.Beta.AssistantDeleted & {
|
|
50
|
-
_request_id?: string | null
|
|
50
|
+
_request_id?: string | null;
|
|
51
51
|
}>;
|
|
52
52
|
/**
|
|
53
53
|
* Retrieves an assistant.
|
|
@@ -56,7 +56,7 @@ declare class OpenAIAssistantRunnable<AsAgent extends boolean | undefined, RunIn
|
|
|
56
56
|
* @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}
|
|
57
57
|
*/
|
|
58
58
|
getAssistant(): Promise<OpenAIClient.Beta.Assistant & {
|
|
59
|
-
_request_id?: string | null
|
|
59
|
+
_request_id?: string | null;
|
|
60
60
|
}>;
|
|
61
61
|
/**
|
|
62
62
|
* Modifies an assistant.
|
|
@@ -75,7 +75,7 @@ declare class OpenAIAssistantRunnable<AsAgent extends boolean | undefined, RunIn
|
|
|
75
75
|
instructions?: string;
|
|
76
76
|
fileIds?: string[];
|
|
77
77
|
}): Promise<OpenAIClient.Beta.Assistant & {
|
|
78
|
-
_request_id?: string | null
|
|
78
|
+
_request_id?: string | null;
|
|
79
79
|
}>;
|
|
80
80
|
private _parseStepsInput;
|
|
81
81
|
private _createRun;
|
|
@@ -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// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ThreadMessage = any;\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype RequiredActionFunctionToolCall = any;\n\ntype ExtractRunOutput<AsAgent extends boolean | undefined> =\n AsAgent extends true\n ? OpenAIAssistantFinish | OpenAIAssistantAction[]\n : ThreadMessage[] | RequiredActionFunctionToolCall[];\n\nexport type OpenAIAssistantRunnableInput<\n AsAgent extends boolean | undefined = undefined,\n> = {\n client?: OpenAIClient;\n clientOptions?: ClientOptions;\n assistantId: string;\n pollIntervalMs?: number;\n asAgent?: AsAgent;\n};\n\nexport class OpenAIAssistantRunnable<\n AsAgent extends boolean | undefined,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends Record<string, any> = Record<string, any>,\n> extends Runnable<RunInput, ExtractRunOutput<AsAgent>> {\n lc_namespace = [\"langchain\", \"experimental\", \"openai_assistant\"];\n\n private client: OpenAIClient;\n\n assistantId: string;\n\n pollIntervalMs = 1000;\n\n asAgent?: AsAgent;\n\n constructor(fields: OpenAIAssistantRunnableInput<AsAgent>) {\n super(fields);\n this.client = fields.client ?? new OpenAIClient(fields?.clientOptions);\n this.assistantId = fields.assistantId;\n this.asAgent = fields.asAgent ?? this.asAgent;\n }\n\n static async createAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n tools,\n client,\n clientOptions,\n asAgent,\n pollIntervalMs,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\"> & {\n model: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n tools?: OpenAIToolType | Array<StructuredTool>;\n fileIds?: string[];\n }) {\n const formattedTools =\n tools?.map((tool) => {\n // eslint-disable-next-line no-instanceof/no-instanceof\n if (tool instanceof StructuredTool) {\n return formatToOpenAIAssistantTool(tool);\n }\n return tool;\n }) ?? [];\n const oaiClient = client ?? new OpenAIClient(clientOptions);\n const assistant = await oaiClient.beta.assistants.create({\n name,\n instructions,\n tools: formattedTools,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n\n return new this({\n client: oaiClient,\n assistantId: assistant.id,\n asAgent,\n pollIntervalMs,\n });\n }\n\n async invoke(\n input: RunInput,\n _options?: RunnableConfig\n ): Promise<ExtractRunOutput<AsAgent>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run: any;\n if (this.asAgent && input.steps && input.steps.length > 0) {\n const parsedStepsInput = await this._parseStepsInput(input);\n run = await this.client.beta.threads.runs.submitToolOutputs(\n parsedStepsInput.runId,\n {\n thread_id: parsedStepsInput.threadId,\n tool_outputs: parsedStepsInput.toolOutputs,\n }\n );\n } else if (!(\"threadId\" in input)) {\n const thread = {\n messages: [\n {\n role: \"user\",\n content: input.content,\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n },\n ],\n metadata: input.threadMetadata,\n };\n run = await this._createThreadAndRun({\n ...input,\n thread,\n });\n } else if (!(\"runId\" in input)) {\n await this.client.beta.threads.messages.create(input.threadId, {\n content: input.content,\n role: \"user\",\n attachments: input.attachments,\n metadata: input.messagesMetadata,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n run = await this._createRun(input);\n } else {\n // Submitting tool outputs to an existing run, outside the AgentExecutor\n // framework.\n run = await this.client.beta.threads.runs.submitToolOutputs(input.runId, {\n thread_id: input.threadId,\n tool_outputs: input.toolOutputs,\n });\n }\n\n return this._getResponse(run.id, run.thread_id);\n }\n\n /**\n * Delete an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/deleteAssistant}\n * @returns {Promise<AssistantDeleted>}\n */\n public async deleteAssistant() {\n return await this.client.beta.assistants.delete(this.assistantId);\n }\n\n /**\n * Retrieves an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/getAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async getAssistant() {\n return await this.client.beta.assistants.retrieve(this.assistantId);\n }\n\n /**\n * Modifies an assistant.\n *\n * @link {https://platform.openai.com/docs/api-reference/assistants/modifyAssistant}\n * @returns {Promise<OpenAIClient.Beta.Assistants.Assistant>}\n */\n public async modifyAssistant<AsAgent extends boolean>({\n model,\n name,\n instructions,\n fileIds,\n }: Omit<OpenAIAssistantRunnableInput<AsAgent>, \"assistantId\" | \"tools\"> & {\n model?: OpenAIChatModelId;\n name?: string;\n instructions?: string;\n fileIds?: string[];\n }) {\n return await this.client.beta.assistants.update(this.assistantId, {\n name,\n instructions,\n model,\n file_ids: fileIds,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any);\n }\n\n private async _parseStepsInput(input: RunInput): Promise<RunInput> {\n const {\n action: { runId, threadId },\n } = input.steps[input.steps.length - 1];\n const run = await this._waitForRun(runId, threadId);\n const toolCalls = run.required_action?.submit_tool_outputs.tool_calls;\n if (!toolCalls) {\n return input;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toolOutputs = toolCalls.flatMap((toolCall: any) => {\n const matchedAction = (\n input.steps as {\n action: OpenAIAssistantAction;\n observation: string;\n }[]\n ).find((step) => step.action.toolCallId === toolCall.id);\n\n return matchedAction\n ? [\n {\n output: matchedAction.observation,\n tool_call_id: matchedAction.action.toolCallId,\n },\n ]\n : [];\n });\n return { toolOutputs, runId, threadId } as unknown as RunInput;\n }\n\n private async _createRun({\n instructions,\n model,\n tools,\n metadata,\n threadId,\n }: RunInput) {\n const run = this.client.beta.threads.runs.create(threadId, {\n assistant_id: this.assistantId,\n instructions,\n model,\n tools,\n metadata,\n });\n return run;\n }\n\n private async _createThreadAndRun(input: RunInput) {\n const params: Record<string, unknown> = [\n \"instructions\",\n \"model\",\n \"tools\",\n \"run_metadata\",\n ]\n .filter((key) => key in input)\n .reduce(\n (obj, key) => {\n const newObj = obj;\n newObj[key] = input[key];\n return newObj;\n },\n {} as Record<string, unknown>\n );\n const run = this.client.beta.threads.createAndRun({\n ...params,\n thread: input.thread,\n assistant_id: this.assistantId,\n });\n return run;\n }\n\n private async _waitForRun(runId: string, threadId: string) {\n let inProgress = true;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let run = {} as any;\n while (inProgress) {\n run = await this.client.beta.threads.runs.retrieve(runId, {\n thread_id: threadId,\n });\n inProgress = [\"in_progress\", \"queued\"].includes(run.status);\n if (inProgress) {\n await sleep(this.pollIntervalMs);\n }\n }\n return run;\n }\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<ExtractRunOutput<AsAgent>>;\n\n private async _getResponse(\n runId: string,\n threadId: string\n ): Promise<\n | OpenAIAssistantFinish\n | OpenAIAssistantAction[]\n | ThreadMessage[]\n | RequiredActionFunctionToolCall[]\n > {\n const run = await this._waitForRun(runId, threadId);\n if (run.status === \"completed\") {\n const messages = await this.client.beta.threads.messages.list(threadId, {\n order: \"desc\",\n });\n const newMessages = messages.data.filter((msg) => msg.run_id === runId);\n if (!this.asAgent) {\n return newMessages;\n }\n const answer = newMessages.flatMap((msg) => msg.content);\n if (answer.every((item) => item.type === \"text\")) {\n const answerString = answer\n .map((item) => item.type === \"text\" && item.text.value)\n .join(\"\\n\");\n return {\n returnValues: {\n output: answerString,\n runId,\n threadId,\n },\n log: \"\",\n runId,\n threadId,\n };\n }\n } else if (run.status === \"requires_action\") {\n if (!this.asAgent) {\n return run.required_action?.submit_tool_outputs.tool_calls ?? [];\n }\n const actions: OpenAIAssistantAction[] = [];\n run.required_action?.submit_tool_outputs.tool_calls.forEach(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => {\n const functionCall = item.function;\n const args = JSON.parse(functionCall.arguments);\n actions.push({\n tool: functionCall.name,\n toolInput: args,\n toolCallId: item.id,\n log: \"\",\n runId,\n threadId,\n });\n }\n );\n return actions;\n }\n const runInfo = JSON.stringify(run, null, 2);\n throw new Error(\n `Unexpected run status ${run.status}.\\nFull run info:\\n\\n${runInfo}`\n );\n }\n}\n\nexport function formatToOpenAIAssistantTool(\n tool: StructuredToolInterface\n): ToolDefinition {\n return {\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: isInteropZodSchema(tool.schema)\n ? toJsonSchema(tool.schema)\n : tool.schema,\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"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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"}
|
|
@@ -29,7 +29,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
29
29
|
}: OpenAIClient.FileCreateParams & {
|
|
30
30
|
options?: OpenAIClient.RequestOptions;
|
|
31
31
|
}): Promise<OpenAIClient.FileObject & {
|
|
32
|
-
_request_id?: string | null
|
|
32
|
+
_request_id?: string | null;
|
|
33
33
|
}>;
|
|
34
34
|
/**
|
|
35
35
|
* Delete a file.
|
|
@@ -46,7 +46,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
46
46
|
fileId: string;
|
|
47
47
|
options?: OpenAIClient.RequestOptions;
|
|
48
48
|
}): Promise<OpenAIClient.FileDeleted & {
|
|
49
|
-
_request_id?: string | null
|
|
49
|
+
_request_id?: string | null;
|
|
50
50
|
}>;
|
|
51
51
|
/**
|
|
52
52
|
* List files
|
|
@@ -77,7 +77,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
77
77
|
fileId: string;
|
|
78
78
|
options?: OpenAIClient.RequestOptions;
|
|
79
79
|
}): Promise<OpenAIClient.FileObject & {
|
|
80
|
-
_request_id?: string | null
|
|
80
|
+
_request_id?: string | null;
|
|
81
81
|
}>;
|
|
82
82
|
/**
|
|
83
83
|
* Retrieve file content
|
|
@@ -97,7 +97,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
97
97
|
fileId: string;
|
|
98
98
|
options?: OpenAIClient.RequestOptions;
|
|
99
99
|
}): Promise<OpenAIClient.FileObject & {
|
|
100
|
-
_request_id?: string | null
|
|
100
|
+
_request_id?: string | null;
|
|
101
101
|
}>;
|
|
102
102
|
}
|
|
103
103
|
//#endregion
|
|
@@ -29,7 +29,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
29
29
|
}: OpenAIClient.FileCreateParams & {
|
|
30
30
|
options?: OpenAIClient.RequestOptions;
|
|
31
31
|
}): Promise<OpenAIClient.FileObject & {
|
|
32
|
-
_request_id?: string | null
|
|
32
|
+
_request_id?: string | null;
|
|
33
33
|
}>;
|
|
34
34
|
/**
|
|
35
35
|
* Delete a file.
|
|
@@ -46,7 +46,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
46
46
|
fileId: string;
|
|
47
47
|
options?: OpenAIClient.RequestOptions;
|
|
48
48
|
}): Promise<OpenAIClient.FileDeleted & {
|
|
49
|
-
_request_id?: string | null
|
|
49
|
+
_request_id?: string | null;
|
|
50
50
|
}>;
|
|
51
51
|
/**
|
|
52
52
|
* List files
|
|
@@ -77,7 +77,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
77
77
|
fileId: string;
|
|
78
78
|
options?: OpenAIClient.RequestOptions;
|
|
79
79
|
}): Promise<OpenAIClient.FileObject & {
|
|
80
|
-
_request_id?: string | null
|
|
80
|
+
_request_id?: string | null;
|
|
81
81
|
}>;
|
|
82
82
|
/**
|
|
83
83
|
* Retrieve file content
|
|
@@ -97,7 +97,7 @@ declare class OpenAIFiles extends Serializable {
|
|
|
97
97
|
fileId: string;
|
|
98
98
|
options?: OpenAIClient.RequestOptions;
|
|
99
99
|
}): Promise<OpenAIClient.FileObject & {
|
|
100
|
-
_request_id?: string | null
|
|
100
|
+
_request_id?: string | null;
|
|
101
101
|
}>;
|
|
102
102
|
}
|
|
103
103
|
//#endregion
|
|
@@ -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 //
|
|
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,WAJa,IAAIC,kBAAAA,SAAS;GACnC;GACA,QAAQ,MAAMC,eAAAA,qBAAqB,MAAM;GAC1C,CAAC,EACqC,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,SAXiB,IAAI,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;IACD,CAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;IACD,CAAC;GACH,CAAC;;;CAKJ,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 //
|
|
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,WAJa,IAAI,SAAS;GACnC;GACA,QAAQ,MAAM,qBAAqB,MAAM;GAC1C,CAAC,EACqC,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,SAXiB,IAAI,4BAA4B;GAC/C,SAAS,MAAM,4BAA4B,kBAAkB;IAC3D;IACA;IACD,CAAC;GACF,cAAc,4BAA4B,uBAAuB;IAC/D;IACA;IACA;IACD,CAAC;GACH,CAAC;;;CAKJ,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":"custom_format.cjs","names":["PromptTemplate"],"sources":["../../../src/experimental/prompts/custom_format.ts"],"sourcesContent":["import type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n type ParsedFStringNode,\n PromptTemplate,\n type PromptTemplateInput,\n TypedPromptInputValues,\n} from \"@langchain/core/prompts\";\n\nexport type CustomFormatPromptTemplateInput<RunInput extends InputValues> =\n Omit<PromptTemplateInput<RunInput, string>, \"templateFormat\"> & {\n customParser: (template: string) => ParsedFStringNode[];\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n renderer: (template: string, values: InputValues) => string;\n };\n\nexport class CustomFormatPromptTemplate<\n //
|
|
1
|
+
{"version":3,"file":"custom_format.cjs","names":["PromptTemplate"],"sources":["../../../src/experimental/prompts/custom_format.ts"],"sourcesContent":["import type { InputValues } from \"@langchain/core/utils/types\";\nimport {\n type ParsedFStringNode,\n PromptTemplate,\n type PromptTemplateInput,\n TypedPromptInputValues,\n} from \"@langchain/core/prompts\";\n\nexport type CustomFormatPromptTemplateInput<RunInput extends InputValues> =\n Omit<PromptTemplateInput<RunInput, string>, \"templateFormat\"> & {\n customParser: (template: string) => ParsedFStringNode[];\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n renderer: (template: string, values: InputValues) => string;\n };\n\nexport class CustomFormatPromptTemplate<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = any,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n PartialVariableName extends string = any,\n> extends PromptTemplate<RunInput, PartialVariableName> {\n static lc_name() {\n return \"CustomPromptTemplate\";\n }\n\n lc_serializable = false;\n\n templateValidator?: (template: string, inputVariables: string[]) => boolean;\n\n renderer: (template: string, values: InputValues) => string;\n\n constructor(input: CustomFormatPromptTemplateInput<RunInput>) {\n super(input);\n Object.assign(this, input);\n\n if (this.validateTemplate && this.templateValidator !== undefined) {\n let totalInputVariables: string[] = this.inputVariables;\n if (this.partialVariables) {\n totalInputVariables = totalInputVariables.concat(\n Object.keys(this.partialVariables)\n );\n }\n if (typeof this.template === \"string\") {\n this.templateValidator(this.template, totalInputVariables);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n }\n\n /**\n * Load prompt template from a template\n */\n static fromTemplate<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunInput extends InputValues = Record<string, any>,\n >(\n template: string,\n {\n customParser,\n ...rest\n }: Omit<\n CustomFormatPromptTemplateInput<RunInput>,\n \"template\" | \"inputVariables\"\n >\n ) {\n const names = new Set<string>();\n const nodes = customParser(template);\n for (const node of nodes) {\n if (node.type === \"variable\") {\n names.add(node.name);\n }\n }\n return new this<RunInput extends Symbol ? never : RunInput>({\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n inputVariables: [...names] as any[],\n template,\n customParser,\n ...rest,\n });\n }\n\n /**\n * Formats the prompt template with the provided values.\n * @param values The values to be used to format the prompt template.\n * @returns A promise that resolves to a string which is the formatted prompt.\n */\n async format(values: TypedPromptInputValues<RunInput>): Promise<string> {\n const allValues = await this.mergePartialAndUserVariables(values);\n if (typeof this.template === \"string\") {\n return this.renderer(this.template, allValues);\n } else {\n throw new Error(\n `Must pass in string as template. Received: ${this.template}`\n );\n }\n }\n}\n"],"mappings":";;;;;AAeA,IAAa,6BAAb,cAKUA,wBAAAA,eAA8C;CACtD,OAAO,UAAU;AACf,SAAO;;CAGT,kBAAkB;CAElB;CAEA;CAEA,YAAY,OAAkD;AAC5D,QAAM,MAAM;AACZ,SAAO,OAAO,MAAM,MAAM;AAE1B,MAAI,KAAK,oBAAoB,KAAK,sBAAsB,KAAA,GAAW;GACjE,IAAI,sBAAgC,KAAK;AACzC,OAAI,KAAK,iBACP,uBAAsB,oBAAoB,OACxC,OAAO,KAAK,KAAK,iBAAiB,CACnC;AAEH,OAAI,OAAO,KAAK,aAAa,SAC3B,MAAK,kBAAkB,KAAK,UAAU,oBAAoB;OAE1D,OAAM,IAAI,MACR,8CAA8C,KAAK,WACpD;;;;;;CAQP,OAAO,aAIL,UACA,EACE,cACA,GAAG,QAKL;EACA,MAAM,wBAAQ,IAAI,KAAa;EAC/B,MAAM,QAAQ,aAAa,SAAS;AACpC,OAAK,MAAM,QAAQ,MACjB,KAAI,KAAK,SAAS,WAChB,OAAM,IAAI,KAAK,KAAK;AAGxB,SAAO,IAAI,KAAiD;GAE1D,gBAAgB,CAAC,GAAG,MAAM;GAC1B;GACA;GACA,GAAG;GACJ,CAAC;;;;;;;CAQJ,MAAM,OAAO,QAA2D;EACtE,MAAM,YAAY,MAAM,KAAK,6BAA6B,OAAO;AACjE,MAAI,OAAO,KAAK,aAAa,SAC3B,QAAO,KAAK,SAAS,KAAK,UAAU,UAAU;MAE9C,OAAM,IAAI,MACR,8CAA8C,KAAK,WACpD"}
|