@langchain/anthropic 1.4.0 → 1.4.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.
@@ -1 +1 @@
1
- {"version":3,"file":"message_inputs.js","names":[],"sources":["../../src/utils/message_inputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting LangChain messages to Anthropic messages.\n */\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport {\n type BaseMessage,\n HumanMessage,\n ToolMessage,\n MessageContentComplex,\n isDataContentBlock,\n convertToProviderContentBlock,\n parseBase64DataUrl,\n ContentBlock,\n AIMessage,\n} from \"@langchain/core/messages\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\nimport {\n AnthropicImageBlockParam,\n AnthropicMessageCreateParams,\n AnthropicTextBlockParam,\n AnthropicToolResultBlockParam,\n AnthropicToolUseBlockParam,\n AnthropicDocumentBlockParam,\n AnthropicThinkingBlockParam,\n AnthropicRedactedThinkingBlockParam,\n AnthropicServerToolUseBlockParam,\n AnthropicWebSearchToolResultBlockParam,\n AnthropicSearchResultBlockParam,\n AnthropicToolResponse,\n AnthropicContainerUploadBlockParam,\n AnthropicCompactionBlockParam,\n} from \"../types.js\";\nimport {\n _isAnthropicImageBlockParam,\n _isAnthropicRedactedThinkingBlock,\n _isAnthropicSearchResultBlock,\n _isAnthropicThinkingBlock,\n _isAnthropicCompactionBlock,\n standardContentBlockConverter,\n} from \"./content.js\";\nimport { _formatStandardContent } from \"./standard.js\";\n\nfunction _formatImage(imageUrl: string) {\n const parsed = parseBase64DataUrl({ dataUrl: imageUrl });\n if (parsed) {\n return {\n type: \"base64\",\n media_type: parsed.mime_type,\n data: parsed.data,\n };\n }\n let parsedUrl: URL;\n\n try {\n parsedUrl = new URL(imageUrl);\n } catch {\n throw new Error(\n [\n `Malformed image URL: ${JSON.stringify(\n imageUrl\n )}. Content blocks of type 'image_url' must be a valid http, https, or base64-encoded data URL.`,\n \"Example: data:image/png;base64,/9j/4AAQSk...\",\n \"Example: https://example.com/image.jpg\",\n ].join(\"\\n\\n\")\n );\n }\n\n if (parsedUrl.protocol === \"http:\" || parsedUrl.protocol === \"https:\") {\n return {\n type: \"url\",\n url: imageUrl,\n };\n }\n\n throw new Error(\n [\n `Invalid image URL protocol: ${JSON.stringify(\n parsedUrl.protocol\n )}. Anthropic only supports images as http, https, or base64-encoded data URLs on 'image_url' content blocks.`,\n \"Example: data:image/png;base64,/9j/4AAQSk...\",\n \"Example: https://example.com/image.jpg\",\n ].join(\"\\n\\n\")\n );\n}\n\nfunction _ensureMessageContents(messages: BaseMessage[]): BaseMessage[] {\n // Merge runs of human/tool messages into single human messages with content blocks.\n const updatedMsgs = [];\n for (const message of messages) {\n if (message._getType() === \"tool\") {\n if (typeof message.content === \"string\") {\n const previousMessage = updatedMsgs[updatedMsgs.length - 1];\n if (\n previousMessage?._getType() === \"human\" &&\n Array.isArray(previousMessage.content) &&\n \"type\" in previousMessage.content[0] &&\n previousMessage.content[0].type === \"tool_result\"\n ) {\n // If the previous message was a tool result, we merge this tool message into it.\n (previousMessage.content as MessageContentComplex[]).push({\n type: \"tool_result\",\n content: message.content,\n tool_use_id: (message as ToolMessage).tool_call_id,\n });\n } else {\n // If not, we create a new human message with the tool result.\n updatedMsgs.push(\n new HumanMessage({\n content: [\n {\n type: \"tool_result\",\n content: message.content,\n tool_use_id: (message as ToolMessage).tool_call_id,\n },\n ],\n })\n );\n }\n } else {\n updatedMsgs.push(\n new HumanMessage({\n content: [\n {\n type: \"tool_result\",\n // rare case: message.content could be undefined\n ...(message.content != null\n ? { content: _formatContent(message) }\n : {}),\n tool_use_id: (message as ToolMessage).tool_call_id,\n },\n ],\n })\n );\n }\n } else {\n updatedMsgs.push(message);\n }\n }\n return updatedMsgs;\n}\n\nexport function _convertLangChainToolCallToAnthropic(\n toolCall: ToolCall\n): AnthropicToolResponse {\n if (toolCall.id === undefined) {\n throw new Error(`Anthropic requires all tool calls to have an \"id\".`);\n }\n return {\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.args,\n };\n}\n\nfunction* _formatContentBlocks(\n content: ContentBlock[],\n toolCalls?: ToolCall[]\n): Generator<Anthropic.Beta.BetaContentBlockParam> {\n const toolTypes = [\n \"bash_code_execution_tool_result\",\n \"input_json_delta\",\n \"server_tool_use\",\n \"text_editor_code_execution_tool_result\",\n \"tool_result\",\n \"tool_use\",\n \"web_search_result\",\n \"web_search_tool_result\",\n ];\n const textTypes = [\"text\", \"text_delta\"];\n for (const contentPart of content) {\n if (isDataContentBlock(contentPart)) {\n yield convertToProviderContentBlock(\n contentPart,\n standardContentBlockConverter\n );\n }\n\n const cacheControl =\n \"cache_control\" in contentPart\n ? (contentPart.cache_control as Anthropic.Beta.BetaCacheControlEphemeral)\n : undefined;\n\n if (contentPart.type === \"image_url\") {\n let source;\n if (typeof contentPart.image_url === \"string\") {\n source = _formatImage(contentPart.image_url);\n } else if (\n typeof contentPart.image_url === \"object\" &&\n contentPart.image_url !== null &&\n \"url\" in contentPart.image_url &&\n typeof contentPart.image_url.url === \"string\"\n ) {\n source = _formatImage(contentPart.image_url.url);\n }\n if (source) {\n yield {\n type: \"image\" as const, // Explicitly setting the type as \"image\"\n source,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.ImageBlockParam;\n }\n } else if (_isAnthropicImageBlockParam(contentPart)) {\n yield contentPart;\n } else if (contentPart.type === \"image\") {\n // Handle new ContentBlock.Multimodal.Image format\n let source;\n\n if (\"url\" in contentPart && typeof contentPart.url === \"string\") {\n // URL-based image\n source = _formatImage(contentPart.url);\n } else if (\n \"data\" in contentPart &&\n (typeof contentPart.data === \"string\" ||\n // oxlint-disable-next-line no-instanceof/no-instanceof\n contentPart.data instanceof Uint8Array)\n ) {\n // Base64-based image\n const mimeType =\n \"mimeType\" in contentPart && typeof contentPart.mimeType === \"string\"\n ? contentPart.mimeType\n : \"image/jpeg\";\n const data =\n typeof contentPart.data === \"string\"\n ? contentPart.data\n : Buffer.from(contentPart.data).toString(\"base64\");\n source = {\n type: \"base64\" as const,\n media_type: mimeType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data,\n };\n } else if (\n \"fileId\" in contentPart &&\n typeof contentPart.fileId === \"string\"\n ) {\n // File ID-based image\n // Note: Anthropic supports file IDs for images that have been uploaded\n // to their servers via the Files API\n source = {\n type: \"file\" as const,\n file_id: contentPart.fileId,\n };\n }\n\n if (source) {\n yield {\n type: \"image\" as const,\n source,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.ImageBlockParam;\n }\n } else if (contentPart.type === \"file\") {\n // Handle new ContentBlock.Multimodal.File format\n let source:\n | { type: \"url\"; url: string }\n | { type: \"base64\"; media_type: string; data: string }\n | { type: \"file\"; file_id: string }\n | undefined;\n\n if (\"url\" in contentPart && typeof contentPart.url === \"string\") {\n // File with URL\n source = {\n type: \"url\" as const,\n url: contentPart.url,\n };\n } else if (\n \"data\" in contentPart &&\n (typeof contentPart.data === \"string\" ||\n // oxlint-disable-next-line no-instanceof/no-instanceof\n contentPart.data instanceof Uint8Array)\n ) {\n // File with base64 data (string or Uint8Array)\n const media_type =\n \"mimeType\" in contentPart && typeof contentPart.mimeType === \"string\"\n ? contentPart.mimeType\n : \"application/pdf\";\n const data =\n typeof contentPart.data === \"string\"\n ? contentPart.data\n : Buffer.from(contentPart.data).toString(\"base64\");\n\n source = {\n type: \"base64\" as const,\n media_type,\n data,\n };\n } else if (\n \"fileId\" in contentPart &&\n typeof contentPart.fileId === \"string\"\n ) {\n // File ID from Anthropic Files API\n // https://platform.claude.com/docs/en/build-with-claude/pdf-support#option-3-files-api\n source = {\n type: \"file\" as const,\n file_id: contentPart.fileId,\n };\n }\n\n if (source) {\n yield {\n type: \"document\" as const,\n source,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.DocumentBlockParam;\n }\n } else if (contentPart.type === \"document\") {\n // PDF\n yield {\n ...contentPart,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.DocumentBlockParam;\n } else if (_isAnthropicThinkingBlock(contentPart)) {\n const block: AnthropicThinkingBlockParam = {\n type: \"thinking\" as const, // Explicitly setting the type as \"thinking\"\n thinking: contentPart.thinking,\n signature: contentPart.signature,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicRedactedThinkingBlock(contentPart)) {\n const block: AnthropicRedactedThinkingBlockParam = {\n type: \"redacted_thinking\" as const, // Explicitly setting the type as \"redacted_thinking\"\n data: contentPart.data,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicCompactionBlock(contentPart)) {\n const block: AnthropicCompactionBlockParam = {\n type: \"compaction\" as const,\n content: contentPart.content,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicSearchResultBlock(contentPart)) {\n const block: AnthropicSearchResultBlockParam = {\n type: \"search_result\" as const, // Explicitly setting the type as \"search_result\"\n title: contentPart.title,\n source: contentPart.source,\n ...(\"cache_control\" in contentPart && contentPart.cache_control\n ? { cache_control: contentPart.cache_control }\n : {}),\n ...(\"citations\" in contentPart && contentPart.citations\n ? { citations: contentPart.citations }\n : {}),\n content: contentPart.content,\n };\n yield block as Anthropic.Beta.BetaSearchResultBlockParam;\n } else if (\n textTypes.find((t) => t === contentPart.type) &&\n \"text\" in contentPart\n ) {\n // Assuming contentPart is of type MessageContentText here\n yield {\n type: \"text\" as const, // Explicitly setting the type as \"text\"\n text: contentPart.text,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n ...(\"citations\" in contentPart && contentPart.citations\n ? { citations: contentPart.citations }\n : {}),\n } as Anthropic.Messages.TextBlockParam;\n } else if (toolTypes.find((t) => t === contentPart.type)) {\n const contentPartCopy = { ...contentPart };\n\n if (contentPartCopy.type === \"input_json_delta\") {\n // `input_json_delta` type only represents yielding partial tool inputs\n // and is not a valid type for Anthropic messages.\n // These blocks appear in streaming responses and should be skipped\n // as their input data is already captured in tool_calls.\n continue;\n }\n\n if (\n contentPartCopy.type === \"tool_use\" &&\n typeof contentPartCopy.input === \"string\"\n ) {\n // First, try to get the input from the corresponding tool_call.\n // This is the most reliable source since tool_calls are properly\n // consolidated from tool_call_chunks during streaming.\n const matchingToolCall = toolCalls?.find(\n (tc) => tc.id === contentPartCopy.id\n );\n if (matchingToolCall) {\n contentPartCopy.input = matchingToolCall.args;\n } else {\n // Fallback: `tool_use` content part may be followed by `input_json_delta`\n // content parts which are chunks of a stringified JSON input,\n // so we need to collect them and merge their inputs.\n const inputDeltas = content.filter(\n (nestedContentPart) =>\n nestedContentPart.index === contentPartCopy.index &&\n nestedContentPart.type === \"input_json_delta\" &&\n typeof nestedContentPart.input === \"string\"\n );\n // If no `input_json_delta` parts are found, this line will just\n // return `contentPartCopy.input`, so no additional check is needed\n contentPartCopy.input = inputDeltas.reduce(\n (accumulator, nestedContentPart) =>\n accumulator + nestedContentPart.input,\n contentPartCopy.input\n );\n }\n }\n\n if (\"index\" in contentPartCopy) {\n // Anthropic does not support passing the index field here, so we remove it.\n delete contentPartCopy.index;\n }\n\n if (\"input\" in contentPartCopy) {\n // Anthropic tool use inputs should be valid objects, when applicable.\n if (typeof contentPartCopy.input === \"string\") {\n try {\n contentPartCopy.input = JSON.parse(contentPartCopy.input);\n } catch {\n contentPartCopy.input = {};\n }\n }\n }\n // TODO: Fix when SDK types are fixed\n yield {\n ...contentPartCopy,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n } else if (contentPart.type === \"container_upload\") {\n yield {\n ...contentPart,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as AnthropicContainerUploadBlockParam;\n }\n\n // Note that we are intentionally dropping any blocks that we don't\n // recognize. This is to allow for cross-compatibility between different\n // providers that may have different block types. Ie if we take a message\n // output from OpenAI and send it to Anthropic, we want to drop any blocks\n // that Anthropic doesn't understand.\n }\n}\n\nfunction _formatContent(message: BaseMessage, toolCalls?: ToolCall[]) {\n const { content } = message;\n\n if (typeof content === \"string\") {\n return content;\n } else {\n return Array.from(_formatContentBlocks(content, toolCalls));\n }\n}\n\n/**\n * Formats messages as a prompt for the model.\n * Used in LangSmith, export is important here.\n * @param messages The base messages to format as a prompt.\n * @returns The formatted prompt.\n */\nexport function _convertMessagesToAnthropicPayload(\n messages: BaseMessage[]\n): AnthropicMessageCreateParams {\n const mergedMessages = _ensureMessageContents(messages);\n let system;\n if (mergedMessages.length > 0 && mergedMessages[0]._getType() === \"system\") {\n system = messages[0].content;\n }\n const conversationMessages =\n system !== undefined ? mergedMessages.slice(1) : mergedMessages;\n const formattedMessages = conversationMessages.map((message) => {\n let role;\n if (message._getType() === \"human\") {\n role = \"user\" as const;\n } else if (message._getType() === \"ai\") {\n role = \"assistant\" as const;\n } else if (message._getType() === \"tool\") {\n role = \"user\" as const;\n } else if (message._getType() === \"system\") {\n throw new Error(\n \"System messages are only permitted as the first passed message.\"\n );\n } else {\n throw new Error(`Message type \"${message.type}\" is not supported.`);\n }\n if (\n AIMessage.isInstance(message) &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return {\n role,\n content: _formatStandardContent(message),\n };\n }\n if (AIMessage.isInstance(message) && !!message.tool_calls?.length) {\n if (typeof message.content === \"string\") {\n if (message.content === \"\") {\n return {\n role,\n content: message.tool_calls.map(\n _convertLangChainToolCallToAnthropic\n ),\n };\n } else {\n return {\n role,\n content: [\n { type: \"text\", text: message.content },\n ...message.tool_calls.map(_convertLangChainToolCallToAnthropic),\n ],\n };\n }\n } else {\n const { content } = message;\n const formattedContent = _formatContent(message, message.tool_calls);\n const formattedContentArr = Array.isArray(formattedContent)\n ? formattedContent\n : [{ type: \"text\" as const, text: formattedContent }];\n const missingToolCalls = message.tool_calls.filter(\n (toolCall) =>\n !content.find(\n (contentPart) =>\n (contentPart.type === \"tool_use\" ||\n contentPart.type === \"input_json_delta\" ||\n contentPart.type === \"server_tool_use\") &&\n contentPart.id === toolCall.id\n )\n );\n return {\n role,\n content: [\n ...formattedContentArr,\n ...missingToolCalls.map(_convertLangChainToolCallToAnthropic),\n ],\n };\n }\n } else {\n return {\n role,\n content: _formatContent(\n message,\n AIMessage.isInstance(message) ? message.tool_calls : undefined\n ),\n };\n }\n });\n return {\n messages: mergeMessages(\n formattedMessages as AnthropicMessageCreateParams[\"messages\"]\n ),\n system,\n } as AnthropicMessageCreateParams;\n}\n\nfunction mergeMessages(messages: AnthropicMessageCreateParams[\"messages\"]) {\n if (!messages || messages.length <= 1) {\n return messages;\n }\n\n const result: AnthropicMessageCreateParams[\"messages\"] = [];\n let currentMessage = messages[0];\n\n const normalizeContent = (\n content:\n | string\n | Array<\n | AnthropicTextBlockParam\n | AnthropicImageBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | AnthropicDocumentBlockParam\n | AnthropicThinkingBlockParam\n | AnthropicRedactedThinkingBlockParam\n | AnthropicServerToolUseBlockParam\n | AnthropicWebSearchToolResultBlockParam\n | AnthropicSearchResultBlockParam\n >\n ): Array<\n | AnthropicTextBlockParam\n | AnthropicImageBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | AnthropicDocumentBlockParam\n | AnthropicThinkingBlockParam\n | AnthropicRedactedThinkingBlockParam\n | AnthropicServerToolUseBlockParam\n | AnthropicWebSearchToolResultBlockParam\n | AnthropicSearchResultBlockParam\n > => {\n if (typeof content === \"string\") {\n return [\n {\n type: \"text\",\n text: content,\n },\n ];\n }\n return content;\n };\n\n const isToolResultMessage = (msg: (typeof messages)[0]) => {\n if (msg.role !== \"user\") return false;\n\n if (typeof msg.content === \"string\") {\n return false;\n }\n\n return (\n Array.isArray(msg.content) &&\n msg.content.every((item) => item.type === \"tool_result\")\n );\n };\n\n for (let i = 1; i < messages.length; i += 1) {\n const nextMessage = messages[i];\n\n if (\n isToolResultMessage(currentMessage) &&\n isToolResultMessage(nextMessage)\n ) {\n // Merge the messages by combining their content arrays\n currentMessage = {\n ...currentMessage,\n content: [\n ...normalizeContent(currentMessage.content),\n ...normalizeContent(nextMessage.content),\n ],\n };\n } else {\n result.push(currentMessage);\n currentMessage = nextMessage;\n }\n }\n\n result.push(currentMessage);\n return result;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"message_inputs.js","names":[],"sources":["../../src/utils/message_inputs.ts"],"sourcesContent":["/**\n * This util file contains functions for converting LangChain messages to Anthropic messages.\n */\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport {\n type BaseMessage,\n HumanMessage,\n ToolMessage,\n MessageContentComplex,\n isDataContentBlock,\n convertToProviderContentBlock,\n parseBase64DataUrl,\n ContentBlock,\n AIMessage,\n} from \"@langchain/core/messages\";\nimport { ToolCall } from \"@langchain/core/messages/tool\";\nimport {\n AnthropicImageBlockParam,\n AnthropicMessageCreateParams,\n AnthropicTextBlockParam,\n AnthropicToolResultBlockParam,\n AnthropicToolUseBlockParam,\n AnthropicDocumentBlockParam,\n AnthropicThinkingBlockParam,\n AnthropicRedactedThinkingBlockParam,\n AnthropicServerToolUseBlockParam,\n AnthropicWebSearchToolResultBlockParam,\n AnthropicSearchResultBlockParam,\n AnthropicToolResponse,\n AnthropicContainerUploadBlockParam,\n AnthropicCompactionBlockParam,\n} from \"../types.js\";\nimport {\n _isAnthropicImageBlockParam,\n _isAnthropicRedactedThinkingBlock,\n _isAnthropicSearchResultBlock,\n _isAnthropicThinkingBlock,\n _isAnthropicCompactionBlock,\n standardContentBlockConverter,\n} from \"./content.js\";\nimport { _formatStandardContent } from \"./standard.js\";\n\nfunction _formatImage(imageUrl: string) {\n const parsed = parseBase64DataUrl({ dataUrl: imageUrl });\n if (parsed) {\n return {\n type: \"base64\",\n media_type: parsed.mime_type,\n data: parsed.data,\n };\n }\n let parsedUrl: URL;\n\n try {\n parsedUrl = new URL(imageUrl);\n } catch {\n throw new Error(\n [\n `Malformed image URL: ${JSON.stringify(\n imageUrl\n )}. Content blocks of type 'image_url' must be a valid http, https, or base64-encoded data URL.`,\n \"Example: data:image/png;base64,/9j/4AAQSk...\",\n \"Example: https://example.com/image.jpg\",\n ].join(\"\\n\\n\")\n );\n }\n\n if (parsedUrl.protocol === \"http:\" || parsedUrl.protocol === \"https:\") {\n return {\n type: \"url\",\n url: imageUrl,\n };\n }\n\n throw new Error(\n [\n `Invalid image URL protocol: ${JSON.stringify(\n parsedUrl.protocol\n )}. Anthropic only supports images as http, https, or base64-encoded data URLs on 'image_url' content blocks.`,\n \"Example: data:image/png;base64,/9j/4AAQSk...\",\n \"Example: https://example.com/image.jpg\",\n ].join(\"\\n\\n\")\n );\n}\n\nfunction _ensureMessageContents(messages: BaseMessage[]): BaseMessage[] {\n // Merge runs of human/tool messages into single human messages with content blocks.\n const updatedMsgs = [];\n for (const message of messages) {\n if (message._getType() === \"tool\") {\n if (typeof message.content === \"string\") {\n const previousMessage = updatedMsgs[updatedMsgs.length - 1];\n if (\n previousMessage?._getType() === \"human\" &&\n Array.isArray(previousMessage.content) &&\n \"type\" in previousMessage.content[0] &&\n previousMessage.content[0].type === \"tool_result\"\n ) {\n // If the previous message was a tool result, we merge this tool message into it.\n (previousMessage.content as MessageContentComplex[]).push({\n type: \"tool_result\",\n content: message.content,\n tool_use_id: (message as ToolMessage).tool_call_id,\n });\n } else {\n // If not, we create a new human message with the tool result.\n updatedMsgs.push(\n new HumanMessage({\n content: [\n {\n type: \"tool_result\",\n content: message.content,\n tool_use_id: (message as ToolMessage).tool_call_id,\n },\n ],\n })\n );\n }\n } else {\n updatedMsgs.push(\n new HumanMessage({\n content: [\n {\n type: \"tool_result\",\n // rare case: message.content could be undefined\n ...(message.content != null\n ? { content: _formatContent(message) }\n : {}),\n tool_use_id: (message as ToolMessage).tool_call_id,\n },\n ],\n })\n );\n }\n } else {\n updatedMsgs.push(message);\n }\n }\n return updatedMsgs;\n}\n\nexport function _convertLangChainToolCallToAnthropic(\n toolCall: ToolCall\n): AnthropicToolResponse {\n if (toolCall.id === undefined) {\n throw new Error(`Anthropic requires all tool calls to have an \"id\".`);\n }\n return {\n type: \"tool_use\",\n id: toolCall.id,\n name: toolCall.name,\n input: toolCall.args,\n };\n}\n\nfunction* _formatContentBlocks(\n content: ContentBlock[],\n toolCalls?: ToolCall[]\n): Generator<Anthropic.Beta.BetaContentBlockParam> {\n const toolTypes = [\n \"bash_code_execution_tool_result\",\n \"input_json_delta\",\n \"server_tool_use\",\n \"text_editor_code_execution_tool_result\",\n \"tool_result\",\n \"tool_use\",\n \"web_search_result\",\n \"web_search_tool_result\",\n ];\n const textTypes = [\"text\", \"text_delta\"];\n for (const contentPart of content) {\n if (isDataContentBlock(contentPart)) {\n yield convertToProviderContentBlock(\n contentPart,\n standardContentBlockConverter\n );\n }\n\n const cacheControl =\n \"cache_control\" in contentPart\n ? (contentPart.cache_control as Anthropic.Beta.BetaCacheControlEphemeral)\n : undefined;\n\n if (contentPart.type === \"image_url\") {\n let source;\n if (typeof contentPart.image_url === \"string\") {\n source = _formatImage(contentPart.image_url);\n } else if (\n typeof contentPart.image_url === \"object\" &&\n contentPart.image_url !== null &&\n \"url\" in contentPart.image_url &&\n typeof contentPart.image_url.url === \"string\"\n ) {\n source = _formatImage(contentPart.image_url.url);\n }\n if (source) {\n yield {\n type: \"image\" as const, // Explicitly setting the type as \"image\"\n source,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.ImageBlockParam;\n }\n } else if (_isAnthropicImageBlockParam(contentPart)) {\n yield contentPart;\n } else if (contentPart.type === \"image\") {\n // Handle new ContentBlock.Multimodal.Image format\n let source;\n\n if (\"url\" in contentPart && typeof contentPart.url === \"string\") {\n // URL-based image\n source = _formatImage(contentPart.url);\n } else if (\n \"data\" in contentPart &&\n (typeof contentPart.data === \"string\" ||\n // oxlint-disable-next-line no-instanceof/no-instanceof\n contentPart.data instanceof Uint8Array)\n ) {\n // Base64-based image\n const mimeType =\n \"mimeType\" in contentPart && typeof contentPart.mimeType === \"string\"\n ? contentPart.mimeType\n : \"image/jpeg\";\n const data =\n typeof contentPart.data === \"string\"\n ? contentPart.data\n : Buffer.from(contentPart.data).toString(\"base64\");\n source = {\n type: \"base64\" as const,\n media_type: mimeType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data,\n };\n } else if (\n \"fileId\" in contentPart &&\n typeof contentPart.fileId === \"string\"\n ) {\n // File ID-based image\n // Note: Anthropic supports file IDs for images that have been uploaded\n // to their servers via the Files API\n source = {\n type: \"file\" as const,\n file_id: contentPart.fileId,\n };\n }\n\n if (source) {\n yield {\n type: \"image\" as const,\n source,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.ImageBlockParam;\n }\n } else if (contentPart.type === \"file\") {\n // Handle new ContentBlock.Multimodal.File format\n let source:\n | { type: \"url\"; url: string }\n | { type: \"base64\"; media_type: string; data: string }\n | { type: \"file\"; file_id: string }\n | undefined;\n\n if (\"url\" in contentPart && typeof contentPart.url === \"string\") {\n // File with URL\n source = {\n type: \"url\" as const,\n url: contentPart.url,\n };\n } else if (\n \"data\" in contentPart &&\n (typeof contentPart.data === \"string\" ||\n // oxlint-disable-next-line no-instanceof/no-instanceof\n contentPart.data instanceof Uint8Array)\n ) {\n // File with base64 data (string or Uint8Array)\n const media_type =\n \"mimeType\" in contentPart && typeof contentPart.mimeType === \"string\"\n ? contentPart.mimeType\n : \"application/pdf\";\n const data =\n typeof contentPart.data === \"string\"\n ? contentPart.data\n : Buffer.from(contentPart.data).toString(\"base64\");\n\n source = {\n type: \"base64\" as const,\n media_type,\n data,\n };\n } else if (\n \"fileId\" in contentPart &&\n typeof contentPart.fileId === \"string\"\n ) {\n // File ID from Anthropic Files API\n // https://platform.claude.com/docs/en/build-with-claude/pdf-support#option-3-files-api\n source = {\n type: \"file\" as const,\n file_id: contentPart.fileId,\n };\n }\n\n if (source) {\n yield {\n type: \"document\" as const,\n source,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.DocumentBlockParam;\n }\n } else if (contentPart.type === \"document\") {\n // PDF\n yield {\n ...contentPart,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as Anthropic.Messages.DocumentBlockParam;\n } else if (_isAnthropicThinkingBlock(contentPart)) {\n const block: AnthropicThinkingBlockParam = {\n type: \"thinking\" as const, // Explicitly setting the type as \"thinking\"\n thinking: contentPart.thinking,\n signature: contentPart.signature,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicRedactedThinkingBlock(contentPart)) {\n const block: AnthropicRedactedThinkingBlockParam = {\n type: \"redacted_thinking\" as const, // Explicitly setting the type as \"redacted_thinking\"\n data: contentPart.data,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicCompactionBlock(contentPart)) {\n const block: AnthropicCompactionBlockParam = {\n type: \"compaction\" as const,\n content: contentPart.content,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n };\n yield block;\n } else if (_isAnthropicSearchResultBlock(contentPart)) {\n const block: AnthropicSearchResultBlockParam = {\n type: \"search_result\" as const, // Explicitly setting the type as \"search_result\"\n title: contentPart.title,\n source: contentPart.source,\n ...(\"cache_control\" in contentPart && contentPart.cache_control\n ? { cache_control: contentPart.cache_control }\n : {}),\n ...(\"citations\" in contentPart && contentPart.citations\n ? { citations: contentPart.citations }\n : {}),\n content: contentPart.content,\n };\n yield block as Anthropic.Beta.BetaSearchResultBlockParam;\n } else if (\n textTypes.find((t) => t === contentPart.type) &&\n \"text\" in contentPart\n ) {\n // Assuming contentPart is of type MessageContentText here\n yield {\n type: \"text\" as const, // Explicitly setting the type as \"text\"\n text: contentPart.text,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n ...(\"citations\" in contentPart && contentPart.citations\n ? { citations: contentPart.citations }\n : {}),\n } as Anthropic.Messages.TextBlockParam;\n } else if (toolTypes.find((t) => t === contentPart.type)) {\n const contentPartCopy = { ...contentPart };\n\n if (contentPartCopy.type === \"input_json_delta\") {\n // `input_json_delta` type only represents yielding partial tool inputs\n // and is not a valid type for Anthropic messages.\n // These blocks appear in streaming responses and should be skipped\n // as their input data is already captured in tool_calls.\n continue;\n }\n\n if (\n contentPartCopy.type === \"tool_use\" &&\n typeof contentPartCopy.input === \"string\"\n ) {\n // First, try to get the input from the corresponding tool_call.\n // This is the most reliable source since tool_calls are properly\n // consolidated from tool_call_chunks during streaming.\n const matchingToolCall = toolCalls?.find(\n (tc) => tc.id === contentPartCopy.id\n );\n if (matchingToolCall) {\n contentPartCopy.input = matchingToolCall.args;\n } else {\n // Fallback: `tool_use` content part may be followed by `input_json_delta`\n // content parts which are chunks of a stringified JSON input,\n // so we need to collect them and merge their inputs.\n const inputDeltas = content.filter(\n (nestedContentPart) =>\n nestedContentPart.index === contentPartCopy.index &&\n nestedContentPart.type === \"input_json_delta\" &&\n typeof nestedContentPart.input === \"string\"\n );\n // If no `input_json_delta` parts are found, this line will just\n // return `contentPartCopy.input`, so no additional check is needed\n contentPartCopy.input = inputDeltas.reduce(\n (accumulator, nestedContentPart) =>\n accumulator + nestedContentPart.input,\n contentPartCopy.input\n );\n }\n }\n\n if (\"index\" in contentPartCopy) {\n // Anthropic does not support passing the index field here, so we remove it.\n delete contentPartCopy.index;\n }\n\n if (\"input\" in contentPartCopy) {\n // Anthropic tool use inputs should be valid objects, when applicable.\n if (typeof contentPartCopy.input === \"string\") {\n try {\n contentPartCopy.input = JSON.parse(contentPartCopy.input);\n } catch {\n contentPartCopy.input = {};\n }\n }\n }\n // TODO: Fix when SDK types are fixed\n yield {\n ...contentPartCopy,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n } else if (contentPart.type === \"container_upload\") {\n yield {\n ...contentPart,\n ...(cacheControl ? { cache_control: cacheControl } : {}),\n } as AnthropicContainerUploadBlockParam;\n }\n\n // Note that we are intentionally dropping any blocks that we don't\n // recognize. This is to allow for cross-compatibility between different\n // providers that may have different block types. Ie if we take a message\n // output from OpenAI and send it to Anthropic, we want to drop any blocks\n // that Anthropic doesn't understand.\n }\n}\n\nfunction _formatContent(message: BaseMessage, toolCalls?: ToolCall[]) {\n const { content } = message;\n\n if (typeof content === \"string\") {\n return content;\n } else {\n return Array.from(_formatContentBlocks(content, toolCalls));\n }\n}\n\n/**\n * Formats messages as a prompt for the model.\n * Used in LangSmith, export is important here.\n * @param messages The base messages to format as a prompt.\n * @returns The formatted prompt.\n */\nexport function _convertMessagesToAnthropicPayload(\n messages: BaseMessage[]\n): AnthropicMessageCreateParams {\n const mergedMessages = _ensureMessageContents(messages);\n let system;\n if (mergedMessages.length > 0 && mergedMessages[0]._getType() === \"system\") {\n system = messages[0].content;\n }\n const conversationMessages =\n system !== undefined ? mergedMessages.slice(1) : mergedMessages;\n const formattedMessages = conversationMessages.map((message) => {\n let role;\n if (message._getType() === \"human\") {\n role = \"user\" as const;\n } else if (message._getType() === \"ai\") {\n role = \"assistant\" as const;\n } else if (message._getType() === \"tool\") {\n role = \"user\" as const;\n } else if (message._getType() === \"system\") {\n throw new Error(\n \"System messages are only permitted as the first passed message.\"\n );\n } else {\n throw new Error(`Message type \"${message.type}\" is not supported.`);\n }\n if (\n AIMessage.isInstance(message) &&\n message.response_metadata?.output_version === \"v1\"\n ) {\n return {\n role,\n content: _formatStandardContent(message),\n };\n }\n if (AIMessage.isInstance(message) && !!message.tool_calls?.length) {\n if (typeof message.content === \"string\") {\n if (message.content === \"\") {\n return {\n role,\n content: message.tool_calls.map(\n _convertLangChainToolCallToAnthropic\n ),\n };\n } else {\n return {\n role,\n content: [\n { type: \"text\", text: message.content },\n ...message.tool_calls.map(_convertLangChainToolCallToAnthropic),\n ],\n };\n }\n } else {\n const { content } = message;\n const formattedContent = _formatContent(message, message.tool_calls);\n const formattedContentArr = Array.isArray(formattedContent)\n ? formattedContent\n : [{ type: \"text\" as const, text: formattedContent }];\n const missingToolCalls = message.tool_calls.filter(\n (toolCall) =>\n !content.find(\n (contentPart) =>\n (contentPart.type === \"tool_use\" ||\n contentPart.type === \"input_json_delta\" ||\n contentPart.type === \"server_tool_use\") &&\n contentPart.id === toolCall.id\n )\n );\n return {\n role,\n content: [\n ...formattedContentArr,\n ...missingToolCalls.map(_convertLangChainToolCallToAnthropic),\n ],\n };\n }\n } else {\n return {\n role,\n content: _formatContent(\n message,\n AIMessage.isInstance(message) ? message.tool_calls : undefined\n ),\n };\n }\n });\n return {\n messages: mergeMessages(\n formattedMessages as AnthropicMessageCreateParams[\"messages\"]\n ),\n system,\n } as AnthropicMessageCreateParams;\n}\n\nfunction mergeMessages(messages: AnthropicMessageCreateParams[\"messages\"]) {\n if (!messages || messages.length <= 1) {\n return messages;\n }\n\n const result: AnthropicMessageCreateParams[\"messages\"] = [];\n let currentMessage = messages[0];\n\n const normalizeContent = (\n content:\n | string\n | Array<\n | AnthropicTextBlockParam\n | AnthropicImageBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | AnthropicDocumentBlockParam\n | AnthropicThinkingBlockParam\n | AnthropicRedactedThinkingBlockParam\n | AnthropicServerToolUseBlockParam\n | AnthropicWebSearchToolResultBlockParam\n | AnthropicSearchResultBlockParam\n >\n ): Array<\n | AnthropicTextBlockParam\n | AnthropicImageBlockParam\n | AnthropicToolUseBlockParam\n | AnthropicToolResultBlockParam\n | AnthropicDocumentBlockParam\n | AnthropicThinkingBlockParam\n | AnthropicRedactedThinkingBlockParam\n | AnthropicServerToolUseBlockParam\n | AnthropicWebSearchToolResultBlockParam\n | AnthropicSearchResultBlockParam\n > => {\n if (typeof content === \"string\") {\n return [\n {\n type: \"text\",\n text: content,\n },\n ];\n }\n return content;\n };\n\n const isToolResultMessage = (msg: (typeof messages)[0]) => {\n if (msg.role !== \"user\") return false;\n\n if (typeof msg.content === \"string\") {\n return false;\n }\n\n return (\n Array.isArray(msg.content) &&\n msg.content.every((item) => item.type === \"tool_result\")\n );\n };\n\n for (let i = 1; i < messages.length; i += 1) {\n const nextMessage = messages[i];\n\n if (\n isToolResultMessage(currentMessage) &&\n isToolResultMessage(nextMessage)\n ) {\n // Merge the messages by combining their content arrays\n currentMessage = {\n ...currentMessage,\n content: [\n ...normalizeContent(currentMessage.content),\n ...normalizeContent(nextMessage.content),\n ],\n };\n } else {\n result.push(currentMessage);\n currentMessage = nextMessage;\n }\n }\n\n result.push(currentMessage);\n return result;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"message_outputs.cjs","names":["AIMessageChunk","_isAnthropicCompactionBlock","AIMessage","extractToolCalls"],"sources":["../../src/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 { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\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 response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata = buildUsageMetadata(usage);\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 ...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 };\n const responseMetadata =\n \"context_management\" in data.delta\n ? { context_management: data.delta.context_management }\n : undefined;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\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 {\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 response_metadata,\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 // oxlint-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 response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\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 response_metadata,\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 response_metadata,\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 response_metadata,\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,\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,\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 response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : 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,\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 // oxlint-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,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nfunction buildUsageMetadata(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"message_outputs.cjs","names":["AIMessageChunk","_isAnthropicCompactionBlock","AIMessage","extractToolCalls"],"sources":["../../src/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 { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\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 response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata = buildUsageMetadata(usage);\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 ...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 };\n const responseMetadata =\n \"context_management\" in data.delta\n ? { context_management: data.delta.context_management }\n : undefined;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\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 {\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 response_metadata,\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 // oxlint-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 response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\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 response_metadata,\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 response_metadata,\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 response_metadata,\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,\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,\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 response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : 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,\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 // oxlint-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,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nfunction buildUsageMetadata(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"message_outputs.js","names":[],"sources":["../../src/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 { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\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 response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata = buildUsageMetadata(usage);\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 ...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 };\n const responseMetadata =\n \"context_management\" in data.delta\n ? { context_management: data.delta.context_management }\n : undefined;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\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 {\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 response_metadata,\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 // oxlint-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 response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\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 response_metadata,\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 response_metadata,\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 response_metadata,\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,\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,\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 response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : 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,\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 // oxlint-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,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nfunction buildUsageMetadata(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"message_outputs.js","names":[],"sources":["../../src/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 { AnthropicMessageResponse } from \"../types.js\";\nimport { extractToolCalls } from \"../output_parsers.js\";\nimport { _isAnthropicCompactionBlock } from \"./content.js\";\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 response_metadata = { model_provider: \"anthropic\" };\n if (data.type === \"message_start\") {\n const { content, usage, ...additionalKwargs } = data.message;\n // oxlint-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 // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata = buildUsageMetadata(usage);\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 ...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 };\n const responseMetadata =\n \"context_management\" in data.delta\n ? { context_management: data.delta.context_management }\n : undefined;\n return {\n chunk: new AIMessageChunk({\n content: fields.coerceContentToString ? \"\" : [],\n response_metadata: responseMetadata,\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 {\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 response_metadata,\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 // oxlint-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 response_metadata,\n }),\n };\n }\n\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"text\" }],\n response_metadata,\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 response_metadata,\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 response_metadata,\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 response_metadata,\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,\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,\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 response_metadata,\n }),\n };\n }\n return null;\n}\n\nexport function anthropicResponseToChatMessages(\n messages: AnthropicMessageResponse[],\n additionalKwargs: Record<string, unknown>\n): ChatGeneration[] {\n const response_metadata = {\n ...additionalKwargs,\n model_provider: \"anthropic\",\n };\n const usage: Record<string, number> | null | undefined =\n additionalKwargs.usage as Record<string, number> | null | undefined;\n const usageMetadata = usage != null ? buildUsageMetadata(usage) : 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,\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 // oxlint-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,\n id: additionalKwargs.id as string,\n }),\n },\n ];\n return generations;\n }\n}\n\nfunction buildUsageMetadata(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;\n const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;\n // Total input tokens in a Claude API request is the summation of `input_tokens`, `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n // ref: https://platform.claude.com/docs/en/api/messages\n const totalInputTokens =\n usage.input_tokens + cacheCreationInputTokens + cacheReadInputTokens;\n return {\n input_tokens: totalInputTokens,\n output_tokens: usage.output_tokens,\n total_tokens: totalInputTokens + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreationInputTokens,\n cache_read: cacheReadInputTokens,\n },\n };\n}\n"],"mappings":"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"}
@@ -1,9 +1,22 @@
1
1
  //#region src/utils/params.ts
