@librechat/agents 3.3.8 → 3.3.10
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/dist/cjs/agents/AgentContext.cjs +4 -0
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +66 -13
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +35 -2
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/hitl/askUserQuestion.cjs +3 -2
- package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +18 -48
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langfuse.cjs +174 -29
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseConfig.cjs +12 -0
- package/dist/cjs/langfuseConfig.cjs.map +1 -1
- package/dist/cjs/langfuseRuntimeContext.cjs +23 -2
- package/dist/cjs/langfuseRuntimeContext.cjs.map +1 -1
- package/dist/cjs/langfuseRuntimeScope.cjs +39 -8
- package/dist/cjs/langfuseRuntimeScope.cjs.map +1 -1
- package/dist/cjs/langfuseSpanRegistry.cjs +95 -0
- package/dist/cjs/langfuseSpanRegistry.cjs.map +1 -0
- package/dist/cjs/langfuseTraceShaping.cjs +121 -4
- package/dist/cjs/langfuseTraceShaping.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +39 -15
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +25 -5
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/init.cjs +3 -3
- package/dist/cjs/llm/invoke.cjs +5 -5
- package/dist/cjs/llm/openai/index.cjs +1 -1
- package/dist/cjs/main.cjs +10 -10
- package/dist/cjs/messages/prune.cjs +13 -1
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/prompts/activityLabel.cjs +24 -12
- package/dist/cjs/prompts/activityLabel.cjs.map +1 -1
- package/dist/cjs/run.cjs +57 -22
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/messageSerialization.cjs +6 -0
- package/dist/cjs/session/messageSerialization.cjs.map +1 -1
- package/dist/cjs/stream.cjs +21 -10
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +5 -0
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +253 -24
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +1 -1
- package/dist/cjs/tools/search/tool.cjs +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +1 -1
- package/dist/cjs/utils/index.cjs +2 -2
- package/dist/esm/agents/AgentContext.mjs +4 -0
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +67 -14
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +35 -2
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/hitl/askUserQuestion.mjs +3 -2
- package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +18 -48
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langfuse.mjs +176 -28
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseConfig.mjs +10 -1
- package/dist/esm/langfuseConfig.mjs.map +1 -1
- package/dist/esm/langfuseRuntimeContext.mjs +21 -3
- package/dist/esm/langfuseRuntimeContext.mjs.map +1 -1
- package/dist/esm/langfuseRuntimeScope.mjs +39 -10
- package/dist/esm/langfuseRuntimeScope.mjs.map +1 -1
- package/dist/esm/langfuseSpanRegistry.mjs +91 -0
- package/dist/esm/langfuseSpanRegistry.mjs.map +1 -0
- package/dist/esm/langfuseTraceShaping.mjs +121 -4
- package/dist/esm/langfuseTraceShaping.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +39 -15
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +25 -5
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/init.mjs +2 -2
- package/dist/esm/llm/invoke.mjs +5 -5
- package/dist/esm/llm/openai/index.mjs +1 -1
- package/dist/esm/main.mjs +8 -8
- package/dist/esm/messages/prune.mjs +13 -1
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/prompts/activityLabel.mjs +24 -12
- package/dist/esm/prompts/activityLabel.mjs.map +1 -1
- package/dist/esm/run.mjs +57 -22
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/messageSerialization.mjs +6 -0
- package/dist/esm/session/messageSerialization.mjs.map +1 -1
- package/dist/esm/stream.mjs +21 -10
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +5 -0
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +254 -25
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +1 -1
- package/dist/esm/tools/search/tool.mjs +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +1 -1
- package/dist/esm/utils/index.mjs +2 -2
- package/dist/types/agents/AgentContext.d.ts +2 -0
- package/dist/types/graphs/Graph.d.ts +24 -0
- package/dist/types/hitl/askUserQuestion.d.ts +11 -1
- package/dist/types/langfuse.d.ts +16 -8
- package/dist/types/langfuseConfig.d.ts +6 -0
- package/dist/types/langfuseRuntimeContext.d.ts +27 -1
- package/dist/types/langfuseRuntimeScope.d.ts +17 -2
- package/dist/types/langfuseSpanRegistry.d.ts +17 -0
- package/dist/types/langfuseTraceShaping.d.ts +2 -1
- package/dist/types/llm/anthropic/utils/message_inputs.d.ts +1 -0
- package/dist/types/run.d.ts +7 -0
- package/dist/types/session/types.d.ts +1 -0
- package/dist/types/tools/ToolNode.d.ts +7 -1
- package/dist/types/types/hitl.d.ts +8 -0
- package/dist/types/types/tools.d.ts +30 -0
- package/package.json +7 -4
- package/src/__tests__/stream.eagerArgsDivergence.test.ts +753 -0
- package/src/agents/AgentContext.ts +5 -0
- package/src/graphs/Graph.ts +108 -20
- package/src/graphs/MultiAgentGraph.ts +56 -2
- package/src/graphs/__tests__/composition.smoke.test.ts +4 -0
- package/src/hitl/askUserQuestion.ts +14 -1
- package/src/instrumentation.ts +35 -77
- package/src/langfuse.ts +320 -43
- package/src/langfuseConfig.ts +24 -0
- package/src/langfuseRuntimeContext.ts +43 -1
- package/src/langfuseRuntimeScope.ts +94 -21
- package/src/langfuseSpanRegistry.ts +131 -0
- package/src/langfuseTraceShaping.ts +194 -7
- package/src/llm/anthropic/utils/message_inputs.ts +70 -19
- package/src/llm/anthropic/utils/streaming-tool-input.test.ts +186 -11
- package/src/llm/bedrock/utils/message_inputs.test.ts +120 -4
- package/src/llm/bedrock/utils/message_inputs.ts +32 -7
- package/src/messages/prune.ts +12 -1
- package/src/prompts/activityLabel.ts +23 -6
- package/src/run.ts +91 -45
- package/src/scripts/activity-labels/captured.json +56 -0
- package/src/scripts/activity-labels/checks.cjs +205 -0
- package/src/scripts/activity-labels/corpus.cjs +473 -0
- package/src/scripts/activity-labels/report.cjs +203 -0
- package/src/scripts/activity-labels/rescore.cjs +102 -0
- package/src/scripts/activity-labels/run.ts +705 -0
- package/src/scripts/activity-labels/variants.ts +71 -0
- package/src/session/messageSerialization.ts +12 -1
- package/src/session/types.ts +1 -0
- package/src/specs/activity-label-prompt.test.ts +26 -10
- package/src/specs/agent-handoffs.test.ts +306 -0
- package/src/specs/discovered-tools.test.ts +217 -0
- package/src/specs/langfuse-callbacks.test.ts +456 -0
- package/src/specs/langfuse-routing.integration.test.ts +138 -1
- package/src/specs/langfuse-span-registry.test.ts +70 -0
- package/src/specs/langfuse-trace-shaping.test.ts +294 -0
- package/src/specs/prune.test.ts +38 -1
- package/src/stream.ts +70 -6
- package/src/summarization/node.ts +5 -0
- package/src/tools/ToolNode.ts +400 -9
- package/src/tools/__tests__/ToolNode.invalidToolCalls.test.ts +757 -0
- package/src/tools/__tests__/hitl.test.ts +58 -0
- package/src/types/hitl.ts +8 -0
- package/src/types/tools.ts +35 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message_inputs.cjs","names":["serializeStructuredValueBounded","HARD_MAX_TOOL_RESULT_CHARS"],"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 type ToolMessage,\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';\nimport { serializeStructuredValueBounded } from '@/utils/toolContent';\nimport { HARD_MAX_TOOL_RESULT_CHARS } from '@/utils/truncation';\n\n/**\n * Reasoning blocks from other providers, relative to Bedrock. Bedrock's native\n * reasoning format is `reasoning_content`; these carry provider-specific\n * signatures Bedrock cannot validate, so they are dropped on a cross-provider\n * handoff (e.g. Anthropic → Bedrock) rather than crashing the conversion.\n */\nconst FOREIGN_REASONING_TYPES = [\n 'thinking',\n 'redacted_thinking',\n 'reasoning',\n 'think',\n];\n\n/**\n * Google server-side tool blocks (`toolCall`/`toolResponse` parts from e.g.\n * URL context or Google Search). Only Google can execute these and validate\n * their thought signatures, so they are dropped on a cross-provider handoff\n * (e.g. Google → Bedrock); the assistant's answer text is kept.\n */\nconst FOREIGN_SERVER_TOOL_TYPES = ['toolCall', 'toolResponse'];\n\n/**\n * Bedrock Converse rejects assistant messages with no content blocks. When\n * filtering (e.g. dropping foreign reasoning) empties an assistant turn that\n * also has no tool calls, fall back to this placeholder text.\n */\nconst BEDROCK_EMPTY_TEXT_PLACEHOLDER = '_';\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 * Whether a reasoning block can be serialized to a valid Bedrock\n * `reasoningContent`. Bedrock Converse rejects `reasoningText` with a null/empty\n * `text` (e.g. a signature-only block that never merged with its text), so such\n * blocks must be dropped rather than sent.\n */\nfunction isSerializableBedrockReasoningBlock(\n content: MessageContentReasoningBlock\n): boolean {\n if (content.reasoningText != null) {\n const text = content.reasoningText.text;\n return text != null && text !== '';\n }\n return content.redactedContent != null && content.redactedContent !== '';\n}\n\nfunction appendSerializableBedrockTextBlock(\n contentBlocks: BedrockContentBlock[],\n text: string\n): boolean {\n if (text === '') {\n return false;\n }\n const cleanedText = text.replace(/\\n/g, '').trim();\n if (cleanedText !== '') {\n contentBlocks.push({ text });\n return true;\n }\n const lastBlock = contentBlocks[contentBlocks.length - 1] as\n | BedrockContentBlock\n | undefined;\n if (lastBlock == null || !('text' in lastBlock)) {\n return false;\n }\n const mergedTextContent = `${lastBlock.text}${text}`;\n (lastBlock as { text: string }).text = mergedTextContent;\n return true;\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 let pendingReasoning: MessageContentReasoningBlock | undefined;\n\n const flushPendingReasoning = (): void => {\n if (pendingReasoning != null) {\n result.push(pendingReasoning);\n pendingReasoning = undefined;\n }\n };\n\n for (const block of content) {\n if (block.type !== 'reasoning_content') {\n flushPendingReasoning();\n result.push(block);\n continue;\n }\n\n const currentReasoning = block as MessageContentReasoningBlock;\n if (currentReasoning.reasoningText != null) {\n const previousText = pendingReasoning?.reasoningText?.text;\n const previousSignature = pendingReasoning?.reasoningText?.signature;\n const { text, signature } = currentReasoning.reasoningText;\n const mergedReasoningText: { text?: string; signature?: string } = {};\n if (previousText !== undefined || text !== undefined) {\n mergedReasoningText.text = (previousText ?? '') + (text ?? '');\n }\n if (previousSignature !== undefined || signature !== undefined) {\n mergedReasoningText.signature =\n (previousSignature ?? '') + (signature ?? '');\n }\n pendingReasoning = {\n type: 'reasoning_content',\n reasoningText: mergedReasoningText,\n };\n\n // A signature seals the accumulated reasoning text. Any following\n // reasoning block starts a new independently signed Bedrock block.\n if ('signature' in currentReasoning.reasoningText) {\n flushPendingReasoning();\n }\n }\n\n if (currentReasoning.redactedContent != null) {\n flushPendingReasoning();\n result.push({\n type: 'reasoning_content',\n redactedContent: currentReasoning.redactedContent,\n });\n }\n }\n\n flushPendingReasoning();\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\ntype BedrockPromptCacheTtl = '5m' | '1h';\ntype NormalizedBedrockCachePoint = {\n type: 'default';\n ttl?: BedrockPromptCacheTtl;\n};\n\n/**\n * Check if a block has a default cache point and return its normalized form,\n * preserving an optional extended-TTL `ttl` (`'5m'` | `'1h'`). Returns\n * `undefined` when the block is not a default cache point.\n */\nfunction getDefaultCachePoint(\n block: unknown\n): NormalizedBedrockCachePoint | undefined {\n if (typeof block !== 'object' || block === null) {\n return undefined;\n }\n if (!('cachePoint' in block)) {\n return undefined;\n }\n const cachePoint = (block as { cachePoint?: unknown }).cachePoint;\n if (typeof cachePoint !== 'object' || cachePoint === null) {\n return undefined;\n }\n if (!('type' in cachePoint)) {\n return undefined;\n }\n if ((cachePoint as { type?: string }).type !== 'default') {\n return undefined;\n }\n const ttl = (cachePoint as { ttl?: unknown }).ttl;\n return ttl === '5m' || ttl === '1h'\n ? { type: 'default', ttl }\n : { 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 const cachePoint = getDefaultCachePoint(block);\n if (cachePoint != null) {\n return {\n cachePoint,\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 {\n const cachePoint = getDefaultCachePoint(block);\n if (cachePoint == null) {\n break;\n }\n contentBlocks.push({\n cachePoint,\n } as BedrockSystemContentBlock);\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 parsedToolCallIds = new Set(\n isAIMessage(msg)\n ? (msg.tool_calls ?? []).flatMap((toolCall) =>\n toolCall.id != null ? [toolCall.id] : []\n )\n : []\n );\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 appendSerializableBedrockTextBlock(contentBlocks, text);\n } else if (block.type === 'tool_use') {\n const toolUse = block as {\n id?: unknown;\n name?: unknown;\n input?: unknown;\n };\n if (\n typeof toolUse.id === 'string' &&\n parsedToolCallIds.has(toolUse.id)\n ) {\n return;\n }\n if (\n typeof toolUse.id !== 'string' ||\n typeof toolUse.name !== 'string' ||\n toolUse.input == null ||\n typeof toolUse.input !== 'object'\n ) {\n throw new Error('Invalid Anthropic tool_use content block');\n }\n contentBlocks.push({\n toolUse: {\n toolUseId: toolUse.id,\n name: toolUse.name,\n input: toolUse.input as Record<string, unknown>,\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning_content') {\n const reasoningBlock = block as MessageContentReasoningBlock;\n // Bedrock Converse rejects reasoningContent whose reasoningText.text is\n // null/empty (a signature-only block that never merged with its text).\n // Drop it rather than emit an invalid request; the empty-turn\n // placeholder below covers a turn left with no content.\n if (!isSerializableBedrockReasoningBlock(reasoningBlock)) {\n return;\n }\n contentBlocks.push({\n reasoningContent:\n langchainReasoningBlockToBedrockReasoningBlock(reasoningBlock),\n } as BedrockContentBlock);\n } else {\n const cachePoint = getDefaultCachePoint(block);\n if (cachePoint != null) {\n contentBlocks.push({\n cachePoint,\n } as BedrockContentBlock);\n } else if (FOREIGN_REASONING_TYPES.some((t) => t === block.type)) {\n // Reasoning from another provider (Anthropic `thinking`/\n // `redacted_thinking`, Google `reasoning`, LibreChat `think`).\n // Bedrock's native reasoning is `reasoning_content` (handled above); a\n // foreign block carries a signature Bedrock cannot validate, so drop\n // it on a cross-provider handoff (e.g. Anthropic → Bedrock) rather\n // than crash. The Bedrock model produces its own reasoning. Anything\n // else unknown still throws below — real content must be surfaced.\n return;\n } else if (FOREIGN_SERVER_TOOL_TYPES.some((t) => t === block.type)) {\n // Google server-side tool call/response (e.g. URL context) — only\n // Google can execute it or validate its thought signature; drop it\n // on a cross-provider handoff rather than crash.\n return;\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\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 existingToolUseIds = new Set(\n (assistantMsg.content ?? [])\n .filter((content) => 'toolUse' in content)\n .map((content) => content.toolUse?.toolUseId)\n );\n const toolUseBlocks = msg.tool_calls\n .filter((toolCall) => !existingToolUseIds.has(toolCall.id))\n .map((toolCall) => ({\n toolUse: {\n toolUseId: toolCall.id,\n name: toolCall.name,\n input: toolCall.args as Record<string, unknown>,\n },\n }));\n assistantMsg.content = [\n ...(assistantMsg.content ?? []),\n ...toolUseBlocks,\n ] as BedrockContentBlock[];\n }\n\n // Bedrock rejects an assistant message with no content blocks; if filtering\n // (e.g. dropping foreign reasoning) left it empty, emit a placeholder.\n if (assistantMsg.content == null || assistantMsg.content.length === 0) {\n assistantMsg.content = [{ text: BEDROCK_EMPTY_TEXT_PLACEHOLDER }];\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 contentBlocks: BedrockContentBlock[] = [];\n const assistantMsg: BedrockMessage = {\n role: 'assistant',\n content: contentBlocks,\n };\n let droppedUnserializableContent = false;\n let unconvertedContentType: string | undefined;\n\n if (Array.isArray(msg.content)) {\n const concatenatedBlocks = concatenateLangchainReasoningBlocks(\n msg.content as Array<MessageContentComplex | MessageContentReasoningBlock>\n );\n for (const block of concatenatedBlocks) {\n if (typeof block === 'string') {\n if (!appendSerializableBedrockTextBlock(contentBlocks, block)) {\n droppedUnserializableContent = true;\n }\n } else if (block.type === 'text') {\n const text = (block as { text?: string }).text ?? '';\n if (!appendSerializableBedrockTextBlock(contentBlocks, text)) {\n droppedUnserializableContent = true;\n }\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 contentBlocks.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 /** Bedrock Converse rejects `reasoningText` with a null/empty `text`\n * (`Member must not be null`), e.g. when the producing model omitted\n * reasoning text (`thinking.display: \"omitted\"`) — drop rather than send. */\n if (reasoning.reasoning == null || reasoning.reasoning === '') {\n droppedUnserializableContent = true;\n continue;\n }\n contentBlocks.push({\n reasoningContent: {\n reasoningText: { text: reasoning.reasoning },\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning_content') {\n const reasoningBlock = block as MessageContentReasoningBlock;\n if (!isSerializableBedrockReasoningBlock(reasoningBlock)) {\n droppedUnserializableContent = true;\n continue;\n }\n contentBlocks.push({\n reasoningContent:\n langchainReasoningBlockToBedrockReasoningBlock(reasoningBlock),\n } as BedrockContentBlock);\n } else {\n unconvertedContentType ??= block.type;\n }\n }\n } else if (typeof msg.content === 'string') {\n if (!appendSerializableBedrockTextBlock(contentBlocks, msg.content)) {\n droppedUnserializableContent = true;\n }\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 contentBlocks\n .filter((c) => 'toolUse' in c)\n .map((c) => (c as { toolUse: { toolUseId: string } }).toolUse.toolUseId)\n );\n\n for (const tc of msg.tool_calls) {\n if (!existingToolUseIds.has(tc.id ?? '')) {\n contentBlocks.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 const hasNoContent = contentBlocks.length === 0;\n if (hasNoContent && unconvertedContentType != null) {\n throw new Error(\n `Unsupported v1 content block type: ${unconvertedContentType}`\n );\n }\n if (hasNoContent && droppedUnserializableContent) {\n contentBlocks.push({ text: BEDROCK_EMPTY_TEXT_PLACEHOLDER });\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 let isError = (msg as ToolMessage).status === 'error';\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.flatMap((block) => {\n if (typeof block === 'object' && block.type === 'tool_result') {\n if ((block as { is_error?: unknown }).is_error === true) {\n isError = true;\n }\n const toolResultContent = (block as { content?: unknown }).content;\n if (typeof toolResultContent === 'string') {\n return [{ text: toolResultContent }];\n }\n if (Array.isArray(toolResultContent)) {\n return toolResultContent.map((nestedBlock) =>\n convertLangChainContentBlockToConverseContentBlock({\n block: nestedBlock,\n onUnknown: 'passthrough',\n })\n );\n }\n return [\n {\n text: serializeStructuredValueBounded(\n toolResultContent,\n HARD_MAX_TOOL_RESULT_CHARS\n ).content,\n },\n ];\n }\n return [\n convertLangChainContentBlockToConverseContentBlock({\n block,\n onUnknown: 'passthrough',\n }),\n ];\n });\n } else {\n content = [{ text: String(msg.content) }];\n }\n\n // A `cachePoint` is a message-level ContentBlock — it is NOT a valid\n // ToolResultContentBlock. A tail prompt-cache breakpoint that anchors on a\n // tool result therefore ends up nested inside `toolResult.content`, which\n // Bedrock silently ignores (no cache write, no cache read). Hoist any\n // cachePoint(s) out of the tool result body so they sit as siblings after\n // it, which is the only position Bedrock honors.\n const toolResultContent: BedrockContentBlock[] = [];\n const trailingCachePoints: BedrockContentBlock[] = [];\n for (const block of content) {\n const cachePoint = getDefaultCachePoint(block);\n if (cachePoint != null) {\n trailingCachePoints.push({\n cachePoint,\n } as BedrockContentBlock);\n } else {\n toolResultContent.push(block);\n }\n }\n\n return {\n role: 'user',\n content: [\n {\n toolResult: {\n toolUseId: toolCallId,\n content: toolResultContent as { text: string }[],\n ...(isError ? { status: 'error' as const } : {}),\n },\n },\n ...trailingCachePoints,\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 /**\n * Combine ALL consecutive user messages into one, not just tool-result\n * pairs. The Converse API documents strict role alternation; enforcement\n * varies by model family (Claude on Converse currently tolerates adjacent\n * user messages — verified live, 2026-07-28 — but the docs promise nothing\n * for the others), so the converter never emits the shape. The case that\n * matters: a `PostToolBatch`/`PreemptBoundary` hook injection lands a text\n * turn directly after tool results, and `ToolMessage` and `HumanMessage`\n * both convert to `role: 'user'` above. Block order is preserved\n * (toolResult blocks, then text) — verified live that Converse accepts the\n * mixed user message and answers both halves — and the toolUse/toolResult\n * pairing stays intact.\n */\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 if (lastMessage.role === 'user' && curr.role === 'user') {\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message_inputs.cjs","names":["serializeStructuredValueBounded","HARD_MAX_TOOL_RESULT_CHARS"],"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 type ToolMessage,\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';\nimport { serializeStructuredValueBounded } from '@/utils/toolContent';\nimport { HARD_MAX_TOOL_RESULT_CHARS } from '@/utils/truncation';\n\n/**\n * Reasoning blocks from other providers, relative to Bedrock. Bedrock's native\n * reasoning format is `reasoning_content`; these carry provider-specific\n * signatures Bedrock cannot validate, so they are dropped on a cross-provider\n * handoff (e.g. Anthropic → Bedrock) rather than crashing the conversion.\n */\nconst FOREIGN_REASONING_TYPES = [\n 'thinking',\n 'redacted_thinking',\n 'reasoning',\n 'think',\n];\n\n/**\n * Google server-side tool blocks (`toolCall`/`toolResponse` parts from e.g.\n * URL context or Google Search). Only Google can execute these and validate\n * their thought signatures, so they are dropped on a cross-provider handoff\n * (e.g. Google → Bedrock); the assistant's answer text is kept.\n */\nconst FOREIGN_SERVER_TOOL_TYPES = ['toolCall', 'toolResponse'];\n\n/**\n * Bedrock Converse rejects assistant messages with no content blocks. When\n * filtering (e.g. dropping foreign reasoning) empties an assistant turn that\n * also has no tool calls, fall back to this placeholder text.\n */\nconst BEDROCK_EMPTY_TEXT_PLACEHOLDER = '_';\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 * Whether a reasoning block can be serialized to a valid Bedrock\n * `reasoningContent`. Bedrock Converse rejects `reasoningText` with a null/empty\n * `text` (e.g. a signature-only block that never merged with its text), so such\n * blocks must be dropped rather than sent.\n */\nfunction isSerializableBedrockReasoningBlock(\n content: MessageContentReasoningBlock\n): boolean {\n if (content.reasoningText != null) {\n const text = content.reasoningText.text;\n return text != null && text !== '';\n }\n return content.redactedContent != null && content.redactedContent !== '';\n}\n\nfunction appendSerializableBedrockTextBlock(\n contentBlocks: BedrockContentBlock[],\n text: string\n): boolean {\n if (text === '') {\n return false;\n }\n const cleanedText = text.replace(/\\n/g, '').trim();\n if (cleanedText !== '') {\n contentBlocks.push({ text });\n return true;\n }\n const lastBlock = contentBlocks[contentBlocks.length - 1] as\n | BedrockContentBlock\n | undefined;\n if (lastBlock == null || !('text' in lastBlock)) {\n return false;\n }\n const mergedTextContent = `${lastBlock.text}${text}`;\n (lastBlock as { text: string }).text = mergedTextContent;\n return true;\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 let pendingReasoning: MessageContentReasoningBlock | undefined;\n\n const flushPendingReasoning = (): void => {\n if (pendingReasoning != null) {\n result.push(pendingReasoning);\n pendingReasoning = undefined;\n }\n };\n\n for (const block of content) {\n if (block.type !== 'reasoning_content') {\n flushPendingReasoning();\n result.push(block);\n continue;\n }\n\n const currentReasoning = block as MessageContentReasoningBlock;\n if (currentReasoning.reasoningText != null) {\n const previousText = pendingReasoning?.reasoningText?.text;\n const previousSignature = pendingReasoning?.reasoningText?.signature;\n const { text, signature } = currentReasoning.reasoningText;\n const mergedReasoningText: { text?: string; signature?: string } = {};\n if (previousText !== undefined || text !== undefined) {\n mergedReasoningText.text = (previousText ?? '') + (text ?? '');\n }\n if (previousSignature !== undefined || signature !== undefined) {\n mergedReasoningText.signature =\n (previousSignature ?? '') + (signature ?? '');\n }\n pendingReasoning = {\n type: 'reasoning_content',\n reasoningText: mergedReasoningText,\n };\n\n // A signature seals the accumulated reasoning text. Any following\n // reasoning block starts a new independently signed Bedrock block.\n if ('signature' in currentReasoning.reasoningText) {\n flushPendingReasoning();\n }\n }\n\n if (currentReasoning.redactedContent != null) {\n flushPendingReasoning();\n result.push({\n type: 'reasoning_content',\n redactedContent: currentReasoning.redactedContent,\n });\n }\n }\n\n flushPendingReasoning();\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\ntype BedrockPromptCacheTtl = '5m' | '1h';\ntype NormalizedBedrockCachePoint = {\n type: 'default';\n ttl?: BedrockPromptCacheTtl;\n};\n\n/**\n * Check if a block has a default cache point and return its normalized form,\n * preserving an optional extended-TTL `ttl` (`'5m'` | `'1h'`). Returns\n * `undefined` when the block is not a default cache point.\n */\nfunction getDefaultCachePoint(\n block: unknown\n): NormalizedBedrockCachePoint | undefined {\n if (typeof block !== 'object' || block === null) {\n return undefined;\n }\n if (!('cachePoint' in block)) {\n return undefined;\n }\n const cachePoint = (block as { cachePoint?: unknown }).cachePoint;\n if (typeof cachePoint !== 'object' || cachePoint === null) {\n return undefined;\n }\n if (!('type' in cachePoint)) {\n return undefined;\n }\n if ((cachePoint as { type?: string }).type !== 'default') {\n return undefined;\n }\n const ttl = (cachePoint as { ttl?: unknown }).ttl;\n return ttl === '5m' || ttl === '1h'\n ? { type: 'default', ttl }\n : { 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 const cachePoint = getDefaultCachePoint(block);\n if (cachePoint != null) {\n return {\n cachePoint,\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 {\n const cachePoint = getDefaultCachePoint(block);\n if (cachePoint == null) {\n break;\n }\n contentBlocks.push({\n cachePoint,\n } as BedrockSystemContentBlock);\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 */\n/**\n * Bedrock Converse requires `toolUse.input` to be a JSON object document.\n * History can carry non-object values: streaming leaves the raw partial-JSON\n * string on Anthropic-shaped inline blocks, and context-pressure truncation\n * (pre-3.x `createBoundedTruncationValue`) could persist `null` onto BOTH a\n * block's inline input and its `tool_calls` args. A string is parsed when it\n * forms a complete JSON object; every other shape degrades to `{}` — the call\n * already executed, so the replayed input is informational. Twin of\n * `coerceAnthropicToolUseInput` in the Anthropic fork; duplicated so each\n * fork stays self-contained against its upstream.\n */\nfunction coerceBedrockToolUseInput(input: unknown): Record<string, unknown> {\n let candidate: unknown = input;\n if (typeof candidate === 'string') {\n try {\n candidate = JSON.parse(candidate);\n } catch {\n return {};\n }\n }\n return typeof candidate === 'object' &&\n candidate !== null &&\n !Array.isArray(candidate)\n ? (candidate as Record<string, unknown>)\n : {};\n}\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 parsedToolCallIds = new Set(\n isAIMessage(msg)\n ? (msg.tool_calls ?? []).flatMap((toolCall) =>\n toolCall.id != null ? [toolCall.id] : []\n )\n : []\n );\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 appendSerializableBedrockTextBlock(contentBlocks, text);\n } else if (block.type === 'tool_use') {\n const toolUse = block as {\n id?: unknown;\n name?: unknown;\n input?: unknown;\n };\n if (\n typeof toolUse.id === 'string' &&\n parsedToolCallIds.has(toolUse.id)\n ) {\n return;\n }\n if (\n typeof toolUse.id !== 'string' ||\n typeof toolUse.name !== 'string'\n ) {\n throw new Error('Invalid Anthropic tool_use content block');\n }\n contentBlocks.push({\n toolUse: {\n toolUseId: toolUse.id,\n name: toolUse.name,\n input: coerceBedrockToolUseInput(toolUse.input),\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning_content') {\n const reasoningBlock = block as MessageContentReasoningBlock;\n // Bedrock Converse rejects reasoningContent whose reasoningText.text is\n // null/empty (a signature-only block that never merged with its text).\n // Drop it rather than emit an invalid request; the empty-turn\n // placeholder below covers a turn left with no content.\n if (!isSerializableBedrockReasoningBlock(reasoningBlock)) {\n return;\n }\n contentBlocks.push({\n reasoningContent:\n langchainReasoningBlockToBedrockReasoningBlock(reasoningBlock),\n } as BedrockContentBlock);\n } else {\n const cachePoint = getDefaultCachePoint(block);\n if (cachePoint != null) {\n contentBlocks.push({\n cachePoint,\n } as BedrockContentBlock);\n } else if (FOREIGN_REASONING_TYPES.some((t) => t === block.type)) {\n // Reasoning from another provider (Anthropic `thinking`/\n // `redacted_thinking`, Google `reasoning`, LibreChat `think`).\n // Bedrock's native reasoning is `reasoning_content` (handled above); a\n // foreign block carries a signature Bedrock cannot validate, so drop\n // it on a cross-provider handoff (e.g. Anthropic → Bedrock) rather\n // than crash. The Bedrock model produces its own reasoning. Anything\n // else unknown still throws below — real content must be surfaced.\n return;\n } else if (FOREIGN_SERVER_TOOL_TYPES.some((t) => t === block.type)) {\n // Google server-side tool call/response (e.g. URL context) — only\n // Google can execute it or validate its thought signature; drop it\n // on a cross-provider handoff rather than crash.\n return;\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\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 existingToolUseIds = new Set(\n (assistantMsg.content ?? [])\n .filter((content) => 'toolUse' in content)\n .map((content) => content.toolUse?.toolUseId)\n );\n const toolUseBlocks = msg.tool_calls\n .filter((toolCall) => !existingToolUseIds.has(toolCall.id))\n .map((toolCall) => ({\n toolUse: {\n toolUseId: toolCall.id,\n name: toolCall.name,\n input: coerceBedrockToolUseInput(toolCall.args),\n },\n }));\n assistantMsg.content = [\n ...(assistantMsg.content ?? []),\n ...toolUseBlocks,\n ] as BedrockContentBlock[];\n }\n\n // Bedrock rejects an assistant message with no content blocks; if filtering\n // (e.g. dropping foreign reasoning) left it empty, emit a placeholder.\n if (assistantMsg.content == null || assistantMsg.content.length === 0) {\n assistantMsg.content = [{ text: BEDROCK_EMPTY_TEXT_PLACEHOLDER }];\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 contentBlocks: BedrockContentBlock[] = [];\n const assistantMsg: BedrockMessage = {\n role: 'assistant',\n content: contentBlocks,\n };\n let droppedUnserializableContent = false;\n let unconvertedContentType: string | undefined;\n\n if (Array.isArray(msg.content)) {\n const concatenatedBlocks = concatenateLangchainReasoningBlocks(\n msg.content as Array<MessageContentComplex | MessageContentReasoningBlock>\n );\n for (const block of concatenatedBlocks) {\n if (typeof block === 'string') {\n if (!appendSerializableBedrockTextBlock(contentBlocks, block)) {\n droppedUnserializableContent = true;\n }\n } else if (block.type === 'text') {\n const text = (block as { text?: string }).text ?? '';\n if (!appendSerializableBedrockTextBlock(contentBlocks, text)) {\n droppedUnserializableContent = true;\n }\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 contentBlocks.push({\n toolUse: {\n toolUseId: toolCall.id,\n name: toolCall.name,\n input: coerceBedrockToolUseInput(toolCall.args),\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning') {\n const reasoning = block as { reasoning?: string };\n /** Bedrock Converse rejects `reasoningText` with a null/empty `text`\n * (`Member must not be null`), e.g. when the producing model omitted\n * reasoning text (`thinking.display: \"omitted\"`) — drop rather than send. */\n if (reasoning.reasoning == null || reasoning.reasoning === '') {\n droppedUnserializableContent = true;\n continue;\n }\n contentBlocks.push({\n reasoningContent: {\n reasoningText: { text: reasoning.reasoning },\n },\n } as BedrockContentBlock);\n } else if (block.type === 'reasoning_content') {\n const reasoningBlock = block as MessageContentReasoningBlock;\n if (!isSerializableBedrockReasoningBlock(reasoningBlock)) {\n droppedUnserializableContent = true;\n continue;\n }\n contentBlocks.push({\n reasoningContent:\n langchainReasoningBlockToBedrockReasoningBlock(reasoningBlock),\n } as BedrockContentBlock);\n } else {\n unconvertedContentType ??= block.type;\n }\n }\n } else if (typeof msg.content === 'string') {\n if (!appendSerializableBedrockTextBlock(contentBlocks, msg.content)) {\n droppedUnserializableContent = true;\n }\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 contentBlocks\n .filter((c) => 'toolUse' in c)\n .map((c) => (c as { toolUse: { toolUseId: string } }).toolUse.toolUseId)\n );\n\n for (const tc of msg.tool_calls) {\n if (!existingToolUseIds.has(tc.id ?? '')) {\n contentBlocks.push({\n toolUse: {\n toolUseId: tc.id,\n name: tc.name,\n input: coerceBedrockToolUseInput(tc.args),\n },\n } as BedrockContentBlock);\n }\n }\n }\n\n const hasNoContent = contentBlocks.length === 0;\n if (hasNoContent && unconvertedContentType != null) {\n throw new Error(\n `Unsupported v1 content block type: ${unconvertedContentType}`\n );\n }\n if (hasNoContent && droppedUnserializableContent) {\n contentBlocks.push({ text: BEDROCK_EMPTY_TEXT_PLACEHOLDER });\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 let isError = (msg as ToolMessage).status === 'error';\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.flatMap((block) => {\n if (typeof block === 'object' && block.type === 'tool_result') {\n if ((block as { is_error?: unknown }).is_error === true) {\n isError = true;\n }\n const toolResultContent = (block as { content?: unknown }).content;\n if (typeof toolResultContent === 'string') {\n return [{ text: toolResultContent }];\n }\n if (Array.isArray(toolResultContent)) {\n return toolResultContent.map((nestedBlock) =>\n convertLangChainContentBlockToConverseContentBlock({\n block: nestedBlock,\n onUnknown: 'passthrough',\n })\n );\n }\n return [\n {\n text: serializeStructuredValueBounded(\n toolResultContent,\n HARD_MAX_TOOL_RESULT_CHARS\n ).content,\n },\n ];\n }\n return [\n convertLangChainContentBlockToConverseContentBlock({\n block,\n onUnknown: 'passthrough',\n }),\n ];\n });\n } else {\n content = [{ text: String(msg.content) }];\n }\n\n // A `cachePoint` is a message-level ContentBlock — it is NOT a valid\n // ToolResultContentBlock. A tail prompt-cache breakpoint that anchors on a\n // tool result therefore ends up nested inside `toolResult.content`, which\n // Bedrock silently ignores (no cache write, no cache read). Hoist any\n // cachePoint(s) out of the tool result body so they sit as siblings after\n // it, which is the only position Bedrock honors.\n const toolResultContent: BedrockContentBlock[] = [];\n const trailingCachePoints: BedrockContentBlock[] = [];\n for (const block of content) {\n const cachePoint = getDefaultCachePoint(block);\n if (cachePoint != null) {\n trailingCachePoints.push({\n cachePoint,\n } as BedrockContentBlock);\n } else {\n toolResultContent.push(block);\n }\n }\n\n return {\n role: 'user',\n content: [\n {\n toolResult: {\n toolUseId: toolCallId,\n content: toolResultContent as { text: string }[],\n ...(isError ? { status: 'error' as const } : {}),\n },\n },\n ...trailingCachePoints,\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 /**\n * Combine ALL consecutive user messages into one, not just tool-result\n * pairs. The Converse API documents strict role alternation; enforcement\n * varies by model family (Claude on Converse currently tolerates adjacent\n * user messages — verified live, 2026-07-28 — but the docs promise nothing\n * for the others), so the converter never emits the shape. The case that\n * matters: a `PostToolBatch`/`PreemptBoundary` hook injection lands a text\n * turn directly after tool results, and `ToolMessage` and `HumanMessage`\n * both convert to `role: 'user'` above. Block order is preserved\n * (toolResult blocks, then text) — verified live that Converse accepts the\n * mixed user message and answers both halves — and the toolUse/toolResult\n * pairing stays intact.\n */\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 if (lastMessage.role === 'user' && curr.role === 'user') {\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"],"mappings":"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"}
|
package/dist/cjs/llm/init.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
require("../common/enum.cjs");
|
|
2
2
|
require("../common/index.cjs");
|
|
3
|
+
const require_index$1 = require("./openai/index.cjs");
|
|
4
|
+
const require_providers = require("./providers.cjs");
|
|
3
5
|
const require_llm = require("../utils/llm.cjs");
|
|
4
6
|
require("../utils/index.cjs");
|
|
5
|
-
const require_index$2 = require("./openai/index.cjs");
|
|
6
|
-
const require_providers = require("./providers.cjs");
|
|
7
7
|
let _langchain_google_vertexai = require("@langchain/google-vertexai");
|
|
8
8
|
//#region src/llm/init.ts
|
|
9
9
|
/**
|
|
@@ -17,7 +17,7 @@ let _langchain_google_vertexai = require("@langchain/google-vertexai");
|
|
|
17
17
|
*/
|
|
18
18
|
function initializeModel({ provider, clientOptions, tools, override }) {
|
|
19
19
|
const model = override ?? new (require_providers.getChatModelClass(provider))(clientOptions ?? {});
|
|
20
|
-
if (require_llm.isOpenAILike(provider) && (model instanceof require_index$
|
|
20
|
+
if (require_llm.isOpenAILike(provider) && (model instanceof require_index$1.ChatOpenAI || model instanceof require_index$1.AzureChatOpenAI)) {
|
|
21
21
|
const opts = clientOptions;
|
|
22
22
|
if (opts) {
|
|
23
23
|
model.temperature = opts.temperature;
|
package/dist/cjs/llm/invoke.cjs
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
const require_callbacks = require("../utils/callbacks.cjs");
|
|
2
1
|
require("../common/enum.cjs");
|
|
3
2
|
require("../common/index.cjs");
|
|
4
|
-
const
|
|
3
|
+
const require_callbacks = require("../utils/callbacks.cjs");
|
|
5
4
|
const require_cache = require("../messages/cache.cjs");
|
|
6
5
|
const require_core = require("../messages/core.cjs");
|
|
7
6
|
const require_events = require("../utils/events.cjs");
|
|
8
7
|
const require_alternation = require("../messages/alternation.cjs");
|
|
9
8
|
const require_handoffCue = require("../messages/handoffCue.cjs");
|
|
10
9
|
require("../messages/index.cjs");
|
|
11
|
-
const require_llm = require("../utils/llm.cjs");
|
|
12
10
|
const require_toolOutputReferences = require("../tools/toolOutputReferences.cjs");
|
|
13
|
-
const require_stream = require("../stream.cjs");
|
|
14
|
-
const require_errors = require("../utils/errors.cjs");
|
|
15
11
|
const require_truncation = require("./truncation.cjs");
|
|
16
12
|
const require_providers = require("./providers.cjs");
|
|
13
|
+
const require_errors = require("../utils/errors.cjs");
|
|
14
|
+
const require_preempt = require("./preempt.cjs");
|
|
15
|
+
const require_llm = require("../utils/llm.cjs");
|
|
16
|
+
const require_stream = require("../stream.cjs");
|
|
17
17
|
const require_init = require("./init.cjs");
|
|
18
18
|
let _langchain_core_runnables = require("@langchain/core/runnables");
|
|
19
19
|
let _langchain_core_messages = require("@langchain/core/messages");
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const require_cache = require("../../messages/cache.cjs");
|
|
2
2
|
const require_core = require("../../messages/core.cjs");
|
|
3
|
-
const require_streamedToolCallSeals = require("../../tools/streamedToolCallSeals.cjs");
|
|
4
3
|
const require_intentArg = require("../../tools/intentArg.cjs");
|
|
4
|
+
const require_streamedToolCallSeals = require("../../tools/streamedToolCallSeals.cjs");
|
|
5
5
|
const require_index = require("./utils/index.cjs");
|
|
6
6
|
const require_streamMetadata = require("./streamMetadata.cjs");
|
|
7
7
|
let _langchain_openai = require("@langchain/openai");
|
package/dist/cjs/main.cjs
CHANGED
|
@@ -5,7 +5,6 @@ const require_enum = require("./common/enum.cjs");
|
|
|
5
5
|
require("./common/index.cjs");
|
|
6
6
|
const require_truncation = require("./utils/truncation.cjs");
|
|
7
7
|
const require_tokens = require("./utils/tokens.cjs");
|
|
8
|
-
const require_preempt = require("./llm/preempt.cjs");
|
|
9
8
|
const require_cache = require("./messages/cache.cjs");
|
|
10
9
|
const require_core = require("./messages/core.cjs");
|
|
11
10
|
const require_ids = require("./messages/ids.cjs");
|
|
@@ -23,20 +22,21 @@ const require_handoffCue = require("./messages/handoffCue.cjs");
|
|
|
23
22
|
const require_reducer = require("./messages/reducer.cjs");
|
|
24
23
|
const require_recency = require("./messages/recency.cjs");
|
|
25
24
|
require("./messages/index.cjs");
|
|
26
|
-
const require_graph = require("./utils/graph.cjs");
|
|
27
|
-
const require_llm = require("./utils/llm.cjs");
|
|
28
|
-
const require_handlers = require("./tools/handlers.cjs");
|
|
29
25
|
const require_intentArg = require("./tools/intentArg.cjs");
|
|
26
|
+
const require_index$2 = require("./llm/openai/index.cjs");
|
|
27
|
+
const require_index$3 = require("./llm/openrouter/index.cjs");
|
|
28
|
+
const require_providers = require("./llm/providers.cjs");
|
|
29
|
+
const require_errors = require("./utils/errors.cjs");
|
|
30
|
+
const require_preempt = require("./llm/preempt.cjs");
|
|
31
|
+
const require_handlers = require("./tools/handlers.cjs");
|
|
32
|
+
const require_llm = require("./utils/llm.cjs");
|
|
30
33
|
const require_stream = require("./stream.cjs");
|
|
34
|
+
const require_graph = require("./utils/graph.cjs");
|
|
31
35
|
const require_events = require("./events.cjs");
|
|
32
36
|
const require_handlers$1 = require("./utils/handlers.cjs");
|
|
33
37
|
const require_run = require("./utils/run.cjs");
|
|
34
38
|
const require_schema = require("./utils/schema.cjs");
|
|
35
|
-
const require_errors = require("./utils/errors.cjs");
|
|
36
39
|
require("./utils/index.cjs");
|
|
37
|
-
const require_index$3 = require("./llm/openai/index.cjs");
|
|
38
|
-
const require_index$4 = require("./llm/openrouter/index.cjs");
|
|
39
|
-
const require_providers = require("./llm/providers.cjs");
|
|
40
40
|
const require_init = require("./llm/init.cjs");
|
|
41
41
|
const require_invoke = require("./llm/invoke.cjs");
|
|
42
42
|
const require_bashAst = require("./tools/local/bashAst.cjs");
|
|
@@ -163,7 +163,7 @@ exports.CalculatorToolDescription = require_Calculator.CalculatorToolDescription
|
|
|
163
163
|
exports.CalculatorToolName = require_Calculator.CalculatorToolName;
|
|
164
164
|
exports.Callback = require_enum.Callback;
|
|
165
165
|
exports.ChatModelStreamHandler = require_stream.ChatModelStreamHandler;
|
|
166
|
-
exports.ChatOpenRouter = require_index$
|
|
166
|
+
exports.ChatOpenRouter = require_index$3.ChatOpenRouter;
|
|
167
167
|
exports.CloudflareBashExecutionToolDescription = require_CloudflareSandboxTools.CloudflareBashExecutionToolDescription;
|
|
168
168
|
exports.CloudflareCodeExecutionToolDescription = require_CloudflareSandboxTools.CloudflareCodeExecutionToolDescription;
|
|
169
169
|
exports.CodeApiRequestError = require_CodeExecutor.CodeApiRequestError;
|
|
@@ -181,7 +181,7 @@ exports.CommonEvents = require_enum.CommonEvents;
|
|
|
181
181
|
exports.CompileCheckToolName = require_CompileCheckTool.CompileCheckToolName;
|
|
182
182
|
exports.Constants = require_enum.Constants;
|
|
183
183
|
exports.ContentTypes = require_enum.ContentTypes;
|
|
184
|
-
exports.CustomOpenAIClient = require_index$
|
|
184
|
+
exports.CustomOpenAIClient = require_index$2.CustomOpenAIClient;
|
|
185
185
|
exports.DATE_RANGE = require_schema$2.DATE_RANGE;
|
|
186
186
|
exports.DEFAULT_CONTEXT_PRUNING_SETTINGS = require_contextPruningSettings.DEFAULT_CONTEXT_PRUNING_SETTINGS;
|
|
187
187
|
exports.DEFAULT_COUNTRY_DESCRIPTION = require_schema$2.DEFAULT_COUNTRY_DESCRIPTION;
|
|
@@ -716,7 +716,19 @@ function createBoundedTruncationValue(preview, originalChars, maxChars) {
|
|
|
716
716
|
if (JSON.stringify({
|
|
717
717
|
_truncated: "",
|
|
718
718
|
_originalChars: originalChars
|
|
719
|
-
}).length > normalizedMaxChars)
|
|
719
|
+
}).length > normalizedMaxChars)
|
|
720
|
+
/**
|
|
721
|
+
* Even the empty envelope overflows the cap, so no preview survives —
|
|
722
|
+
* but the result must still be a JSON OBJECT, never `null`. This value
|
|
723
|
+
* replaces a `tool_use.input` / tool-call `args` on messages that are
|
|
724
|
+
* mutated IN PLACE into graph state (`preFlightTruncateToolCallInputs`),
|
|
725
|
+
* and Anthropic rejects a replayed non-object input with a 400
|
|
726
|
+
* (`tool_use.input: Input should be an object`). Observed live: a tight
|
|
727
|
+
* summarization budget shrank the cap below the envelope, nulled a
|
|
728
|
+
* retained calculator call's input and args, and the next model call
|
|
729
|
+
* failed on replay.
|
|
730
|
+
*/
|
|
731
|
+
return {};
|
|
720
732
|
let low = 0;
|
|
721
733
|
let high = Math.min(preview.length, normalizedMaxChars);
|
|
722
734
|
while (low < high) {
|