@librechat/agents 3.1.74 → 3.1.75-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -0
- package/dist/cjs/agents/AgentContext.cjs +84 -37
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +13 -3
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/langchain/google-common.cjs +3 -0
- package/dist/cjs/langchain/google-common.cjs.map +1 -0
- package/dist/cjs/langchain/index.cjs +86 -0
- package/dist/cjs/langchain/index.cjs.map +1 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs +3 -0
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +1 -0
- package/dist/cjs/langchain/messages/tool.cjs +3 -0
- package/dist/cjs/langchain/messages/tool.cjs.map +1 -0
- package/dist/cjs/langchain/messages.cjs +51 -0
- package/dist/cjs/langchain/messages.cjs.map +1 -0
- package/dist/cjs/langchain/openai.cjs +3 -0
- package/dist/cjs/langchain/openai.cjs.map +1 -0
- package/dist/cjs/langchain/prompts.cjs +11 -0
- package/dist/cjs/langchain/prompts.cjs.map +1 -0
- package/dist/cjs/langchain/runnables.cjs +19 -0
- package/dist/cjs/langchain/runnables.cjs.map +1 -0
- package/dist/cjs/langchain/tools.cjs +23 -0
- package/dist/cjs/langchain/tools.cjs.map +1 -0
- package/dist/cjs/langchain/utils/env.cjs +11 -0
- package/dist/cjs/langchain/utils/env.cjs.map +1 -0
- package/dist/cjs/llm/anthropic/index.cjs +145 -52
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +25 -15
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +84 -70
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +1 -1
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +213 -3
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +2 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +5 -4
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +468 -647
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +1 -448
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +57 -175
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +5 -3
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +83 -3
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +39 -4
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +7 -6
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +7 -6
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/langchain.cjs +26 -0
- package/dist/cjs/messages/langchain.cjs.map +1 -0
- package/dist/cjs/messages/prune.cjs +7 -6
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +5 -1
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +85 -38
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +13 -3
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/langchain/google-common.mjs +2 -0
- package/dist/esm/langchain/google-common.mjs.map +1 -0
- package/dist/esm/langchain/index.mjs +5 -0
- package/dist/esm/langchain/index.mjs.map +1 -0
- package/dist/esm/langchain/language_models/chat_models.mjs +2 -0
- package/dist/esm/langchain/language_models/chat_models.mjs.map +1 -0
- package/dist/esm/langchain/messages/tool.mjs +2 -0
- package/dist/esm/langchain/messages/tool.mjs.map +1 -0
- package/dist/esm/langchain/messages.mjs +2 -0
- package/dist/esm/langchain/messages.mjs.map +1 -0
- package/dist/esm/langchain/openai.mjs +2 -0
- package/dist/esm/langchain/openai.mjs.map +1 -0
- package/dist/esm/langchain/prompts.mjs +2 -0
- package/dist/esm/langchain/prompts.mjs.map +1 -0
- package/dist/esm/langchain/runnables.mjs +2 -0
- package/dist/esm/langchain/runnables.mjs.map +1 -0
- package/dist/esm/langchain/tools.mjs +2 -0
- package/dist/esm/langchain/tools.mjs.map +1 -0
- package/dist/esm/langchain/utils/env.mjs +2 -0
- package/dist/esm/langchain/utils/env.mjs.map +1 -0
- package/dist/esm/llm/anthropic/index.mjs +146 -54
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +25 -15
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +84 -71
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +1 -1
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +214 -4
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +2 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +5 -4
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +469 -648
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +4 -449
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +57 -175
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +5 -3
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +4 -0
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +39 -4
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +7 -6
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +7 -6
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/langchain.mjs +23 -0
- package/dist/esm/messages/langchain.mjs.map +1 -0
- package/dist/esm/messages/prune.mjs +7 -6
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +5 -1
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/types/agents/AgentContext.d.ts +14 -4
- package/dist/types/agents/__tests__/promptCacheLiveHelpers.d.ts +46 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/langchain/google-common.d.ts +1 -0
- package/dist/types/langchain/index.d.ts +8 -0
- package/dist/types/langchain/language_models/chat_models.d.ts +1 -0
- package/dist/types/langchain/messages/tool.d.ts +1 -0
- package/dist/types/langchain/messages.d.ts +2 -0
- package/dist/types/langchain/openai.d.ts +1 -0
- package/dist/types/langchain/prompts.d.ts +1 -0
- package/dist/types/langchain/runnables.d.ts +2 -0
- package/dist/types/langchain/tools.d.ts +2 -0
- package/dist/types/langchain/utils/env.d.ts +1 -0
- package/dist/types/llm/anthropic/index.d.ts +22 -9
- package/dist/types/llm/anthropic/types.d.ts +5 -1
- package/dist/types/llm/anthropic/utils/message_outputs.d.ts +13 -6
- package/dist/types/llm/anthropic/utils/output_parsers.d.ts +1 -1
- package/dist/types/llm/openai/index.d.ts +21 -24
- package/dist/types/llm/openrouter/index.d.ts +11 -9
- package/dist/types/llm/vertexai/index.d.ts +1 -0
- package/dist/types/messages/cache.d.ts +4 -1
- package/dist/types/messages/langchain.d.ts +27 -0
- package/dist/types/types/graph.d.ts +26 -38
- package/dist/types/types/llm.d.ts +3 -3
- package/dist/types/types/run.d.ts +2 -0
- package/dist/types/types/stream.d.ts +1 -1
- package/package.json +80 -17
- package/src/agents/AgentContext.ts +123 -44
- package/src/agents/__tests__/AgentContext.anthropic.live.test.ts +116 -0
- package/src/agents/__tests__/AgentContext.bedrock.live.test.ts +149 -0
- package/src/agents/__tests__/AgentContext.test.ts +155 -2
- package/src/agents/__tests__/promptCacheLiveHelpers.ts +165 -0
- package/src/graphs/Graph.ts +24 -4
- package/src/graphs/__tests__/composition.smoke.test.ts +188 -0
- package/src/index.ts +3 -0
- package/src/langchain/google-common.ts +1 -0
- package/src/langchain/index.ts +8 -0
- package/src/langchain/language_models/chat_models.ts +1 -0
- package/src/langchain/messages/tool.ts +5 -0
- package/src/langchain/messages.ts +21 -0
- package/src/langchain/openai.ts +1 -0
- package/src/langchain/prompts.ts +1 -0
- package/src/langchain/runnables.ts +7 -0
- package/src/langchain/tools.ts +8 -0
- package/src/langchain/utils/env.ts +1 -0
- package/src/llm/anthropic/index.ts +252 -84
- package/src/llm/anthropic/llm.spec.ts +751 -102
- package/src/llm/anthropic/types.ts +9 -1
- package/src/llm/anthropic/utils/message_inputs.ts +43 -20
- package/src/llm/anthropic/utils/message_outputs.ts +119 -101
- package/src/llm/anthropic/utils/server-tool-inputs.test.ts +77 -0
- package/src/llm/bedrock/index.ts +2 -2
- package/src/llm/bedrock/llm.spec.ts +341 -0
- package/src/llm/bedrock/utils/message_inputs.ts +303 -4
- package/src/llm/bedrock/utils/message_outputs.ts +2 -1
- package/src/llm/custom-chat-models.smoke.test.ts +662 -0
- package/src/llm/google/llm.spec.ts +339 -57
- package/src/llm/google/utils/common.ts +53 -48
- package/src/llm/openai/contentBlocks.test.ts +346 -0
- package/src/llm/openai/index.ts +736 -837
- package/src/llm/openai/utils/index.ts +84 -64
- package/src/llm/openrouter/index.ts +124 -247
- package/src/llm/openrouter/reasoning.test.ts +8 -1
- package/src/llm/vertexai/index.ts +11 -5
- package/src/llm/vertexai/llm.spec.ts +28 -1
- package/src/messages/cache.test.ts +106 -4
- package/src/messages/cache.ts +57 -5
- package/src/messages/core.ts +16 -9
- package/src/messages/format.ts +9 -6
- package/src/messages/langchain.ts +39 -0
- package/src/messages/prune.ts +12 -8
- package/src/scripts/caching.ts +2 -3
- package/src/specs/anthropic.simple.test.ts +61 -0
- package/src/specs/summarization.test.ts +58 -61
- package/src/tools/ToolNode.ts +5 -1
- package/src/types/graph.ts +35 -88
- package/src/types/llm.ts +3 -3
- package/src/types/run.ts +2 -0
- package/src/types/stream.ts +1 -1
- package/src/utils/llmConfig.ts +1 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_outputs.cjs","sources":["../../../../../src/llm/anthropic/utils/message_outputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting Anthropic messages to LangChain messages.\n */\nimport Anthropic from '@anthropic-ai/sdk';\nimport {\n AIMessage,\n AIMessageChunk,\n UsageMetadata,\n} from '@langchain/core/messages';\nimport type { ToolCallChunk } from '@langchain/core/messages/tool';\nimport { ChatGeneration } from '@langchain/core/outputs';\nimport { extractToolCalls } from './output_parsers';\nimport { AnthropicMessageResponse } from '../types';\n\nfunction _isAnthropicCompactionBlock(\n block: unknown\n): block is Anthropic.Beta.BetaCompactionBlockParam {\n return (\n typeof block === 'object' &&\n block !== null &&\n 'type' in block &&\n block.type === 'compaction'\n );\n}\n\nexport function _makeMessageChunkFromAnthropicEvent(\n data: Anthropic.Beta.Messages.BetaRawMessageStreamEvent,\n fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n }\n): {\n chunk: AIMessageChunk;\n} | null {\n if (data.type === 'message_start') {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { content, usage, ...additionalKwargs } = data.message;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredAdditionalKwargs: Record<string, any> = {};\n for (const [key, value] of Object.entries(additionalKwargs)) {\n if (value !== undefined && value !== null) {\n filteredAdditionalKwargs[key] = value;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata: UsageMetadata = {\n input_tokens,\n output_tokens,\n total_tokens: input_tokens + output_tokens,\n input_token_details: {\n cache_creation: rest.cache_creation_input_tokens,\n cache_read: rest.cache_read_input_tokens,\n },\n };\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? '' : [],\n additional_kwargs: filteredAdditionalKwargs,\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n response_metadata: {\n usage: {\n ...rest,\n },\n },\n id: data.message.id,\n }),\n };\n } else if (data.type === 'message_delta') {\n const usageMetadata: UsageMetadata = {\n input_tokens: 0,\n output_tokens: data.usage.output_tokens,\n total_tokens: data.usage.output_tokens,\n input_token_details: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cache_creation: (data.usage as any).cache_creation_input_tokens,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n cache_read: (data.usage as any).cache_read_input_tokens,\n },\n };\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? '' : [],\n additional_kwargs: { ...data.delta },\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n [\n 'tool_use',\n 'document',\n 'server_tool_use',\n 'web_search_tool_result',\n ].includes(data.content_block.type)\n ) {\n const contentBlock = data.content_block;\n let toolCallChunks: ToolCallChunk[];\n if (contentBlock.type === 'tool_use') {\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: '',\n },\n ];\n } else if (contentBlock.type === 'server_tool_use') {\n // Handle anthropic built-in server tool use (like web search)\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: '',\n },\n ];\n } else {\n toolCallChunks = [];\n }\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? ''\n : [\n {\n index: data.index,\n ...data.content_block,\n input:\n contentBlock.type === 'server_tool_use' ||\n contentBlock.type === 'tool_use'\n ? ''\n : undefined,\n },\n ],\n additional_kwargs: {},\n tool_call_chunks: toolCallChunks,\n }),\n };\n } else if (\n data.type === 'content_block_delta' &&\n [\n 'text_delta',\n 'citations_delta',\n 'thinking_delta',\n 'signature_delta',\n ].includes(data.delta.type)\n ) {\n if (fields.coerceContentToString && 'text' in data.delta) {\n return {\n chunk: new AIMessageChunk({\n content: data.delta.text,\n }),\n };\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const contentBlock: Record<string, any> = data.delta;\n if ('citation' in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === 'thinking_delta' ||\n contentBlock.type === 'signature_delta'\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: 'thinking' }],\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: 'text' }],\n }),\n };\n }\n } else if (\n data.type === 'content_block_delta' &&\n data.delta.type === 'input_json_delta'\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? ''\n : [\n {\n index: data.index,\n input: data.delta.partial_json,\n type: data.delta.type,\n },\n ],\n additional_kwargs: {},\n tool_call_chunks: [\n {\n index: data.index,\n args: data.delta.partial_json,\n },\n ],\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n data.content_block.type === 'text'\n ) {\n const content = data.content_block.text;\n if (content !== undefined) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [\n {\n index: data.index,\n ...data.content_block,\n },\n ],\n additional_kwargs: {},\n }),\n };\n }\n } else if (\n data.type === 'content_block_start' &&\n data.content_block.type === 'redacted_thinking'\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? ''\n : [{ index: data.index, ...data.content_block }],\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n data.content_block.type === 'thinking'\n ) {\n const content = data.content_block.thinking;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [{ index: data.index, ...data.content_block }],\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n _isAnthropicCompactionBlock(data.content_block)\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? ''\n : [{ index: data.index, ...data.content_block }],\n }),\n };\n } else if (\n data.type === 'content_block_delta' &&\n data.delta.type === 'compaction_delta'\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? ''\n : [\n {\n index: data.index,\n ...data.delta,\n type: 'compaction',\n },\n ],\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata =\n usage != null\n ? {\n input_tokens: usage.input_tokens ?? 0,\n output_tokens: usage.output_tokens ?? 0,\n total_tokens: (usage.input_tokens ?? 0) + (usage.output_tokens ?? 0),\n input_token_details: {\n cache_creation: usage.cache_creation_input_tokens,\n cache_read: usage.cache_read_input_tokens,\n },\n }\n : undefined;\n if (messages.length === 1 && messages[0].type === 'text') {\n return [\n {\n text: messages[0].text,\n message: new AIMessage({\n content: messages[0].text,\n additional_kwargs: additionalKwargs,\n usage_metadata: usageMetadata,\n response_metadata: additionalKwargs,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n } else {\n const toolCalls = extractToolCalls(messages);\n const generations: ChatGeneration[] = [\n {\n text: '',\n message: new AIMessage({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n content: messages as any,\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata: additionalKwargs,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n"],"names":["AIMessageChunk"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message_outputs.cjs","sources":["../../../../../src/llm/anthropic/utils/message_outputs.ts"],"sourcesContent":["/** This util file contains functions for converting Anthropic messages to LangChain messages. */\nimport { AIMessage, AIMessageChunk } from '@langchain/core/messages';\n\nimport type Anthropic from '@anthropic-ai/sdk';\nimport type { UsageMetadata } from '@langchain/core/messages';\nimport type { ToolCallChunk } from '@langchain/core/messages/tool';\nimport type { ChatGeneration } from '@langchain/core/outputs';\nimport type { MessageContentComplex } from '@/types';\nimport type { AnthropicMessageResponse } from '../types';\n\nimport { toLangChainContent } from '@/messages/langchain';\nimport { extractToolCalls } from './output_parsers';\n\ninterface AnthropicUsageData {\n input_tokens?: number | null;\n output_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n cache_read_input_tokens?: number | null;\n}\n\nexport function getAnthropicUsageMetadata(\n usage: AnthropicUsageData | null | undefined\n): UsageMetadata | undefined {\n if (usage == null) {\n return undefined;\n }\n\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Anthropic reports uncached input separately from cache creation/read tokens.\n const inputTokens =\n (usage.input_tokens ?? 0) + cacheCreationInputTokens + cacheReadInputTokens;\n const outputTokens = usage.output_tokens ?? 0;\n\n return {\n input_tokens: inputTokens,\n output_tokens: outputTokens,\n total_tokens: inputTokens + outputTokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n\nfunction _isAnthropicCompactionBlock(\n block: unknown\n): block is Anthropic.Beta.BetaCompactionBlockParam {\n return (\n typeof block === 'object' &&\n block !== null &&\n 'type' in block &&\n block.type === 'compaction'\n );\n}\n\nexport function _makeMessageChunkFromAnthropicEvent(\n data: Anthropic.Beta.Messages.BetaRawMessageStreamEvent,\n fields: {\n streamUsage: boolean;\n coerceContentToString: boolean;\n }\n): {\n chunk: AIMessageChunk;\n} | null {\n const responseMetadata = { model_provider: 'anthropic' };\n if (data.type === 'message_start') {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { content, usage, ...additionalKwargs } = data.message;\n const {\n input_tokens: _inputTokens,\n output_tokens: _outputTokens,\n ...rest\n } = usage;\n const usageMetadata = getAnthropicUsageMetadata(usage);\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? '' : [],\n additional_kwargs: additionalKwargs,\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n response_metadata: {\n ...responseMetadata,\n usage: {\n ...rest,\n },\n },\n id: data.message.id,\n }),\n };\n } else if (data.type === 'message_delta') {\n const messageDeltaResponseMetadata = { ...responseMetadata };\n if ('context_management' in data.delta) {\n Object.assign(messageDeltaResponseMetadata, {\n context_management: data.delta.context_management,\n });\n }\n const usageMetadata: UsageMetadata = {\n input_tokens: 0,\n output_tokens: data.usage.output_tokens,\n total_tokens: data.usage.output_tokens,\n input_token_details: {\n cache_creation: data.usage.cache_creation_input_tokens ?? undefined,\n cache_read: data.usage.cache_read_input_tokens ?? undefined,\n },\n };\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? '' : [],\n response_metadata: messageDeltaResponseMetadata,\n additional_kwargs: { ...data.delta },\n usage_metadata: fields.streamUsage ? usageMetadata : undefined,\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n [\n 'tool_use',\n 'document',\n 'server_tool_use',\n 'web_search_tool_result',\n ].includes(data.content_block.type)\n ) {\n const contentBlock = data.content_block;\n let toolCallChunks: ToolCallChunk[];\n if (contentBlock.type === 'tool_use') {\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: '',\n },\n ];\n } else if (contentBlock.type === 'server_tool_use') {\n // Handle anthropic built-in server tool use (like web search)\n toolCallChunks = [\n {\n id: contentBlock.id,\n index: data.index,\n name: contentBlock.name,\n args: '',\n },\n ];\n } else {\n toolCallChunks = [];\n }\n const content = [\n {\n index: data.index,\n ...data.content_block,\n input:\n contentBlock.type === 'server_tool_use' ||\n contentBlock.type === 'tool_use'\n ? ''\n : undefined,\n },\n ];\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? '' : content,\n response_metadata: responseMetadata,\n additional_kwargs: {},\n tool_call_chunks: toolCallChunks,\n }),\n };\n } else if (\n data.type === 'content_block_delta' &&\n [\n 'text_delta',\n 'citations_delta',\n 'thinking_delta',\n 'signature_delta',\n ].includes(data.delta.type)\n ) {\n if (fields.coerceContentToString && 'text' in data.delta) {\n return {\n chunk: new AIMessageChunk({\n content: data.delta.text,\n }),\n };\n } else {\n const contentBlock: Record<string, unknown> = { ...data.delta };\n if ('citation' in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === 'thinking_delta' ||\n contentBlock.type === 'signature_delta'\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: 'thinking' }],\n response_metadata: responseMetadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: 'text' }],\n response_metadata: responseMetadata,\n }),\n };\n }\n } else if (\n data.type === 'content_block_delta' &&\n data.delta.type === 'input_json_delta'\n ) {\n const content = [\n {\n index: data.index,\n input: data.delta.partial_json,\n type: data.delta.type,\n },\n ];\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? '' : content,\n response_metadata: responseMetadata,\n additional_kwargs: {},\n tool_call_chunks: [\n {\n index: data.index,\n args: data.delta.partial_json,\n },\n ],\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n data.content_block.type === 'text'\n ) {\n const content = data.content_block.text;\n const contentBlock = [\n {\n index: data.index,\n ...data.content_block,\n },\n ];\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? content : contentBlock,\n response_metadata: responseMetadata,\n additional_kwargs: {},\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n data.content_block.type === 'redacted_thinking'\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? ''\n : [{ index: data.index, ...data.content_block }],\n response_metadata: responseMetadata,\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n data.content_block.type === 'thinking'\n ) {\n const content = data.content_block.thinking;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? content\n : [{ index: data.index, ...data.content_block }],\n response_metadata: responseMetadata,\n }),\n };\n } else if (\n data.type === 'content_block_start' &&\n _isAnthropicCompactionBlock(data.content_block)\n ) {\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString\n ? ''\n : [{ index: data.index, ...data.content_block }],\n response_metadata: responseMetadata,\n }),\n };\n } else if (\n data.type === 'content_block_delta' &&\n data.delta.type === 'compaction_delta'\n ) {\n const content = [\n {\n index: data.index,\n ...data.delta,\n type: 'compaction',\n },\n ];\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? '' : content,\n response_metadata: responseMetadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const responseMetadata = {\n ...additionalKwargs,\n model_provider: 'anthropic',\n };\n const usage = additionalKwargs.usage as AnthropicUsageData | null | undefined;\n const usageMetadata = getAnthropicUsageMetadata(usage);\n if (messages.length === 1 && messages[0].type === 'text') {\n return [\n {\n text: messages[0].text,\n message: new AIMessage({\n content: messages[0].text,\n additional_kwargs: additionalKwargs,\n usage_metadata: usageMetadata,\n response_metadata: responseMetadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n } else {\n const toolCalls = extractToolCalls(messages);\n const generations: ChatGeneration[] = [\n {\n text: '',\n message: new AIMessage({\n content: toLangChainContent(messages as MessageContentComplex[]),\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata: responseMetadata,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n"],"names":["AIMessageChunk"],"mappings":";;;;;;AAAA;AAoBM,SAAU,yBAAyB,CACvC,KAA4C,EAAA;AAE5C,IAAA,IAAI,KAAK,IAAI,IAAI,EAAE;AACjB,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,MAAM,wBAAwB,GAAG,KAAK,CAAC,2BAA2B,IAAI,CAAC;AACvE,IAAA,MAAM,oBAAoB,GAAG,KAAK,CAAC,uBAAuB,IAAI,CAAC;;AAE/D,IAAA,MAAM,WAAW,GACf,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,IAAI,wBAAwB,GAAG,oBAAoB;AAC7E,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,IAAI,CAAC;IAE7C,OAAO;AACL,QAAA,YAAY,EAAE,WAAW;AACzB,QAAA,aAAa,EAAE,YAAY;QAC3B,YAAY,EAAE,WAAW,GAAG,YAAY;AACxC,QAAA,mBAAmB,EAAE;AACnB,YAAA,cAAc,EAAE,wBAAwB;AACxC,YAAA,UAAU,EAAE,oBAAoB;AACjC,SAAA;KACF;AACH;AAEA,SAAS,2BAA2B,CAClC,KAAc,EAAA;AAEd,IAAA,QACE,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,KAAK,KAAK,IAAI;AACd,QAAA,MAAM,IAAI,KAAK;AACf,QAAA,KAAK,CAAC,IAAI,KAAK,YAAY;AAE/B;AAEM,SAAU,mCAAmC,CACjD,IAAuD,EACvD,MAGC,EAAA;AAID,IAAA,MAAM,gBAAgB,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE;AACxD,IAAA,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE;;AAEjC,QAAA,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,gBAAgB,EAAE,GAAG,IAAI,CAAC,OAAO;AAC5D,QAAA,MAAM,EACJ,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,EAC5B,GAAG,IAAI,EACR,GAAG,KAAK;AACT,QAAA,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC;QACtD,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC,qBAAqB,GAAG,EAAE,GAAG,EAAE;AAC/C,gBAAA,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,MAAM,CAAC,WAAW,GAAG,aAAa,GAAG,SAAS;AAC9D,gBAAA,iBAAiB,EAAE;AACjB,oBAAA,GAAG,gBAAgB;AACnB,oBAAA,KAAK,EAAE;AACL,wBAAA,GAAG,IAAI;AACR,qBAAA;AACF,iBAAA;AACD,gBAAA,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;aACpB,CAAC;SACH;IACH;AAAO,SAAA,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE;AACxC,QAAA,MAAM,4BAA4B,GAAG,EAAE,GAAG,gBAAgB,EAAE;AAC5D,QAAA,IAAI,oBAAoB,IAAI,IAAI,CAAC,KAAK,EAAE;AACtC,YAAA,MAAM,CAAC,MAAM,CAAC,4BAA4B,EAAE;AAC1C,gBAAA,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,kBAAkB;AAClD,aAAA,CAAC;QACJ;AACA,QAAA,MAAM,aAAa,GAAkB;AACnC,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;AACvC,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa;AACtC,YAAA,mBAAmB,EAAE;AACnB,gBAAA,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,2BAA2B,IAAI,SAAS;AACnE,gBAAA,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,uBAAuB,IAAI,SAAS;AAC5D,aAAA;SACF;QACD,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC,qBAAqB,GAAG,EAAE,GAAG,EAAE;AAC/C,gBAAA,iBAAiB,EAAE,4BAA4B;AAC/C,gBAAA,iBAAiB,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;gBACpC,cAAc,EAAE,MAAM,CAAC,WAAW,GAAG,aAAa,GAAG,SAAS;aAC/D,CAAC;SACH;IACH;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA;YACE,UAAU;YACV,UAAU;YACV,iBAAiB;YACjB,wBAAwB;SACzB,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EACnC;AACA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa;AACvC,QAAA,IAAI,cAA+B;AACnC,QAAA,IAAI,YAAY,CAAC,IAAI,KAAK,UAAU,EAAE;AACpC,YAAA,cAAc,GAAG;AACf,gBAAA;oBACE,EAAE,EAAE,YAAY,CAAC,EAAE;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,YAAY,CAAC,IAAI;AACvB,oBAAA,IAAI,EAAE,EAAE;AACT,iBAAA;aACF;QACH;AAAO,aAAA,IAAI,YAAY,CAAC,IAAI,KAAK,iBAAiB,EAAE;;AAElD,YAAA,cAAc,GAAG;AACf,gBAAA;oBACE,EAAE,EAAE,YAAY,CAAC,EAAE;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,YAAY,CAAC,IAAI;AACvB,oBAAA,IAAI,EAAE,EAAE;AACT,iBAAA;aACF;QACH;aAAO;YACL,cAAc,GAAG,EAAE;QACrB;AACA,QAAA,MAAM,OAAO,GAAG;AACd,YAAA;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,GAAG,IAAI,CAAC,aAAa;AACrB,gBAAA,KAAK,EACH,YAAY,CAAC,IAAI,KAAK,iBAAiB;oBACvC,YAAY,CAAC,IAAI,KAAK;AACpB,sBAAE;AACF,sBAAE,SAAS;AAChB,aAAA;SACF;QACD,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC,qBAAqB,GAAG,EAAE,GAAG,OAAO;AACpD,gBAAA,iBAAiB,EAAE,gBAAgB;AACnC,gBAAA,iBAAiB,EAAE,EAAE;AACrB,gBAAA,gBAAgB,EAAE,cAAc;aACjC,CAAC;SACH;IACH;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA;YACE,YAAY;YACZ,iBAAiB;YACjB,gBAAgB;YAChB,iBAAiB;SAClB,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAC3B;QACA,IAAI,MAAM,CAAC,qBAAqB,IAAI,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE;YACxD,OAAO;gBACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;AACxB,oBAAA,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;iBACzB,CAAC;aACH;QACH;aAAO;YACL,MAAM,YAAY,GAA4B,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;AAC/D,YAAA,IAAI,UAAU,IAAI,YAAY,EAAE;gBAC9B,YAAY,CAAC,SAAS,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;gBAChD,OAAO,YAAY,CAAC,QAAQ;YAC9B;AACA,YAAA,IACE,YAAY,CAAC,IAAI,KAAK,gBAAgB;AACtC,gBAAA,YAAY,CAAC,IAAI,KAAK,iBAAiB,EACvC;gBACA,OAAO;oBACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;AACxB,wBAAA,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACnE,wBAAA,iBAAiB,EAAE,gBAAgB;qBACpC,CAAC;iBACH;YACH;YAEA,OAAO;gBACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;AACxB,oBAAA,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/D,oBAAA,iBAAiB,EAAE,gBAAgB;iBACpC,CAAC;aACH;QACH;IACF;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,EACtC;AACA,QAAA,MAAM,OAAO,GAAG;AACd,YAAA;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,gBAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AAC9B,gBAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACtB,aAAA;SACF;QACD,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC,qBAAqB,GAAG,EAAE,GAAG,OAAO;AACpD,gBAAA,iBAAiB,EAAE,gBAAgB;AACnC,gBAAA,iBAAiB,EAAE,EAAE;AACrB,gBAAA,gBAAgB,EAAE;AAChB,oBAAA;wBACE,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,wBAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AAC9B,qBAAA;AACF,iBAAA;aACF,CAAC;SACH;IACH;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,MAAM,EAClC;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI;AACvC,QAAA,MAAM,YAAY,GAAG;AACnB,YAAA;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,GAAG,IAAI,CAAC,aAAa;AACtB,aAAA;SACF;QACD,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC,qBAAqB,GAAG,OAAO,GAAG,YAAY;AAC9D,gBAAA,iBAAiB,EAAE,gBAAgB;AACnC,gBAAA,iBAAiB,EAAE,EAAE;aACtB,CAAC;SACH;IACH;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,mBAAmB,EAC/C;QACA,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC;AACd,sBAAE;AACF,sBAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAClD,gBAAA,iBAAiB,EAAE,gBAAgB;aACpC,CAAC;SACH;IACH;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,UAAU,EACtC;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ;QAC3C,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC;AACd,sBAAE;AACF,sBAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAClD,gBAAA,iBAAiB,EAAE,gBAAgB;aACpC,CAAC;SACH;IACH;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA,2BAA2B,CAAC,IAAI,CAAC,aAAa,CAAC,EAC/C;QACA,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC;AACd,sBAAE;AACF,sBAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AAClD,gBAAA,iBAAiB,EAAE,gBAAgB;aACpC,CAAC;SACH;IACH;AAAO,SAAA,IACL,IAAI,CAAC,IAAI,KAAK,qBAAqB;AACnC,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,EACtC;AACA,QAAA,MAAM,OAAO,GAAG;AACd,YAAA;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,GAAG,IAAI,CAAC,KAAK;AACb,gBAAA,IAAI,EAAE,YAAY;AACnB,aAAA;SACF;QACD,OAAO;YACL,KAAK,EAAE,IAAIA,uBAAc,CAAC;gBACxB,OAAO,EAAE,MAAM,CAAC,qBAAqB,GAAG,EAAE,GAAG,OAAO;AACpD,gBAAA,iBAAiB,EAAE,gBAAgB;aACpC,CAAC;SACH;IACH;AACA,IAAA,OAAO,IAAI;AACb;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/llm/bedrock/index.ts"],"sourcesContent":["/**\n * Optimized ChatBedrockConverse wrapper that fixes content block merging for\n * streaming responses and adds support for latest @langchain/aws features:\n *\n * - Application Inference Profiles (PR #9129)\n * - Service Tiers (Priority/Standard/Flex) (PR #9785) - requires AWS SDK 3.966.0+\n *\n * Bedrock's `@langchain/aws` library does not include an `index` property on content\n * blocks (unlike Anthropic/OpenAI), which causes LangChain's `_mergeLists` to append\n * each streaming chunk as a separate array entry instead of merging by index.\n *\n * This wrapper takes full ownership of the stream by directly interfacing with the\n * AWS SDK client (`this.client`) and using custom handlers from `./utils/` that\n * include `contentBlockIndex` in response_metadata for every delta type. It then\n * promotes `contentBlockIndex` to an `index` property on each content block\n * (mirroring Anthropic's pattern) and strips it from metadata to avoid\n * `_mergeDicts` conflicts.\n *\n * When multiple content block types are present (e.g. reasoning + text), text deltas\n * are promoted from strings to array form with `index` so they merge correctly once\n * the accumulated content is already an array.\n */\n\nimport { ChatBedrockConverse } from '@langchain/aws';\nimport { ConverseStreamCommand } from '@aws-sdk/client-bedrock-runtime';\nimport { AIMessageChunk } from '@langchain/core/messages';\nimport { ChatGenerationChunk, ChatResult } from '@langchain/core/outputs';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { ChatBedrockConverseInput } from '@langchain/aws';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport {\n convertToConverseMessages,\n handleConverseStreamContentBlockStart,\n handleConverseStreamContentBlockDelta,\n handleConverseStreamMetadata,\n} from './utils';\n\n/**\n * Service tier type for Bedrock invocations.\n * Requires AWS SDK >= 3.966.0 to actually work.\n * @see https://docs.aws.amazon.com/bedrock/latest/userguide/service-tiers-inference.html\n */\nexport type ServiceTierType = 'priority' | 'default' | 'flex' | 'reserved';\n\n/**\n * Extended input interface with additional features:\n * - applicationInferenceProfile: Use an inference profile ARN instead of model ID\n * - serviceTier: Specify service tier (Priority, Standard, Flex, Reserved)\n */\nexport interface CustomChatBedrockConverseInput\n extends ChatBedrockConverseInput {\n /**\n * Application Inference Profile ARN to use for the model.\n * For example, \"arn:aws:bedrock:eu-west-1:123456789102:application-inference-profile/fm16bt65tzgx\"\n * When provided, this ARN will be used for the actual inference calls instead of the model ID.\n * Must still provide `model` as normal modelId to benefit from all the metadata.\n * @see https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-create.html\n */\n applicationInferenceProfile?: string;\n\n /**\n * Service tier for model invocation.\n * Specifies the processing tier type used for serving the request.\n * Supported values are 'priority', 'default', 'flex', and 'reserved'.\n *\n * - 'priority': Prioritized processing for lower latency\n * - 'default': Standard processing tier\n * - 'flex': Flexible processing tier with lower cost\n * - 'reserved': Reserved capacity for consistent performance\n *\n * If not provided, AWS uses the default tier.\n * Note: Requires AWS SDK >= 3.966.0 to work.\n * @see https://docs.aws.amazon.com/bedrock/latest/userguide/service-tiers-inference.html\n */\n serviceTier?: ServiceTierType;\n}\n\n/**\n * Extended call options with serviceTier override support.\n */\nexport interface CustomChatBedrockConverseCallOptions {\n serviceTier?: ServiceTierType;\n}\n\nexport class CustomChatBedrockConverse extends ChatBedrockConverse {\n /**\n * Application Inference Profile ARN to use instead of model ID.\n */\n applicationInferenceProfile?: string;\n\n /**\n * Service tier for model invocation.\n */\n serviceTier?: ServiceTierType;\n\n constructor(fields?: CustomChatBedrockConverseInput) {\n super(fields);\n this.applicationInferenceProfile = fields?.applicationInferenceProfile;\n this.serviceTier = fields?.serviceTier;\n }\n\n static lc_name(): string {\n return 'LibreChatBedrockConverse';\n }\n\n /**\n * Get the model ID to use for API calls.\n * Returns applicationInferenceProfile if set, otherwise returns this.model.\n */\n protected getModelId(): string {\n return this.applicationInferenceProfile ?? this.model;\n }\n\n /**\n * Override invocationParams to add serviceTier support.\n */\n override invocationParams(\n options?: this['ParsedCallOptions'] & CustomChatBedrockConverseCallOptions\n ): ReturnType<ChatBedrockConverse['invocationParams']> & {\n serviceTier?: { type: ServiceTierType };\n } {\n const baseParams = super.invocationParams(options);\n\n /** Service tier from options or fall back to class-level setting */\n const serviceTierType = options?.serviceTier ?? this.serviceTier;\n\n return {\n ...baseParams,\n serviceTier: serviceTierType ? { type: serviceTierType } : undefined,\n };\n }\n\n /**\n * Override _generateNonStreaming to use applicationInferenceProfile as modelId.\n * Uses the same model-swapping pattern as streaming for consistency.\n */\n override async _generateNonStreaming(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'] & CustomChatBedrockConverseCallOptions,\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const originalModel = this.model;\n if (\n this.applicationInferenceProfile != null &&\n this.applicationInferenceProfile !== ''\n ) {\n this.model = this.applicationInferenceProfile;\n }\n\n try {\n return await super._generateNonStreaming(messages, options, runManager);\n } finally {\n this.model = originalModel;\n }\n }\n\n /**\n * Own the stream end-to-end so we have direct access to every\n * `contentBlockDelta.contentBlockIndex` from the AWS SDK.\n *\n * This replaces the parent's implementation which strips contentBlockIndex\n * from text and reasoning deltas, making it impossible to merge correctly.\n */\n override async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'] & CustomChatBedrockConverseCallOptions,\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const { converseMessages, converseSystem } =\n convertToConverseMessages(messages);\n const params = this.invocationParams(options);\n\n let { streamUsage } = this;\n if ((options as Record<string, unknown>).streamUsage !== undefined) {\n streamUsage = (options as Record<string, unknown>).streamUsage as boolean;\n }\n\n const modelId = this.getModelId();\n\n const command = new ConverseStreamCommand({\n modelId,\n messages: converseMessages,\n system: converseSystem,\n ...(params as Record<string, unknown>),\n });\n\n const response = await this.client.send(command, {\n abortSignal: options.signal,\n });\n\n if (!response.stream) {\n return;\n }\n\n const seenBlockIndices = new Set<number>();\n\n for await (const event of response.stream) {\n if (event.contentBlockStart != null) {\n const startChunk = handleConverseStreamContentBlockStart(\n event.contentBlockStart\n );\n if (startChunk != null) {\n const idx = event.contentBlockStart.contentBlockIndex;\n if (idx != null) {\n seenBlockIndices.add(idx);\n }\n yield this.enrichChunk(startChunk, seenBlockIndices);\n }\n } else if (event.contentBlockDelta != null) {\n const deltaChunk = handleConverseStreamContentBlockDelta(\n event.contentBlockDelta\n );\n\n const idx = event.contentBlockDelta.contentBlockIndex;\n if (idx != null) {\n seenBlockIndices.add(idx);\n }\n\n yield this.enrichChunk(deltaChunk, seenBlockIndices);\n\n await runManager?.handleLLMNewToken(\n deltaChunk.text,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: deltaChunk }\n );\n } else if (event.metadata != null) {\n yield handleConverseStreamMetadata(event.metadata, { streamUsage });\n } else if (event.contentBlockStop != null) {\n const stopIdx = event.contentBlockStop.contentBlockIndex;\n if (stopIdx != null) {\n seenBlockIndices.add(stopIdx);\n }\n } else {\n yield new ChatGenerationChunk({\n text: '',\n message: new AIMessageChunk({\n content: '',\n response_metadata: event,\n }),\n });\n }\n }\n }\n\n /**\n * Inject `index` on content blocks for proper merge behaviour, then strip\n * `contentBlockIndex` from response_metadata to prevent `_mergeDicts` conflicts.\n *\n * Text string content is promoted to array form only when the stream contains\n * multiple content block indices (e.g. reasoning at index 0, text at index 1),\n * ensuring text merges correctly with the already-array accumulated content.\n */\n private enrichChunk(\n chunk: ChatGenerationChunk,\n seenBlockIndices: Set<number>\n ): ChatGenerationChunk {\n const message = chunk.message;\n if (!(message instanceof AIMessageChunk)) {\n return chunk;\n }\n\n const metadata = message.response_metadata as Record<string, unknown>;\n const blockIndex = this.extractContentBlockIndex(metadata);\n const hasMetadataIndex = blockIndex != null;\n\n let content: AIMessageChunk['content'] = message.content;\n let contentModified = false;\n\n if (Array.isArray(content) && blockIndex != null) {\n content = content.map((block) =>\n typeof block === 'object' && !('index' in block)\n ? { ...block, index: blockIndex }\n : block\n );\n contentModified = true;\n } else if (\n typeof content === 'string' &&\n content !== '' &&\n blockIndex != null &&\n seenBlockIndices.size > 1\n ) {\n content = [{ type: 'text', text: content, index: blockIndex }];\n contentModified = true;\n }\n\n if (!contentModified && !hasMetadataIndex) {\n return chunk;\n }\n\n const cleanedMetadata = hasMetadataIndex\n ? (this.removeContentBlockIndex(metadata) as Record<string, unknown>)\n : metadata;\n\n return new ChatGenerationChunk({\n text: chunk.text,\n message: new AIMessageChunk({\n ...message,\n content,\n response_metadata: cleanedMetadata,\n }),\n generationInfo: chunk.generationInfo,\n });\n }\n\n /**\n * Extract `contentBlockIndex` from the top level of response_metadata.\n * Our custom handlers always place it at the top level.\n */\n private extractContentBlockIndex(\n metadata: Record<string, unknown>\n ): number | undefined {\n if (\n 'contentBlockIndex' in metadata &&\n typeof metadata.contentBlockIndex === 'number'\n ) {\n return metadata.contentBlockIndex;\n }\n return undefined;\n }\n\n private removeContentBlockIndex(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.removeContentBlockIndex(item));\n }\n\n if (typeof obj === 'object') {\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key !== 'contentBlockIndex') {\n cleaned[key] = this.removeContentBlockIndex(value);\n }\n }\n return cleaned;\n }\n\n return obj;\n }\n}\n\nexport type { ChatBedrockConverseInput };\n"],"names":["ChatBedrockConverse","messages","convertToConverseMessages","ConverseStreamCommand","handleConverseStreamContentBlockStart","handleConverseStreamContentBlockDelta","handleConverseStreamMetadata","ChatGenerationChunk","AIMessageChunk"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/llm/bedrock/index.ts"],"sourcesContent":["/**\n * Optimized ChatBedrockConverse wrapper that fixes content block merging for\n * streaming responses and adds support for latest @langchain/aws features:\n *\n * - Application Inference Profiles (PR #9129)\n * - Service Tiers (Priority/Standard/Flex) (PR #9785) - requires AWS SDK 3.966.0+\n *\n * Bedrock's `@langchain/aws` library does not include an `index` property on content\n * blocks (unlike Anthropic/OpenAI), which causes LangChain's `_mergeLists` to append\n * each streaming chunk as a separate array entry instead of merging by index.\n *\n * This wrapper takes full ownership of the stream by directly interfacing with the\n * AWS SDK client (`this.client`) and using custom handlers from `./utils/` that\n * include `contentBlockIndex` in response_metadata for every delta type. It then\n * promotes `contentBlockIndex` to an `index` property on each content block\n * (mirroring Anthropic's pattern) and strips it from metadata to avoid\n * `_mergeDicts` conflicts.\n *\n * When multiple content block types are present (e.g. reasoning + text), text deltas\n * are promoted from strings to array form with `index` so they merge correctly once\n * the accumulated content is already an array.\n */\n\nimport { ChatBedrockConverse } from '@langchain/aws';\nimport { ConverseStreamCommand } from '@aws-sdk/client-bedrock-runtime';\nimport { AIMessageChunk } from '@langchain/core/messages';\nimport { ChatGenerationChunk, ChatResult } from '@langchain/core/outputs';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { ChatBedrockConverseInput } from '@langchain/aws';\nimport type { BaseMessage, ResponseMetadata } from '@langchain/core/messages';\nimport {\n convertToConverseMessages,\n handleConverseStreamContentBlockStart,\n handleConverseStreamContentBlockDelta,\n handleConverseStreamMetadata,\n} from './utils';\n\n/**\n * Service tier type for Bedrock invocations.\n * Requires AWS SDK >= 3.966.0 to actually work.\n * @see https://docs.aws.amazon.com/bedrock/latest/userguide/service-tiers-inference.html\n */\nexport type ServiceTierType = 'priority' | 'default' | 'flex' | 'reserved';\n\n/**\n * Extended input interface with additional features:\n * - applicationInferenceProfile: Use an inference profile ARN instead of model ID\n * - serviceTier: Specify service tier (Priority, Standard, Flex, Reserved)\n */\nexport interface CustomChatBedrockConverseInput\n extends ChatBedrockConverseInput {\n /**\n * Application Inference Profile ARN to use for the model.\n * For example, \"arn:aws:bedrock:eu-west-1:123456789102:application-inference-profile/fm16bt65tzgx\"\n * When provided, this ARN will be used for the actual inference calls instead of the model ID.\n * Must still provide `model` as normal modelId to benefit from all the metadata.\n * @see https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-create.html\n */\n applicationInferenceProfile?: string;\n\n /**\n * Service tier for model invocation.\n * Specifies the processing tier type used for serving the request.\n * Supported values are 'priority', 'default', 'flex', and 'reserved'.\n *\n * - 'priority': Prioritized processing for lower latency\n * - 'default': Standard processing tier\n * - 'flex': Flexible processing tier with lower cost\n * - 'reserved': Reserved capacity for consistent performance\n *\n * If not provided, AWS uses the default tier.\n * Note: Requires AWS SDK >= 3.966.0 to work.\n * @see https://docs.aws.amazon.com/bedrock/latest/userguide/service-tiers-inference.html\n */\n serviceTier?: ServiceTierType;\n}\n\n/**\n * Extended call options with serviceTier override support.\n */\nexport interface CustomChatBedrockConverseCallOptions {\n serviceTier?: ServiceTierType;\n}\n\nexport class CustomChatBedrockConverse extends ChatBedrockConverse {\n /**\n * Application Inference Profile ARN to use instead of model ID.\n */\n applicationInferenceProfile?: string;\n\n /**\n * Service tier for model invocation.\n */\n serviceTier?: ServiceTierType;\n\n constructor(fields?: CustomChatBedrockConverseInput) {\n super(fields);\n this.applicationInferenceProfile = fields?.applicationInferenceProfile;\n this.serviceTier = fields?.serviceTier;\n }\n\n static lc_name(): string {\n return 'LibreChatBedrockConverse';\n }\n\n /**\n * Get the model ID to use for API calls.\n * Returns applicationInferenceProfile if set, otherwise returns this.model.\n */\n protected getModelId(): string {\n return this.applicationInferenceProfile ?? this.model;\n }\n\n /**\n * Override invocationParams to add serviceTier support.\n */\n override invocationParams(\n options?: this['ParsedCallOptions'] & CustomChatBedrockConverseCallOptions\n ): ReturnType<ChatBedrockConverse['invocationParams']> & {\n serviceTier?: { type: ServiceTierType };\n } {\n const baseParams = super.invocationParams(options);\n\n /** Service tier from options or fall back to class-level setting */\n const serviceTierType = options?.serviceTier ?? this.serviceTier;\n\n return {\n ...baseParams,\n serviceTier: serviceTierType ? { type: serviceTierType } : undefined,\n };\n }\n\n /**\n * Override _generateNonStreaming to use applicationInferenceProfile as modelId.\n * Uses the same model-swapping pattern as streaming for consistency.\n */\n override async _generateNonStreaming(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'] & CustomChatBedrockConverseCallOptions,\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n const originalModel = this.model;\n if (\n this.applicationInferenceProfile != null &&\n this.applicationInferenceProfile !== ''\n ) {\n this.model = this.applicationInferenceProfile;\n }\n\n try {\n return await super._generateNonStreaming(messages, options, runManager);\n } finally {\n this.model = originalModel;\n }\n }\n\n /**\n * Own the stream end-to-end so we have direct access to every\n * `contentBlockDelta.contentBlockIndex` from the AWS SDK.\n *\n * This replaces the parent's implementation which strips contentBlockIndex\n * from text and reasoning deltas, making it impossible to merge correctly.\n */\n override async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'] & CustomChatBedrockConverseCallOptions,\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const { converseMessages, converseSystem } =\n convertToConverseMessages(messages);\n const params = this.invocationParams(options);\n\n let { streamUsage } = this;\n if ((options as Record<string, unknown>).streamUsage !== undefined) {\n streamUsage = (options as Record<string, unknown>).streamUsage as boolean;\n }\n\n const modelId = this.getModelId();\n\n const command = new ConverseStreamCommand({\n modelId,\n messages: converseMessages,\n system: converseSystem,\n ...(params as Record<string, unknown>),\n });\n\n const response = await this.client.send(command, {\n abortSignal: options.signal,\n });\n\n if (!response.stream) {\n return;\n }\n\n const seenBlockIndices = new Set<number>();\n\n for await (const event of response.stream) {\n if (event.contentBlockStart != null) {\n const startChunk = handleConverseStreamContentBlockStart(\n event.contentBlockStart\n );\n if (startChunk != null) {\n const idx = event.contentBlockStart.contentBlockIndex;\n if (idx != null) {\n seenBlockIndices.add(idx);\n }\n yield this.enrichChunk(startChunk, seenBlockIndices);\n }\n } else if (event.contentBlockDelta != null) {\n const deltaChunk = handleConverseStreamContentBlockDelta(\n event.contentBlockDelta\n );\n\n const idx = event.contentBlockDelta.contentBlockIndex;\n if (idx != null) {\n seenBlockIndices.add(idx);\n }\n\n yield this.enrichChunk(deltaChunk, seenBlockIndices);\n\n await runManager?.handleLLMNewToken(\n deltaChunk.text,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: deltaChunk }\n );\n } else if (event.metadata != null) {\n yield handleConverseStreamMetadata(event.metadata, { streamUsage });\n } else if (event.contentBlockStop != null) {\n const stopIdx = event.contentBlockStop.contentBlockIndex;\n if (stopIdx != null) {\n seenBlockIndices.add(stopIdx);\n }\n } else {\n yield new ChatGenerationChunk({\n text: '',\n message: new AIMessageChunk({\n content: '',\n response_metadata: { ...event } as ResponseMetadata,\n }),\n });\n }\n }\n }\n\n /**\n * Inject `index` on content blocks for proper merge behaviour, then strip\n * `contentBlockIndex` from response_metadata to prevent `_mergeDicts` conflicts.\n *\n * Text string content is promoted to array form only when the stream contains\n * multiple content block indices (e.g. reasoning at index 0, text at index 1),\n * ensuring text merges correctly with the already-array accumulated content.\n */\n private enrichChunk(\n chunk: ChatGenerationChunk,\n seenBlockIndices: Set<number>\n ): ChatGenerationChunk {\n const message = chunk.message;\n if (!(message instanceof AIMessageChunk)) {\n return chunk;\n }\n\n const metadata = message.response_metadata as Record<string, unknown>;\n const blockIndex = this.extractContentBlockIndex(metadata);\n const hasMetadataIndex = blockIndex != null;\n\n let content: AIMessageChunk['content'] = message.content;\n let contentModified = false;\n\n if (Array.isArray(content) && blockIndex != null) {\n content = content.map((block) =>\n typeof block === 'object' && !('index' in block)\n ? { ...block, index: blockIndex }\n : block\n );\n contentModified = true;\n } else if (\n typeof content === 'string' &&\n content !== '' &&\n blockIndex != null &&\n seenBlockIndices.size > 1\n ) {\n content = [{ type: 'text', text: content, index: blockIndex }];\n contentModified = true;\n }\n\n if (!contentModified && !hasMetadataIndex) {\n return chunk;\n }\n\n const cleanedMetadata = hasMetadataIndex\n ? (this.removeContentBlockIndex(metadata) as Record<string, unknown>)\n : metadata;\n\n return new ChatGenerationChunk({\n text: chunk.text,\n message: new AIMessageChunk({\n ...message,\n content,\n response_metadata: cleanedMetadata,\n }),\n generationInfo: chunk.generationInfo,\n });\n }\n\n /**\n * Extract `contentBlockIndex` from the top level of response_metadata.\n * Our custom handlers always place it at the top level.\n */\n private extractContentBlockIndex(\n metadata: Record<string, unknown>\n ): number | undefined {\n if (\n 'contentBlockIndex' in metadata &&\n typeof metadata.contentBlockIndex === 'number'\n ) {\n return metadata.contentBlockIndex;\n }\n return undefined;\n }\n\n private removeContentBlockIndex(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.removeContentBlockIndex(item));\n }\n\n if (typeof obj === 'object') {\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (key !== 'contentBlockIndex') {\n cleaned[key] = this.removeContentBlockIndex(value);\n }\n }\n return cleaned;\n }\n\n return obj;\n }\n}\n\nexport type { ChatBedrockConverseInput };\n"],"names":["ChatBedrockConverse","messages","convertToConverseMessages","ConverseStreamCommand","handleConverseStreamContentBlockStart","handleConverseStreamContentBlockDelta","handleConverseStreamMetadata","ChatGenerationChunk","AIMessageChunk"],"mappings":";;;;;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;AAqBG;AA+DG,MAAO,yBAA0B,SAAQA,uBAAmB,CAAA;AAChE;;AAEG;AACH,IAAA,2BAA2B;AAE3B;;AAEG;AACH,IAAA,WAAW;AAEX,IAAA,WAAA,CAAY,MAAuC,EAAA;QACjD,KAAK,CAAC,MAAM,CAAC;AACb,QAAA,IAAI,CAAC,2BAA2B,GAAG,MAAM,EAAE,2BAA2B;AACtE,QAAA,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,WAAW;IACxC;AAEA,IAAA,OAAO,OAAO,GAAA;AACZ,QAAA,OAAO,0BAA0B;IACnC;AAEA;;;AAGG;IACO,UAAU,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,2BAA2B,IAAI,IAAI,CAAC,KAAK;IACvD;AAEA;;AAEG;AACM,IAAA,gBAAgB,CACvB,OAA0E,EAAA;QAI1E,MAAM,UAAU,GAAG,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;;QAGlD,MAAM,eAAe,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW;QAEhE,OAAO;AACL,YAAA,GAAG,UAAU;AACb,YAAA,WAAW,EAAE,eAAe,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,SAAS;SACrE;IACH;AAEA;;;AAGG;AACM,IAAA,MAAM,qBAAqB,CAClC,QAAuB,EACvB,OAAyE,EACzE,UAAqC,EAAA;AAErC,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK;AAChC,QAAA,IACE,IAAI,CAAC,2BAA2B,IAAI,IAAI;AACxC,YAAA,IAAI,CAAC,2BAA2B,KAAK,EAAE,EACvC;AACA,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,2BAA2B;QAC/C;AAEA,QAAA,IAAI;YACF,OAAO,MAAM,KAAK,CAAC,qBAAqB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC;QACzE;gBAAU;AACR,YAAA,IAAI,CAAC,KAAK,GAAG,aAAa;QAC5B;IACF;AAEA;;;;;;AAMG;IACM,OAAO,qBAAqB,CACnCC,UAAuB,EACvB,OAAyE,EACzE,UAAqC,EAAA;QAErC,MAAM,EAAE,gBAAgB,EAAE,cAAc,EAAE,GACxCC,wCAAyB,CAACD,UAAQ,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;AAE7C,QAAA,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI;AAC1B,QAAA,IAAK,OAAmC,CAAC,WAAW,KAAK,SAAS,EAAE;AAClE,YAAA,WAAW,GAAI,OAAmC,CAAC,WAAsB;QAC3E;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AAEjC,QAAA,MAAM,OAAO,GAAG,IAAIE,0CAAqB,CAAC;YACxC,OAAO;AACP,YAAA,QAAQ,EAAE,gBAAgB;AAC1B,YAAA,MAAM,EAAE,cAAc;AACtB,YAAA,GAAI,MAAkC;AACvC,SAAA,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;YAC/C,WAAW,EAAE,OAAO,CAAC,MAAM;AAC5B,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB;QACF;AAEA,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU;QAE1C,WAAW,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE;AACzC,YAAA,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,EAAE;gBACnC,MAAM,UAAU,GAAGC,qDAAqC,CACtD,KAAK,CAAC,iBAAiB,CACxB;AACD,gBAAA,IAAI,UAAU,IAAI,IAAI,EAAE;AACtB,oBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,iBAAiB,CAAC,iBAAiB;AACrD,oBAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,wBAAA,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;oBAC3B;oBACA,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,gBAAgB,CAAC;gBACtD;YACF;AAAO,iBAAA,IAAI,KAAK,CAAC,iBAAiB,IAAI,IAAI,EAAE;gBAC1C,MAAM,UAAU,GAAGC,qDAAqC,CACtD,KAAK,CAAC,iBAAiB,CACxB;AAED,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,iBAAiB,CAAC,iBAAiB;AACrD,gBAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,oBAAA,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC3B;gBAEA,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,gBAAgB,CAAC;gBAEpD,MAAM,UAAU,EAAE,iBAAiB,CACjC,UAAU,CAAC,IAAI,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,EAAE,KAAK,EAAE,UAAU,EAAE,CACtB;YACH;AAAO,iBAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,EAAE;gBACjC,MAAMC,4CAA4B,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC;YACrE;AAAO,iBAAA,IAAI,KAAK,CAAC,gBAAgB,IAAI,IAAI,EAAE;AACzC,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,iBAAiB;AACxD,gBAAA,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,oBAAA,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC/B;YACF;iBAAO;gBACL,MAAM,IAAIC,2BAAmB,CAAC;AAC5B,oBAAA,IAAI,EAAE,EAAE;oBACR,OAAO,EAAE,IAAIC,uBAAc,CAAC;AAC1B,wBAAA,OAAO,EAAE,EAAE;AACX,wBAAA,iBAAiB,EAAE,EAAE,GAAG,KAAK,EAAsB;qBACpD,CAAC;AACH,iBAAA,CAAC;YACJ;QACF;IACF;AAEA;;;;;;;AAOG;IACK,WAAW,CACjB,KAA0B,EAC1B,gBAA6B,EAAA;AAE7B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAC7B,QAAA,IAAI,EAAE,OAAO,YAAYA,uBAAc,CAAC,EAAE;AACxC,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAA4C;QACrE,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC;AAC1D,QAAA,MAAM,gBAAgB,GAAG,UAAU,IAAI,IAAI;AAE3C,QAAA,IAAI,OAAO,GAA8B,OAAO,CAAC,OAAO;QACxD,IAAI,eAAe,GAAG,KAAK;QAE3B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,UAAU,IAAI,IAAI,EAAE;YAChD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAC1B,OAAO,KAAK,KAAK,QAAQ,IAAI,EAAE,OAAO,IAAI,KAAK;kBAC3C,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,UAAU;kBAC7B,KAAK,CACV;YACD,eAAe,GAAG,IAAI;QACxB;aAAO,IACL,OAAO,OAAO,KAAK,QAAQ;AAC3B,YAAA,OAAO,KAAK,EAAE;AACd,YAAA,UAAU,IAAI,IAAI;AAClB,YAAA,gBAAgB,CAAC,IAAI,GAAG,CAAC,EACzB;AACA,YAAA,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YAC9D,eAAe,GAAG,IAAI;QACxB;AAEA,QAAA,IAAI,CAAC,eAAe,IAAI,CAAC,gBAAgB,EAAE;AACzC,YAAA,OAAO,KAAK;QACd;QAEA,MAAM,eAAe,GAAG;AACtB,cAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ;cACtC,QAAQ;QAEZ,OAAO,IAAID,2BAAmB,CAAC;YAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,IAAIC,uBAAc,CAAC;AAC1B,gBAAA,GAAG,OAAO;gBACV,OAAO;AACP,gBAAA,iBAAiB,EAAE,eAAe;aACnC,CAAC;YACF,cAAc,EAAE,KAAK,CAAC,cAAc;AACrC,SAAA,CAAC;IACJ;AAEA;;;AAGG;AACK,IAAA,wBAAwB,CAC9B,QAAiC,EAAA;QAEjC,IACE,mBAAmB,IAAI,QAAQ;AAC/B,YAAA,OAAO,QAAQ,CAAC,iBAAiB,KAAK,QAAQ,EAC9C;YACA,OAAO,QAAQ,CAAC,iBAAiB;QACnC;AACA,QAAA,OAAO,SAAS;IAClB;AAEQ,IAAA,uBAAuB,CAAC,GAAY,EAAA;QAC1C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE;AACrC,YAAA,OAAO,GAAG;QACZ;AAEA,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAC9D;AAEA,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;YAC3B,MAAM,OAAO,GAA4B,EAAE;AAC3C,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC9C,gBAAA,IAAI,GAAG,KAAK,mBAAmB,EAAE;oBAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;gBACpD;YACF;AACA,YAAA,OAAO,OAAO;QAChB;AAEA,QAAA,OAAO,GAAG;IACZ;AACD;;;;"}
|
|
@@ -93,6 +93,194 @@ function extractImageInfo(base64) {
|
|
|
93
93
|
},
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
|
+
const mimeTypeToVideoFormat = {
|
|
97
|
+
'video/flv': 'flv',
|
|
98
|
+
'video/mkv': 'mkv',
|
|
99
|
+
'video/mov': 'mov',
|
|
100
|
+
'video/mp4': 'mp4',
|
|
101
|
+
'video/mpeg': 'mpeg',
|
|
102
|
+
'video/mpg': 'mpg',
|
|
103
|
+
'video/three_gp': 'three_gp',
|
|
104
|
+
'video/webm': 'webm',
|
|
105
|
+
'video/wmv': 'wmv',
|
|
106
|
+
};
|
|
107
|
+
const mimeTypeToAudioFormat = {
|
|
108
|
+
'audio/aac': 'aac',
|
|
109
|
+
'audio/flac': 'flac',
|
|
110
|
+
'audio/m4a': 'm4a',
|
|
111
|
+
'audio/mka': 'mka',
|
|
112
|
+
'audio/mkv': 'mkv',
|
|
113
|
+
'audio/mp3': 'mp3',
|
|
114
|
+
'audio/mp4': 'mp4',
|
|
115
|
+
'audio/mpeg': 'mpeg',
|
|
116
|
+
'audio/mpga': 'mpga',
|
|
117
|
+
'audio/ogg': 'ogg',
|
|
118
|
+
'audio/opus': 'opus',
|
|
119
|
+
'audio/pcm': 'pcm',
|
|
120
|
+
'audio/wav': 'wav',
|
|
121
|
+
'audio/webm': 'webm',
|
|
122
|
+
'audio/x-aac': 'x-aac',
|
|
123
|
+
};
|
|
124
|
+
const mimeTypeToDocumentFormat = {
|
|
125
|
+
'text/csv': 'csv',
|
|
126
|
+
'application/msword': 'doc',
|
|
127
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',
|
|
128
|
+
'text/html': 'html',
|
|
129
|
+
'text/markdown': 'md',
|
|
130
|
+
'application/pdf': 'pdf',
|
|
131
|
+
'text/plain': 'txt',
|
|
132
|
+
'application/vnd.ms-excel': 'xls',
|
|
133
|
+
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',
|
|
134
|
+
};
|
|
135
|
+
function base64ToBytes(data) {
|
|
136
|
+
return Uint8Array.from(atob(data), (char) => char.charCodeAt(0));
|
|
137
|
+
}
|
|
138
|
+
function getMediaFormat(mimeType, formatMap) {
|
|
139
|
+
if (mimeType == null || mimeType === '') {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
return formatMap[mimeType] ?? messages.parseMimeType(mimeType).subtype;
|
|
143
|
+
}
|
|
144
|
+
function resolveMediaSource(block) {
|
|
145
|
+
if (typeof block.data === 'string') {
|
|
146
|
+
return { bytes: base64ToBytes(block.data) };
|
|
147
|
+
}
|
|
148
|
+
if (block.data instanceof Uint8Array) {
|
|
149
|
+
return { bytes: block.data };
|
|
150
|
+
}
|
|
151
|
+
if (typeof block.url === 'string') {
|
|
152
|
+
const parsedData = messages.parseBase64DataUrl({
|
|
153
|
+
dataUrl: block.url,
|
|
154
|
+
asTypedArray: true,
|
|
155
|
+
});
|
|
156
|
+
if (parsedData != null) {
|
|
157
|
+
return { bytes: parsedData.data };
|
|
158
|
+
}
|
|
159
|
+
throw new Error(`Only base64 data URLs are supported for ${block.type} blocks with 'url' field with ChatBedrockConverse.`);
|
|
160
|
+
}
|
|
161
|
+
if (typeof block.fileId === 'string') {
|
|
162
|
+
return { s3Location: { uri: block.fileId } };
|
|
163
|
+
}
|
|
164
|
+
throw new Error(`${block.type} block must include one of: 'data' (base64 string or Uint8Array), 'url' (base64 data URL), or 'fileId' (S3 URI).`);
|
|
165
|
+
}
|
|
166
|
+
function convertMultimodalVideoBlock(block) {
|
|
167
|
+
return {
|
|
168
|
+
video: {
|
|
169
|
+
format: getMediaFormat(block.mimeType, mimeTypeToVideoFormat),
|
|
170
|
+
source: resolveMediaSource(block),
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function convertMultimodalAudioBlock(block) {
|
|
175
|
+
return {
|
|
176
|
+
audio: {
|
|
177
|
+
format: getMediaFormat(block.mimeType, mimeTypeToAudioFormat),
|
|
178
|
+
source: resolveMediaSource(block),
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
function getDocumentName(block) {
|
|
183
|
+
return (block.metadata?.name ??
|
|
184
|
+
block.metadata?.filename ??
|
|
185
|
+
block.metadata?.title ??
|
|
186
|
+
globalThis.crypto.randomUUID().replace(/-/g, '').slice(0, 12));
|
|
187
|
+
}
|
|
188
|
+
function getDocumentFormat(mimeType) {
|
|
189
|
+
if (mimeType == null || mimeType === '') {
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
const parsedMimeType = messages.parseMimeType(mimeType);
|
|
193
|
+
const format = mimeTypeToDocumentFormat[`${parsedMimeType.type}/${parsedMimeType.subtype}`];
|
|
194
|
+
if (format === undefined) {
|
|
195
|
+
throw new Error(`Unsupported file mime type: "${mimeType}" ChatBedrockConverse only supports ${Object.keys(mimeTypeToDocumentFormat).join(', ')} formats.`);
|
|
196
|
+
}
|
|
197
|
+
return format;
|
|
198
|
+
}
|
|
199
|
+
const standardContentBlockConverter = {
|
|
200
|
+
providerName: 'ChatBedrockConverse',
|
|
201
|
+
fromStandardTextBlock(block) {
|
|
202
|
+
return { text: block.text };
|
|
203
|
+
},
|
|
204
|
+
fromStandardImageBlock(block) {
|
|
205
|
+
if (block.source_type === 'url') {
|
|
206
|
+
const parsedData = messages.parseBase64DataUrl({
|
|
207
|
+
dataUrl: block.url,
|
|
208
|
+
asTypedArray: true,
|
|
209
|
+
});
|
|
210
|
+
if (parsedData == null) {
|
|
211
|
+
throw new Error([
|
|
212
|
+
'Only base64 data URLs are supported for image blocks with source type ',
|
|
213
|
+
'url',
|
|
214
|
+
' with ChatBedrockConverse.',
|
|
215
|
+
].join(String.fromCharCode(39)));
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
image: {
|
|
219
|
+
format: messages.parseMimeType(parsedData.mime_type).subtype,
|
|
220
|
+
source: { bytes: parsedData.data },
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
if (block.source_type === 'base64') {
|
|
225
|
+
let format;
|
|
226
|
+
if (block.mime_type != null && block.mime_type !== '') {
|
|
227
|
+
format = messages.parseMimeType(block.mime_type).subtype;
|
|
228
|
+
}
|
|
229
|
+
if (format != null && !['gif', 'jpeg', 'png', 'webp'].includes(format)) {
|
|
230
|
+
throw new Error(`Unsupported image mime type: "${block.mime_type}" ChatBedrockConverse only supports "image/gif", "image/jpeg", "image/png", and "image/webp" formats.`);
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
image: {
|
|
234
|
+
format,
|
|
235
|
+
source: { bytes: base64ToBytes(block.data) },
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
throw new Error(`Image source type '${block.source_type}' not supported with ChatBedrockConverse.`);
|
|
240
|
+
},
|
|
241
|
+
fromStandardFileBlock(block) {
|
|
242
|
+
const name = getDocumentName(block);
|
|
243
|
+
if (block.source_type === 'text') {
|
|
244
|
+
return {
|
|
245
|
+
document: {
|
|
246
|
+
name,
|
|
247
|
+
format: 'txt',
|
|
248
|
+
source: { bytes: new TextEncoder().encode(block.text) },
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
if (block.source_type === 'url') {
|
|
253
|
+
const parsedData = messages.parseBase64DataUrl({
|
|
254
|
+
dataUrl: block.url,
|
|
255
|
+
asTypedArray: true,
|
|
256
|
+
});
|
|
257
|
+
if (parsedData == null) {
|
|
258
|
+
throw new Error([
|
|
259
|
+
'Only base64 data URLs are supported for file blocks with source type ',
|
|
260
|
+
'url',
|
|
261
|
+
' with ChatBedrockConverse.',
|
|
262
|
+
].join(String.fromCharCode(39)));
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
document: {
|
|
266
|
+
name,
|
|
267
|
+
format: getDocumentFormat(parsedData.mime_type),
|
|
268
|
+
source: { bytes: parsedData.data },
|
|
269
|
+
},
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
if (block.source_type === 'base64') {
|
|
273
|
+
return {
|
|
274
|
+
document: {
|
|
275
|
+
name,
|
|
276
|
+
format: getDocumentFormat(block.mime_type),
|
|
277
|
+
source: { bytes: base64ToBytes(block.data) },
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
throw new Error(`File source type '${block.source_type}' not supported with ChatBedrockConverse.`);
|
|
282
|
+
},
|
|
283
|
+
};
|
|
96
284
|
/**
|
|
97
285
|
* Check if a block has a cache point.
|
|
98
286
|
*/
|
|
@@ -119,6 +307,9 @@ function convertLangChainContentBlockToConverseContentBlock({ block, onUnknown =
|
|
|
119
307
|
if (typeof block === 'string') {
|
|
120
308
|
return { text: block };
|
|
121
309
|
}
|
|
310
|
+
if (messages.isDataContentBlock(block)) {
|
|
311
|
+
return messages.convertToProviderContentBlock(block, standardContentBlockConverter);
|
|
312
|
+
}
|
|
122
313
|
if (block.type === 'text') {
|
|
123
314
|
return { text: block.text };
|
|
124
315
|
}
|
|
@@ -175,6 +366,24 @@ function convertLangChainContentBlockToConverseContentBlock({ block, onUnknown =
|
|
|
175
366
|
};
|
|
176
367
|
}
|
|
177
368
|
}
|
|
369
|
+
if (block.type === 'video' &&
|
|
370
|
+
block.video !== undefined) {
|
|
371
|
+
return {
|
|
372
|
+
video: block.video,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
if (block.type === 'video') {
|
|
376
|
+
return convertMultimodalVideoBlock(block);
|
|
377
|
+
}
|
|
378
|
+
if (block.type === 'audio' &&
|
|
379
|
+
block.audio !== undefined) {
|
|
380
|
+
return {
|
|
381
|
+
audio: block.audio,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
if (block.type === 'audio') {
|
|
385
|
+
return convertMultimodalAudioBlock(block);
|
|
386
|
+
}
|
|
178
387
|
if (block.type === 'document' &&
|
|
179
388
|
block.document !== undefined) {
|
|
180
389
|
return {
|
|
@@ -234,7 +443,8 @@ function convertSystemMessageToConverseMessage(msg) {
|
|
|
234
443
|
*/
|
|
235
444
|
function convertAIMessageToConverseMessage(msg) {
|
|
236
445
|
// Check for v1 format from other providers (PR #9766 fix)
|
|
237
|
-
|
|
446
|
+
const responseMetadata = msg.response_metadata;
|
|
447
|
+
if (responseMetadata?.output_version === 'v1') {
|
|
238
448
|
return convertFromV1ToChatBedrockConverseMessage(msg);
|
|
239
449
|
}
|
|
240
450
|
const assistantMsg = {
|
|
@@ -441,11 +651,11 @@ function convertToConverseMessages(messages) {
|
|
|
441
651
|
});
|
|
442
652
|
// Combine consecutive user tool result messages into a single message
|
|
443
653
|
const combinedConverseMessages = converseMessages.reduce((acc, curr) => {
|
|
444
|
-
|
|
445
|
-
if (lastMessage == null) {
|
|
654
|
+
if (acc.length === 0) {
|
|
446
655
|
acc.push(curr);
|
|
447
656
|
return acc;
|
|
448
657
|
}
|
|
658
|
+
const lastMessage = acc[acc.length - 1];
|
|
449
659
|
const lastHasToolResult = lastMessage.content?.some((c) => 'toolResult' in c) === true;
|
|
450
660
|
const currHasToolResult = curr.content?.some((c) => 'toolResult' in c) === true;
|
|
451
661
|
if (lastMessage.role === 'user' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_inputs.cjs","sources":["../../../../../src/llm/bedrock/utils/message_inputs.ts"],"sourcesContent":["/**\n * Utility functions for converting LangChain messages to Bedrock Converse messages.\n * Ported from @langchain/aws common.js\n */\nimport {\n type BaseMessage,\n isAIMessage,\n parseBase64DataUrl,\n parseMimeType,\n MessageContentComplex,\n} from '@langchain/core/messages';\nimport type {\n BedrockMessage,\n BedrockSystemContentBlock,\n BedrockContentBlock,\n MessageContentReasoningBlock,\n} from '../types';\n\n/**\n * Convert a LangChain reasoning block to a Bedrock reasoning block.\n */\nexport function langchainReasoningBlockToBedrockReasoningBlock(\n content: MessageContentReasoningBlock\n): {\n reasoningText?: { text?: string; signature?: string };\n redactedContent?: Uint8Array;\n} {\n if (content.reasoningText != null) {\n return {\n reasoningText: content.reasoningText,\n };\n }\n if (content.redactedContent != null && content.redactedContent !== '') {\n return {\n redactedContent: new Uint8Array(\n Buffer.from(content.redactedContent, 'base64')\n ),\n };\n }\n throw new Error('Invalid reasoning content');\n}\n\n/**\n * Concatenate consecutive reasoning blocks in content array.\n */\nexport function concatenateLangchainReasoningBlocks(\n content: Array<MessageContentComplex | MessageContentReasoningBlock>\n): Array<MessageContentComplex | MessageContentReasoningBlock> {\n const result: Array<MessageContentComplex | MessageContentReasoningBlock> =\n [];\n\n for (const block of content) {\n if (block.type === 'reasoning_content') {\n const currentReasoning = block as MessageContentReasoningBlock;\n const lastIndex = result.length - 1;\n\n // Check if we can merge with the previous block\n if (lastIndex >= 0) {\n const lastBlock = result[lastIndex];\n if (\n lastBlock.type === 'reasoning_content' &&\n (lastBlock as MessageContentReasoningBlock).reasoningText != null &&\n currentReasoning.reasoningText != null\n ) {\n const lastReasoning = lastBlock as MessageContentReasoningBlock;\n // Merge consecutive reasoning text blocks\n const lastText = lastReasoning.reasoningText?.text;\n const currentText = currentReasoning.reasoningText.text;\n if (\n lastText != null &&\n lastText !== '' &&\n currentText != null &&\n currentText !== ''\n ) {\n lastReasoning.reasoningText!.text = lastText + currentText;\n } else if (\n currentReasoning.reasoningText.signature != null &&\n currentReasoning.reasoningText.signature !== ''\n ) {\n lastReasoning.reasoningText!.signature =\n currentReasoning.reasoningText.signature;\n }\n continue;\n }\n }\n\n result.push({ ...block } as MessageContentReasoningBlock);\n } else {\n result.push(block);\n }\n }\n\n return result;\n}\n\n/**\n * Extract image info from a base64 string or URL.\n */\nexport function extractImageInfo(base64: string): BedrockContentBlock {\n // Extract the format from the base64 string\n const formatMatch = base64.match(/^data:image\\/(\\w+);base64,/);\n let format: 'gif' | 'jpeg' | 'png' | 'webp' | undefined;\n if (formatMatch) {\n const extractedFormat = formatMatch[1].toLowerCase();\n if (['gif', 'jpeg', 'png', 'webp'].includes(extractedFormat)) {\n format = extractedFormat as typeof format;\n }\n }\n\n // Remove the data URL prefix if present\n const base64Data = base64.replace(/^data:image\\/\\w+;base64,/, '');\n\n // Convert base64 to Uint8Array\n const binaryString = atob(base64Data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i += 1) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return {\n image: {\n format,\n source: {\n bytes,\n },\n },\n };\n}\n\n/**\n * Check if a block has a cache point.\n */\nfunction isDefaultCachePoint(block: unknown): boolean {\n if (typeof block !== 'object' || block === null) {\n return false;\n }\n if (!('cachePoint' in block)) {\n return false;\n }\n const cachePoint = (block as { cachePoint?: unknown }).cachePoint;\n if (typeof cachePoint !== 'object' || cachePoint === null) {\n return false;\n }\n if (!('type' in cachePoint)) {\n return false;\n }\n return (cachePoint as { type?: string }).type === 'default';\n}\n\n/**\n * Convert a LangChain content block to a Bedrock Converse content block.\n */\nfunction convertLangChainContentBlockToConverseContentBlock({\n block,\n onUnknown = 'throw',\n}: {\n block: string | MessageContentComplex;\n onUnknown?: 'throw' | 'passthrough';\n}): BedrockContentBlock {\n if (typeof block === 'string') {\n return { text: block };\n }\n\n if (block.type === 'text') {\n return { text: (block as { text: string }).text };\n }\n\n if (block.type === 'image_url') {\n const imageUrl =\n typeof (block as { image_url: string | { url: string } }).image_url ===\n 'string'\n ? (block as { image_url: string }).image_url\n : (block as { image_url: { url: string } }).image_url.url;\n return extractImageInfo(imageUrl);\n }\n\n if (block.type === 'image') {\n // Handle standard image block format\n const imageBlock = block as {\n source_type?: string;\n url?: string;\n data?: string;\n mime_type?: string;\n };\n if (\n imageBlock.source_type === 'url' &&\n imageBlock.url != null &&\n imageBlock.url !== ''\n ) {\n const parsedData = parseBase64DataUrl({\n dataUrl: imageBlock.url,\n asTypedArray: true,\n });\n if (parsedData != null) {\n const parsedMimeType = parseMimeType(parsedData.mime_type);\n return {\n image: {\n format: parsedMimeType.subtype as 'gif' | 'jpeg' | 'png' | 'webp',\n source: {\n bytes: parsedData.data as Uint8Array,\n },\n },\n };\n }\n } else if (\n imageBlock.source_type === 'base64' &&\n imageBlock.data != null &&\n imageBlock.data !== ''\n ) {\n let format: 'gif' | 'jpeg' | 'png' | 'webp' | undefined;\n if (imageBlock.mime_type != null && imageBlock.mime_type !== '') {\n const parsedMimeType = parseMimeType(imageBlock.mime_type);\n format = parsedMimeType.subtype as typeof format;\n }\n return {\n image: {\n format,\n source: {\n bytes: Uint8Array.from(atob(imageBlock.data), (c) =>\n c.charCodeAt(0)\n ),\n },\n },\n };\n }\n // If it already has the Bedrock image structure, pass through\n if ((block as { image?: unknown }).image !== undefined) {\n return {\n image: (block as { image: unknown }).image,\n } as BedrockContentBlock;\n }\n }\n\n if (\n block.type === 'document' &&\n (block as { document?: unknown }).document !== undefined\n ) {\n return {\n document: (block as { document: unknown }).document,\n } as BedrockContentBlock;\n }\n\n if (isDefaultCachePoint(block)) {\n return {\n cachePoint: {\n type: 'default',\n },\n } as BedrockContentBlock;\n }\n\n if (onUnknown === 'throw') {\n throw new Error(`Unsupported content block type: ${block.type}`);\n } else {\n return block as unknown as BedrockContentBlock;\n }\n}\n\n/**\n * Convert a system message to Bedrock system content blocks.\n */\nfunction convertSystemMessageToConverseMessage(\n msg: BaseMessage\n): BedrockSystemContentBlock[] {\n if (typeof msg.content === 'string') {\n return [{ text: msg.content }];\n } else if (Array.isArray(msg.content) && msg.content.length > 0) {\n const contentBlocks: BedrockSystemContentBlock[] = [];\n for (const block of msg.content) {\n if (\n typeof block === 'object' &&\n block.type === 'text' &&\n typeof (block as { text?: string }).text === 'string'\n ) {\n contentBlocks.push({\n text: (block as { text: string }).text,\n });\n } else if (isDefaultCachePoint(block)) {\n contentBlocks.push({\n cachePoint: {\n type: 'default',\n },\n } as BedrockSystemContentBlock);\n } else {\n break;\n }\n }\n if (msg.content.length === contentBlocks.length) {\n return contentBlocks;\n }\n }\n throw new Error(\n 'System message content must be either a string, or an array of text blocks, optionally including a cache point.'\n );\n}\n\n/**\n * Convert an AI message to a Bedrock message.\n */\nfunction convertAIMessageToConverseMessage(msg: BaseMessage): BedrockMessage {\n // Check for v1 format from other providers (PR #9766 fix)\n if (msg.response_metadata.output_version === 'v1') {\n return convertFromV1ToChatBedrockConverseMessage(msg);\n }\n\n const assistantMsg: BedrockMessage = {\n role: 'assistant',\n content: [],\n };\n\n if (typeof msg.content === 'string' && msg.content !== '') {\n assistantMsg.content?.push({ text: msg.content });\n } else if (Array.isArray(msg.content)) {\n const concatenatedBlocks = concatenateLangchainReasoningBlocks(\n msg.content as Array<MessageContentComplex | MessageContentReasoningBlock>\n );\n const contentBlocks: BedrockContentBlock[] = [];\n\n concatenatedBlocks.forEach((block) => {\n if (block.type === 'text') {\n const text = (block as { text?: string }).text ?? '';\n // Skip completely empty text blocks (common in AI messages with tool_use blocks)\n if (text === '') {\n return;\n }\n // Merge whitespace/newlines with previous text blocks to avoid validation errors.\n const cleanedText = text.replace(/\\n/g, '').trim();\n if (cleanedText === '') {\n if (contentBlocks.length > 0) {\n const lastBlock = contentBlocks[contentBlocks.length - 1];\n if ('text' in lastBlock) {\n const mergedTextContent = `${lastBlock.text}${text}`;\n (lastBlock as { text: string }).text = mergedTextContent;\n }\n }\n } else {\n contentBlocks.push({ text });\n }\n } else if (block.type === 'reasoning_content') {\n contentBlocks.push({\n reasoningContent: langchainReasoningBlockToBedrockReasoningBlock(\n block as MessageContentReasoningBlock\n ),\n } as BedrockContentBlock);\n } else if (isDefaultCachePoint(block)) {\n contentBlocks.push({\n cachePoint: {\n type: 'default',\n },\n } as BedrockContentBlock);\n } else {\n const blockValues = Object.fromEntries(\n Object.entries(block).filter(([key]) => key !== 'type')\n );\n throw new Error(\n `Unsupported content block type: ${block.type} with content of ${JSON.stringify(blockValues, null, 2)}`\n );\n }\n });\n\n assistantMsg.content = [...(assistantMsg.content ?? []), ...contentBlocks];\n }\n\n // Important: this must be placed after any reasoning content blocks\n if (isAIMessage(msg) && msg.tool_calls != null && msg.tool_calls.length > 0) {\n const toolUseBlocks = msg.tool_calls.map((tc) => ({\n toolUse: {\n toolUseId: tc.id,\n name: tc.name,\n input: tc.args as Record<string, unknown>,\n },\n }));\n assistantMsg.content = [\n ...(assistantMsg.content ?? []),\n ...toolUseBlocks,\n ] as BedrockContentBlock[];\n }\n\n return assistantMsg;\n}\n\n/**\n * Convert a v1 format message from other providers to Bedrock format.\n * This handles messages with standard content blocks like tool_call and reasoning.\n * (Implements PR #9766 fix for output_version v1 detection)\n */\nfunction convertFromV1ToChatBedrockConverseMessage(\n msg: BaseMessage\n): BedrockMessage {\n const assistantMsg: BedrockMessage = {\n role: 'assistant',\n content: [],\n };\n\n if (Array.isArray(msg.content)) {\n for (const block of msg.content) {\n if (typeof block === 'string') {\n assistantMsg.content?.push({ text: block });\n } else if (block.type === 'text') {\n assistantMsg.content?.push({ text: (block as { text: string }).text });\n } else if (block.type === 'tool_call') {\n const toolCall = block as {\n id: string;\n name: string;\n args: Record<string, unknown>;\n };\n assistantMsg.content?.push({\n toolUse: {\n toolUseId: toolCall.id,\n name: toolCall.name,\n input: toolCall.args as Record<string, unknown>,\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning') {\n const reasoning = block as { reasoning: string };\n assistantMsg.content?.push({\n reasoningContent: {\n reasoningText: { text: reasoning.reasoning },\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning_content') {\n assistantMsg.content?.push({\n reasoningContent: langchainReasoningBlockToBedrockReasoningBlock(\n block as MessageContentReasoningBlock\n ),\n } as BedrockContentBlock);\n }\n }\n } else if (typeof msg.content === 'string' && msg.content !== '') {\n assistantMsg.content?.push({ text: msg.content });\n }\n\n // Also handle tool_calls from the message\n if (isAIMessage(msg) && msg.tool_calls != null && msg.tool_calls.length > 0) {\n // Check if tool calls are already in content\n const existingToolUseIds = new Set(\n assistantMsg.content\n ?.filter((c) => 'toolUse' in c)\n .map(\n (c) => (c as { toolUse: { toolUseId: string } }).toolUse.toolUseId\n ) ?? []\n );\n\n for (const tc of msg.tool_calls) {\n if (!existingToolUseIds.has(tc.id ?? '')) {\n assistantMsg.content?.push({\n toolUse: {\n toolUseId: tc.id,\n name: tc.name,\n input: tc.args as Record<string, unknown>,\n },\n } as BedrockContentBlock);\n }\n }\n }\n\n return assistantMsg;\n}\n\n/**\n * Convert a human message to a Bedrock message.\n */\nfunction convertHumanMessageToConverseMessage(\n msg: BaseMessage\n): BedrockMessage {\n const userMessage: BedrockMessage = {\n role: 'user',\n content: [],\n };\n\n if (typeof msg.content === 'string') {\n userMessage.content = [{ text: msg.content }];\n } else if (Array.isArray(msg.content)) {\n userMessage.content = msg.content.map((block) =>\n convertLangChainContentBlockToConverseContentBlock({ block })\n );\n }\n\n return userMessage;\n}\n\n/**\n * Convert a tool message to a Bedrock message.\n */\nfunction convertToolMessageToConverseMessage(msg: BaseMessage): BedrockMessage {\n const toolCallId = (msg as { tool_call_id?: string }).tool_call_id;\n\n let content: BedrockContentBlock[];\n if (typeof msg.content === 'string') {\n content = [{ text: msg.content }];\n } else if (Array.isArray(msg.content)) {\n content = msg.content.map((block) =>\n convertLangChainContentBlockToConverseContentBlock({\n block,\n onUnknown: 'passthrough',\n })\n );\n } else {\n content = [{ text: String(msg.content) }];\n }\n\n return {\n role: 'user',\n content: [\n {\n toolResult: {\n toolUseId: toolCallId,\n content: content as { text: string }[],\n },\n },\n ],\n };\n}\n\n/**\n * Convert LangChain messages to Bedrock Converse messages.\n */\nexport function convertToConverseMessages(messages: BaseMessage[]): {\n converseMessages: BedrockMessage[];\n converseSystem: BedrockSystemContentBlock[];\n} {\n const converseSystem = messages\n .filter((msg) => msg._getType() === 'system')\n .flatMap((msg) => convertSystemMessageToConverseMessage(msg));\n\n const converseMessages = messages\n .filter((msg) => msg._getType() !== 'system')\n .map((msg) => {\n if (msg._getType() === 'ai') {\n return convertAIMessageToConverseMessage(msg);\n } else if (msg._getType() === 'human' || msg._getType() === 'generic') {\n return convertHumanMessageToConverseMessage(msg);\n } else if (msg._getType() === 'tool') {\n return convertToolMessageToConverseMessage(msg);\n } else {\n throw new Error(`Unsupported message type: ${msg._getType()}`);\n }\n });\n\n // Combine consecutive user tool result messages into a single message\n const combinedConverseMessages = converseMessages.reduce<BedrockMessage[]>(\n (acc, curr) => {\n const lastMessage = acc[acc.length - 1];\n if (lastMessage == null) {\n acc.push(curr);\n return acc;\n }\n const lastHasToolResult =\n lastMessage.content?.some((c) => 'toolResult' in c) === true;\n const currHasToolResult =\n curr.content?.some((c) => 'toolResult' in c) === true;\n if (\n lastMessage.role === 'user' &&\n lastHasToolResult &&\n curr.role === 'user' &&\n currHasToolResult\n ) {\n lastMessage.content = lastMessage.content?.concat(curr.content ?? []);\n } else {\n acc.push(curr);\n }\n return acc;\n },\n []\n );\n\n return { converseMessages: combinedConverseMessages, converseSystem };\n}\n"],"names":["parseBase64DataUrl","parseMimeType","isAIMessage"],"mappings":";;;;AAAA;;;AAGG;AAeH;;AAEG;AACG,SAAU,8CAA8C,CAC5D,OAAqC,EAAA;AAKrC,IAAA,IAAI,OAAO,CAAC,aAAa,IAAI,IAAI,EAAE;QACjC,OAAO;YACL,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC;IACH;AACA,IAAA,IAAI,OAAO,CAAC,eAAe,IAAI,IAAI,IAAI,OAAO,CAAC,eAAe,KAAK,EAAE,EAAE;QACrE,OAAO;AACL,YAAA,eAAe,EAAE,IAAI,UAAU,CAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAC/C;SACF;IACH;AACA,IAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC;AAC9C;AAEA;;AAEG;AACG,SAAU,mCAAmC,CACjD,OAAoE,EAAA;IAEpE,MAAM,MAAM,GACV,EAAE;AAEJ,IAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE;YACtC,MAAM,gBAAgB,GAAG,KAAqC;AAC9D,YAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;;AAGnC,YAAA,IAAI,SAAS,IAAI,CAAC,EAAE;AAClB,gBAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AACnC,gBAAA,IACE,SAAS,CAAC,IAAI,KAAK,mBAAmB;oBACrC,SAA0C,CAAC,aAAa,IAAI,IAAI;AACjE,oBAAA,gBAAgB,CAAC,aAAa,IAAI,IAAI,EACtC;oBACA,MAAM,aAAa,GAAG,SAAyC;;AAE/D,oBAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,aAAa,EAAE,IAAI;AAClD,oBAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,aAAa,CAAC,IAAI;oBACvD,IACE,QAAQ,IAAI,IAAI;AAChB,wBAAA,QAAQ,KAAK,EAAE;AACf,wBAAA,WAAW,IAAI,IAAI;wBACnB,WAAW,KAAK,EAAE,EAClB;wBACA,aAAa,CAAC,aAAc,CAAC,IAAI,GAAG,QAAQ,GAAG,WAAW;oBAC5D;AAAO,yBAAA,IACL,gBAAgB,CAAC,aAAa,CAAC,SAAS,IAAI,IAAI;AAChD,wBAAA,gBAAgB,CAAC,aAAa,CAAC,SAAS,KAAK,EAAE,EAC/C;wBACA,aAAa,CAAC,aAAc,CAAC,SAAS;AACpC,4BAAA,gBAAgB,CAAC,aAAa,CAAC,SAAS;oBAC5C;oBACA;gBACF;YACF;YAEA,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAkC,CAAC;QAC3D;aAAO;AACL,YAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACpB;IACF;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;;AAEG;AACG,SAAU,gBAAgB,CAAC,MAAc,EAAA;;IAE7C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC;AAC9D,IAAA,IAAI,MAAmD;IACvD,IAAI,WAAW,EAAE;QACf,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AACpD,QAAA,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;YAC5D,MAAM,GAAG,eAAgC;QAC3C;IACF;;IAGA,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;;AAGjE,IAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC;AACjD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAC/C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;IACvC;IAEA,OAAO;AACL,QAAA,KAAK,EAAE;YACL,MAAM;AACN,YAAA,MAAM,EAAE;gBACN,KAAK;AACN,aAAA;AACF,SAAA;KACF;AACH;AAEA;;AAEG;AACH,SAAS,mBAAmB,CAAC,KAAc,EAAA;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC/C,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,EAAE,YAAY,IAAI,KAAK,CAAC,EAAE;AAC5B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,MAAM,UAAU,GAAI,KAAkC,CAAC,UAAU;IACjE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE;AACzD,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,EAAE,MAAM,IAAI,UAAU,CAAC,EAAE;AAC3B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,OAAQ,UAAgC,CAAC,IAAI,KAAK,SAAS;AAC7D;AAEA;;AAEG;AACH,SAAS,kDAAkD,CAAC,EAC1D,KAAK,EACL,SAAS,GAAG,OAAO,GAIpB,EAAA;AACC,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;IACxB;AAEA,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACzB,QAAA,OAAO,EAAE,IAAI,EAAG,KAA0B,CAAC,IAAI,EAAE;IACnD;AAEA,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;AAC9B,QAAA,MAAM,QAAQ,GACZ,OAAQ,KAAiD,CAAC,SAAS;YACnE;cACK,KAA+B,CAAC;AACnC,cAAG,KAAwC,CAAC,SAAS,CAAC,GAAG;AAC7D,QAAA,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IACnC;AAEA,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;;QAE1B,MAAM,UAAU,GAAG,KAKlB;AACD,QAAA,IACE,UAAU,CAAC,WAAW,KAAK,KAAK;YAChC,UAAU,CAAC,GAAG,IAAI,IAAI;AACtB,YAAA,UAAU,CAAC,GAAG,KAAK,EAAE,EACrB;YACA,MAAM,UAAU,GAAGA,2BAAkB,CAAC;gBACpC,OAAO,EAAE,UAAU,CAAC,GAAG;AACvB,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA,CAAC;AACF,YAAA,IAAI,UAAU,IAAI,IAAI,EAAE;gBACtB,MAAM,cAAc,GAAGC,sBAAa,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC1D,OAAO;AACL,oBAAA,KAAK,EAAE;wBACL,MAAM,EAAE,cAAc,CAAC,OAA0C;AACjE,wBAAA,MAAM,EAAE;4BACN,KAAK,EAAE,UAAU,CAAC,IAAkB;AACrC,yBAAA;AACF,qBAAA;iBACF;YACH;QACF;AAAO,aAAA,IACL,UAAU,CAAC,WAAW,KAAK,QAAQ;YACnC,UAAU,CAAC,IAAI,IAAI,IAAI;AACvB,YAAA,UAAU,CAAC,IAAI,KAAK,EAAE,EACtB;AACA,YAAA,IAAI,MAAmD;AACvD,YAAA,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,IAAI,UAAU,CAAC,SAAS,KAAK,EAAE,EAAE;gBAC/D,MAAM,cAAc,GAAGA,sBAAa,CAAC,UAAU,CAAC,SAAS,CAAC;AAC1D,gBAAA,MAAM,GAAG,cAAc,CAAC,OAAwB;YAClD;YACA,OAAO;AACL,gBAAA,KAAK,EAAE;oBACL,MAAM;AACN,oBAAA,MAAM,EAAE;wBACN,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAC9C,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAChB;AACF,qBAAA;AACF,iBAAA;aACF;QACH;;AAEA,QAAA,IAAK,KAA6B,CAAC,KAAK,KAAK,SAAS,EAAE;YACtD,OAAO;gBACL,KAAK,EAAG,KAA4B,CAAC,KAAK;aACpB;QAC1B;IACF;AAEA,IAAA,IACE,KAAK,CAAC,IAAI,KAAK,UAAU;AACxB,QAAA,KAAgC,CAAC,QAAQ,KAAK,SAAS,EACxD;QACA,OAAO;YACL,QAAQ,EAAG,KAA+B,CAAC,QAAQ;SAC7B;IAC1B;AAEA,IAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;QAC9B,OAAO;AACL,YAAA,UAAU,EAAE;AACV,gBAAA,IAAI,EAAE,SAAS;AAChB,aAAA;SACqB;IAC1B;AAEA,IAAA,IAAI,SAAS,KAAK,OAAO,EAAE;QACzB,MAAM,IAAI,KAAK,CAAC,CAAA,gCAAA,EAAmC,KAAK,CAAC,IAAI,CAAA,CAAE,CAAC;IAClE;SAAO;AACL,QAAA,OAAO,KAAuC;IAChD;AACF;AAEA;;AAEG;AACH,SAAS,qCAAqC,CAC5C,GAAgB,EAAA;AAEhB,IAAA,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE;QACnC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IAChC;AAAO,SAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/D,MAAM,aAAa,GAAgC,EAAE;AACrD,QAAA,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE;YAC/B,IACE,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,CAAC,IAAI,KAAK,MAAM;AACrB,gBAAA,OAAQ,KAA2B,CAAC,IAAI,KAAK,QAAQ,EACrD;gBACA,aAAa,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAG,KAA0B,CAAC,IAAI;AACvC,iBAAA,CAAC;YACJ;AAAO,iBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBACrC,aAAa,CAAC,IAAI,CAAC;AACjB,oBAAA,UAAU,EAAE;AACV,wBAAA,IAAI,EAAE,SAAS;AAChB,qBAAA;AAC2B,iBAAA,CAAC;YACjC;iBAAO;gBACL;YACF;QACF;QACA,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE;AAC/C,YAAA,OAAO,aAAa;QACtB;IACF;AACA,IAAA,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH;AACH;AAEA;;AAEG;AACH,SAAS,iCAAiC,CAAC,GAAgB,EAAA;;IAEzD,IAAI,GAAG,CAAC,iBAAiB,CAAC,cAAc,KAAK,IAAI,EAAE;AACjD,QAAA,OAAO,yCAAyC,CAAC,GAAG,CAAC;IACvD;AAEA,IAAA,MAAM,YAAY,GAAmB;AACnC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,OAAO,EAAE,EAAE;KACZ;AAED,IAAA,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,EAAE,EAAE;AACzD,QAAA,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACnD;SAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QACrC,MAAM,kBAAkB,GAAG,mCAAmC,CAC5D,GAAG,CAAC,OAAsE,CAC3E;QACD,MAAM,aAAa,GAA0B,EAAE;AAE/C,QAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;AACnC,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACzB,gBAAA,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,IAAI,EAAE;;AAEpD,gBAAA,IAAI,IAAI,KAAK,EAAE,EAAE;oBACf;gBACF;;AAEA,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;AAClD,gBAAA,IAAI,WAAW,KAAK,EAAE,EAAE;AACtB,oBAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;wBAC5B,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;AACzD,wBAAA,IAAI,MAAM,IAAI,SAAS,EAAE;4BACvB,MAAM,iBAAiB,GAAG,CAAA,EAAG,SAAS,CAAC,IAAI,CAAA,EAAG,IAAI,CAAA,CAAE;AACnD,4BAAA,SAA8B,CAAC,IAAI,GAAG,iBAAiB;wBAC1D;oBACF;gBACF;qBAAO;AACL,oBAAA,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;gBAC9B;YACF;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE;gBAC7C,aAAa,CAAC,IAAI,CAAC;AACjB,oBAAA,gBAAgB,EAAE,8CAA8C,CAC9D,KAAqC,CACtC;AACqB,iBAAA,CAAC;YAC3B;AAAO,iBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBACrC,aAAa,CAAC,IAAI,CAAC;AACjB,oBAAA,UAAU,EAAE;AACV,wBAAA,IAAI,EAAE,SAAS;AAChB,qBAAA;AACqB,iBAAA,CAAC;YAC3B;iBAAO;gBACL,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,MAAM,CAAC,CACxD;gBACD,MAAM,IAAI,KAAK,CACb,CAAA,gCAAA,EAAmC,KAAK,CAAC,IAAI,oBAAoB,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA,CAAE,CACxG;YACH;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,YAAY,CAAC,OAAO,GAAG,CAAC,IAAI,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC;IAC5E;;AAGA,IAAA,IAAIC,oBAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3E,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;AAChD,YAAA,OAAO,EAAE;gBACP,SAAS,EAAE,EAAE,CAAC,EAAE;gBAChB,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,KAAK,EAAE,EAAE,CAAC,IAA+B;AAC1C,aAAA;AACF,SAAA,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,GAAG;AACrB,YAAA,IAAI,YAAY,CAAC,OAAO,IAAI,EAAE,CAAC;AAC/B,YAAA,GAAG,aAAa;SACQ;IAC5B;AAEA,IAAA,OAAO,YAAY;AACrB;AAEA;;;;AAIG;AACH,SAAS,yCAAyC,CAChD,GAAgB,EAAA;AAEhB,IAAA,MAAM,YAAY,GAAmB;AACnC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,OAAO,EAAE,EAAE;KACZ;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AAC9B,QAAA,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE;AAC/B,YAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;gBAC7B,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC7C;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AAChC,gBAAA,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAG,KAA0B,CAAC,IAAI,EAAE,CAAC;YACxE;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;gBACrC,MAAM,QAAQ,GAAG,KAIhB;AACD,gBAAA,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;AACzB,oBAAA,OAAO,EAAE;wBACP,SAAS,EAAE,QAAQ,CAAC,EAAE;wBACtB,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,KAAK,EAAE,QAAQ,CAAC,IAA+B;AAChD,qBAAA;AACqB,iBAAA,CAAC;YAC3B;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;gBACrC,MAAM,SAAS,GAAG,KAA8B;AAChD,gBAAA,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;AACzB,oBAAA,gBAAgB,EAAE;AAChB,wBAAA,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE;AAC7C,qBAAA;AACqB,iBAAA,CAAC;YAC3B;AAAO,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE;AAC7C,gBAAA,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;AACzB,oBAAA,gBAAgB,EAAE,8CAA8C,CAC9D,KAAqC,CACtC;AACqB,iBAAA,CAAC;YAC3B;QACF;IACF;AAAO,SAAA,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,EAAE,EAAE;AAChE,QAAA,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACnD;;AAGA,IAAA,IAAIA,oBAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;;AAE3E,QAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAChC,YAAY,CAAC;cACT,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC;AAC7B,aAAA,GAAG,CACF,CAAC,CAAC,KAAM,CAAwC,CAAC,OAAO,CAAC,SAAS,CACnE,IAAI,EAAE,CACV;AAED,QAAA,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE;AAC/B,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;AACxC,gBAAA,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;AACzB,oBAAA,OAAO,EAAE;wBACP,SAAS,EAAE,EAAE,CAAC,EAAE;wBAChB,IAAI,EAAE,EAAE,CAAC,IAAI;wBACb,KAAK,EAAE,EAAE,CAAC,IAA+B;AAC1C,qBAAA;AACqB,iBAAA,CAAC;YAC3B;QACF;IACF;AAEA,IAAA,OAAO,YAAY;AACrB;AAEA;;AAEG;AACH,SAAS,oCAAoC,CAC3C,GAAgB,EAAA;AAEhB,IAAA,MAAM,WAAW,GAAmB;AAClC,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,OAAO,EAAE,EAAE;KACZ;AAED,IAAA,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE;AACnC,QAAA,WAAW,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/C;SAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QACrC,WAAW,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAC1C,kDAAkD,CAAC,EAAE,KAAK,EAAE,CAAC,CAC9D;IACH;AAEA,IAAA,OAAO,WAAW;AACpB;AAEA;;AAEG;AACH,SAAS,mCAAmC,CAAC,GAAgB,EAAA;AAC3D,IAAA,MAAM,UAAU,GAAI,GAAiC,CAAC,YAAY;AAElE,IAAA,IAAI,OAA8B;AAClC,IAAA,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE;QACnC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACnC;SAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACrC,QAAA,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAC9B,kDAAkD,CAAC;YACjD,KAAK;AACL,YAAA,SAAS,EAAE,aAAa;AACzB,SAAA,CAAC,CACH;IACH;SAAO;AACL,QAAA,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C;IAEA,OAAO;AACL,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,OAAO,EAAE;AACP,YAAA;AACE,gBAAA,UAAU,EAAE;AACV,oBAAA,SAAS,EAAE,UAAU;AACrB,oBAAA,OAAO,EAAE,OAA6B;AACvC,iBAAA;AACF,aAAA;AACF,SAAA;KACF;AACH;AAEA;;AAEG;AACG,SAAU,yBAAyB,CAAC,QAAuB,EAAA;IAI/D,MAAM,cAAc,GAAG;AACpB,SAAA,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,EAAE,KAAK,QAAQ;SAC3C,OAAO,CAAC,CAAC,GAAG,KAAK,qCAAqC,CAAC,GAAG,CAAC,CAAC;IAE/D,MAAM,gBAAgB,GAAG;AACtB,SAAA,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,EAAE,KAAK,QAAQ;AAC3C,SAAA,GAAG,CAAC,CAAC,GAAG,KAAI;AACX,QAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;AAC3B,YAAA,OAAO,iCAAiC,CAAC,GAAG,CAAC;QAC/C;AAAO,aAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,SAAS,EAAE;AACrE,YAAA,OAAO,oCAAoC,CAAC,GAAG,CAAC;QAClD;AAAO,aAAA,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,MAAM,EAAE;AACpC,YAAA,OAAO,mCAAmC,CAAC,GAAG,CAAC;QACjD;aAAO;YACL,MAAM,IAAI,KAAK,CAAC,CAAA,0BAAA,EAA6B,GAAG,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;QAChE;AACF,IAAA,CAAC,CAAC;;IAGJ,MAAM,wBAAwB,GAAG,gBAAgB,CAAC,MAAM,CACtD,CAAC,GAAG,EAAE,IAAI,KAAI;QACZ,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACvC,QAAA,IAAI,WAAW,IAAI,IAAI,EAAE;AACvB,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACd,YAAA,OAAO,GAAG;QACZ;AACA,QAAA,MAAM,iBAAiB,GACrB,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI;AAC9D,QAAA,MAAM,iBAAiB,GACrB,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,CAAC,KAAK,IAAI;AACvD,QAAA,IACE,WAAW,CAAC,IAAI,KAAK,MAAM;YAC3B,iBAAiB;YACjB,IAAI,CAAC,IAAI,KAAK,MAAM;AACpB,YAAA,iBAAiB,EACjB;AACA,YAAA,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACvE;aAAO;AACL,YAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAChB;AACA,QAAA,OAAO,GAAG;IACZ,CAAC,EACD,EAAE,CACH;AAED,IAAA,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,cAAc,EAAE;AACvE;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"message_inputs.cjs","sources":["../../../../../src/llm/bedrock/utils/message_inputs.ts"],"sourcesContent":["/**\n * Utility functions for converting LangChain messages to Bedrock Converse messages.\n * Ported from @langchain/aws common.js\n */\nimport {\n type BaseMessage,\n isAIMessage,\n type Data,\n parseBase64DataUrl,\n parseMimeType,\n MessageContentComplex,\n type StandardContentBlockConverter,\n convertToProviderContentBlock,\n isDataContentBlock,\n} from '@langchain/core/messages';\nimport type {\n AudioFormat,\n AudioSource,\n DocumentFormat,\n DocumentSource,\n VideoFormat,\n VideoSource,\n} from '@aws-sdk/client-bedrock-runtime';\nimport type {\n BedrockMessage,\n BedrockSystemContentBlock,\n BedrockContentBlock,\n MessageContentReasoningBlock,\n} from '../types';\n\n/**\n * Convert a LangChain reasoning block to a Bedrock reasoning block.\n */\nexport function langchainReasoningBlockToBedrockReasoningBlock(\n content: MessageContentReasoningBlock\n): {\n reasoningText?: { text?: string; signature?: string };\n redactedContent?: Uint8Array;\n} {\n if (content.reasoningText != null) {\n return {\n reasoningText: content.reasoningText,\n };\n }\n if (content.redactedContent != null && content.redactedContent !== '') {\n return {\n redactedContent: new Uint8Array(\n Buffer.from(content.redactedContent, 'base64')\n ),\n };\n }\n throw new Error('Invalid reasoning content');\n}\n\n/**\n * Concatenate consecutive reasoning blocks in content array.\n */\nexport function concatenateLangchainReasoningBlocks(\n content: Array<MessageContentComplex | MessageContentReasoningBlock>\n): Array<MessageContentComplex | MessageContentReasoningBlock> {\n const result: Array<MessageContentComplex | MessageContentReasoningBlock> =\n [];\n\n for (const block of content) {\n if (block.type === 'reasoning_content') {\n const currentReasoning = block as MessageContentReasoningBlock;\n const lastIndex = result.length - 1;\n\n // Check if we can merge with the previous block\n if (lastIndex >= 0) {\n const lastBlock = result[lastIndex];\n if (\n lastBlock.type === 'reasoning_content' &&\n (lastBlock as MessageContentReasoningBlock).reasoningText != null &&\n currentReasoning.reasoningText != null\n ) {\n const lastReasoning = lastBlock as MessageContentReasoningBlock;\n // Merge consecutive reasoning text blocks\n const lastText = lastReasoning.reasoningText?.text;\n const currentText = currentReasoning.reasoningText.text;\n if (\n lastText != null &&\n lastText !== '' &&\n currentText != null &&\n currentText !== ''\n ) {\n lastReasoning.reasoningText!.text = lastText + currentText;\n } else if (\n currentReasoning.reasoningText.signature != null &&\n currentReasoning.reasoningText.signature !== ''\n ) {\n lastReasoning.reasoningText!.signature =\n currentReasoning.reasoningText.signature;\n }\n continue;\n }\n }\n\n result.push({ ...block } as MessageContentReasoningBlock);\n } else {\n result.push(block);\n }\n }\n\n return result;\n}\n\n/**\n * Extract image info from a base64 string or URL.\n */\nexport function extractImageInfo(base64: string): BedrockContentBlock {\n // Extract the format from the base64 string\n const formatMatch = base64.match(/^data:image\\/(\\w+);base64,/);\n let format: 'gif' | 'jpeg' | 'png' | 'webp' | undefined;\n if (formatMatch) {\n const extractedFormat = formatMatch[1].toLowerCase();\n if (['gif', 'jpeg', 'png', 'webp'].includes(extractedFormat)) {\n format = extractedFormat as typeof format;\n }\n }\n\n // Remove the data URL prefix if present\n const base64Data = base64.replace(/^data:image\\/\\w+;base64,/, '');\n\n // Convert base64 to Uint8Array\n const binaryString = atob(base64Data);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i += 1) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return {\n image: {\n format,\n source: {\n bytes,\n },\n },\n };\n}\n\ntype MediaContentBlock = MessageContentComplex & {\n data?: string | Uint8Array;\n url?: string;\n fileId?: string;\n mimeType?: string;\n};\n\nconst mimeTypeToVideoFormat: Record<string, VideoFormat> = {\n 'video/flv': 'flv',\n 'video/mkv': 'mkv',\n 'video/mov': 'mov',\n 'video/mp4': 'mp4',\n 'video/mpeg': 'mpeg',\n 'video/mpg': 'mpg',\n 'video/three_gp': 'three_gp',\n 'video/webm': 'webm',\n 'video/wmv': 'wmv',\n};\n\nconst mimeTypeToAudioFormat: Record<string, AudioFormat> = {\n 'audio/aac': 'aac',\n 'audio/flac': 'flac',\n 'audio/m4a': 'm4a',\n 'audio/mka': 'mka',\n 'audio/mkv': 'mkv',\n 'audio/mp3': 'mp3',\n 'audio/mp4': 'mp4',\n 'audio/mpeg': 'mpeg',\n 'audio/mpga': 'mpga',\n 'audio/ogg': 'ogg',\n 'audio/opus': 'opus',\n 'audio/pcm': 'pcm',\n 'audio/wav': 'wav',\n 'audio/webm': 'webm',\n 'audio/x-aac': 'x-aac',\n};\n\nconst mimeTypeToDocumentFormat: Partial<Record<string, DocumentFormat>> = {\n 'text/csv': 'csv',\n 'application/msword': 'doc',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n 'docx',\n 'text/html': 'html',\n 'text/markdown': 'md',\n 'application/pdf': 'pdf',\n 'text/plain': 'txt',\n 'application/vnd.ms-excel': 'xls',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',\n};\n\nfunction base64ToBytes(data: string): Uint8Array {\n return Uint8Array.from(atob(data), (char) => char.charCodeAt(0));\n}\n\nfunction getMediaFormat<T extends string>(\n mimeType: string | undefined,\n formatMap: Record<string, T>\n): T | undefined {\n if (mimeType == null || mimeType === '') {\n return undefined;\n }\n return formatMap[mimeType] ?? (parseMimeType(mimeType).subtype as T);\n}\n\nfunction resolveMediaSource(\n block: MediaContentBlock\n): AudioSource | VideoSource {\n if (typeof block.data === 'string') {\n return { bytes: base64ToBytes(block.data) };\n }\n if (block.data instanceof Uint8Array) {\n return { bytes: block.data };\n }\n if (typeof block.url === 'string') {\n const parsedData = parseBase64DataUrl({\n dataUrl: block.url,\n asTypedArray: true,\n });\n if (parsedData != null) {\n return { bytes: parsedData.data as Uint8Array };\n }\n throw new Error(\n `Only base64 data URLs are supported for ${block.type} blocks with 'url' field with ChatBedrockConverse.`\n );\n }\n if (typeof block.fileId === 'string') {\n return { s3Location: { uri: block.fileId } };\n }\n throw new Error(\n `${block.type} block must include one of: 'data' (base64 string or Uint8Array), 'url' (base64 data URL), or 'fileId' (S3 URI).`\n );\n}\n\nfunction convertMultimodalVideoBlock(\n block: MediaContentBlock\n): BedrockContentBlock {\n return {\n video: {\n format: getMediaFormat(block.mimeType, mimeTypeToVideoFormat),\n source: resolveMediaSource(block) as VideoSource,\n },\n } as BedrockContentBlock;\n}\n\nfunction convertMultimodalAudioBlock(\n block: MediaContentBlock\n): BedrockContentBlock {\n return {\n audio: {\n format: getMediaFormat(block.mimeType, mimeTypeToAudioFormat),\n source: resolveMediaSource(block) as AudioSource,\n },\n } as BedrockContentBlock;\n}\n\nfunction getDocumentName(block: Data.StandardFileBlock): string {\n return (\n (block.metadata?.name as string | undefined) ??\n (block.metadata?.filename as string | undefined) ??\n (block.metadata?.title as string | undefined) ??\n globalThis.crypto.randomUUID().replace(/-/g, '').slice(0, 12)\n );\n}\n\nfunction getDocumentFormat(\n mimeType: string | undefined\n): DocumentFormat | undefined {\n if (mimeType == null || mimeType === '') {\n return undefined;\n }\n const parsedMimeType = parseMimeType(mimeType);\n const format =\n mimeTypeToDocumentFormat[\n `${parsedMimeType.type}/${parsedMimeType.subtype}`\n ];\n if (format === undefined) {\n throw new Error(\n `Unsupported file mime type: \"${mimeType}\" ChatBedrockConverse only supports ${Object.keys(\n mimeTypeToDocumentFormat\n ).join(', ')} formats.`\n );\n }\n return format;\n}\n\nconst standardContentBlockConverter: StandardContentBlockConverter<{\n text: BedrockContentBlock;\n image: BedrockContentBlock;\n file: BedrockContentBlock;\n}> = {\n providerName: 'ChatBedrockConverse',\n\n fromStandardTextBlock(block: Data.StandardTextBlock): BedrockContentBlock {\n return { text: block.text };\n },\n\n fromStandardImageBlock(block: Data.StandardImageBlock): BedrockContentBlock {\n if (block.source_type === 'url') {\n const parsedData = parseBase64DataUrl({\n dataUrl: block.url,\n asTypedArray: true,\n });\n if (parsedData == null) {\n throw new Error(\n [\n 'Only base64 data URLs are supported for image blocks with source type ',\n 'url',\n ' with ChatBedrockConverse.',\n ].join(String.fromCharCode(39))\n );\n }\n return {\n image: {\n format: parseMimeType(parsedData.mime_type).subtype as\n | 'gif'\n | 'jpeg'\n | 'png'\n | 'webp',\n source: { bytes: parsedData.data as Uint8Array },\n },\n };\n }\n if (block.source_type === 'base64') {\n let format: 'gif' | 'jpeg' | 'png' | 'webp' | undefined;\n if (block.mime_type != null && block.mime_type !== '') {\n format = parseMimeType(block.mime_type).subtype as typeof format;\n }\n if (format != null && !['gif', 'jpeg', 'png', 'webp'].includes(format)) {\n throw new Error(\n `Unsupported image mime type: \"${block.mime_type}\" ChatBedrockConverse only supports \"image/gif\", \"image/jpeg\", \"image/png\", and \"image/webp\" formats.`\n );\n }\n return {\n image: {\n format,\n source: { bytes: base64ToBytes(block.data) },\n },\n };\n }\n throw new Error(\n `Image source type '${block.source_type}' not supported with ChatBedrockConverse.`\n );\n },\n\n fromStandardFileBlock(block: Data.StandardFileBlock): BedrockContentBlock {\n const name = getDocumentName(block);\n if (block.source_type === 'text') {\n return {\n document: {\n name,\n format: 'txt',\n source: { bytes: new TextEncoder().encode(block.text) },\n },\n } as BedrockContentBlock;\n }\n if (block.source_type === 'url') {\n const parsedData = parseBase64DataUrl({\n dataUrl: block.url,\n asTypedArray: true,\n });\n if (parsedData == null) {\n throw new Error(\n [\n 'Only base64 data URLs are supported for file blocks with source type ',\n 'url',\n ' with ChatBedrockConverse.',\n ].join(String.fromCharCode(39))\n );\n }\n return {\n document: {\n name,\n format: getDocumentFormat(parsedData.mime_type),\n source: { bytes: parsedData.data as Uint8Array } as DocumentSource,\n },\n } as BedrockContentBlock;\n }\n if (block.source_type === 'base64') {\n return {\n document: {\n name,\n format: getDocumentFormat(block.mime_type),\n source: { bytes: base64ToBytes(block.data) } as DocumentSource,\n },\n } as BedrockContentBlock;\n }\n throw new Error(\n `File source type '${block.source_type}' not supported with ChatBedrockConverse.`\n );\n },\n};\n\n/**\n * Check if a block has a cache point.\n */\nfunction isDefaultCachePoint(block: unknown): boolean {\n if (typeof block !== 'object' || block === null) {\n return false;\n }\n if (!('cachePoint' in block)) {\n return false;\n }\n const cachePoint = (block as { cachePoint?: unknown }).cachePoint;\n if (typeof cachePoint !== 'object' || cachePoint === null) {\n return false;\n }\n if (!('type' in cachePoint)) {\n return false;\n }\n return (cachePoint as { type?: string }).type === 'default';\n}\n\n/**\n * Convert a LangChain content block to a Bedrock Converse content block.\n */\nfunction convertLangChainContentBlockToConverseContentBlock({\n block,\n onUnknown = 'throw',\n}: {\n block: string | MessageContentComplex;\n onUnknown?: 'throw' | 'passthrough';\n}): BedrockContentBlock {\n if (typeof block === 'string') {\n return { text: block };\n }\n\n if (isDataContentBlock(block)) {\n return convertToProviderContentBlock(block, standardContentBlockConverter);\n }\n\n if (block.type === 'text') {\n return { text: (block as { text: string }).text };\n }\n\n if (block.type === 'image_url') {\n const imageUrl =\n typeof (block as { image_url: string | { url: string } }).image_url ===\n 'string'\n ? (block as { image_url: string }).image_url\n : (block as { image_url: { url: string } }).image_url.url;\n return extractImageInfo(imageUrl);\n }\n\n if (block.type === 'image') {\n // Handle standard image block format\n const imageBlock = block as {\n source_type?: string;\n url?: string;\n data?: string;\n mime_type?: string;\n };\n if (\n imageBlock.source_type === 'url' &&\n imageBlock.url != null &&\n imageBlock.url !== ''\n ) {\n const parsedData = parseBase64DataUrl({\n dataUrl: imageBlock.url,\n asTypedArray: true,\n });\n if (parsedData != null) {\n const parsedMimeType = parseMimeType(parsedData.mime_type);\n return {\n image: {\n format: parsedMimeType.subtype as 'gif' | 'jpeg' | 'png' | 'webp',\n source: {\n bytes: parsedData.data as Uint8Array,\n },\n },\n };\n }\n } else if (\n imageBlock.source_type === 'base64' &&\n imageBlock.data != null &&\n imageBlock.data !== ''\n ) {\n let format: 'gif' | 'jpeg' | 'png' | 'webp' | undefined;\n if (imageBlock.mime_type != null && imageBlock.mime_type !== '') {\n const parsedMimeType = parseMimeType(imageBlock.mime_type);\n format = parsedMimeType.subtype as typeof format;\n }\n return {\n image: {\n format,\n source: {\n bytes: Uint8Array.from(atob(imageBlock.data), (c) =>\n c.charCodeAt(0)\n ),\n },\n },\n };\n }\n // If it already has the Bedrock image structure, pass through\n if ((block as { image?: unknown }).image !== undefined) {\n return {\n image: (block as { image: unknown }).image,\n } as BedrockContentBlock;\n }\n }\n\n if (\n block.type === 'video' &&\n (block as { video?: unknown }).video !== undefined\n ) {\n return {\n video: (block as { video: unknown }).video,\n } as BedrockContentBlock;\n }\n\n if (block.type === 'video') {\n return convertMultimodalVideoBlock(block as MediaContentBlock);\n }\n\n if (\n block.type === 'audio' &&\n (block as { audio?: unknown }).audio !== undefined\n ) {\n return {\n audio: (block as { audio: unknown }).audio,\n } as BedrockContentBlock;\n }\n\n if (block.type === 'audio') {\n return convertMultimodalAudioBlock(block as MediaContentBlock);\n }\n\n if (\n block.type === 'document' &&\n (block as { document?: unknown }).document !== undefined\n ) {\n return {\n document: (block as { document: unknown }).document,\n } as BedrockContentBlock;\n }\n\n if (isDefaultCachePoint(block)) {\n return {\n cachePoint: {\n type: 'default',\n },\n } as BedrockContentBlock;\n }\n\n if (onUnknown === 'throw') {\n throw new Error(`Unsupported content block type: ${block.type}`);\n } else {\n return block as unknown as BedrockContentBlock;\n }\n}\n\n/**\n * Convert a system message to Bedrock system content blocks.\n */\nfunction convertSystemMessageToConverseMessage(\n msg: BaseMessage\n): BedrockSystemContentBlock[] {\n if (typeof msg.content === 'string') {\n return [{ text: msg.content }];\n } else if (Array.isArray(msg.content) && msg.content.length > 0) {\n const contentBlocks: BedrockSystemContentBlock[] = [];\n for (const block of msg.content) {\n if (\n typeof block === 'object' &&\n block.type === 'text' &&\n typeof (block as { text?: string }).text === 'string'\n ) {\n contentBlocks.push({\n text: (block as { text: string }).text,\n });\n } else if (isDefaultCachePoint(block)) {\n contentBlocks.push({\n cachePoint: {\n type: 'default',\n },\n } as BedrockSystemContentBlock);\n } else {\n break;\n }\n }\n if (msg.content.length === contentBlocks.length) {\n return contentBlocks;\n }\n }\n throw new Error(\n 'System message content must be either a string, or an array of text blocks, optionally including a cache point.'\n );\n}\n\n/**\n * Convert an AI message to a Bedrock message.\n */\nfunction convertAIMessageToConverseMessage(msg: BaseMessage): BedrockMessage {\n // Check for v1 format from other providers (PR #9766 fix)\n const responseMetadata = msg.response_metadata as\n | { output_version?: string }\n | undefined;\n if (responseMetadata?.output_version === 'v1') {\n return convertFromV1ToChatBedrockConverseMessage(msg);\n }\n\n const assistantMsg: BedrockMessage = {\n role: 'assistant',\n content: [],\n };\n\n if (typeof msg.content === 'string' && msg.content !== '') {\n assistantMsg.content?.push({ text: msg.content });\n } else if (Array.isArray(msg.content)) {\n const concatenatedBlocks = concatenateLangchainReasoningBlocks(\n msg.content as Array<MessageContentComplex | MessageContentReasoningBlock>\n );\n const contentBlocks: BedrockContentBlock[] = [];\n\n concatenatedBlocks.forEach((block) => {\n if (block.type === 'text') {\n const text = (block as { text?: string }).text ?? '';\n // Skip completely empty text blocks (common in AI messages with tool_use blocks)\n if (text === '') {\n return;\n }\n // Merge whitespace/newlines with previous text blocks to avoid validation errors.\n const cleanedText = text.replace(/\\n/g, '').trim();\n if (cleanedText === '') {\n if (contentBlocks.length > 0) {\n const lastBlock = contentBlocks[contentBlocks.length - 1];\n if ('text' in lastBlock) {\n const mergedTextContent = `${lastBlock.text}${text}`;\n (lastBlock as { text: string }).text = mergedTextContent;\n }\n }\n } else {\n contentBlocks.push({ text });\n }\n } else if (block.type === 'reasoning_content') {\n contentBlocks.push({\n reasoningContent: langchainReasoningBlockToBedrockReasoningBlock(\n block as MessageContentReasoningBlock\n ),\n } as BedrockContentBlock);\n } else if (isDefaultCachePoint(block)) {\n contentBlocks.push({\n cachePoint: {\n type: 'default',\n },\n } as BedrockContentBlock);\n } else {\n const blockValues = Object.fromEntries(\n Object.entries(block).filter(([key]) => key !== 'type')\n );\n throw new Error(\n `Unsupported content block type: ${block.type} with content of ${JSON.stringify(blockValues, null, 2)}`\n );\n }\n });\n\n assistantMsg.content = [...(assistantMsg.content ?? []), ...contentBlocks];\n }\n\n // Important: this must be placed after any reasoning content blocks\n if (isAIMessage(msg) && msg.tool_calls != null && msg.tool_calls.length > 0) {\n const toolUseBlocks = msg.tool_calls.map((tc) => ({\n toolUse: {\n toolUseId: tc.id,\n name: tc.name,\n input: tc.args as Record<string, unknown>,\n },\n }));\n assistantMsg.content = [\n ...(assistantMsg.content ?? []),\n ...toolUseBlocks,\n ] as BedrockContentBlock[];\n }\n\n return assistantMsg;\n}\n\n/**\n * Convert a v1 format message from other providers to Bedrock format.\n * This handles messages with standard content blocks like tool_call and reasoning.\n * (Implements PR #9766 fix for output_version v1 detection)\n */\nfunction convertFromV1ToChatBedrockConverseMessage(\n msg: BaseMessage\n): BedrockMessage {\n const assistantMsg: BedrockMessage = {\n role: 'assistant',\n content: [],\n };\n\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as Array<\n MessageContentComplex | MessageContentReasoningBlock\n >) {\n if (typeof block === 'string') {\n assistantMsg.content?.push({ text: block });\n } else if (block.type === 'text') {\n assistantMsg.content?.push({ text: (block as { text: string }).text });\n } else if (block.type === 'tool_call') {\n const toolCall = block as {\n id: string;\n name: string;\n args: Record<string, unknown>;\n };\n assistantMsg.content?.push({\n toolUse: {\n toolUseId: toolCall.id,\n name: toolCall.name,\n input: toolCall.args as Record<string, unknown>,\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning') {\n const reasoning = block as { reasoning: string };\n assistantMsg.content?.push({\n reasoningContent: {\n reasoningText: { text: reasoning.reasoning },\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning_content') {\n assistantMsg.content?.push({\n reasoningContent: langchainReasoningBlockToBedrockReasoningBlock(\n block as MessageContentReasoningBlock\n ),\n } as BedrockContentBlock);\n }\n }\n } else if (typeof msg.content === 'string' && msg.content !== '') {\n assistantMsg.content?.push({ text: msg.content });\n }\n\n // Also handle tool_calls from the message\n if (isAIMessage(msg) && msg.tool_calls != null && msg.tool_calls.length > 0) {\n // Check if tool calls are already in content\n const existingToolUseIds = new Set(\n assistantMsg.content\n ?.filter((c) => 'toolUse' in c)\n .map(\n (c) => (c as { toolUse: { toolUseId: string } }).toolUse.toolUseId\n ) ?? []\n );\n\n for (const tc of msg.tool_calls) {\n if (!existingToolUseIds.has(tc.id ?? '')) {\n assistantMsg.content?.push({\n toolUse: {\n toolUseId: tc.id,\n name: tc.name,\n input: tc.args as Record<string, unknown>,\n },\n } as BedrockContentBlock);\n }\n }\n }\n\n return assistantMsg;\n}\n\n/**\n * Convert a human message to a Bedrock message.\n */\nfunction convertHumanMessageToConverseMessage(\n msg: BaseMessage\n): BedrockMessage {\n const userMessage: BedrockMessage = {\n role: 'user',\n content: [],\n };\n\n if (typeof msg.content === 'string') {\n userMessage.content = [{ text: msg.content }];\n } else if (Array.isArray(msg.content)) {\n userMessage.content = msg.content.map((block) =>\n convertLangChainContentBlockToConverseContentBlock({ block })\n );\n }\n\n return userMessage;\n}\n\n/**\n * Convert a tool message to a Bedrock message.\n */\nfunction convertToolMessageToConverseMessage(msg: BaseMessage): BedrockMessage {\n const toolCallId = (msg as { tool_call_id?: string }).tool_call_id;\n\n let content: BedrockContentBlock[];\n if (typeof msg.content === 'string') {\n content = [{ text: msg.content }];\n } else if (Array.isArray(msg.content)) {\n content = msg.content.map((block) =>\n convertLangChainContentBlockToConverseContentBlock({\n block,\n onUnknown: 'passthrough',\n })\n );\n } else {\n content = [{ text: String(msg.content) }];\n }\n\n return {\n role: 'user',\n content: [\n {\n toolResult: {\n toolUseId: toolCallId,\n content: content as { text: string }[],\n },\n },\n ],\n };\n}\n\n/**\n * Convert LangChain messages to Bedrock Converse messages.\n */\nexport function convertToConverseMessages(messages: BaseMessage[]): {\n converseMessages: BedrockMessage[];\n converseSystem: BedrockSystemContentBlock[];\n} {\n const converseSystem = messages\n .filter((msg) => msg._getType() === 'system')\n .flatMap((msg) => convertSystemMessageToConverseMessage(msg));\n\n const converseMessages = messages\n .filter((msg) => msg._getType() !== 'system')\n .map((msg) => {\n if (msg._getType() === 'ai') {\n return convertAIMessageToConverseMessage(msg);\n } else if (msg._getType() === 'human' || msg._getType() === 'generic') {\n return convertHumanMessageToConverseMessage(msg);\n } else if (msg._getType() === 'tool') {\n return convertToolMessageToConverseMessage(msg);\n } else {\n throw new Error(`Unsupported message type: ${msg._getType()}`);\n }\n });\n\n // Combine consecutive user tool result messages into a single message\n const combinedConverseMessages = converseMessages.reduce<BedrockMessage[]>(\n (acc, curr) => {\n if (acc.length === 0) {\n acc.push(curr);\n return acc;\n }\n const lastMessage = acc[acc.length - 1];\n const lastHasToolResult =\n lastMessage.content?.some((c) => 'toolResult' in c) === true;\n const currHasToolResult =\n curr.content?.some((c) => 'toolResult' in c) === true;\n if (\n lastMessage.role === 'user' &&\n lastHasToolResult &&\n curr.role === 'user' &&\n currHasToolResult\n ) {\n lastMessage.content = lastMessage.content?.concat(curr.content ?? []);\n } else {\n acc.push(curr);\n }\n return acc;\n },\n []\n );\n\n return { converseMessages: combinedConverseMessages, converseSystem };\n}\n"],"names":["parseMimeType","parseBase64DataUrl","isDataContentBlock","convertToProviderContentBlock","isAIMessage"],"mappings":"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"}
|