2
+ const ADAPTIVE_ONLY_MODEL_PREFIXES = [
3
+ "claude-opus-4-7",
4
+ "claude-opus-4-8",
5
+ "claude-fable-5",
6
+ "claude-mythos-5",
7
+ "claude-mythos-preview"
8
+ ];
9
+ function modelStartsWithAnyPrefix(model, prefixes) {
10
+ return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;
11
+ }
2
12
  function isThinkingEnabled(thinking) {
3
13
  return thinking.type === "enabled" || thinking.type === "adaptive";
4
14
  }
5
15
  function isOpus47Model(model) {
6
- return model?.startsWith("claude-opus-4-7") ?? false;
16
+ return modelStartsWithAnyPrefix(model, ["claude-opus-4-7"]);
17
+ }
18
+ function isAdaptiveOnlyModel(model) {
19
+ return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);
7
20
  }
8
21
  function getTaskBudgetBetas(model, outputConfig) {
9
22
  const hasTaskBudget = outputConfig && typeof outputConfig === "object" && "task_budget" in outputConfig && outputConfig.task_budget != null;
@@ -11,13 +24,14 @@ function getTaskBudgetBetas(model, outputConfig) {
11
24
  }
12
25
  function validateInvocationParamCompatibility(fields) {
13
26
  const { model, thinking, topK, topP, temperature } = fields;
14
- const opus47 = isOpus47Model(model);
15
- if (opus47 && thinking.type === "enabled") throw new Error("thinking.type=\"enabled\" is not supported for claude-opus-4-7; use thinking.type=\"adaptive\" instead");
16
- if (opus47 && typeof thinking === "object" && thinking != null && "budget_tokens" in thinking) throw new Error("thinking.budget_tokens is not supported for claude-opus-4-7; use outputConfig.effort instead");
17
- if (opus47) {
18
- if (topK !== void 0) throw new Error("topK is not supported for claude-opus-4-7; omit topK/topP/temperature or use model prompting instead");
19
- if (topP !== void 0 && topP !== 1) throw new Error("topP is not supported for claude-opus-4-7 when set to non-default values");
20
- if (temperature !== void 0 && temperature !== 1) throw new Error("temperature is not supported for claude-opus-4-7 when set to non-default values");
27
+ const adaptiveOnlyModel = isAdaptiveOnlyModel(model);
28
+ const modelName = model ?? "this model";
29
+ if (adaptiveOnlyModel && thinking.type === "enabled") throw new Error(`thinking.type="enabled" is not supported for ${modelName}; use thinking.type="adaptive" instead`);
30
+ if (adaptiveOnlyModel && typeof thinking === "object" && thinking != null && "budget_tokens" in thinking) throw new Error(`thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`);
31
+ if (adaptiveOnlyModel) {
32
+ if (topK !== void 0) throw new Error(`topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`);
33
+ if (topP !== void 0 && topP !== 1) throw new Error(`topP is not supported for ${modelName} when set to non-default values`);
34
+ if (temperature !== void 0 && temperature !== 1) throw new Error(`temperature is not supported for ${modelName} when set to non-default values`);
21
35
  }
22
36
  if (isThinkingEnabled(thinking)) {
23
37
  if (topK !== void 0) throw new Error("topK is not supported when thinking is enabled");
@@ -28,7 +42,7 @@ function validateInvocationParamCompatibility(fields) {
28
42
  function getSamplingParams(fields) {
29
43
  const { model, thinking, topK, topP, temperature } = fields;
30
44
  const output = {};
31
- if (isThinkingEnabled(thinking) || isOpus47Model(model)) return output;
45
+ if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) return output;
32
46
  if (temperature !== void 0) output.temperature = temperature;
33
47
  if (topK !== void 0) output.top_k = topK;
34
48
  if (topP !== void 0) output.top_p = topP;
@@ -1 +1 @@
1
- {"version":3,"file":"params.cjs","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return model?.startsWith(\"claude-opus-4-7\") ?? false;\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const { model, thinking, topK, topP, temperature } = fields;\n const opus47 = isOpus47Model(model);\n\n if (opus47 && thinking.type === \"enabled\") {\n throw new Error(\n 'thinking.type=\"enabled\" is not supported for claude-opus-4-7; use thinking.type=\"adaptive\" instead'\n );\n }\n if (\n opus47 &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n \"thinking.budget_tokens is not supported for claude-opus-4-7; use outputConfig.effort instead\"\n );\n }\n if (opus47) {\n if (topK !== undefined) {\n throw new Error(\n \"topK is not supported for claude-opus-4-7; omit topK/topP/temperature or use model prompting instead\"\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n \"topP is not supported for claude-opus-4-7 when set to non-default values\"\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n \"temperature is not supported for claude-opus-4-7 when set to non-default values\"\n );\n }\n }\n\n if (isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isOpus47Model(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAgBA,SAAS,kBAAkB,UAAiD;AAC1E,QAAO,SAAS,SAAS,aAAa,SAAS,SAAS;;AAG1D,SAAgB,cAAc,OAAyB;AACrD,QAAO,OAAO,WAAW,kBAAkB,IAAI;;AAGjD,SAAgB,mBACd,OACA,cACiB;CACjB,MAAM,gBACJ,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,gBACjB,aAAa,eAAe;AAE9B,QAAO,cAAc,MAAM,IAAI,gBAC1B,CAAC,0BAA0B,GAC5B,EAAE;;AAGR,SAAgB,qCACd,QACM;CACN,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAAS,cAAc,MAAM;AAEnC,KAAI,UAAU,SAAS,SAAS,UAC9B,OAAM,IAAI,MACR,yGACD;AAEH,KACE,UACA,OAAO,aAAa,YACpB,YAAY,QACZ,mBAAmB,SAEnB,OAAM,IAAI,MACR,+FACD;AAEH,KAAI,QAAQ;AACV,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MACR,uGACD;AAEH,MAAI,SAAS,KAAA,KAAa,SAAS,EACjC,OAAM,IAAI,MACR,2EACD;AAEH,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MACR,kFACD;;AAIL,KAAI,kBAAkB,SAAS,EAAE;AAC/B,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MAAM,wDAAwD;;;AAK9E,SAAgB,kBACd,QACoE;CACpE,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAGF,EAAE;AAEN,KAAI,kBAAkB,SAAS,IAAI,cAAc,MAAM,CACrD,QAAO;AAGT,KAAI,gBAAgB,KAAA,EAClB,QAAO,cAAc;AAEvB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAEjB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAGjB,QAAO"}
1
+ {"version":3,"file":"params.cjs","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nconst ADAPTIVE_ONLY_MODEL_PREFIXES = [\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] as const;\n\nfunction modelStartsWithAnyPrefix(\n model: string | undefined,\n prefixes: readonly string[]\n): boolean {\n return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;\n}\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, [\"claude-opus-4-7\"]);\n}\n\nexport function isAdaptiveOnlyModel(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const { model, thinking, topK, topP, temperature } = fields;\n const adaptiveOnlyModel = isAdaptiveOnlyModel(model);\n const modelName = model ?? \"this model\";\n\n if (adaptiveOnlyModel && thinking.type === \"enabled\") {\n throw new Error(\n `thinking.type=\"enabled\" is not supported for ${modelName}; use thinking.type=\"adaptive\" instead`\n );\n }\n if (\n adaptiveOnlyModel &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n `thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`\n );\n }\n if (adaptiveOnlyModel) {\n if (topK !== undefined) {\n throw new Error(\n `topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n `topP is not supported for ${modelName} when set to non-default values`\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n `temperature is not supported for ${modelName} when set to non-default values`\n );\n }\n }\n\n if (isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAgBA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,yBACP,OACA,UACS;AACT,QAAO,QAAQ,SAAS,MAAM,WAAW,MAAM,WAAW,OAAO,CAAC,GAAG;;AAGvE,SAAS,kBAAkB,UAAiD;AAC1E,QAAO,SAAS,SAAS,aAAa,SAAS,SAAS;;AAG1D,SAAgB,cAAc,OAAyB;AACrD,QAAO,yBAAyB,OAAO,CAAC,kBAAkB,CAAC;;AAG7D,SAAgB,oBAAoB,OAAyB;AAC3D,QAAO,yBAAyB,OAAO,6BAA6B;;AAGtE,SAAgB,mBACd,OACA,cACiB;CACjB,MAAM,gBACJ,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,gBACjB,aAAa,eAAe;AAE9B,QAAO,cAAc,MAAM,IAAI,gBAC1B,CAAC,0BAA0B,GAC5B,EAAE;;AAGR,SAAgB,qCACd,QACM;CACN,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,oBAAoB,oBAAoB,MAAM;CACpD,MAAM,YAAY,SAAS;AAE3B,KAAI,qBAAqB,SAAS,SAAS,UACzC,OAAM,IAAI,MACR,gDAAgD,UAAU,wCAC3D;AAEH,KACE,qBACA,OAAO,aAAa,YACpB,YAAY,QACZ,mBAAmB,SAEnB,OAAM,IAAI,MACR,+CAA+C,UAAU,mCAC1D;AAEH,KAAI,mBAAmB;AACrB,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MACR,6BAA6B,UAAU,6DACxC;AAEH,MAAI,SAAS,KAAA,KAAa,SAAS,EACjC,OAAM,IAAI,MACR,6BAA6B,UAAU,iCACxC;AAEH,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MACR,oCAAoC,UAAU,iCAC/C;;AAIL,KAAI,kBAAkB,SAAS,EAAE;AAC/B,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MAAM,wDAAwD;;;AAK9E,SAAgB,kBACd,QACoE;CACpE,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAGF,EAAE;AAEN,KAAI,kBAAkB,SAAS,IAAI,oBAAoB,MAAM,CAC3D,QAAO;AAGT,KAAI,gBAAgB,KAAA,EAClB,QAAO,cAAc;AAEvB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAEjB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAGjB,QAAO"}
@@ -1,9 +1,22 @@
1
1
  //#region src/utils/params.ts
2
+ const ADAPTIVE_ONLY_MODEL_PREFIXES = [
3
+ "claude-opus-4-7",
4
+ "claude-opus-4-8",
5
+ "claude-fable-5",
6
+ "claude-mythos-5",
7
+ "claude-mythos-preview"
8
+ ];
9
+ function modelStartsWithAnyPrefix(model, prefixes) {
10
+ return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;
11
+ }
2
12
  function isThinkingEnabled(thinking) {
3
13
  return thinking.type === "enabled" || thinking.type === "adaptive";
4
14
  }
5
15
  function isOpus47Model(model) {
6
- return model?.startsWith("claude-opus-4-7") ?? false;
16
+ return modelStartsWithAnyPrefix(model, ["claude-opus-4-7"]);
17
+ }
18
+ function isAdaptiveOnlyModel(model) {
19
+ return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);
7
20
  }
8
21
  function getTaskBudgetBetas(model, outputConfig) {
9
22
  const hasTaskBudget = outputConfig && typeof outputConfig === "object" && "task_budget" in outputConfig && outputConfig.task_budget != null;
@@ -11,13 +24,14 @@ function getTaskBudgetBetas(model, outputConfig) {
11
24
  }
12
25
  function validateInvocationParamCompatibility(fields) {
13
26
  const { model, thinking, topK, topP, temperature } = fields;
14
- const opus47 = isOpus47Model(model);
15
- if (opus47 && thinking.type === "enabled") throw new Error("thinking.type=\"enabled\" is not supported for claude-opus-4-7; use thinking.type=\"adaptive\" instead");
16
- if (opus47 && typeof thinking === "object" && thinking != null && "budget_tokens" in thinking) throw new Error("thinking.budget_tokens is not supported for claude-opus-4-7; use outputConfig.effort instead");
17
- if (opus47) {
18
- if (topK !== void 0) throw new Error("topK is not supported for claude-opus-4-7; omit topK/topP/temperature or use model prompting instead");
19
- if (topP !== void 0 && topP !== 1) throw new Error("topP is not supported for claude-opus-4-7 when set to non-default values");
20
- if (temperature !== void 0 && temperature !== 1) throw new Error("temperature is not supported for claude-opus-4-7 when set to non-default values");
27
+ const adaptiveOnlyModel = isAdaptiveOnlyModel(model);
28
+ const modelName = model ?? "this model";
29
+ if (adaptiveOnlyModel && thinking.type === "enabled") throw new Error(`thinking.type="enabled" is not supported for ${modelName}; use thinking.type="adaptive" instead`);
30
+ if (adaptiveOnlyModel && typeof thinking === "object" && thinking != null && "budget_tokens" in thinking) throw new Error(`thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`);
31
+ if (adaptiveOnlyModel) {
32
+ if (topK !== void 0) throw new Error(`topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`);
33
+ if (topP !== void 0 && topP !== 1) throw new Error(`topP is not supported for ${modelName} when set to non-default values`);
34
+ if (temperature !== void 0 && temperature !== 1) throw new Error(`temperature is not supported for ${modelName} when set to non-default values`);
21
35
  }
22
36
  if (isThinkingEnabled(thinking)) {
23
37
  if (topK !== void 0) throw new Error("topK is not supported when thinking is enabled");
@@ -28,7 +42,7 @@ function validateInvocationParamCompatibility(fields) {
28
42
  function getSamplingParams(fields) {
29
43
  const { model, thinking, topK, topP, temperature } = fields;
30
44
  const output = {};
31
- if (isThinkingEnabled(thinking) || isOpus47Model(model)) return output;
45
+ if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) return output;
32
46
  if (temperature !== void 0) output.temperature = temperature;
33
47
  if (topK !== void 0) output.top_k = topK;
34
48
  if (topP !== void 0) output.top_p = topP;
@@ -1 +1 @@
1
- {"version":3,"file":"params.js","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return model?.startsWith(\"claude-opus-4-7\") ?? false;\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const { model, thinking, topK, topP, temperature } = fields;\n const opus47 = isOpus47Model(model);\n\n if (opus47 && thinking.type === \"enabled\") {\n throw new Error(\n 'thinking.type=\"enabled\" is not supported for claude-opus-4-7; use thinking.type=\"adaptive\" instead'\n );\n }\n if (\n opus47 &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n \"thinking.budget_tokens is not supported for claude-opus-4-7; use outputConfig.effort instead\"\n );\n }\n if (opus47) {\n if (topK !== undefined) {\n throw new Error(\n \"topK is not supported for claude-opus-4-7; omit topK/topP/temperature or use model prompting instead\"\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n \"topP is not supported for claude-opus-4-7 when set to non-default values\"\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n \"temperature is not supported for claude-opus-4-7 when set to non-default values\"\n );\n }\n }\n\n if (isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isOpus47Model(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAgBA,SAAS,kBAAkB,UAAiD;AAC1E,QAAO,SAAS,SAAS,aAAa,SAAS,SAAS;;AAG1D,SAAgB,cAAc,OAAyB;AACrD,QAAO,OAAO,WAAW,kBAAkB,IAAI;;AAGjD,SAAgB,mBACd,OACA,cACiB;CACjB,MAAM,gBACJ,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,gBACjB,aAAa,eAAe;AAE9B,QAAO,cAAc,MAAM,IAAI,gBAC1B,CAAC,0BAA0B,GAC5B,EAAE;;AAGR,SAAgB,qCACd,QACM;CACN,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAAS,cAAc,MAAM;AAEnC,KAAI,UAAU,SAAS,SAAS,UAC9B,OAAM,IAAI,MACR,yGACD;AAEH,KACE,UACA,OAAO,aAAa,YACpB,YAAY,QACZ,mBAAmB,SAEnB,OAAM,IAAI,MACR,+FACD;AAEH,KAAI,QAAQ;AACV,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MACR,uGACD;AAEH,MAAI,SAAS,KAAA,KAAa,SAAS,EACjC,OAAM,IAAI,MACR,2EACD;AAEH,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MACR,kFACD;;AAIL,KAAI,kBAAkB,SAAS,EAAE;AAC/B,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MAAM,wDAAwD;;;AAK9E,SAAgB,kBACd,QACoE;CACpE,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAGF,EAAE;AAEN,KAAI,kBAAkB,SAAS,IAAI,cAAc,MAAM,CACrD,QAAO;AAGT,KAAI,gBAAgB,KAAA,EAClB,QAAO,cAAc;AAEvB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAEjB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAGjB,QAAO"}
1
+ {"version":3,"file":"params.js","names":[],"sources":["../../src/utils/params.ts"],"sourcesContent":["import { AnthropicBeta } from \"@anthropic-ai/sdk/resources\";\n\nimport {\n AnthropicInvocationParams,\n AnthropicOutputConfig,\n AnthropicThinkingConfigParam,\n} from \"../types.js\";\n\ntype InvocationCompatibilityFields = {\n model?: string;\n thinking: AnthropicThinkingConfigParam;\n topK?: number;\n topP?: number;\n temperature?: number;\n};\n\nconst ADAPTIVE_ONLY_MODEL_PREFIXES = [\n \"claude-opus-4-7\",\n \"claude-opus-4-8\",\n \"claude-fable-5\",\n \"claude-mythos-5\",\n \"claude-mythos-preview\",\n] as const;\n\nfunction modelStartsWithAnyPrefix(\n model: string | undefined,\n prefixes: readonly string[]\n): boolean {\n return model ? prefixes.some((prefix) => model.startsWith(prefix)) : false;\n}\n\nfunction isThinkingEnabled(thinking: AnthropicThinkingConfigParam): boolean {\n return thinking.type === \"enabled\" || thinking.type === \"adaptive\";\n}\n\nexport function isOpus47Model(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, [\"claude-opus-4-7\"]);\n}\n\nexport function isAdaptiveOnlyModel(model?: string): boolean {\n return modelStartsWithAnyPrefix(model, ADAPTIVE_ONLY_MODEL_PREFIXES);\n}\n\nexport function getTaskBudgetBetas(\n model?: string,\n outputConfig?: AnthropicOutputConfig\n): AnthropicBeta[] {\n const hasTaskBudget =\n outputConfig &&\n typeof outputConfig === \"object\" &&\n \"task_budget\" in outputConfig &&\n outputConfig.task_budget != null;\n\n return isOpus47Model(model) && hasTaskBudget\n ? ([\"task-budgets-2026-03-13\"] as AnthropicBeta[])\n : [];\n}\n\nexport function validateInvocationParamCompatibility(\n fields: InvocationCompatibilityFields\n): void {\n const { model, thinking, topK, topP, temperature } = fields;\n const adaptiveOnlyModel = isAdaptiveOnlyModel(model);\n const modelName = model ?? \"this model\";\n\n if (adaptiveOnlyModel && thinking.type === \"enabled\") {\n throw new Error(\n `thinking.type=\"enabled\" is not supported for ${modelName}; use thinking.type=\"adaptive\" instead`\n );\n }\n if (\n adaptiveOnlyModel &&\n typeof thinking === \"object\" &&\n thinking != null &&\n \"budget_tokens\" in thinking\n ) {\n throw new Error(\n `thinking.budget_tokens is not supported for ${modelName}; use outputConfig.effort instead`\n );\n }\n if (adaptiveOnlyModel) {\n if (topK !== undefined) {\n throw new Error(\n `topK is not supported for ${modelName}; omit topK/topP/temperature or use model prompting instead`\n );\n }\n if (topP !== undefined && topP !== 1) {\n throw new Error(\n `topP is not supported for ${modelName} when set to non-default values`\n );\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\n `temperature is not supported for ${modelName} when set to non-default values`\n );\n }\n }\n\n if (isThinkingEnabled(thinking)) {\n if (topK !== undefined) {\n throw new Error(\"topK is not supported when thinking is enabled\");\n }\n if (topP !== undefined) {\n throw new Error(\"topP is not supported when thinking is enabled\");\n }\n if (temperature !== undefined && temperature !== 1) {\n throw new Error(\"temperature is not supported when thinking is enabled\");\n }\n }\n}\n\nexport function getSamplingParams(\n fields: InvocationCompatibilityFields\n): Pick<AnthropicInvocationParams, \"temperature\" | \"top_k\" | \"top_p\"> {\n const { model, thinking, topK, topP, temperature } = fields;\n const output: Pick<\n AnthropicInvocationParams,\n \"temperature\" | \"top_k\" | \"top_p\"\n > = {};\n\n if (isThinkingEnabled(thinking) || isAdaptiveOnlyModel(model)) {\n return output;\n }\n\n if (temperature !== undefined) {\n output.temperature = temperature;\n }\n if (topK !== undefined) {\n output.top_k = topK;\n }\n if (topP !== undefined) {\n output.top_p = topP;\n }\n\n return output;\n}\n"],"mappings":";AAgBA,MAAM,+BAA+B;CACnC;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,yBACP,OACA,UACS;AACT,QAAO,QAAQ,SAAS,MAAM,WAAW,MAAM,WAAW,OAAO,CAAC,GAAG;;AAGvE,SAAS,kBAAkB,UAAiD;AAC1E,QAAO,SAAS,SAAS,aAAa,SAAS,SAAS;;AAG1D,SAAgB,cAAc,OAAyB;AACrD,QAAO,yBAAyB,OAAO,CAAC,kBAAkB,CAAC;;AAG7D,SAAgB,oBAAoB,OAAyB;AAC3D,QAAO,yBAAyB,OAAO,6BAA6B;;AAGtE,SAAgB,mBACd,OACA,cACiB;CACjB,MAAM,gBACJ,gBACA,OAAO,iBAAiB,YACxB,iBAAiB,gBACjB,aAAa,eAAe;AAE9B,QAAO,cAAc,MAAM,IAAI,gBAC1B,CAAC,0BAA0B,GAC5B,EAAE;;AAGR,SAAgB,qCACd,QACM;CACN,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,oBAAoB,oBAAoB,MAAM;CACpD,MAAM,YAAY,SAAS;AAE3B,KAAI,qBAAqB,SAAS,SAAS,UACzC,OAAM,IAAI,MACR,gDAAgD,UAAU,wCAC3D;AAEH,KACE,qBACA,OAAO,aAAa,YACpB,YAAY,QACZ,mBAAmB,SAEnB,OAAM,IAAI,MACR,+CAA+C,UAAU,mCAC1D;AAEH,KAAI,mBAAmB;AACrB,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MACR,6BAA6B,UAAU,6DACxC;AAEH,MAAI,SAAS,KAAA,KAAa,SAAS,EACjC,OAAM,IAAI,MACR,6BAA6B,UAAU,iCACxC;AAEH,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MACR,oCAAoC,UAAU,iCAC/C;;AAIL,KAAI,kBAAkB,SAAS,EAAE;AAC/B,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,SAAS,KAAA,EACX,OAAM,IAAI,MAAM,iDAAiD;AAEnE,MAAI,gBAAgB,KAAA,KAAa,gBAAgB,EAC/C,OAAM,IAAI,MAAM,wDAAwD;;;AAK9E,SAAgB,kBACd,QACoE;CACpE,MAAM,EAAE,OAAO,UAAU,MAAM,MAAM,gBAAgB;CACrD,MAAM,SAGF,EAAE;AAEN,KAAI,kBAAkB,SAAS,IAAI,oBAAoB,MAAM,CAC3D,QAAO;AAGT,KAAI,gBAAgB,KAAA,EAClB,QAAO,cAAc;AAEvB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAEjB,KAAI,SAAS,KAAA,EACX,QAAO,QAAQ;AAGjB,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.cjs","names":["_convertMessagesToAnthropicPayload"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;CAExC,MAAM,gBAAgBA,uBAAAA,mCADL,gBAAgB,gBAAgB,CACiB;AAClE,KAAI,cAAc,aAAa,KAAA,EAC7B,eAAc,WAAW,EAAE;AAE7B,QAAO"}
1
+ {"version":3,"file":"prompts.cjs","names":["_convertMessagesToAnthropicPayload"],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;CAExC,MAAM,gBAAgBA,uBAAAA,mCADL,gBAAgB,gBACgC,CAAC;AAClE,KAAI,cAAc,aAAa,KAAA,EAC7B,eAAc,WAAW,EAAE;AAE7B,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","names":[],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;CAExC,MAAM,gBAAgB,mCADL,gBAAgB,gBAAgB,CACiB;AAClE,KAAI,cAAc,aAAa,KAAA,EAC7B,eAAc,WAAW,EAAE;AAE7B,QAAO"}
1
+ {"version":3,"file":"prompts.js","names":[],"sources":["../../src/utils/prompts.ts"],"sourcesContent":["import type { BasePromptValue } from \"@langchain/core/prompt_values\";\nimport Anthropic from \"@anthropic-ai/sdk\";\n\nimport { _convertMessagesToAnthropicPayload } from \"./message_inputs.js\";\n\n/**\n * Convert a formatted LangChain prompt (e.g. pulled from the hub) into\n * a format expected by Anthropic's JS SDK.\n *\n * Requires the \"@langchain/anthropic\" package to be installed in addition\n * to the Anthropic SDK.\n *\n * @example\n * ```ts\n * import { convertPromptToAnthropic } from \"langsmith/utils/hub/anthropic\";\n * import { pull } from \"langchain/hub\";\n *\n * import Anthropic from '@anthropic-ai/sdk';\n *\n * const prompt = await pull(\"jacob/joke-generator\");\n * const formattedPrompt = await prompt.invoke({\n * topic: \"cats\",\n * });\n *\n * const { system, messages } = convertPromptToAnthropic(formattedPrompt);\n *\n * const anthropicClient = new Anthropic({\n * apiKey: 'your_api_key',\n * });\n *\n * const anthropicResponse = await anthropicClient.messages.create({\n * model: \"claude-sonnet-4-5-20250929\",\n * max_tokens: 1024,\n * stream: false,\n * system,\n * messages,\n * });\n * ```\n * @param formattedPrompt\n * @returns A partial Anthropic payload.\n */\nexport function convertPromptToAnthropic(\n formattedPrompt: BasePromptValue\n): Anthropic.Messages.MessageCreateParams {\n const messages = formattedPrompt.toChatMessages();\n const anthropicBody = _convertMessagesToAnthropicPayload(messages);\n if (anthropicBody.messages === undefined) {\n anthropicBody.messages = [];\n }\n return anthropicBody;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,yBACd,iBACwC;CAExC,MAAM,gBAAgB,mCADL,gBAAgB,gBACgC,CAAC;AAClE,KAAI,cAAc,aAAa,KAAA,EAC7B,eAAc,WAAW,EAAE;AAE7B,QAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"standard.cjs","names":["iife"],"sources":["../../src/utils/standard.ts"],"sourcesContent":["import type Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n BaseMessage,\n ContentBlock,\n ResponseMetadata,\n} from \"@langchain/core/messages\";\nimport { iife } from \"./index.js\";\n\nfunction _isStandardAnnotation(\n annotation: unknown\n): annotation is ContentBlock.Citation {\n return (\n typeof annotation === \"object\" &&\n annotation !== null &&\n \"type\" in annotation &&\n annotation.type === \"citation\"\n );\n}\n\nfunction _formatStandardCitations(\n annotations: ContentBlock.Citation[]\n): Anthropic.Beta.BetaTextCitation[] {\n function* iterateAnnotations() {\n for (const annotation of annotations) {\n if (_isStandardAnnotation(annotation)) {\n if (annotation.source === \"char\") {\n yield {\n type: \"char_location\" as const,\n file_id: annotation.url ?? \"\",\n start_char_index: annotation.startIndex ?? 0,\n end_char_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"page\") {\n yield {\n type: \"page_location\" as const,\n file_id: annotation.url ?? \"\",\n start_page_number: annotation.startIndex ?? 0,\n end_page_number: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"block\") {\n yield {\n type: \"content_block_location\" as const,\n file_id: annotation.url ?? \"\",\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"url\") {\n yield {\n type: \"web_search_result_location\" as const,\n url: annotation.url ?? \"\",\n title: annotation.title ?? null,\n encrypted_index: String(annotation.startIndex ?? 0),\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"search\") {\n yield {\n type: \"search_result_location\" as const,\n title: annotation.title ?? null,\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n search_result_index: 0,\n source: annotation.source ?? \"\",\n cited_text: annotation.citedText ?? \"\",\n };\n }\n }\n }\n }\n return Array.from(iterateAnnotations());\n}\n\nfunction _formatBase64Data(data: string | Uint8Array): string {\n if (typeof data === \"string\") return data;\n else return _encodeUint8Array(data);\n}\n\nfunction _encodeUint8Array(data: Uint8Array): string {\n const output = [];\n for (let i = 0, { length } = data; i < length; i++) {\n output.push(String.fromCharCode(data[i]));\n }\n return btoa(output.join(\"\"));\n}\n\nfunction _normalizeMimeType(mimeType?: string | null): string {\n return (mimeType ?? \"\").split(\";\")[0].toLowerCase();\n}\n\nfunction _extractMetadataValue<T>(\n metadata: unknown,\n key: string\n): T | undefined {\n if (\n metadata !== undefined &&\n metadata !== null &&\n typeof metadata === \"object\" &&\n key in metadata\n ) {\n return (metadata as Record<string, unknown>)[key] as T;\n }\n return undefined;\n}\n\nfunction _applyDocumentMetadata(\n block: Anthropic.Beta.BetaRequestDocumentBlock,\n metadata: unknown\n): Anthropic.Beta.BetaRequestDocumentBlock {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n const citations =\n _extractMetadataValue<Anthropic.Beta.BetaCitationsConfigParam | null>(\n metadata,\n \"citations\"\n );\n if (citations !== undefined) {\n block.citations = citations;\n }\n const context = _extractMetadataValue<string | null>(metadata, \"context\");\n if (context !== undefined) {\n block.context = context;\n }\n const title = _extractMetadataValue<string | null>(metadata, \"title\");\n if (title !== undefined) {\n block.title = title;\n }\n return block;\n}\n\nfunction _applyImageMetadata(\n block: Anthropic.Beta.BetaImageBlockParam,\n metadata: unknown\n): Anthropic.Beta.BetaImageBlockParam {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n return block;\n}\n\nfunction _hasAllowedImageMimeType(\n mimeType: string\n): mimeType is \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\" {\n const ALLOWED_IMAGE_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n ]);\n return ALLOWED_IMAGE_MIME_TYPES.has(mimeType);\n}\n\nexport function _formatStandardContent(\n message: BaseMessage\n): Anthropic.Beta.BetaContentBlockParam[] {\n const result: Anthropic.Beta.BetaContentBlockParam[] = [];\n const responseMetadata = message.response_metadata as ResponseMetadata;\n const isAnthropicMessage =\n \"model_provider\" in responseMetadata &&\n responseMetadata?.model_provider === \"anthropic\";\n for (const block of message.contentBlocks) {\n if (block.type === \"text\") {\n if (block.annotations) {\n result.push({\n type: \"text\",\n text: block.text,\n citations: _formatStandardCitations(\n block.annotations as ContentBlock.Citation[]\n ),\n });\n } else {\n result.push({\n type: \"text\",\n text: block.text,\n });\n }\n } else if (block.type === \"tool_call\") {\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name,\n input: block.args,\n });\n } else if (block.type === \"tool_call_chunk\") {\n const input = iife(() => {\n if (typeof block.args !== \"string\") {\n return block.args;\n }\n try {\n return JSON.parse(block.args);\n } catch {\n return {};\n }\n });\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name ?? \"\",\n input,\n });\n } else if (block.type === \"reasoning\" && isAnthropicMessage) {\n result.push({\n type: \"thinking\",\n thinking: block.reasoning,\n signature: String(block.signature),\n });\n } else if (block.type === \"server_tool_call\" && isAnthropicMessage) {\n if (block.name === \"web_search\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n }\n } else if (block.type === \"server_tool_call_result\" && isAnthropicMessage) {\n if (block.name === \"web_search\" && Array.isArray(block.output.urls)) {\n const content = block.output.urls.map((url) => ({\n type: \"web_search_result\" as const,\n title: \"\",\n encrypted_content: \"\",\n url,\n }));\n result.push({\n type: \"web_search_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n content,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"code_execution_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n } else if (block.name === \"mcp_tool_result\") {\n result.push({\n type: \"mcp_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n }\n } else if (block.type === \"audio\") {\n throw new Error(\"Anthropic does not support audio content blocks.\");\n } else if (block.type === \"file\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"application/pdf\" || mimeType === \"\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"\" || mimeType === \"application/pdf\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: \"application/pdf\",\n },\n },\n metadata\n )\n );\n } else if (mimeType === \"text/plain\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n metadata\n )\n );\n } else {\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n ],\n },\n },\n metadata\n )\n );\n } else {\n throw new Error(\n `Unsupported file mime type for Anthropic base64 source: ${mimeType}`\n );\n }\n }\n continue;\n }\n throw new Error(\n \"File content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"image\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType) || \"image/png\";\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n metadata\n )\n );\n }\n continue;\n }\n throw new Error(\n \"Image content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"video\") {\n // no-op\n } else if (block.type === \"text-plain\") {\n if (block.data) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n block.metadata\n )\n );\n }\n } else if (block.type === \"non_standard\" && isAnthropicMessage) {\n result.push(block.value as Anthropic.Beta.BetaContentBlockParam);\n }\n }\n return result;\n}\n"],"mappings":";;AAQA,SAAS,sBACP,YACqC;AACrC,QACE,OAAO,eAAe,YACtB,eAAe,QACf,UAAU,cACV,WAAW,SAAS;;AAIxB,SAAS,yBACP,aACmC;CACnC,UAAU,qBAAqB;AAC7B,OAAK,MAAM,cAAc,YACvB,KAAI,sBAAsB,WAAW;OAC/B,WAAW,WAAW,OACxB,OAAM;IACJ,MAAM;IACN,SAAS,WAAW,OAAO;IAC3B,kBAAkB,WAAW,cAAc;IAC3C,gBAAgB,WAAW,YAAY;IACvC,gBAAgB,WAAW,SAAS;IACpC,gBAAgB;IAChB,YAAY,WAAW,aAAa;IACrC;YACQ,WAAW,WAAW,OAC/B,OAAM;IACJ,MAAM;IACN,SAAS,WAAW,OAAO;IAC3B,mBAAmB,WAAW,cAAc;IAC5C,iBAAiB,WAAW,YAAY;IACxC,gBAAgB,WAAW,SAAS;IACpC,gBAAgB;IAChB,YAAY,WAAW,aAAa;IACrC;YACQ,WAAW,WAAW,QAC/B,OAAM;IACJ,MAAM;IACN,SAAS,WAAW,OAAO;IAC3B,mBAAmB,WAAW,cAAc;IAC5C,iBAAiB,WAAW,YAAY;IACxC,gBAAgB,WAAW,SAAS;IACpC,gBAAgB;IAChB,YAAY,WAAW,aAAa;IACrC;YACQ,WAAW,WAAW,MAC/B,OAAM;IACJ,MAAM;IACN,KAAK,WAAW,OAAO;IACvB,OAAO,WAAW,SAAS;IAC3B,iBAAiB,OAAO,WAAW,cAAc,EAAE;IACnD,YAAY,WAAW,aAAa;IACrC;YACQ,WAAW,WAAW,SAC/B,OAAM;IACJ,MAAM;IACN,OAAO,WAAW,SAAS;IAC3B,mBAAmB,WAAW,cAAc;IAC5C,iBAAiB,WAAW,YAAY;IACxC,qBAAqB;IACrB,QAAQ,WAAW,UAAU;IAC7B,YAAY,WAAW,aAAa;IACrC;;;AAKT,QAAO,MAAM,KAAK,oBAAoB,CAAC;;AAGzC,SAAS,kBAAkB,MAAmC;AAC5D,KAAI,OAAO,SAAS,SAAU,QAAO;KAChC,QAAO,kBAAkB,KAAK;;AAGrC,SAAS,kBAAkB,MAA0B;CACnD,MAAM,SAAS,EAAE;AACjB,MAAK,IAAI,IAAI,GAAG,EAAE,WAAW,MAAM,IAAI,QAAQ,IAC7C,QAAO,KAAK,OAAO,aAAa,KAAK,GAAG,CAAC;AAE3C,QAAO,KAAK,OAAO,KAAK,GAAG,CAAC;;AAG9B,SAAS,mBAAmB,UAAkC;AAC5D,SAAQ,YAAY,IAAI,MAAM,IAAI,CAAC,GAAG,aAAa;;AAGrD,SAAS,sBACP,UACA,KACe;AACf,KACE,aAAa,KAAA,KACb,aAAa,QACb,OAAO,aAAa,YACpB,OAAO,SAEP,QAAQ,SAAqC;;AAKjD,SAAS,uBACP,OACA,UACyC;CACzC,MAAM,eACJ,sBACE,UACA,gBACD;AACH,KAAI,iBAAiB,KAAA,EACnB,OAAM,gBAAgB;CAExB,MAAM,YACJ,sBACE,UACA,YACD;AACH,KAAI,cAAc,KAAA,EAChB,OAAM,YAAY;CAEpB,MAAM,UAAU,sBAAqC,UAAU,UAAU;AACzE,KAAI,YAAY,KAAA,EACd,OAAM,UAAU;CAElB,MAAM,QAAQ,sBAAqC,UAAU,QAAQ;AACrE,KAAI,UAAU,KAAA,EACZ,OAAM,QAAQ;AAEhB,QAAO;;AAGT,SAAS,oBACP,OACA,UACoC;CACpC,MAAM,eACJ,sBACE,UACA,gBACD;AACH,KAAI,iBAAiB,KAAA,EACnB,OAAM,gBAAgB;AAExB,QAAO;;AAGT,SAAS,yBACP,UACqE;AAOrE,QANiC,IAAI,IAAI;EACvC;EACA;EACA;EACA;EACD,CAAC,CAC8B,IAAI,SAAS;;AAG/C,SAAgB,uBACd,SACwC;CACxC,MAAM,SAAiD,EAAE;CACzD,MAAM,mBAAmB,QAAQ;CACjC,MAAM,qBACJ,oBAAoB,oBACpB,kBAAkB,mBAAmB;AACvC,MAAK,MAAM,SAAS,QAAQ,cAC1B,KAAI,MAAM,SAAS,OACjB,KAAI,MAAM,YACR,QAAO,KAAK;EACV,MAAM;EACN,MAAM,MAAM;EACZ,WAAW,yBACT,MAAM,YACP;EACF,CAAC;KAEF,QAAO,KAAK;EACV,MAAM;EACN,MAAM,MAAM;EACb,CAAC;UAEK,MAAM,SAAS,YACxB,QAAO,KAAK;EACV,MAAM;EACN,IAAI,MAAM,MAAM;EAChB,MAAM,MAAM;EACZ,OAAO,MAAM;EACd,CAAC;UACO,MAAM,SAAS,mBAAmB;EAC3C,MAAM,QAAQA,cAAAA,WAAW;AACvB,OAAI,OAAO,MAAM,SAAS,SACxB,QAAO,MAAM;AAEf,OAAI;AACF,WAAO,KAAK,MAAM,MAAM,KAAK;WACvB;AACN,WAAO,EAAE;;IAEX;AACF,SAAO,KAAK;GACV,MAAM;GACN,IAAI,MAAM,MAAM;GAChB,MAAM,MAAM,QAAQ;GACpB;GACD,CAAC;YACO,MAAM,SAAS,eAAe,mBACvC,QAAO,KAAK;EACV,MAAM;EACN,UAAU,MAAM;EAChB,WAAW,OAAO,MAAM,UAAU;EACnC,CAAC;UACO,MAAM,SAAS,sBAAsB;MAC1C,MAAM,SAAS,aACjB,QAAO,KAAK;GACV,MAAM;GACN,MAAM,MAAM;GACZ,IAAI,MAAM,MAAM;GAChB,OAAO,MAAM;GACd,CAAC;WACO,MAAM,SAAS,iBACxB,QAAO,KAAK;GACV,MAAM;GACN,MAAM,MAAM;GACZ,IAAI,MAAM,MAAM;GAChB,OAAO,MAAM;GACd,CAAC;YAEK,MAAM,SAAS,6BAA6B;MACjD,MAAM,SAAS,gBAAgB,MAAM,QAAQ,MAAM,OAAO,KAAK,EAAE;GACnE,MAAM,UAAU,MAAM,OAAO,KAAK,KAAK,SAAS;IAC9C,MAAM;IACN,OAAO;IACP,mBAAmB;IACnB;IACD,EAAE;AACH,UAAO,KAAK;IACV,MAAM;IACN,aAAa,MAAM,cAAc;IACjC;IACD,CAAC;aACO,MAAM,SAAS,iBACxB,QAAO,KAAK;GACV,MAAM;GACN,aAAa,MAAM,cAAc;GAEjC,SAAS,MAAM;GAChB,CAAC;WACO,MAAM,SAAS,kBACxB,QAAO,KAAK;GACV,MAAM;GACN,aAAa,MAAM,cAAc;GAEjC,SAAS,MAAM;GAChB,CAAC;YAEK,MAAM,SAAS,QACxB,OAAM,IAAI,MAAM,mDAAmD;UAC1D,MAAM,SAAS,QAAQ;EAChC,MAAM,WAAW,MAAM;AACvB,MAAI,MAAM,QAAQ;AAChB,UAAO,KACL,uBACE;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,SAAS,MAAM;KAChB;IACF,EACD,SACD,CACF;AACD;;AAEF,MAAI,MAAM,KAAK;GACb,MAAM,WAAW,mBAAmB,MAAM,SAAS;AACnD,OAAI,aAAa,qBAAqB,aAAa,IAAI;AACrD,WAAO,KACL,uBACE;KACE,MAAM;KACN,QAAQ;MACN,MAAM;MACN,KAAK,MAAM;MACZ;KACF,EACD,SACD,CACF;AACD;;;AAGJ,MAAI,MAAM,MAAM;GACd,MAAM,WAAW,mBAAmB,MAAM,SAAS;AACnD,OAAI,aAAa,MAAM,aAAa,kBAClC,QAAO,KACL,uBACE;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,MAAM,kBAAkB,MAAM,KAAK;KACnC,YAAY;KACb;IACF,EACD,SACD,CACF;YACQ,aAAa,aACtB,QAAO,KACL,uBACE;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,MAAM,kBAAkB,MAAM,KAAK;KACnC,YAAY;KACb;IACF,EACD,SACD,CACF;YAEG,yBAAyB,SAAS,CACpC,QAAO,KACL,uBACE;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,SAAS,CACP;MACE,MAAM;MACN,QAAQ;OACN,MAAM;OACN,MAAM,kBAAkB,MAAM,KAAK;OACnC,YAAY;OACb;MACF,CACF;KACF;IACF,EACD,SACD,CACF;OAED,OAAM,IAAI,MACR,2DAA2D,WAC5D;AAGL;;AAEF,QAAM,IAAI,MACR,mEACD;YACQ,MAAM,SAAS,SAAS;EACjC,MAAM,WAAW,MAAM;AACvB,MAAI,MAAM,QAAQ;AAChB,UAAO,KACL,oBACE;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,SAAS,MAAM;KAChB;IACF,EACD,SACD,CACF;AACD;;AAEF,MAAI,MAAM,KAAK;AACb,UAAO,KACL,oBACE;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,KAAK,MAAM;KACZ;IACF,EACD,SACD,CACF;AACD;;AAEF,MAAI,MAAM,MAAM;GACd,MAAM,WAAW,mBAAmB,MAAM,SAAS,IAAI;AACvD,OAAI,yBAAyB,SAAS,CACpC,QAAO,KACL,oBACE;IACE,MAAM;IACN,QAAQ;KACN,MAAM;KACN,MAAM,kBAAkB,MAAM,KAAK;KACnC,YAAY;KACb;IACF,EACD,SACD,CACF;AAEH;;AAEF,QAAM,IAAI,MACR,oEACD;YACQ,MAAM,SAAS,SAAS,YAExB,MAAM,SAAS;MACpB,MAAM,KACR,QAAO,KACL,uBACE;GACE,MAAM;GACN,QAAQ;IACN,MAAM;IACN,MAAM,kBAAkB,MAAM,KAAK;IACnC,YAAY;IACb;GACF,EACD,MAAM,SACP,CACF;YAEM,MAAM,SAAS,kBAAkB,mBAC1C,QAAO,KAAK,MAAM,MAA8C;AAGpE,QAAO"}
1
+ {"version":3,"file":"standard.cjs","names":["iife"],"sources":["../../src/utils/standard.ts"],"sourcesContent":["import type Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n BaseMessage,\n ContentBlock,\n ResponseMetadata,\n} from \"@langchain/core/messages\";\nimport { iife } from \"./index.js\";\n\nfunction _isStandardAnnotation(\n annotation: unknown\n): annotation is ContentBlock.Citation {\n return (\n typeof annotation === \"object\" &&\n annotation !== null &&\n \"type\" in annotation &&\n annotation.type === \"citation\"\n );\n}\n\nfunction _formatStandardCitations(\n annotations: ContentBlock.Citation[]\n): Anthropic.Beta.BetaTextCitation[] {\n function* iterateAnnotations() {\n for (const annotation of annotations) {\n if (_isStandardAnnotation(annotation)) {\n if (annotation.source === \"char\") {\n yield {\n type: \"char_location\" as const,\n file_id: annotation.url ?? \"\",\n start_char_index: annotation.startIndex ?? 0,\n end_char_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"page\") {\n yield {\n type: \"page_location\" as const,\n file_id: annotation.url ?? \"\",\n start_page_number: annotation.startIndex ?? 0,\n end_page_number: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"block\") {\n yield {\n type: \"content_block_location\" as const,\n file_id: annotation.url ?? \"\",\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n document_title: annotation.title ?? null,\n document_index: 0,\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"url\") {\n yield {\n type: \"web_search_result_location\" as const,\n url: annotation.url ?? \"\",\n title: annotation.title ?? null,\n encrypted_index: String(annotation.startIndex ?? 0),\n cited_text: annotation.citedText ?? \"\",\n };\n } else if (annotation.source === \"search\") {\n yield {\n type: \"search_result_location\" as const,\n title: annotation.title ?? null,\n start_block_index: annotation.startIndex ?? 0,\n end_block_index: annotation.endIndex ?? 0,\n search_result_index: 0,\n source: annotation.source ?? \"\",\n cited_text: annotation.citedText ?? \"\",\n };\n }\n }\n }\n }\n return Array.from(iterateAnnotations());\n}\n\nfunction _formatBase64Data(data: string | Uint8Array): string {\n if (typeof data === \"string\") return data;\n else return _encodeUint8Array(data);\n}\n\nfunction _encodeUint8Array(data: Uint8Array): string {\n const output = [];\n for (let i = 0, { length } = data; i < length; i++) {\n output.push(String.fromCharCode(data[i]));\n }\n return btoa(output.join(\"\"));\n}\n\nfunction _normalizeMimeType(mimeType?: string | null): string {\n return (mimeType ?? \"\").split(\";\")[0].toLowerCase();\n}\n\nfunction _extractMetadataValue<T>(\n metadata: unknown,\n key: string\n): T | undefined {\n if (\n metadata !== undefined &&\n metadata !== null &&\n typeof metadata === \"object\" &&\n key in metadata\n ) {\n return (metadata as Record<string, unknown>)[key] as T;\n }\n return undefined;\n}\n\nfunction _applyDocumentMetadata(\n block: Anthropic.Beta.BetaRequestDocumentBlock,\n metadata: unknown\n): Anthropic.Beta.BetaRequestDocumentBlock {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n const citations =\n _extractMetadataValue<Anthropic.Beta.BetaCitationsConfigParam | null>(\n metadata,\n \"citations\"\n );\n if (citations !== undefined) {\n block.citations = citations;\n }\n const context = _extractMetadataValue<string | null>(metadata, \"context\");\n if (context !== undefined) {\n block.context = context;\n }\n const title = _extractMetadataValue<string | null>(metadata, \"title\");\n if (title !== undefined) {\n block.title = title;\n }\n return block;\n}\n\nfunction _applyImageMetadata(\n block: Anthropic.Beta.BetaImageBlockParam,\n metadata: unknown\n): Anthropic.Beta.BetaImageBlockParam {\n const cacheControl =\n _extractMetadataValue<Anthropic.Beta.BetaCacheControlEphemeral | null>(\n metadata,\n \"cache_control\"\n );\n if (cacheControl !== undefined) {\n block.cache_control = cacheControl;\n }\n return block;\n}\n\nfunction _hasAllowedImageMimeType(\n mimeType: string\n): mimeType is \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\" {\n const ALLOWED_IMAGE_MIME_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n ]);\n return ALLOWED_IMAGE_MIME_TYPES.has(mimeType);\n}\n\nexport function _formatStandardContent(\n message: BaseMessage\n): Anthropic.Beta.BetaContentBlockParam[] {\n const result: Anthropic.Beta.BetaContentBlockParam[] = [];\n const responseMetadata = message.response_metadata as ResponseMetadata;\n const isAnthropicMessage =\n \"model_provider\" in responseMetadata &&\n responseMetadata?.model_provider === \"anthropic\";\n for (const block of message.contentBlocks) {\n if (block.type === \"text\") {\n if (block.annotations) {\n result.push({\n type: \"text\",\n text: block.text,\n citations: _formatStandardCitations(\n block.annotations as ContentBlock.Citation[]\n ),\n });\n } else {\n result.push({\n type: \"text\",\n text: block.text,\n });\n }\n } else if (block.type === \"tool_call\") {\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name,\n input: block.args,\n });\n } else if (block.type === \"tool_call_chunk\") {\n const input = iife(() => {\n if (typeof block.args !== \"string\") {\n return block.args;\n }\n try {\n return JSON.parse(block.args);\n } catch {\n return {};\n }\n });\n result.push({\n type: \"tool_use\",\n id: block.id ?? \"\",\n name: block.name ?? \"\",\n input,\n });\n } else if (block.type === \"reasoning\" && isAnthropicMessage) {\n result.push({\n type: \"thinking\",\n thinking: block.reasoning,\n signature: String(block.signature),\n });\n } else if (block.type === \"server_tool_call\" && isAnthropicMessage) {\n if (block.name === \"web_search\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"server_tool_use\",\n name: block.name,\n id: block.id ?? \"\",\n input: block.args,\n });\n }\n } else if (block.type === \"server_tool_call_result\" && isAnthropicMessage) {\n if (block.name === \"web_search\" && Array.isArray(block.output.urls)) {\n const content = block.output.urls.map((url) => ({\n type: \"web_search_result\" as const,\n title: \"\",\n encrypted_content: \"\",\n url,\n }));\n result.push({\n type: \"web_search_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n content,\n });\n } else if (block.name === \"code_execution\") {\n result.push({\n type: \"code_execution_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n } else if (block.name === \"mcp_tool_result\") {\n result.push({\n type: \"mcp_tool_result\",\n tool_use_id: block.toolCallId ?? \"\",\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n content: block.output as any,\n });\n }\n } else if (block.type === \"audio\") {\n throw new Error(\"Anthropic does not support audio content blocks.\");\n } else if (block.type === \"file\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"application/pdf\" || mimeType === \"\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType);\n if (mimeType === \"\" || mimeType === \"application/pdf\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: \"application/pdf\",\n },\n },\n metadata\n )\n );\n } else if (mimeType === \"text/plain\") {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n metadata\n )\n );\n } else {\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"content\",\n content: [\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n ],\n },\n },\n metadata\n )\n );\n } else {\n throw new Error(\n `Unsupported file mime type for Anthropic base64 source: ${mimeType}`\n );\n }\n }\n continue;\n }\n throw new Error(\n \"File content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"image\") {\n const metadata = block.metadata;\n if (block.fileId) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"file\",\n file_id: block.fileId,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.url) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"url\",\n url: block.url,\n },\n },\n metadata\n )\n );\n continue;\n }\n if (block.data) {\n const mimeType = _normalizeMimeType(block.mimeType) || \"image/png\";\n if (_hasAllowedImageMimeType(mimeType)) {\n result.push(\n _applyImageMetadata(\n {\n type: \"image\",\n source: {\n type: \"base64\",\n data: _formatBase64Data(block.data),\n media_type: mimeType,\n },\n },\n metadata\n )\n );\n }\n continue;\n }\n throw new Error(\n \"Image content block must include a fileId, url, or data property.\"\n );\n } else if (block.type === \"video\") {\n // no-op\n } else if (block.type === \"text-plain\") {\n if (block.data) {\n result.push(\n _applyDocumentMetadata(\n {\n type: \"document\",\n source: {\n type: \"text\",\n data: _formatBase64Data(block.data),\n media_type: \"text/plain\",\n },\n },\n block.metadata\n )\n );\n }\n } else if (block.type === \"non_standard\" && isAnthropicMessage) {\n result.push(block.value as Anthropic.Beta.BetaContentBlockParam);\n }\n }\n return result;\n}\n"],"mappings":"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"}