UNPKG

@langchain/community

Version:
1 lines 41.5 kB
{"version":3,"file":"web.cjs","names":["ChatMessage","AIMessage","isLangChainTool","isOpenAITool","isAnthropicTool","isStructuredTool","BaseChatModel","EventStreamCodec","toUtf8","fromUtf8","BedrockLLMInputOutputAdapter","HttpRequest","SignatureV4","Sha256","_toolsInParams","ChatGenerationChunk","AIMessageChunk"],"sources":["../../../src/chat_models/bedrock/web.ts"],"sourcesContent":["import { SignatureV4 } from \"@smithy/signature-v4\";\nimport { HttpRequest } from \"@smithy/protocol-http\";\nimport { EventStreamCodec } from \"@smithy/eventstream-codec\";\nimport { fromUtf8, toUtf8 } from \"@smithy/util-utf8\";\nimport { Sha256 } from \"@aws-crypto/sha256-js\";\n\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport {\n type BaseChatModelParams,\n BaseChatModel,\n LangSmithParams,\n BaseChatModelCallOptions,\n BindToolsInput,\n} from \"@langchain/core/language_models/chat_models\";\nimport {\n BaseLanguageModelInput,\n isOpenAITool,\n} from \"@langchain/core/language_models/base\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport {\n AIMessageChunk,\n BaseMessage,\n AIMessage,\n ChatMessage,\n BaseMessageChunk,\n isAIMessage,\n} from \"@langchain/core/messages\";\nimport {\n ChatGeneration,\n ChatGenerationChunk,\n ChatResult,\n} from \"@langchain/core/outputs\";\nimport {\n isLangChainTool,\n isStructuredTool,\n} from \"@langchain/core/utils/function_calling\";\nimport { toJsonSchema } from \"@langchain/core/utils/json_schema\";\nimport { isInteropZodSchema } from \"@langchain/core/utils/types\";\nimport type { SerializedFields } from \"../../load/map_keys.js\";\nimport {\n BaseBedrockInput,\n BedrockLLMInputOutputAdapter,\n type CredentialType,\n} from \"../../utils/bedrock/index.js\";\nimport {\n _toolsInParams,\n isAnthropicTool,\n} from \"../../utils/bedrock/anthropic.js\";\n\ntype AnthropicTool = Record<string, unknown>;\n\ntype BedrockChatToolType = BindToolsInput | AnthropicTool;\n\n/**\n * @see https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html#Concepts.RegionsAndAvailabilityZones.Regions\n */\nconst AWS_REGIONS = [\n \"us\",\n \"sa\",\n \"me\",\n \"mx\",\n \"il\",\n \"eu\",\n \"cn\",\n \"ca\",\n \"ap\",\n \"af\",\n \"us-gov\",\n \"apac\",\n \"au\",\n \"jp\",\n \"global\",\n];\n\nconst ALLOWED_MODEL_PROVIDERS = [\n \"ai21\",\n \"anthropic\",\n \"amazon\",\n \"cohere\",\n \"meta\",\n \"mistral\",\n \"deepseek\",\n];\n\nconst PRELUDE_TOTAL_LENGTH_BYTES = 4;\n\nfunction convertOneMessageToText(\n message: BaseMessage,\n humanPrompt: string,\n aiPrompt: string\n): string {\n if (message._getType() === \"human\") {\n return `${humanPrompt} ${message.content}`;\n } else if (message._getType() === \"ai\") {\n return `${aiPrompt} ${message.content}`;\n } else if (message._getType() === \"system\") {\n return `${humanPrompt} <admin>${message.content}</admin>`;\n } else if (message._getType() === \"function\") {\n return `${humanPrompt} ${message.content}`;\n } else if (ChatMessage.isInstance(message)) {\n return `\\n\\n${\n message.role[0].toUpperCase() + message.role.slice(1)\n }: {message.content}`;\n }\n throw new Error(`Unknown role: ${message._getType()}`);\n}\n\nexport function convertMessagesToPromptAnthropic(\n messages: BaseMessage[],\n humanPrompt = \"\\n\\nHuman:\",\n aiPrompt = \"\\n\\nAssistant:\"\n): string {\n const messagesCopy = [...messages];\n\n if (\n messagesCopy.length === 0 ||\n messagesCopy[messagesCopy.length - 1]._getType() !== \"ai\"\n ) {\n messagesCopy.push(new AIMessage({ content: \"\" }));\n }\n\n return messagesCopy\n .map((message) => convertOneMessageToText(message, humanPrompt, aiPrompt))\n .join(\"\");\n}\n\n/**\n * Function that converts an array of messages into a single string prompt\n * that can be used as input for a chat model. It delegates the conversion\n * logic to the appropriate provider-specific function.\n * @param messages Array of messages to be converted.\n * @param options Options to be used during the conversion.\n * @returns A string prompt that can be used as input for a chat model.\n */\nexport function convertMessagesToPrompt(\n messages: BaseMessage[],\n provider: string\n): string {\n if (provider === \"anthropic\") {\n return convertMessagesToPromptAnthropic(messages);\n }\n throw new Error(`Provider ${provider} does not support chat.`);\n}\n\nfunction formatTools(tools: BedrockChatCallOptions[\"tools\"]): AnthropicTool[] {\n if (!tools || !tools.length) {\n return [];\n }\n if (tools.every(isLangChainTool)) {\n return tools.map((tc) => ({\n name: tc.name,\n description: tc.description,\n input_schema: isInteropZodSchema(tc.schema)\n ? toJsonSchema(tc.schema)\n : tc.schema,\n }));\n }\n if (tools.every(isOpenAITool)) {\n return tools.map((tc) => ({\n name: tc.function.name,\n description: tc.function.description,\n input_schema: tc.function.parameters,\n }));\n }\n if (tools.every(isAnthropicTool)) {\n return tools;\n }\n if (\n tools.some(isStructuredTool) ||\n tools.some(isOpenAITool) ||\n tools.some(isAnthropicTool)\n ) {\n throw new Error(\n \"All tools passed to BedrockChat must be of the same type.\"\n );\n }\n throw new Error(\"Invalid tool format received.\");\n}\n\nexport interface BedrockChatCallOptions extends BaseChatModelCallOptions {\n tools?: BedrockChatToolType[];\n}\n\nexport interface BedrockChatFields\n extends Partial<BaseBedrockInput>, BaseChatModelParams {}\n\n/**\n * AWS Bedrock chat model integration.\n *\n * Setup:\n * Install `@langchain/community` and set the following environment variables:\n *\n * ```bash\n * npm install @langchain/openai\n * export AWS_REGION=\"your-aws-region\"\n * export AWS_SECRET_ACCESS_KEY=\"your-aws-secret-access-key\"\n * export AWS_ACCESS_KEY_ID=\"your-aws-access-key-id\"\n * ```\n *\n * ## [Constructor args](/classes/langchain_community_chat_models_bedrock.BedrockChat.html#constructor)\n *\n * ## [Runtime args](/interfaces/langchain_community_chat_models_bedrock_web.BedrockChatCallOptions.html)\n *\n * Runtime args can be passed as the second argument to any of the base runnable methods `.invoke`. `.stream`, `.batch`, etc.\n * They can also be passed via `.withConfig`, or the second arg in `.bindTools`, like shown in the examples below:\n *\n * ```typescript\n * // When calling `.withConfig`, call options should be passed via the first argument\n * const llmWithArgsBound = llm.withConfig({\n * stop: [\"\\n\"],\n * tools: [...],\n * });\n *\n * // When calling `.bindTools`, call options should be passed via the second argument\n * const llmWithTools = llm.bindTools(\n * [...],\n * {\n * stop: [\"stop on this token!\"],\n * }\n * );\n * ```\n *\n * ## Examples\n *\n * <details open>\n * <summary><strong>Instantiate</strong></summary>\n *\n * ```typescript\n * import { BedrockChat } from '@langchain/community/chat_models/bedrock/web';\n *\n * const llm = new BedrockChat({\n * region: process.env.AWS_REGION,\n * maxRetries: 0,\n * model: \"anthropic.claude-sonnet-4-5-20250929-v1:0\",\n * temperature: 0,\n * maxTokens: undefined,\n * // other params...\n * });\n *\n * // You can also pass credentials in explicitly:\n * const llmWithCredentials = new BedrockChat({\n * region: process.env.BEDROCK_AWS_REGION,\n * model: \"anthropic.claude-sonnet-4-5-20250929-v1:0\",\n * credentials: {\n * secretAccessKey: process.env.BEDROCK_AWS_SECRET_ACCESS_KEY!,\n * accessKeyId: process.env.BEDROCK_AWS_ACCESS_KEY_ID!,\n * },\n * });\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Invoking</strong></summary>\n *\n * ```typescript\n * const input = `Translate \"I love programming\" into French.`;\n *\n * // Models also accept a list of chat messages or a formatted prompt\n * const result = await llm.invoke(input);\n * console.log(result);\n * ```\n *\n * ```txt\n * AIMessage {\n * \"content\": \"Here's the translation to French:\\n\\nJ'adore la programmation.\",\n * \"additional_kwargs\": {\n * \"id\": \"msg_bdrk_01HCZHa2mKbMZeTeHjLDd286\"\n * },\n * \"response_metadata\": {\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-sonnet-4-5-20250929\",\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null,\n * \"usage\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 19\n * }\n * },\n * \"tool_calls\": [],\n * \"invalid_tool_calls\": []\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Streaming Chunks</strong></summary>\n *\n * ```typescript\n * for await (const chunk of await llm.stream(input)) {\n * console.log(chunk);\n * }\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {\n * \"id\": \"msg_bdrk_01RhFuGR9uJ2bj5GbdAma4y6\"\n * },\n * \"response_metadata\": {\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-sonnet-4-5-20250929\",\n * \"stop_reason\": null,\n * \"stop_sequence\": null\n * },\n * }\n * AIMessageChunk {\n * \"content\": \"J\",\n * }\n * AIMessageChunk {\n * \"content\": \"'adore la\",\n * }\n * AIMessageChunk {\n * \"content\": \" programmation.\",\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"additional_kwargs\": {\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null\n * },\n * }\n * AIMessageChunk {\n * \"content\": \"\",\n * \"response_metadata\": {\n * \"amazon-bedrock-invocationMetrics\": {\n * \"inputTokenCount\": 25,\n * \"outputTokenCount\": 11,\n * \"invocationLatency\": 659,\n * \"firstByteLatency\": 506\n * }\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 11,\n * \"total_tokens\": 36\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Aggregate Streamed Chunks</strong></summary>\n *\n * ```typescript\n * import { AIMessageChunk } from '@langchain/core/messages';\n * import { concat } from '@langchain/core/utils/stream';\n *\n * const stream = await llm.stream(input);\n * let full: AIMessageChunk | undefined;\n * for await (const chunk of stream) {\n * full = !full ? chunk : concat(full, chunk);\n * }\n * console.log(full);\n * ```\n *\n * ```txt\n * AIMessageChunk {\n * \"content\": \"J'adore la programmation.\",\n * \"additional_kwargs\": {\n * \"id\": \"msg_bdrk_017b6PuBybA51P5LZ9K6gZHm\",\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null\n * },\n * \"response_metadata\": {\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-sonnet-4-5-20250929\",\n * \"stop_reason\": null,\n * \"stop_sequence\": null,\n * \"amazon-bedrock-invocationMetrics\": {\n * \"inputTokenCount\": 25,\n * \"outputTokenCount\": 11,\n * \"invocationLatency\": 1181,\n * \"firstByteLatency\": 1177\n * }\n * },\n * \"usage_metadata\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 11,\n * \"total_tokens\": 36\n * }\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Bind tools</strong></summary>\n *\n * ```typescript\n * import { z } from 'zod';\n * import { AIMessage } from '@langchain/core/messages';\n *\n * const GetWeather = {\n * name: \"GetWeather\",\n * description: \"Get the current weather in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const GetPopulation = {\n * name: \"GetPopulation\",\n * description: \"Get the current population in a given location\",\n * schema: z.object({\n * location: z.string().describe(\"The city and state, e.g. San Francisco, CA\")\n * }),\n * }\n *\n * const llmWithTools = llm.bindTools([GetWeather, GetPopulation]);\n * const aiMsg: AIMessage = await llmWithTools.invoke(\n * \"Which city is hotter today and which is bigger: LA or NY?\"\n * );\n * console.log(aiMsg.tool_calls);\n * ```\n *\n * ```txt\n * [\n * {\n * name: 'GetWeather',\n * args: { location: 'Los Angeles, CA' },\n * id: 'toolu_bdrk_01R2daqwHR931r4baVNzbe38',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetWeather',\n * args: { location: 'New York, NY' },\n * id: 'toolu_bdrk_01WDadwNc7PGqVZvCN7Dr7eD',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'Los Angeles, CA' },\n * id: 'toolu_bdrk_014b8zLkpAgpxrPfewKinJFc',\n * type: 'tool_call'\n * },\n * {\n * name: 'GetPopulation',\n * args: { location: 'New York, NY' },\n * id: 'toolu_bdrk_01Tt8K2MUP15kNuMDFCLEFKN',\n * type: 'tool_call'\n * }\n * ]\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Structured Output</strong></summary>\n *\n * ```typescript\n * const Joke = z.object({\n * setup: z.string().describe(\"The setup of the joke\"),\n * punchline: z.string().describe(\"The punchline to the joke\"),\n * rating: z.number().optional().describe(\"How funny the joke is, from 1 to 10\")\n * }).describe('Joke to tell user.');\n *\n * const structuredLlm = llm.withStructuredOutput(Joke);\n * const jokeResult = await structuredLlm.invoke(\"Tell me a joke about cats\");\n * console.log(jokeResult);\n * ```\n *\n * ```txt\n * {\n * setup: \"Why don't cats play poker in the jungle?\",\n * punchline: 'Too many cheetahs!'\n * }\n * ```\n * </details>\n *\n * <br />\n *\n * <details>\n * <summary><strong>Response Metadata</strong></summary>\n *\n * ```typescript\n * const aiMsgForResponseMetadata = await llm.invoke(input);\n * console.log(aiMsgForResponseMetadata.response_metadata);\n * ```\n *\n * ```txt\n * \"response_metadata\": {\n * \"type\": \"message\",\n * \"role\": \"assistant\",\n * \"model\": \"claude-sonnet-4-5-20250929\",\n * \"stop_reason\": \"end_turn\",\n * \"stop_sequence\": null,\n * \"usage\": {\n * \"input_tokens\": 25,\n * \"output_tokens\": 19\n * }\n * }\n * ```\n * </details>\n */\nexport class BedrockChat\n extends BaseChatModel<BedrockChatCallOptions, AIMessageChunk>\n implements BaseBedrockInput\n{\n model = \"amazon.titan-tg1-large\";\n\n modelProvider: string;\n\n region: string;\n\n credentials: CredentialType;\n\n temperature?: number | undefined = undefined;\n\n maxTokens?: number | undefined = undefined;\n\n fetchFn: typeof fetch;\n\n endpointHost?: string;\n\n modelKwargs?: Record<string, unknown>;\n\n codec: EventStreamCodec = new EventStreamCodec(toUtf8, fromUtf8);\n\n streaming = false;\n\n usesMessagesApi = false;\n\n lc_serializable = true;\n\n trace?: \"ENABLED\" | \"DISABLED\";\n\n guardrailIdentifier = \"\";\n\n guardrailVersion = \"\";\n\n guardrailConfig?: {\n tagSuffix: string;\n streamProcessingMode: \"SYNCHRONOUS\" | \"ASYNCHRONOUS\";\n };\n\n get lc_aliases(): Record<string, string> {\n return {\n model: \"model_id\",\n region: \"region_name\",\n };\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n \"credentials.accessKeyId\": \"AWS_ACCESS_KEY_ID\",\n \"credentials.secretAccessKey\": \"AWS_SECRET_ACCESS_KEY\",\n \"credentials.sessionToken\": \"AWS_SECRET_ACCESS_KEY\",\n awsAccessKeyId: \"AWS_ACCESS_KEY_ID\",\n awsSecretAccessKey: \"AWS_SECRET_ACCESS_KEY\",\n awsSessionToken: \"AWS_SESSION_TOKEN\",\n };\n }\n\n get lc_attributes(): SerializedFields | undefined {\n return { region: this.region };\n }\n\n _identifyingParams(): Record<string, string> {\n return {\n model: this.model,\n };\n }\n\n _llmType() {\n return \"bedrock\";\n }\n\n static lc_name() {\n return \"BedrockChat\";\n }\n\n constructor(fields?: BedrockChatFields) {\n const awsAccessKeyId =\n fields?.awsAccessKeyId ?? getEnvironmentVariable(\"AWS_ACCESS_KEY_ID\");\n const awsSecretAccessKey =\n fields?.awsSecretAccessKey ??\n getEnvironmentVariable(\"AWS_SECRET_ACCESS_KEY\");\n const awsSessionToken =\n fields?.awsSessionToken ?? getEnvironmentVariable(\"AWS_SESSION_TOKEN\");\n\n let credentials = fields?.credentials;\n if (credentials === undefined) {\n if (awsAccessKeyId === undefined || awsSecretAccessKey === undefined) {\n throw new Error(\n \"Please set your AWS credentials in the 'credentials' field or set env vars AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY, and optionally AWS_SESSION_TOKEN.\"\n );\n }\n credentials = {\n accessKeyId: awsAccessKeyId,\n secretAccessKey: awsSecretAccessKey,\n sessionToken: awsSessionToken,\n };\n }\n\n // eslint-disable-next-line no-param-reassign\n fields = { ...fields, awsAccessKeyId, awsSecretAccessKey, awsSessionToken };\n\n super(fields);\n\n this.model = fields?.model ?? this.model;\n this.modelProvider = getModelProvider(this.model);\n\n if (!ALLOWED_MODEL_PROVIDERS.includes(this.modelProvider)) {\n throw new Error(\n `Unknown model provider: '${this.modelProvider}', only these are supported: ${ALLOWED_MODEL_PROVIDERS}`\n );\n }\n const region =\n fields?.region ?? getEnvironmentVariable(\"AWS_DEFAULT_REGION\");\n if (!region) {\n throw new Error(\n \"Please set the AWS_DEFAULT_REGION environment variable or pass it to the constructor as the region field.\"\n );\n }\n this.region = region;\n\n this.credentials = credentials;\n\n this.temperature = fields?.temperature ?? this.temperature;\n this.maxTokens = fields?.maxTokens ?? this.maxTokens;\n this.fetchFn = fields?.fetchFn ?? fetch.bind(globalThis);\n this.endpointHost = fields?.endpointHost ?? fields?.endpointUrl;\n this.modelKwargs = fields?.modelKwargs;\n this.streaming = fields?.streaming ?? this.streaming;\n this.usesMessagesApi = canUseMessagesApi(this.model);\n this.trace = fields?.trace ?? this.trace;\n this.guardrailVersion = fields?.guardrailVersion ?? this.guardrailVersion;\n this.guardrailIdentifier =\n fields?.guardrailIdentifier ?? this.guardrailIdentifier;\n this.guardrailConfig = fields?.guardrailConfig;\n // Permit Application Inference Profile override in fetch URL (expects to be url-encoded)\n if (fields?.applicationInferenceProfile) {\n this.model = fields?.applicationInferenceProfile;\n }\n }\n\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n if (options?.tool_choice) {\n throw new Error(\n \"'tool_choice' call option is not supported by BedrockChat.\"\n );\n }\n\n return {\n tools: options?.tools ? formatTools(options.tools) : undefined,\n temperature: this.temperature,\n max_tokens: this.maxTokens,\n stop: options?.stop,\n modelKwargs: this.modelKwargs,\n guardrailConfig: this.guardrailConfig,\n };\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"bedrock\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.max_tokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n async _generate(\n messages: BaseMessage[],\n options: Partial<this[\"ParsedCallOptions\"]>,\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalResult: ChatGenerationChunk | undefined;\n for await (const chunk of stream) {\n if (finalResult === undefined) {\n finalResult = chunk;\n } else {\n finalResult = finalResult.concat(chunk);\n }\n }\n if (finalResult === undefined) {\n throw new Error(\n \"Could not parse final output from Bedrock streaming call.\"\n );\n }\n return {\n generations: [finalResult],\n llmOutput: finalResult.generationInfo,\n };\n }\n return this._generateNonStreaming(messages, options, runManager);\n }\n\n async _generateNonStreaming(\n messages: BaseMessage[],\n options: Partial<this[\"ParsedCallOptions\"]>,\n _runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const service = \"bedrock-runtime\";\n const endpointHost =\n this.endpointHost ?? `${service}.${this.region}.amazonaws.com`;\n const provider = this.modelProvider;\n const response = await this._signedFetch(messages, options, {\n bedrockMethod: \"invoke\",\n endpointHost,\n provider,\n });\n const json = await response.json();\n if (!response.ok) {\n throw new Error(\n `Error ${response.status}: ${json.message ?? JSON.stringify(json)}`\n );\n }\n if (this.usesMessagesApi) {\n const outputGeneration =\n BedrockLLMInputOutputAdapter.prepareMessagesOutput(provider, json);\n if (outputGeneration === undefined) {\n throw new Error(\"Failed to parse output generation.\");\n }\n return {\n generations: [outputGeneration],\n llmOutput: outputGeneration.generationInfo,\n };\n } else {\n const text = BedrockLLMInputOutputAdapter.prepareOutput(provider, json);\n return { generations: [{ text, message: new AIMessage(text) }] };\n }\n }\n\n async _signedFetch(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n fields: {\n bedrockMethod: \"invoke\" | \"invoke-with-response-stream\";\n endpointHost: string;\n provider: string;\n }\n ) {\n const { bedrockMethod, endpointHost, provider } = fields;\n const {\n max_tokens,\n temperature,\n stop,\n modelKwargs,\n guardrailConfig,\n tools,\n } = this.invocationParams(options);\n const inputBody = this.usesMessagesApi\n ? BedrockLLMInputOutputAdapter.prepareMessagesInput(\n provider,\n messages,\n max_tokens,\n temperature,\n stop,\n modelKwargs,\n guardrailConfig,\n tools\n )\n : BedrockLLMInputOutputAdapter.prepareInput(\n provider,\n convertMessagesToPromptAnthropic(messages),\n max_tokens,\n temperature,\n stop,\n modelKwargs,\n fields.bedrockMethod,\n guardrailConfig\n );\n\n const url = new URL(\n `https://${endpointHost}/model/${this.model}/${bedrockMethod}`\n );\n\n const request = new HttpRequest({\n hostname: url.hostname,\n path: url.pathname,\n protocol: url.protocol,\n method: \"POST\", // method must be uppercase\n body: JSON.stringify(inputBody),\n query: Object.fromEntries(url.searchParams.entries()),\n headers: {\n // host is required by AWS Signature V4: https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n host: url.host,\n accept: \"application/json\",\n \"content-type\": \"application/json\",\n ...(this.trace &&\n this.guardrailIdentifier &&\n this.guardrailVersion && {\n \"X-Amzn-Bedrock-Trace\": this.trace,\n \"X-Amzn-Bedrock-GuardrailIdentifier\": this.guardrailIdentifier,\n \"X-Amzn-Bedrock-GuardrailVersion\": this.guardrailVersion,\n }),\n },\n });\n\n const signer = new SignatureV4({\n credentials: this.credentials,\n service: \"bedrock\",\n region: this.region,\n sha256: Sha256,\n });\n\n const signedRequest = await signer.sign(request);\n\n // Send request to AWS using the low-level fetch API\n const response = await this.caller.callWithOptions(\n { signal: options.signal },\n async () =>\n this.fetchFn(url, {\n headers: signedRequest.headers,\n body: signedRequest.body,\n method: signedRequest.method,\n })\n );\n return response;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const provider = this.modelProvider;\n const service = \"bedrock-runtime\";\n\n const endpointHost =\n this.endpointHost ?? `${service}.${this.region}.amazonaws.com`;\n\n const bedrockMethod =\n provider === \"anthropic\" ||\n provider === \"cohere\" ||\n provider === \"meta\" ||\n provider === \"mistral\"\n ? \"invoke-with-response-stream\"\n : \"invoke\";\n\n const response = await this._signedFetch(messages, options, {\n bedrockMethod,\n endpointHost,\n provider,\n });\n\n if (response.status < 200 || response.status >= 300) {\n throw Error(\n `Failed to access underlying url '${endpointHost}': got ${\n response.status\n } ${response.statusText}: ${await response.text()}`\n );\n }\n\n if (\n provider === \"anthropic\" ||\n provider === \"cohere\" ||\n provider === \"meta\" ||\n provider === \"mistral\"\n ) {\n const toolsInParams = _toolsInParams(options);\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n for await (const chunk of this._readChunks(reader)) {\n const event = this.codec.decode(chunk);\n if (\n (event.headers[\":event-type\"] !== undefined &&\n event.headers[\":event-type\"].value !== \"chunk\") ||\n event.headers[\":content-type\"].value !== \"application/json\"\n ) {\n throw Error(`Failed to get event chunk: got ${chunk}`);\n }\n const body = JSON.parse(decoder.decode(event.body));\n if (body.message) {\n throw new Error(body.message);\n }\n if (body.bytes !== undefined) {\n const chunkResult = JSON.parse(\n decoder.decode(\n Uint8Array.from(atob(body.bytes), (m) => m.codePointAt(0) ?? 0)\n )\n );\n if (this.usesMessagesApi) {\n const chunk = BedrockLLMInputOutputAdapter.prepareMessagesOutput(\n provider,\n chunkResult,\n {\n // Content should _ONLY_ be coerced if tools are not in params\n // If they are, we need content to be of type MessageTypeComplex\n // so the tools can be passed through.\n coerceContentToString: !toolsInParams,\n }\n );\n if (chunk === undefined) {\n continue;\n }\n if (\n provider === \"anthropic\" &&\n chunk.generationInfo?.usage !== undefined\n ) {\n // Avoid bad aggregation in chunks, rely on final Bedrock data\n delete chunk.generationInfo.usage;\n }\n const finalMetrics =\n chunk.generationInfo?.[\"amazon-bedrock-invocationMetrics\"];\n if (\n finalMetrics != null &&\n typeof finalMetrics === \"object\" &&\n isAIMessage(chunk.message)\n ) {\n chunk.message.usage_metadata = {\n input_tokens: finalMetrics.inputTokenCount,\n output_tokens: finalMetrics.outputTokenCount,\n total_tokens:\n finalMetrics.inputTokenCount + finalMetrics.outputTokenCount,\n };\n }\n if (isChatGenerationChunk(chunk)) {\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(\n chunk.text,\n undefined,\n undefined,\n undefined,\n undefined,\n {\n chunk,\n }\n );\n } else {\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(chunk.text);\n }\n } else {\n const text = BedrockLLMInputOutputAdapter.prepareOutput(\n provider,\n chunkResult\n );\n const chunk = new ChatGenerationChunk({\n text,\n message: new AIMessageChunk({ content: text }),\n });\n yield chunk;\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(\n text,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n } else {\n const json = await response.json();\n const text = BedrockLLMInputOutputAdapter.prepareOutput(provider, json);\n yield new ChatGenerationChunk({\n text,\n message: new AIMessageChunk({ content: text }),\n });\n // eslint-disable-next-line no-void\n void runManager?.handleLLMNewToken(text);\n }\n }\n\n // oxlint-disable-next-line typescript/no-explicit-any\n _readChunks(reader: any) {\n function _concatChunks(a: Uint8Array, b: Uint8Array) {\n const newBuffer = new Uint8Array(a.length + b.length);\n newBuffer.set(a);\n newBuffer.set(b, a.length);\n return newBuffer;\n }\n\n function getMessageLength(buffer: Uint8Array) {\n if (buffer.byteLength < PRELUDE_TOTAL_LENGTH_BYTES) return 0;\n const view = new DataView(\n buffer.buffer,\n buffer.byteOffset,\n buffer.byteLength\n );\n\n return view.getUint32(0, false);\n }\n\n return {\n async *[Symbol.asyncIterator]() {\n let readResult = await reader.read();\n\n let buffer: Uint8Array = new Uint8Array(0);\n while (!readResult.done) {\n const chunk: Uint8Array = readResult.value;\n\n buffer = _concatChunks(buffer, chunk);\n let messageLength = getMessageLength(buffer);\n\n while (\n buffer.byteLength >= PRELUDE_TOTAL_LENGTH_BYTES &&\n buffer.byteLength >= messageLength\n ) {\n yield buffer.slice(0, messageLength);\n buffer = buffer.slice(messageLength);\n messageLength = getMessageLength(buffer);\n }\n\n readResult = await reader.read();\n }\n },\n };\n }\n\n _combineLLMOutput() {\n return {};\n }\n\n override bindTools(\n tools: BedrockChatToolType[],\n _kwargs?: Partial<this[\"ParsedCallOptions\"]>\n ): Runnable<\n BaseLanguageModelInput,\n BaseMessageChunk,\n this[\"ParsedCallOptions\"]\n > {\n const provider = this.modelProvider;\n if (provider !== \"anthropic\") {\n throw new Error(\n \"Currently, tool calling through Bedrock is only supported for Anthropic models.\"\n );\n }\n return this.withConfig({\n tools: formatTools(tools),\n });\n }\n}\n\nfunction isChatGenerationChunk(\n x?: ChatGenerationChunk | ChatGeneration\n): x is ChatGenerationChunk {\n return (\n x !== undefined && typeof (x as ChatGenerationChunk).concat === \"function\"\n );\n}\n\nfunction canUseMessagesApi(model: string): boolean {\n const modelProviderName = getModelProvider(model);\n\n if (\n modelProviderName === \"anthropic\" &&\n !model.includes(\"claude-v2\") &&\n !model.includes(\"claude-instant-v1\")\n ) {\n return true;\n }\n\n if (modelProviderName === \"cohere\") {\n if (model.includes(\"command-r-v1\")) {\n return true;\n }\n if (model.includes(\"command-r-plus-v1\")) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isInferenceModel(modelId: string): boolean {\n const parts = modelId.split(\".\");\n return AWS_REGIONS.some((region) => parts[0] === region);\n}\n\nfunction getModelProvider(modelId: string): string {\n const parts = modelId.split(\".\");\n if (isInferenceModel(modelId)) {\n return parts[1];\n } else {\n return parts[0];\n }\n}\n"],"mappings":"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"}