From 9366e69d8889b62ebfc9d517e831fb44d0ce9e04 Mon Sep 17 00:00:00 2001 From: Timothy Carambat Date: Tue, 23 Jul 2024 16:35:37 -0700 Subject: [PATCH] Add AWS bedrock support for LLM + agents (#1935) add AWS bedrock support for LLM + agents --- README.md | 1 + docker/.env.example | 7 + .../AwsBedrockLLMOptions/index.jsx | 122 ++ .../AwsBedrockLLMOptions/regions.js | 204 ++++ frontend/src/hooks/useGetProvidersModels.js | 2 + frontend/src/media/llmprovider/bedrock.png | Bin 0 -> 57786 bytes .../GeneralSettings/LLMPreference/index.jsx | 16 + .../Steps/DataHandling/index.jsx | 8 + .../Steps/LLMPreference/index.jsx | 9 + .../AgentConfig/AgentLLMSelection/index.jsx | 1 + .../WorkspaceLLMSelection/index.jsx | 7 +- server/models/systemSettings.js | 6 + server/package.json | 3 +- server/utils/AiProviders/bedrock/index.js | 217 ++++ server/utils/agents/aibitat/index.js | 2 + .../agents/aibitat/providers/ai-provider.js | 11 + .../utils/agents/aibitat/providers/bedrock.js | 136 +++ .../utils/agents/aibitat/providers/index.js | 2 + server/utils/agents/index.js | 15 +- server/utils/helpers/index.js | 3 + server/utils/helpers/updateENV.js | 23 + server/yarn.lock | 1046 +++++++++++++++++ 22 files changed, 1838 insertions(+), 3 deletions(-) create mode 100644 frontend/src/components/LLMSelection/AwsBedrockLLMOptions/index.jsx create mode 100644 frontend/src/components/LLMSelection/AwsBedrockLLMOptions/regions.js create mode 100644 frontend/src/media/llmprovider/bedrock.png create mode 100644 server/utils/AiProviders/bedrock/index.js create mode 100644 server/utils/agents/aibitat/providers/bedrock.js diff --git a/README.md b/README.md index 38bbda9e..dad242a2 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ Some cool features of AnythingLLM - [OpenAI](https://openai.com) - [OpenAI (Generic)](https://openai.com) - [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service) +- [AWS Bedrock](https://aws.amazon.com/bedrock/) - [Anthropic](https://www.anthropic.com/) - [Google Gemini Pro](https://ai.google.dev/) - [Hugging Face (chat models)](https://huggingface.co/) diff --git a/docker/.env.example b/docker/.env.example index 38b98088..56be87cb 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -94,6 +94,13 @@ GID='1000' # COHERE_API_KEY= # COHERE_MODEL_PREF='command-r' +# LLM_PROVIDER='bedrock' +# AWS_BEDROCK_LLM_ACCESS_KEY_ID= +# AWS_BEDROCK_LLM_ACCESS_KEY= +# AWS_BEDROCK_LLM_REGION=us-west-2 +# AWS_BEDROCK_LLM_MODEL_PREFERENCE=meta.llama3-1-8b-instruct-v1:0 +# AWS_BEDROCK_LLM_MODEL_TOKEN_LIMIT=8191 + ########################################### ######## Embedding API SElECTION ########## ########################################### diff --git a/frontend/src/components/LLMSelection/AwsBedrockLLMOptions/index.jsx b/frontend/src/components/LLMSelection/AwsBedrockLLMOptions/index.jsx new file mode 100644 index 00000000..20686f2e --- /dev/null +++ b/frontend/src/components/LLMSelection/AwsBedrockLLMOptions/index.jsx @@ -0,0 +1,122 @@ +import { ArrowSquareOut, Info } from "@phosphor-icons/react"; +import { AWS_REGIONS } from "./regions"; + +export default function AwsBedrockLLMOptions({ settings }) { + return ( +
+ {!settings?.credentialsOnly && ( +
+
+ +

+ You should use a properly defined IAM user for inferencing. +
+ + Read more on how to use AWS Bedrock in AnythingLLM + + +

+
+
+ )} + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ {!settings?.credentialsOnly && ( + <> +
+ + +
+
+ + e.target.blur()} + defaultValue={settings?.AwsBedrockLLMTokenLimit} + required={true} + autoComplete="off" + /> +
+ + )} +
+
+ ); +} diff --git a/frontend/src/components/LLMSelection/AwsBedrockLLMOptions/regions.js b/frontend/src/components/LLMSelection/AwsBedrockLLMOptions/regions.js new file mode 100644 index 00000000..b490a07e --- /dev/null +++ b/frontend/src/components/LLMSelection/AwsBedrockLLMOptions/regions.js @@ -0,0 +1,204 @@ +export const AWS_REGIONS = [ + { + name: "N. Virginia", + full_name: "US East (N. Virginia)", + code: "us-east-1", + public: true, + zones: [ + "us-east-1a", + "us-east-1b", + "us-east-1c", + "us-east-1d", + "us-east-1e", + "us-east-1f", + ], + }, + { + name: "Ohio", + full_name: "US East (Ohio)", + code: "us-east-2", + public: true, + zones: ["us-east-2a", "us-east-2b", "us-east-2c"], + }, + { + name: "N. California", + full_name: "US West (N. California)", + code: "us-west-1", + public: true, + zone_limit: 2, + zones: ["us-west-1a", "us-west-1b", "us-west-1c"], + }, + { + name: "Oregon", + full_name: "US West (Oregon)", + code: "us-west-2", + public: true, + zones: ["us-west-2a", "us-west-2b", "us-west-2c", "us-west-2d"], + }, + { + name: "GovCloud West", + full_name: "AWS GovCloud (US)", + code: "us-gov-west-1", + public: false, + zones: ["us-gov-west-1a", "us-gov-west-1b", "us-gov-west-1c"], + }, + { + name: "GovCloud East", + full_name: "AWS GovCloud (US-East)", + code: "us-gov-east-1", + public: false, + zones: ["us-gov-east-1a", "us-gov-east-1b", "us-gov-east-1c"], + }, + { + name: "Canada", + full_name: "Canada (Central)", + code: "ca-central-1", + public: true, + zones: ["ca-central-1a", "ca-central-1b", "ca-central-1c", "ca-central-1d"], + }, + { + name: "Stockholm", + full_name: "EU (Stockholm)", + code: "eu-north-1", + public: true, + zones: ["eu-north-1a", "eu-north-1b", "eu-north-1c"], + }, + { + name: "Ireland", + full_name: "EU (Ireland)", + code: "eu-west-1", + public: true, + zones: ["eu-west-1a", "eu-west-1b", "eu-west-1c"], + }, + { + name: "London", + full_name: "EU (London)", + code: "eu-west-2", + public: true, + zones: ["eu-west-2a", "eu-west-2b", "eu-west-2c"], + }, + { + name: "Paris", + full_name: "EU (Paris)", + code: "eu-west-3", + public: true, + zones: ["eu-west-3a", "eu-west-3b", "eu-west-3c"], + }, + { + name: "Frankfurt", + full_name: "EU (Frankfurt)", + code: "eu-central-1", + public: true, + zones: ["eu-central-1a", "eu-central-1b", "eu-central-1c"], + }, + { + name: "Milan", + full_name: "EU (Milan)", + code: "eu-south-1", + public: true, + zones: ["eu-south-1a", "eu-south-1b", "eu-south-1c"], + }, + { + name: "Cape Town", + full_name: "Africa (Cape Town)", + code: "af-south-1", + public: true, + zones: ["af-south-1a", "af-south-1b", "af-south-1c"], + }, + { + name: "Tokyo", + full_name: "Asia Pacific (Tokyo)", + code: "ap-northeast-1", + public: true, + zone_limit: 3, + zones: [ + "ap-northeast-1a", + "ap-northeast-1b", + "ap-northeast-1c", + "ap-northeast-1d", + ], + }, + { + name: "Seoul", + full_name: "Asia Pacific (Seoul)", + code: "ap-northeast-2", + public: true, + zones: [ + "ap-northeast-2a", + "ap-northeast-2b", + "ap-northeast-2c", + "ap-northeast-2d", + ], + }, + { + name: "Osaka", + full_name: "Asia Pacific (Osaka-Local)", + code: "ap-northeast-3", + public: true, + zones: ["ap-northeast-3a", "ap-northeast-3b", "ap-northeast-3c"], + }, + { + name: "Singapore", + full_name: "Asia Pacific (Singapore)", + code: "ap-southeast-1", + public: true, + zones: ["ap-southeast-1a", "ap-southeast-1b", "ap-southeast-1c"], + }, + { + name: "Sydney", + full_name: "Asia Pacific (Sydney)", + code: "ap-southeast-2", + public: true, + zones: ["ap-southeast-2a", "ap-southeast-2b", "ap-southeast-2c"], + }, + { + name: "Jakarta", + full_name: "Asia Pacific (Jakarta)", + code: "ap-southeast-3", + public: true, + zones: ["ap-southeast-3a", "ap-southeast-3b", "ap-southeast-3c"], + }, + { + name: "Hong Kong", + full_name: "Asia Pacific (Hong Kong)", + code: "ap-east-1", + public: true, + zones: ["ap-east-1a", "ap-east-1b", "ap-east-1c"], + }, + { + name: "Mumbai", + full_name: "Asia Pacific (Mumbai)", + code: "ap-south-1", + public: true, + zones: ["ap-south-1a", "ap-south-1b", "ap-south-1c"], + }, + { + name: "São Paulo", + full_name: "South America (São Paulo)", + code: "sa-east-1", + public: true, + zone_limit: 2, + zones: ["sa-east-1a", "sa-east-1b", "sa-east-1c"], + }, + { + name: "Bahrain", + full_name: "Middle East (Bahrain)", + code: "me-south-1", + public: true, + zones: ["me-south-1a", "me-south-1b", "me-south-1c"], + }, + { + name: "Beijing", + full_name: "China (Beijing)", + code: "cn-north-1", + public: false, + zones: ["cn-north-1a", "cn-north-1b", "cn-north-1c"], + }, + { + name: "Ningxia", + full_name: "China (Ningxia)", + code: "cn-northwest-1", + public: false, + zones: ["cn-northwest-1a", "cn-northwest-1b", "cn-northwest-1c"], + }, +]; diff --git a/frontend/src/hooks/useGetProvidersModels.js b/frontend/src/hooks/useGetProvidersModels.js index 051c97ed..e118f5e7 100644 --- a/frontend/src/hooks/useGetProvidersModels.js +++ b/frontend/src/hooks/useGetProvidersModels.js @@ -8,6 +8,7 @@ export const DISABLED_PROVIDERS = [ "native", "textgenwebui", "generic-openai", + "bedrock", ]; const PROVIDER_DEFAULT_MODELS = { openai: [], @@ -48,6 +49,7 @@ const PROVIDER_DEFAULT_MODELS = { ], textgenwebui: [], "generic-openai": [], + bedrock: [], }; // For togetherAi, which has a large model list - we subgroup the options diff --git a/frontend/src/media/llmprovider/bedrock.png b/frontend/src/media/llmprovider/bedrock.png new file mode 100644 index 0000000000000000000000000000000000000000..58a74acb03a39713e9b712742196f565820d17b0 GIT binary patch literal 57786 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 R-+%xB002ovPDHLkV1lZ*?c@Le literal 0 HcmV?d00001 diff --git a/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx b/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx index 2baa0c6c..148409d6 100644 --- a/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx +++ b/frontend/src/pages/GeneralSettings/LLMPreference/index.jsx @@ -23,6 +23,8 @@ import KoboldCPPLogo from "@/media/llmprovider/koboldcpp.png"; import TextGenWebUILogo from "@/media/llmprovider/text-generation-webui.png"; import CohereLogo from "@/media/llmprovider/cohere.png"; import LiteLLMLogo from "@/media/llmprovider/litellm.png"; +import AWSBedrockLogo from "@/media/llmprovider/bedrock.png"; + import PreLoader from "@/components/Preloader"; import OpenAiOptions from "@/components/LLMSelection/OpenAiOptions"; import GenericOpenAiOptions from "@/components/LLMSelection/GenericOpenAiOptions"; @@ -43,6 +45,7 @@ import CohereAiOptions from "@/components/LLMSelection/CohereAiOptions"; import KoboldCPPOptions from "@/components/LLMSelection/KoboldCPPOptions"; import TextGenWebUIOptions from "@/components/LLMSelection/TextGenWebUIOptions"; import LiteLLMOptions from "@/components/LLMSelection/LiteLLMOptions"; +import AWSBedrockLLMOptions from "@/components/LLMSelection/AwsBedrockLLMOptions"; import LLMItem from "@/components/LLMSelection/LLMItem"; import { CaretUpDown, MagnifyingGlass, X } from "@phosphor-icons/react"; @@ -211,6 +214,19 @@ export const AVAILABLE_LLM_PROVIDERS = [ "GenericOpenAiKey", ], }, + { + name: "AWS Bedrock", + value: "bedrock", + logo: AWSBedrockLogo, + options: (settings) => , + description: "Run powerful foundation models privately with AWS Bedrock.", + requiredConfig: [ + "AwsBedrockLLMAccessKeyId", + "AwsBedrockLLMAccessKey", + "AwsBedrockLLMRegion", + "AwsBedrockLLMModel", + ], + }, { name: "Native", value: "native", diff --git a/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx index 1b3bf360..372a6523 100644 --- a/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx +++ b/frontend/src/pages/OnboardingFlow/Steps/DataHandling/index.jsx @@ -18,6 +18,7 @@ import GroqLogo from "@/media/llmprovider/groq.png"; import KoboldCPPLogo from "@/media/llmprovider/koboldcpp.png"; import TextGenWebUILogo from "@/media/llmprovider/text-generation-webui.png"; import LiteLLMLogo from "@/media/llmprovider/litellm.png"; +import AWSBedrockLogo from "@/media/llmprovider/bedrock.png"; import CohereLogo from "@/media/llmprovider/cohere.png"; import ZillizLogo from "@/media/vectordbs/zilliz.png"; @@ -179,6 +180,13 @@ export const LLM_SELECTION_PRIVACY = { ], logo: LiteLLMLogo, }, + bedrock: { + name: "AWS Bedrock", + description: [ + "You model and chat contents are subject to the agreed EULA for AWS and the model provider on aws.amazon.com", + ], + logo: AWSBedrockLogo, + }, }; export const VECTOR_DB_PRIVACY = { diff --git a/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx b/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx index 5d2ec337..aab02689 100644 --- a/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx +++ b/frontend/src/pages/OnboardingFlow/Steps/LLMPreference/index.jsx @@ -18,6 +18,7 @@ import GroqLogo from "@/media/llmprovider/groq.png"; import KoboldCPPLogo from "@/media/llmprovider/koboldcpp.png"; import TextGenWebUILogo from "@/media/llmprovider/text-generation-webui.png"; import LiteLLMLogo from "@/media/llmprovider/litellm.png"; +import AWSBedrockLogo from "@/media/llmprovider/bedrock.png"; import CohereLogo from "@/media/llmprovider/cohere.png"; import OpenAiOptions from "@/components/LLMSelection/OpenAiOptions"; @@ -39,6 +40,7 @@ import CohereAiOptions from "@/components/LLMSelection/CohereAiOptions"; import KoboldCPPOptions from "@/components/LLMSelection/KoboldCPPOptions"; import TextGenWebUIOptions from "@/components/LLMSelection/TextGenWebUIOptions"; import LiteLLMOptions from "@/components/LLMSelection/LiteLLMOptions"; +import AWSBedrockLLMOptions from "@/components/LLMSelection/AwsBedrockLLMOptions"; import LLMItem from "@/components/LLMSelection/LLMItem"; import System from "@/models/system"; @@ -182,6 +184,13 @@ const LLMS = [ description: "Connect to any OpenAi-compatible service via a custom configuration", }, + { + name: "AWS Bedrock", + value: "bedrock", + logo: AWSBedrockLogo, + options: (settings) => , + description: "Run powerful foundation models privately with AWS Bedrock.", + }, { name: "Native", value: "native", diff --git a/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx b/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx index 3e5ad64d..02c9a671 100644 --- a/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx +++ b/frontend/src/pages/WorkspaceSettings/AgentConfig/AgentLLMSelection/index.jsx @@ -21,6 +21,7 @@ const ENABLED_PROVIDERS = [ "perplexity", "textgenwebui", "generic-openai", + "bedrock", // TODO: More agent support. // "cohere", // Has tool calling and will need to build explicit support // "huggingface" // Can be done but already has issues with no-chat templated. Needs to be tested. diff --git a/frontend/src/pages/WorkspaceSettings/ChatSettings/WorkspaceLLMSelection/index.jsx b/frontend/src/pages/WorkspaceSettings/ChatSettings/WorkspaceLLMSelection/index.jsx index 72f17047..c1841929 100644 --- a/frontend/src/pages/WorkspaceSettings/ChatSettings/WorkspaceLLMSelection/index.jsx +++ b/frontend/src/pages/WorkspaceSettings/ChatSettings/WorkspaceLLMSelection/index.jsx @@ -10,7 +10,12 @@ import paths from "@/utils/paths"; // Some providers can only be associated with a single model. // In that case there is no selection to be made so we can just move on. -const NO_MODEL_SELECTION = ["default", "huggingface", "generic-openai"]; +const NO_MODEL_SELECTION = [ + "default", + "huggingface", + "generic-openai", + "bedrock", +]; const DISABLED_PROVIDERS = ["azure", "lmstudio", "native"]; const LLM_DEFAULT = { name: "System default", diff --git a/server/models/systemSettings.js b/server/models/systemSettings.js index cf5219d3..6f5b4238 100644 --- a/server/models/systemSettings.js +++ b/server/models/systemSettings.js @@ -465,6 +465,12 @@ const SystemSettings = { GenericOpenAiKey: !!process.env.GENERIC_OPEN_AI_API_KEY, GenericOpenAiMaxTokens: process.env.GENERIC_OPEN_AI_MAX_TOKENS, + AwsBedrockLLMAccessKeyId: !!process.env.AWS_BEDROCK_LLM_ACCESS_KEY_ID, + AwsBedrockLLMAccessKey: !!process.env.AWS_BEDROCK_LLM_ACCESS_KEY, + AwsBedrockLLMRegion: process.env.AWS_BEDROCK_LLM_REGION, + AwsBedrockLLMModel: process.env.AWS_BEDROCK_LLM_MODEL_PREFERENCE, + AwsBedrockLLMTokenLimit: process.env.AWS_BEDROCK_LLM_MODEL_TOKEN_LIMIT, + // Cohere API Keys CohereApiKey: !!process.env.COHERE_API_KEY, CohereModelPref: process.env.COHERE_MODEL_PREF, diff --git a/server/package.json b/server/package.json index 0b998240..8cd3d7aa 100644 --- a/server/package.json +++ b/server/package.json @@ -28,6 +28,7 @@ "@ladjs/graceful": "^3.2.2", "@lancedb/lancedb": "0.5.2", "@langchain/anthropic": "0.1.16", + "@langchain/aws": "^0.0.5", "@langchain/community": "0.0.53", "@langchain/core": "0.1.61", "@langchain/openai": "0.0.28", @@ -102,4 +103,4 @@ "nodemon": "^2.0.22", "prettier": "^3.0.3" } -} \ No newline at end of file +} diff --git a/server/utils/AiProviders/bedrock/index.js b/server/utils/AiProviders/bedrock/index.js new file mode 100644 index 00000000..2ea439ae --- /dev/null +++ b/server/utils/AiProviders/bedrock/index.js @@ -0,0 +1,217 @@ +const { StringOutputParser } = require("@langchain/core/output_parsers"); +const { + writeResponseChunk, + clientAbortedHandler, +} = require("../../helpers/chat/responses"); +const { NativeEmbedder } = require("../../EmbeddingEngines/native"); + +// Docs: https://js.langchain.com/v0.2/docs/integrations/chat/bedrock_converse +class AWSBedrockLLM { + constructor(embedder = null, modelPreference = null) { + if (!process.env.AWS_BEDROCK_LLM_ACCESS_KEY_ID) + throw new Error("No AWS Bedrock LLM profile id was set."); + + if (!process.env.AWS_BEDROCK_LLM_ACCESS_KEY) + throw new Error("No AWS Bedrock LLM access key was set."); + + if (!process.env.AWS_BEDROCK_LLM_REGION) + throw new Error("No AWS Bedrock LLM region was set."); + + this.model = + modelPreference || process.env.AWS_BEDROCK_LLM_MODEL_PREFERENCE; + this.limits = { + history: this.promptWindowLimit() * 0.15, + system: this.promptWindowLimit() * 0.15, + user: this.promptWindowLimit() * 0.7, + }; + + this.embedder = embedder ?? new NativeEmbedder(); + this.defaultTemp = 0.7; + } + + #bedrockClient({ temperature = 0.7 }) { + const { ChatBedrockConverse } = require("@langchain/aws"); + return new ChatBedrockConverse({ + model: process.env.AWS_BEDROCK_LLM_MODEL_PREFERENCE, + region: process.env.AWS_BEDROCK_LLM_REGION, + credentials: { + accessKeyId: process.env.AWS_BEDROCK_LLM_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_BEDROCK_LLM_ACCESS_KEY, + }, + temperature, + }); + } + + // For streaming we use Langchain's wrapper to handle weird chunks + // or otherwise absorb headaches that can arise from Ollama models + #convertToLangchainPrototypes(chats = []) { + const { + HumanMessage, + SystemMessage, + AIMessage, + } = require("@langchain/core/messages"); + const langchainChats = []; + const roleToMessageMap = { + system: SystemMessage, + user: HumanMessage, + assistant: AIMessage, + }; + + for (const chat of chats) { + if (!roleToMessageMap.hasOwnProperty(chat.role)) continue; + const MessageClass = roleToMessageMap[chat.role]; + langchainChats.push(new MessageClass({ content: chat.content })); + } + + return langchainChats; + } + + #appendContext(contextTexts = []) { + if (!contextTexts || !contextTexts.length) return ""; + return ( + "\nContext:\n" + + contextTexts + .map((text, i) => { + return `[CONTEXT ${i}]:\n${text}\n[END CONTEXT ${i}]\n\n`; + }) + .join("") + ); + } + + streamingEnabled() { + return "streamGetChatCompletion" in this; + } + + // Ensure the user set a value for the token limit + // and if undefined - assume 4096 window. + promptWindowLimit() { + const limit = process.env.AWS_BEDROCK_LLM_MODEL_TOKEN_LIMIT || 8191; + if (!limit || isNaN(Number(limit))) + throw new Error("No valid token context limit was set."); + return Number(limit); + } + + async isValidChatCompletionModel(_ = "") { + return true; + } + + constructPrompt({ + systemPrompt = "", + contextTexts = [], + chatHistory = [], + userPrompt = "", + }) { + // AWS Mistral models do not support system prompts + if (this.model.startsWith("mistral")) + return [...chatHistory, { role: "user", content: userPrompt }]; + + const prompt = { + role: "system", + content: `${systemPrompt}${this.#appendContext(contextTexts)}`, + }; + return [prompt, ...chatHistory, { role: "user", content: userPrompt }]; + } + + async getChatCompletion(messages = null, { temperature = 0.7 }) { + const model = this.#bedrockClient({ temperature }); + const textResponse = await model + .pipe(new StringOutputParser()) + .invoke(this.#convertToLangchainPrototypes(messages)) + .catch((e) => { + throw new Error( + `AWSBedrock::getChatCompletion failed to communicate with Ollama. ${e.message}` + ); + }); + + if (!textResponse || !textResponse.length) + throw new Error(`AWSBedrock::getChatCompletion text response was empty.`); + + return textResponse; + } + + async streamGetChatCompletion(messages = null, { temperature = 0.7 }) { + const model = this.#bedrockClient({ temperature }); + const stream = await model + .pipe(new StringOutputParser()) + .stream(this.#convertToLangchainPrototypes(messages)); + return stream; + } + + handleStream(response, stream, responseProps) { + const { uuid = uuidv4(), sources = [] } = responseProps; + + return new Promise(async (resolve) => { + let fullText = ""; + + // Establish listener to early-abort a streaming response + // in case things go sideways or the user does not like the response. + // We preserve the generated text but continue as if chat was completed + // to preserve previously generated content. + const handleAbort = () => clientAbortedHandler(resolve, fullText); + response.on("close", handleAbort); + + try { + for await (const chunk of stream) { + if (chunk === undefined) + throw new Error( + "Stream returned undefined chunk. Aborting reply - check model provider logs." + ); + + const content = chunk.hasOwnProperty("content") + ? chunk.content + : chunk; + fullText += content; + writeResponseChunk(response, { + uuid, + sources: [], + type: "textResponseChunk", + textResponse: content, + close: false, + error: false, + }); + } + + writeResponseChunk(response, { + uuid, + sources, + type: "textResponseChunk", + textResponse: "", + close: true, + error: false, + }); + response.removeListener("close", handleAbort); + resolve(fullText); + } catch (error) { + writeResponseChunk(response, { + uuid, + sources: [], + type: "textResponseChunk", + textResponse: "", + close: true, + error: `AWSBedrock:streaming - could not stream chat. ${ + error?.cause ?? error.message + }`, + }); + response.removeListener("close", handleAbort); + } + }); + } + + // Simple wrapper for dynamic embedder & normalize interface for all LLM implementations + async embedTextInput(textInput) { + return await this.embedder.embedTextInput(textInput); + } + async embedChunks(textChunks = []) { + return await this.embedder.embedChunks(textChunks); + } + + async compressMessages(promptArgs = {}, rawHistory = []) { + const { messageArrayCompressor } = require("../../helpers/chat"); + const messageArray = this.constructPrompt(promptArgs); + return await messageArrayCompressor(this, messageArray, rawHistory); + } +} + +module.exports = { + AWSBedrockLLM, +}; diff --git a/server/utils/agents/aibitat/index.js b/server/utils/agents/aibitat/index.js index 0fe6eb51..0d3aab1a 100644 --- a/server/utils/agents/aibitat/index.js +++ b/server/utils/agents/aibitat/index.js @@ -775,6 +775,8 @@ ${this.getHistory({ to: route.to }) return new Providers.PerplexityProvider({ model: config.model }); case "textgenwebui": return new Providers.TextWebGenUiProvider({}); + case "bedrock": + return new Providers.AWSBedrockProvider({}); default: throw new Error( diff --git a/server/utils/agents/aibitat/providers/ai-provider.js b/server/utils/agents/aibitat/providers/ai-provider.js index 483d43b3..472f72be 100644 --- a/server/utils/agents/aibitat/providers/ai-provider.js +++ b/server/utils/agents/aibitat/providers/ai-provider.js @@ -12,6 +12,7 @@ const { ChatOpenAI } = require("@langchain/openai"); const { ChatAnthropic } = require("@langchain/anthropic"); +const { ChatBedrockConverse } = require("@langchain/aws"); const { ChatOllama } = require("@langchain/community/chat_models/ollama"); const { toValidNumber } = require("../../../http"); @@ -113,6 +114,16 @@ class Provider { ), ...config, }); + case "bedrock": + return new ChatBedrockConverse({ + model: process.env.AWS_BEDROCK_LLM_MODEL_PREFERENCE, + region: process.env.AWS_BEDROCK_LLM_REGION, + credentials: { + accessKeyId: process.env.AWS_BEDROCK_LLM_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_BEDROCK_LLM_ACCESS_KEY, + }, + ...config, + }); // OSS Model Runners // case "anythingllm_ollama": diff --git a/server/utils/agents/aibitat/providers/bedrock.js b/server/utils/agents/aibitat/providers/bedrock.js new file mode 100644 index 00000000..819dfc40 --- /dev/null +++ b/server/utils/agents/aibitat/providers/bedrock.js @@ -0,0 +1,136 @@ +const Provider = require("./ai-provider.js"); +const InheritMultiple = require("./helpers/classes.js"); +const UnTooled = require("./helpers/untooled.js"); +const { ChatBedrockConverse } = require("@langchain/aws"); +const { + HumanMessage, + SystemMessage, + AIMessage, +} = require("@langchain/core/messages"); + +/** + * The agent provider for the AWS Bedrock provider. + */ +class AWSBedrockProvider extends InheritMultiple([Provider, UnTooled]) { + model; + + constructor(_config = {}) { + super(); + const model = process.env.AWS_BEDROCK_LLM_MODEL_PREFERENCE ?? null; + const client = new ChatBedrockConverse({ + region: process.env.AWS_BEDROCK_LLM_REGION, + credentials: { + accessKeyId: process.env.AWS_BEDROCK_LLM_ACCESS_KEY_ID, + secretAccessKey: process.env.AWS_BEDROCK_LLM_ACCESS_KEY, + }, + model, + }); + + this._client = client; + this.model = model; + this.verbose = true; + } + + get client() { + return this._client; + } + + // For streaming we use Langchain's wrapper to handle weird chunks + // or otherwise absorb headaches that can arise from Ollama models + #convertToLangchainPrototypes(chats = []) { + const langchainChats = []; + const roleToMessageMap = { + system: SystemMessage, + user: HumanMessage, + assistant: AIMessage, + }; + + for (const chat of chats) { + if (!roleToMessageMap.hasOwnProperty(chat.role)) continue; + const MessageClass = roleToMessageMap[chat.role]; + langchainChats.push(new MessageClass({ content: chat.content })); + } + + return langchainChats; + } + + async #handleFunctionCallChat({ messages = [] }) { + const response = await this.client + .invoke(this.#convertToLangchainPrototypes(messages)) + .then((res) => res) + .catch((e) => { + console.error(e); + return null; + }); + + return response?.content; + } + + /** + * Create a completion based on the received messages. + * + * @param messages A list of messages to send to the API. + * @param functions + * @returns The completion. + */ + async complete(messages, functions = null) { + try { + let completion; + if (functions.length > 0) { + const { toolCall, text } = await this.functionCall( + messages, + functions, + this.#handleFunctionCallChat.bind(this) + ); + + if (toolCall !== null) { + this.providerLog(`Valid tool call found - running ${toolCall.name}.`); + this.deduplicator.trackRun(toolCall.name, toolCall.arguments); + return { + result: null, + functionCall: { + name: toolCall.name, + arguments: toolCall.arguments, + }, + cost: 0, + }; + } + completion = { content: text }; + } + + if (!completion?.content) { + this.providerLog( + "Will assume chat completion without tool call inputs." + ); + const response = await this.client.invoke( + this.#convertToLangchainPrototypes(this.cleanMsgs(messages)) + ); + completion = response; + } + + // The UnTooled class inherited Deduplicator is mostly useful to prevent the agent + // from calling the exact same function over and over in a loop within a single chat exchange + // _but_ we should enable it to call previously used tools in a new chat interaction. + this.deduplicator.reset("runs"); + return { + result: completion.content, + cost: 0, + }; + } catch (error) { + throw error; + } + } + + /** + * Get the cost of the completion. + * + * @param _usage The completion to get the cost for. + * @returns The cost of the completion. + * Stubbed since KoboldCPP has no cost basis. + */ + getCost(_usage) { + return 0; + } +} + +module.exports = AWSBedrockProvider; diff --git a/server/utils/agents/aibitat/providers/index.js b/server/utils/agents/aibitat/providers/index.js index 14748b2e..6f784ae5 100644 --- a/server/utils/agents/aibitat/providers/index.js +++ b/server/utils/agents/aibitat/providers/index.js @@ -12,6 +12,7 @@ const MistralProvider = require("./mistral.js"); const GenericOpenAiProvider = require("./genericOpenAi.js"); const PerplexityProvider = require("./perplexity.js"); const TextWebGenUiProvider = require("./textgenwebui.js"); +const AWSBedrockProvider = require("./bedrock.js"); module.exports = { OpenAIProvider, @@ -28,4 +29,5 @@ module.exports = { GenericOpenAiProvider, PerplexityProvider, TextWebGenUiProvider, + AWSBedrockProvider, }; diff --git a/server/utils/agents/index.js b/server/utils/agents/index.js index 66d51b74..f6c9b3e8 100644 --- a/server/utils/agents/index.js +++ b/server/utils/agents/index.js @@ -143,6 +143,17 @@ class AgentHandler { "TextWebGenUI API base path must be provided to use agents." ); break; + case "bedrock": + if ( + !process.env.AWS_BEDROCK_LLM_ACCESS_KEY_ID || + !process.env.AWS_BEDROCK_LLM_ACCESS_KEY || + !process.env.AWS_BEDROCK_LLM_REGION || + !process.env.AWS_BEDROCK_LLM_MODEL_PREFERENCE + ) + throw new Error( + "AWS Bedrock Access Keys, model and region must be provided to use agents." + ); + break; default: throw new Error( @@ -183,6 +194,8 @@ class AgentHandler { return "sonar-small-online"; case "textgenwebui": return null; + case "bedrock": + return null; default: return "unknown"; } @@ -210,7 +223,7 @@ class AgentHandler { } #providerSetupAndCheck() { - this.provider = this.invocation.workspace.agentProvider || "openai"; + this.provider = this.invocation.workspace.agentProvider; this.model = this.#fetchModel(); this.log(`Start ${this.#invocationUUID}::${this.provider}:${this.model}`); this.#checkSetup(); diff --git a/server/utils/helpers/index.js b/server/utils/helpers/index.js index 43940069..2f6ea514 100644 --- a/server/utils/helpers/index.js +++ b/server/utils/helpers/index.js @@ -140,6 +140,9 @@ function getLLMProvider({ provider = null, model = null } = {}) { case "generic-openai": const { GenericOpenAiLLM } = require("../AiProviders/genericOpenAi"); return new GenericOpenAiLLM(embedder, model); + case "bedrock": + const { AWSBedrockLLM } = require("../AiProviders/bedrock"); + return new AWSBedrockLLM(embedder, model); default: throw new Error( `ENV: No valid LLM_PROVIDER value found in environment! Using ${process.env.LLM_PROVIDER}` diff --git a/server/utils/helpers/updateENV.js b/server/utils/helpers/updateENV.js index 5b3e2f66..d39941ec 100644 --- a/server/utils/helpers/updateENV.js +++ b/server/utils/helpers/updateENV.js @@ -208,6 +208,28 @@ const KEY_MAPPING = { checks: [nonZero], }, + // AWS Bedrock LLM InferenceSettings + AwsBedrockLLMAccessKeyId: { + envKey: "AWS_BEDROCK_LLM_ACCESS_KEY_ID", + checks: [isNotEmpty], + }, + AwsBedrockLLMAccessKey: { + envKey: "AWS_BEDROCK_LLM_ACCESS_KEY", + checks: [isNotEmpty], + }, + AwsBedrockLLMRegion: { + envKey: "AWS_BEDROCK_LLM_REGION", + checks: [isNotEmpty], + }, + AwsBedrockLLMModel: { + envKey: "AWS_BEDROCK_LLM_MODEL_PREFERENCE", + checks: [isNotEmpty], + }, + AwsBedrockLLMTokenLimit: { + envKey: "AWS_BEDROCK_LLM_MODEL_TOKEN_LIMIT", + checks: [nonZero], + }, + EmbeddingEngine: { envKey: "EMBEDDING_ENGINE", checks: [supportedEmbeddingModel], @@ -541,6 +563,7 @@ function supportedLLM(input = "") { "cohere", "litellm", "generic-openai", + "bedrock", ].includes(input); return validSelection ? null : `${input} is not a valid LLM provider.`; } diff --git a/server/yarn.lock b/server/yarn.lock index 96df39c4..8369d829 100644 --- a/server/yarn.lock +++ b/server/yarn.lock @@ -54,6 +54,552 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + +"@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-bedrock-agent-runtime@^3.583.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-bedrock-agent-runtime/-/client-bedrock-agent-runtime-3.616.0.tgz#50d4a27235ddc55a7b36da524b7989ff57d55ad0" + integrity sha512-LmKgpTNNqJ0ClfDL1ZmssxiADS3hoznc4Tidh+M7SUJKmsd/iyPlyhu0Lwluw0k4wnPGqoDFwDWzjAzdxeCidw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.616.0" + "@aws-sdk/client-sts" "3.616.0" + "@aws-sdk/core" "3.616.0" + "@aws-sdk/credential-provider-node" "3.616.0" + "@aws-sdk/middleware-host-header" "3.616.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.616.0" + "@aws-sdk/middleware-user-agent" "3.616.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.2.7" + "@smithy/eventstream-serde-browser" "^3.0.4" + "@smithy/eventstream-serde-config-resolver" "^3.0.3" + "@smithy/eventstream-serde-node" "^3.0.4" + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.4" + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-retry" "^3.0.10" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.10" + "@smithy/util-defaults-mode-node" "^3.0.10" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-bedrock-runtime@^3.602.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-bedrock-runtime/-/client-bedrock-runtime-3.616.0.tgz#247df230def2997ece4964dfeb1b286f5f0ce159" + integrity sha512-3uvKafBwlrJp2/Me/BMdvYf3J127vC69aDJloElX9eClhSBDwIQ6C7tuXmhqb662mKNy5iqXcmYhmv9FowevJw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.616.0" + "@aws-sdk/client-sts" "3.616.0" + "@aws-sdk/core" "3.616.0" + "@aws-sdk/credential-provider-node" "3.616.0" + "@aws-sdk/middleware-host-header" "3.616.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.616.0" + "@aws-sdk/middleware-user-agent" "3.616.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.2.7" + "@smithy/eventstream-serde-browser" "^3.0.4" + "@smithy/eventstream-serde-config-resolver" "^3.0.3" + "@smithy/eventstream-serde-node" "^3.0.4" + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.4" + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-retry" "^3.0.10" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.10" + "@smithy/util-defaults-mode-node" "^3.0.10" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-stream" "^3.1.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-kendra@^3.352.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-kendra/-/client-kendra-3.616.0.tgz#1ac7459c60d3e0f0e8c34fe1684f51b65a802c57" + integrity sha512-pSl4+SrMZL/LuZ883pIvPR0VuU4DjYwb9kWFsUHGZDQtuyU0puM90f4bEUzxlwS5az5kiioTEMYwqaRst7d7xQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.616.0" + "@aws-sdk/client-sts" "3.616.0" + "@aws-sdk/core" "3.616.0" + "@aws-sdk/credential-provider-node" "3.616.0" + "@aws-sdk/middleware-host-header" "3.616.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.616.0" + "@aws-sdk/middleware-user-agent" "3.616.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.2.7" + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.4" + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-retry" "^3.0.10" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.10" + "@smithy/util-defaults-mode-node" "^3.0.10" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + uuid "^9.0.1" + +"@aws-sdk/client-sso-oidc@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.616.0.tgz#eb298b1c543465a5f7ebd28f8148d68654edf9d1" + integrity sha512-YY1hpYS/G1uRGjQf88dL8VLHkP/IjGxKeXdhy+JnzMdCkAWl3V9j0fEALw40NZe0x79gr6R2KUOUH/IKYQfUmg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.616.0" + "@aws-sdk/credential-provider-node" "3.616.0" + "@aws-sdk/middleware-host-header" "3.616.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.616.0" + "@aws-sdk/middleware-user-agent" "3.616.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.2.7" + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.4" + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-retry" "^3.0.10" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.10" + "@smithy/util-defaults-mode-node" "^3.0.10" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.616.0.tgz#d4bbb279daf6b4fde7ec2df9243526eb5119b0c0" + integrity sha512-hwW0u1f8U4dSloAe61/eupUiGd5Q13B72BuzGxvRk0cIpYX/2m0KBG8DDl7jW1b2QQ+CflTLpG2XUf2+vRJxGA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.616.0" + "@aws-sdk/middleware-host-header" "3.616.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.616.0" + "@aws-sdk/middleware-user-agent" "3.616.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.2.7" + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.4" + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-retry" "^3.0.10" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.10" + "@smithy/util-defaults-mode-node" "^3.0.10" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sts@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.616.0.tgz#9616c3693d9ae5232ccc12d570f46abe4ec49d2b" + integrity sha512-FP7i7hS5FpReqnysQP1ukQF1OUWy8lkomaOnbu15H415YUrfCp947SIx6+BItjmx+esKxPkEjh/fbCVzw2D6hQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.616.0" + "@aws-sdk/core" "3.616.0" + "@aws-sdk/credential-provider-node" "3.616.0" + "@aws-sdk/middleware-host-header" "3.616.0" + "@aws-sdk/middleware-logger" "3.609.0" + "@aws-sdk/middleware-recursion-detection" "3.616.0" + "@aws-sdk/middleware-user-agent" "3.616.0" + "@aws-sdk/region-config-resolver" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@aws-sdk/util-user-agent-browser" "3.609.0" + "@aws-sdk/util-user-agent-node" "3.614.0" + "@smithy/config-resolver" "^3.0.5" + "@smithy/core" "^2.2.7" + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/hash-node" "^3.0.3" + "@smithy/invalid-dependency" "^3.0.3" + "@smithy/middleware-content-length" "^3.0.4" + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-retry" "^3.0.10" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.10" + "@smithy/util-defaults-mode-node" "^3.0.10" + "@smithy/util-endpoints" "^2.0.5" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/core@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.616.0.tgz#4d7f79cd62e545e6db677216a17dab84c2b4cda3" + integrity sha512-O/urkh2kECs/IqZIVZxyeyHZ7OR2ZWhLNK7btsVQBQvJKrEspLrk/Fp20Qfg5JDerQfBN83ZbyRXLJOOucdZpw== + dependencies: + "@smithy/core" "^2.2.7" + "@smithy/protocol-http" "^4.0.4" + "@smithy/signature-v4" "^4.0.0" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + fast-xml-parser "4.2.5" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.609.0.tgz#b3f32e5a8ff8b541e151eadadfb60283aa3d835e" + integrity sha512-v69ZCWcec2iuV9vLVJMa6fAb5xwkzN4jYIT8yjo2c4Ia/j976Q+TPf35Pnz5My48Xr94EFcaBazrWedF+kwfuQ== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.616.0.tgz#207cbe3e74c6c55208fd4bf0ff59df6e765d2c41" + integrity sha512-1rgCkr7XvEMBl7qWCo5BKu3yAxJs71dRaZ55Xnjte/0ZHH6Oc93ZrHzyYy6UH6t0nZrH+FAuw7Yko2YtDDwDeg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/property-provider" "^3.1.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.8" + "@smithy/types" "^3.3.0" + "@smithy/util-stream" "^3.1.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.616.0.tgz#5bb726e969908a28e960d65016e7440b78056209" + integrity sha512-5gQdMr9cca3xV7FF2SxpxWGH2t6+t4o+XBGiwsHm8muEjf4nUmw7Ij863x25Tjt2viPYV0UStczSb5Sihp7bkA== + dependencies: + "@aws-sdk/credential-provider-env" "3.609.0" + "@aws-sdk/credential-provider-http" "3.616.0" + "@aws-sdk/credential-provider-process" "3.614.0" + "@aws-sdk/credential-provider-sso" "3.616.0" + "@aws-sdk/credential-provider-web-identity" "3.609.0" + "@aws-sdk/types" "3.609.0" + "@smithy/credential-provider-imds" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.616.0", "@aws-sdk/credential-provider-node@^3.600.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.616.0.tgz#0887ab7b9bab3031fe3ed8aaee2d4abb5091a67f" + integrity sha512-Se+u6DAxjDPjKE3vX1X2uxjkWgGq69BTo0uTB0vDUiWwBVgh16s9BsBhSAlKEH1CCbbJHvOg4YdTrzjwzqyClg== + dependencies: + "@aws-sdk/credential-provider-env" "3.609.0" + "@aws-sdk/credential-provider-http" "3.616.0" + "@aws-sdk/credential-provider-ini" "3.616.0" + "@aws-sdk/credential-provider-process" "3.614.0" + "@aws-sdk/credential-provider-sso" "3.616.0" + "@aws-sdk/credential-provider-web-identity" "3.609.0" + "@aws-sdk/types" "3.609.0" + "@smithy/credential-provider-imds" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.614.0.tgz#b6b9382346dfe51c8fb448595ae55b930532c897" + integrity sha512-Q0SI0sTRwi8iNODLs5+bbv8vgz8Qy2QdxbCHnPk/6Cx6LMf7i3dqmWquFbspqFRd8QiqxStrblwxrUYZi09tkA== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.616.0.tgz#051b1a2eb31fa30866f2c1e95bbcf965911b16c3" + integrity sha512-3rsWs9GBi8Z8Gps5ROwqguxtw+J6OIg1vawZMLRNMqqZoBvbOToe9wEnpid8ylU+27+oG8uibJNlNuRyXApUjw== + dependencies: + "@aws-sdk/client-sso" "3.616.0" + "@aws-sdk/token-providers" "3.614.0" + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.609.0.tgz#d29222d6894347ee89c781ea090d388656df1d2a" + integrity sha512-U+PG8NhlYYF45zbr1km3ROtBMYqyyj/oK8NRp++UHHeuavgrP+4wJ4wQnlEaKvJBjevfo3+dlIBcaeQ7NYejWg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.616.0.tgz#542dac3370374ba3733c96a6bb153e6fe53fafe6" + integrity sha512-mhNfHuGhCDZwYCABebaOvTgOM44UCZZRq2cBpgPZLVKP0ydAv5aFHXv01goexxXHqgHoEGx0uXWxlw0s2EpFDg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz#ed44d201f091b8bac908cbf14724c7a4d492553f" + integrity sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.616.0.tgz#fa87c9d77c6f85d02b9cf8394f52b2d6334a63af" + integrity sha512-LQKAcrZRrR9EGez4fdCIVjdn0Ot2HMN12ChnoMGEU6oIxnQ2aSC7iASFFCV39IYfeMh7iSCPj7Wopqw8rAouzg== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/protocol-http" "^4.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.616.0": + version "3.616.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.616.0.tgz#fe11d62e9cdc96a354c37968499fa32637a70f45" + integrity sha512-iMcAb4E+Z3vuEcrDsG6T2OBNiqWAquwahP9qepHqfmnmJqHr1mSHtXDYTGBNid31+621sUQmneUQ+fagpGAe4w== + dependencies: + "@aws-sdk/types" "3.609.0" + "@aws-sdk/util-endpoints" "3.614.0" + "@smithy/protocol-http" "^4.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz#9cebb31a5bcfea2a41891fff7f28d0164cde179a" + integrity sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz#88da04f6d4ce916b0b0f6e045676d04201fb47fd" + integrity sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/types@3.609.0", "@aws-sdk/types@^3.222.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.609.0.tgz#06b39d799c9f197a7b43670243e8e78a3bf7d6a5" + integrity sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz#6564b0ffd7dc3728221e9f9821f5aab1cc58468e" + integrity sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + "@smithy/util-endpoints" "^2.0.5" + tslib "^2.6.2" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.568.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz#2acc4b2236af0d7494f7e517401ba6b3c4af11ff" + integrity sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.609.0": + version "3.609.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz#aa15421b2e32ae8bc589dac2bd6e8969832ce588" + integrity sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/types" "^3.3.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.614.0": + version "3.614.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz#1e3f49a80f841a3f21647baed2adce01aac5beb5" + integrity sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA== + dependencies: + "@aws-sdk/types" "3.609.0" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + "@azure-rest/core-client@^1.1.7": version "1.4.0" resolved "https://registry.yarnpkg.com/@azure-rest/core-client/-/core-client-1.4.0.tgz#3be28c02c6c20e49dea73a7f012daeeda4eacb8e" @@ -622,6 +1168,18 @@ zod "^3.22.4" zod-to-json-schema "^3.22.4" +"@langchain/aws@^0.0.5": + version "0.0.5" + resolved "https://registry.yarnpkg.com/@langchain/aws/-/aws-0.0.5.tgz#eb5f97b170c25219eff0db83f291be5e19403936" + integrity sha512-l6OdEEXEVYYkp3wCOO0YAs4lnyOnZ65ypm9wg8ECPk/tTQQEKIQ7bMUmcyn3bo1ogcaMymChigX3qH6bI8lQog== + dependencies: + "@aws-sdk/client-bedrock-agent-runtime" "^3.583.0" + "@aws-sdk/client-bedrock-runtime" "^3.602.0" + "@aws-sdk/client-kendra" "^3.352.0" + "@aws-sdk/credential-provider-node" "^3.600.0" + "@langchain/core" ">=0.2.16 <0.3.0" + zod-to-json-schema "^3.22.5" + "@langchain/community@0.0.53", "@langchain/community@~0.0.47": version "0.0.53" resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.53.tgz#a9aaedffa0ed2977e8d302d74e9f90a49a6da037" @@ -654,6 +1212,24 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/core@>=0.2.16 <0.3.0": + version "0.2.18" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.18.tgz#1ac4f307fa217ab3555c9634147a6c4ad9826092" + integrity sha512-ru542BwNcsnDfjTeDbIkFIchwa54ctHZR+kVrC8U9NPS9/36iM8p8ruprOV7Zccj/oxtLE5UpEhV+9MZhVcFlA== + dependencies: + ansi-styles "^5.0.0" + camelcase "6" + decamelize "1.2.0" + js-tiktoken "^1.0.12" + langsmith "~0.1.39" + ml-distance "^4.0.0" + mustache "^4.2.0" + p-queue "^6.6.2" + p-retry "4" + uuid "^10.0.0" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + "@langchain/openai@0.0.28", "@langchain/openai@~0.0.28": version "0.0.28" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.28.tgz#afaeec61b44816935db9ae937496c964c81ab571" @@ -1114,6 +1690,441 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.29.6.tgz#4cd8372f9247372edd5fc5af44f67e2032c46e2f" integrity sha512-aX5IFYWlMa7tQ8xZr3b2gtVReCvg7f3LEhjir/JAjX2bJCMVJA5tIPv30wTD4KDfcwMd7DDYY3hFDeGmOgtrZQ== +"@smithy/abort-controller@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-3.1.1.tgz#291210611ff6afecfc198d0ca72d5771d8461d16" + integrity sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/config-resolver@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-3.0.5.tgz#727978bba7ace754c741c259486a19d3083431fd" + integrity sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + +"@smithy/core@^2.2.7": + version "2.2.8" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-2.2.8.tgz#d1edc47584497c58aec741b0a2814cdc1db7b72c" + integrity sha512-1Y0XX0Ucyg0LWTfTVLWpmvSRtFRniykUl3dQ0os1sTd03mKDudR6mVyX+2ak1phwPXx2aEWMAAdW52JNi0mc3A== + dependencies: + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-retry" "^3.0.11" + "@smithy/middleware-serde" "^3.0.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/smithy-client" "^3.1.9" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.4.tgz#797116f68cc3ffa658469558cc014f25d9febe09" + integrity sha512-NKyH01m97Xa5xf3pB2QOF3lnuE8RIK0hTVNU5zvZAwZU8uspYO4DHQVlK+Y5gwSrujTfHvbfd1D9UFJAc0iYKQ== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + tslib "^2.6.2" + +"@smithy/eventstream-codec@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-3.1.2.tgz#4a1c72b34400631b829241151984a1ad8c4f963c" + integrity sha512-0mBcu49JWt4MXhrhRAlxASNy0IjDRFU+aWNDRal9OtUJvJNiwDuyKMUONSOjLjSCeGwZaE0wOErdqULer8r7yw== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^3.3.0" + "@smithy/util-hex-encoding" "^3.0.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-browser@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.5.tgz#3e971afd2b8a02a098af8decc4b9e3f35296d6a2" + integrity sha512-dEyiUYL/ekDfk+2Ra4GxV+xNnFoCmk1nuIXg+fMChFTrM2uI/1r9AdiTYzPqgb72yIv/NtAj6C3dG//1wwgakQ== + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-config-resolver@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.3.tgz#f852e096d0ad112363b4685e1d441088d1fce67a" + integrity sha512-NVTYjOuYpGfrN/VbRQgn31x73KDLfCXCsFdad8DiIc3IcdxL+dYA9zEQPyOP7Fy2QL8CPy2WE4WCUD+ZsLNfaQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-node@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.4.tgz#6301752ca51b3ebabcd2dec112f1dacd990de4c1" + integrity sha512-mjlG0OzGAYuUpdUpflfb9zyLrBGgmQmrobNT8b42ZTsGv/J03+t24uhhtVEKG/b2jFtPIHF74Bq+VUtbzEKOKg== + dependencies: + "@smithy/eventstream-serde-universal" "^3.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-universal@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.4.tgz#6754de5b94bdc286d8ef1d6bcf22d80f6ab68f30" + integrity sha512-Od9dv8zh3PgOD7Vj4T3HSuox16n0VG8jJIM2gvKASL6aCtcS8CfHZDWe1Ik3ZXW6xBouU+45Q5wgoliWDZiJ0A== + dependencies: + "@smithy/eventstream-codec" "^3.1.2" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.2.tgz#67e29be8815dcf793d14186cae00bccaeffb963c" + integrity sha512-3LaWlBZObyGrOOd7e5MlacnAKEwFBmAeiW/TOj2eR9475Vnq30uS2510+tnKbxrGjROfNdOhQqGo5j3sqLT6bA== + dependencies: + "@smithy/protocol-http" "^4.0.4" + "@smithy/querystring-builder" "^3.0.3" + "@smithy/types" "^3.3.0" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + +"@smithy/hash-node@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-3.0.3.tgz#82c5cb7b0f1a29ee7319081853d2d158c07dff24" + integrity sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz#8d9fd70e3a94b565a4eba4ffbdc95238e1930528" + integrity sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/is-array-buffer@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111" + integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz#9a95c2d46b8768946a9eec7f935feaddcffa5e7a" + integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== + dependencies: + tslib "^2.6.2" + +"@smithy/middleware-content-length@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-3.0.4.tgz#7c5804775da0d3d0c045d52293298f608e72311b" + integrity sha512-wySGje/KfhsnF8YSh9hP16pZcl3C+X6zRsvSfItQGvCyte92LliilU3SD0nR7kTlxnAJwxY8vE/k4Eoezj847Q== + dependencies: + "@smithy/protocol-http" "^4.0.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.5.tgz#76e8a559e891282d3ede9ab8e228e66cbee89b21" + integrity sha512-V4acqqrh5tDxUEGVTOgf2lYMZqPQsoGntCrjrJZEeBzEzDry2d2vcI1QCXhGltXPPY+BMc6eksZMguA9fIY8vA== + dependencies: + "@smithy/middleware-serde" "^3.0.3" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + "@smithy/url-parser" "^3.0.3" + "@smithy/util-middleware" "^3.0.3" + tslib "^2.6.2" + +"@smithy/middleware-retry@^3.0.10", "@smithy/middleware-retry@^3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-3.0.11.tgz#4a8137a45247233aa83707ff9da3b8ee3dfefbba" + integrity sha512-/TIRWmhwMpv99JCGuMhJPnH7ggk/Lah7s/uNDyr7faF02BxNsyD/fz9Tw7pgCf9tYOKgjimm2Qml1Aq1pbkt6g== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/protocol-http" "^4.0.4" + "@smithy/service-error-classification" "^3.0.3" + "@smithy/smithy-client" "^3.1.9" + "@smithy/types" "^3.3.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-retry" "^3.0.3" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-serde@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz#74d974460f74d99f38c861e6862984543a880a66" + integrity sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/middleware-stack@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz#91845c7e61e6f137fa912b623b6def719a4f6ce7" + integrity sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/node-config-provider@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz#05647bed666aa8036a1ad72323c1942e5d421be1" + integrity sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ== + dependencies: + "@smithy/property-provider" "^3.1.3" + "@smithy/shared-ini-file-loader" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/node-http-handler@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-3.1.3.tgz#1b729a8a2ca6b84618a1e92c53c49a1fcf3a3e5a" + integrity sha512-UiKZm8KHb/JeOPzHZtRUfyaRDO1KPKPpsd7iplhiwVGOeVdkiVJ5bVe7+NhWREMOKomrDIDdSZyglvMothLg0Q== + dependencies: + "@smithy/abort-controller" "^3.1.1" + "@smithy/protocol-http" "^4.0.4" + "@smithy/querystring-builder" "^3.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/property-provider@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-3.1.3.tgz#afd57ea82a3f6c79fbda95e3cb85c0ee0a79f39a" + integrity sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/protocol-http@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-4.0.4.tgz#f784a03460b971cf10027d0e7f6673835ed7e637" + integrity sha512-fAA2O4EFyNRyYdFLVIv5xMMeRb+3fRKc/Rt2flh5k831vLvUmNFXcydeg7V3UeEhGURJI4c1asmGJBjvmF6j8Q== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/querystring-builder@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz#6b0e566f885bb84938d077c69e8f8555f686af13" + integrity sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw== + dependencies: + "@smithy/types" "^3.3.0" + "@smithy/util-uri-escape" "^3.0.0" + tslib "^2.6.2" + +"@smithy/querystring-parser@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz#272a6b83f88dfcbbec8283d72a6bde850cc00091" + integrity sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/service-error-classification@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz#73484255060a094aa9372f6cd972dcaf97e3ce80" + integrity sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ== + dependencies: + "@smithy/types" "^3.3.0" + +"@smithy/shared-ini-file-loader@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz#7dceaf5a5307a2ee347ace8aba17312a1a3ede15" + integrity sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/signature-v4@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-4.0.0.tgz#0583baba98819eab49e028166b186ce927c42128" + integrity sha512-ervYjQ+ZvmNG51Ui77IOTPri7nOyo8Kembzt9uwwlmtXJPmFXvslOahbA1blvAVs7G0KlYMiOBog1rAt7RVXxg== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/types" "^3.3.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-middleware" "^3.0.3" + "@smithy/util-uri-escape" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/smithy-client@^3.1.8", "@smithy/smithy-client@^3.1.9": + version "3.1.9" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-3.1.9.tgz#a0d8e867165db64c2a66762df0db279d1f8029eb" + integrity sha512-My2RaInZ4gSwJUPMaiLR/Nk82+c4LlvqpXA+n7lonGYgCZq23Tg+/xFhgmiejJ6XPElYJysTPyV90vKyp17+1g== + dependencies: + "@smithy/middleware-endpoint" "^3.0.5" + "@smithy/middleware-stack" "^3.0.3" + "@smithy/protocol-http" "^4.0.4" + "@smithy/types" "^3.3.0" + "@smithy/util-stream" "^3.1.1" + tslib "^2.6.2" + +"@smithy/types@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-3.3.0.tgz#fae037c733d09bc758946a01a3de0ef6e210b16b" + integrity sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-3.0.3.tgz#e8a060d9810b24b1870385fc2b02485b8a6c5955" + integrity sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A== + dependencies: + "@smithy/querystring-parser" "^3.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/util-base64@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-3.0.0.tgz#f7a9a82adf34e27a72d0719395713edf0e493017" + integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz#86ec2f6256310b4845a2f064e2f571c1ca164ded" + integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz#99a291bae40d8932166907fe981d6a1f54298a6d" + integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== + dependencies: + tslib "^2.6.2" + +"@smithy/util-buffer-from@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b" + integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== + dependencies: + "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-buffer-from@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz#559fc1c86138a89b2edaefc1e6677780c24594e3" + integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-config-provider@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz#62c6b73b22a430e84888a8f8da4b6029dd5b8efe" + integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^3.0.10": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.11.tgz#c8a74369405f55d39492b9ec15458cc2fe56b783" + integrity sha512-O3s9DGb3bmRvEKmT8RwvSWK4A9r6svfd+MnJB+UMi9ZcCkAnoRtliulOnGF0qCMkKF9mwk2tkopBBstalPY/vg== + dependencies: + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.1.9" + "@smithy/types" "^3.3.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^3.0.10": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.11.tgz#288f443b65554597082858c4b6624cd362a2caaa" + integrity sha512-qd4a9qtyOa/WY14aHHOkMafhh9z8D2QTwlcBoXMTPnEwtcY+xpe1JyFm9vya7VsB8hHsfn3XodEtwqREiu4ygQ== + dependencies: + "@smithy/config-resolver" "^3.0.5" + "@smithy/credential-provider-imds" "^3.1.4" + "@smithy/node-config-provider" "^3.1.4" + "@smithy/property-provider" "^3.1.3" + "@smithy/smithy-client" "^3.1.9" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/util-endpoints@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz#e3a7a4d1c41250bfd2b2d890d591273a7d8934be" + integrity sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg== + dependencies: + "@smithy/node-config-provider" "^3.1.4" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/util-hex-encoding@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz#32938b33d5bf2a15796cd3f178a55b4155c535e6" + integrity sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-middleware@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-3.0.3.tgz#07bf9602682f5a6c55bc2f0384303f85fc68c87e" + integrity sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw== + dependencies: + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/util-retry@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-3.0.3.tgz#9b2ac0dbb1c81f69812a8affa4d772bebfc0e049" + integrity sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w== + dependencies: + "@smithy/service-error-classification" "^3.0.3" + "@smithy/types" "^3.3.0" + tslib "^2.6.2" + +"@smithy/util-stream@^3.1.0", "@smithy/util-stream@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-3.1.1.tgz#2fffe56d9cdf70e94a7cd690e980454b1b35ad23" + integrity sha512-EhRnVvl3AhoHAT2rGQ5o+oSDRM/BUSMPLZZdRJZLcNVUsFAjOs4vHaPdNQivTSzRcFxf5DA4gtO46WWU2zimaw== + dependencies: + "@smithy/fetch-http-handler" "^3.2.2" + "@smithy/node-http-handler" "^3.1.3" + "@smithy/types" "^3.3.0" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-uri-escape@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz#e43358a78bf45d50bb736770077f0f09195b6f54" + integrity sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-utf8@^2.0.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5" + integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== + dependencies: + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-3.0.0.tgz#1a6a823d47cbec1fd6933e5fc87df975286d9d6a" + integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + tslib "^2.6.2" + "@swc/helpers@^0.5.2": version "0.5.11" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7" @@ -1768,6 +2779,11 @@ bottleneck@^2.15.3: resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3004,6 +4020,13 @@ fast-text-encoding@^1.0.0: resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz#0aa25f7f638222e3396d72bf936afcf1d42d6867" integrity sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w== +fast-xml-parser@4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz#a6747a09296a6cb34f2ae634019bf1738f3b421f" + integrity sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g== + dependencies: + strnum "^1.0.5" + fast-xml-parser@^4.3.5: version "4.3.6" resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.6.tgz#190f9d99097f0c8f2d3a0e681a10404afca052ff" @@ -4044,6 +5067,13 @@ js-tiktoken@^1.0.11, js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: dependencies: base64-js "^1.5.1" +js-tiktoken@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" + integrity sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ== + dependencies: + base64-js "^1.5.1" + "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4255,6 +5285,17 @@ langsmith@~0.1.1, langsmith@~0.1.7: p-retry "4" uuid "^9.0.0" +langsmith@~0.1.39: + version "0.1.39" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.39.tgz#cc99f1828a9c0f5ba24bec6b0121edc44e8d282d" + integrity sha512-K2/qbc96JhrZbSL74RbZ0DBOpTB9Mxicu8RQrZ88Xsp1bH2O3+y5EdcvC0g/1YzQWQhcQ4peknCA24c3VTNiNA== + dependencies: + "@types/uuid" "^9.0.1" + commander "^10.0.1" + p-queue "^6.6.2" + p-retry "4" + uuid "^9.0.0" + lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -6650,6 +7691,11 @@ uuid-apikey@^1.5.3: encode32 "^1.1.0" uuid "^8.3.1" +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + uuid@^8.3.0, uuid@^8.3.1: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"