@langchain/anthropic 1.3.26 → 1.4.0-dev-1775763803878

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.
Files changed (41) hide show
  1. package/dist/chat_models.cjs +39 -1
  2. package/dist/chat_models.cjs.map +1 -1
  3. package/dist/chat_models.d.cts +46 -26
  4. package/dist/chat_models.d.cts.map +1 -1
  5. package/dist/chat_models.d.ts +46 -26
  6. package/dist/chat_models.d.ts.map +1 -1
  7. package/dist/chat_models.js +39 -1
  8. package/dist/chat_models.js.map +1 -1
  9. package/dist/output_parsers.cjs.map +1 -1
  10. package/dist/output_parsers.js.map +1 -1
  11. package/dist/tools/bash.d.cts +2 -12
  12. package/dist/tools/bash.d.cts.map +1 -1
  13. package/dist/tools/bash.d.ts +2 -12
  14. package/dist/tools/bash.d.ts.map +1 -1
  15. package/dist/tools/computer.cjs.map +1 -1
  16. package/dist/tools/computer.d.cts +3 -112
  17. package/dist/tools/computer.d.cts.map +1 -1
  18. package/dist/tools/computer.d.ts +3 -112
  19. package/dist/tools/computer.d.ts.map +1 -1
  20. package/dist/tools/computer.js.map +1 -1
  21. package/dist/tools/memory.d.cts +2 -52
  22. package/dist/tools/memory.d.cts.map +1 -1
  23. package/dist/tools/memory.d.ts +2 -52
  24. package/dist/tools/memory.d.ts.map +1 -1
  25. package/dist/tools/textEditor.d.cts +2 -40
  26. package/dist/tools/textEditor.d.cts.map +1 -1
  27. package/dist/tools/textEditor.d.ts +2 -40
  28. package/dist/tools/textEditor.d.ts.map +1 -1
  29. package/dist/utils/errors.cjs.map +1 -1
  30. package/dist/utils/errors.js.map +1 -1
  31. package/dist/utils/message_inputs.cjs.map +1 -1
  32. package/dist/utils/message_inputs.js.map +1 -1
  33. package/dist/utils/message_outputs.cjs.map +1 -1
  34. package/dist/utils/message_outputs.js.map +1 -1
  35. package/dist/utils/standard.cjs.map +1 -1
  36. package/dist/utils/standard.js.map +1 -1
  37. package/dist/utils/stream_events.cjs +316 -0
  38. package/dist/utils/stream_events.cjs.map +1 -0
  39. package/dist/utils/stream_events.js +316 -0
  40. package/dist/utils/stream_events.js.map +1 -0
  41. package/package.json +8 -17
@@ -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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredAdditionalKwargs: Record<string, any> = {};\n for (const [key, value] of Object.entries(additionalKwargs)) {\n if (value !== undefined && value !== null) {\n filteredAdditionalKwargs[key] = value;\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const { input_tokens, output_tokens, ...rest }: Record<string, any> =\n usage ?? {};\n const usageMetadata = 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const contentBlock: Record<string, any> = data.delta;\n if (\"citation\" in contentBlock) {\n contentBlock.citations = [contentBlock.citation];\n delete contentBlock.citation;\n }\n if (\n contentBlock.type === \"thinking_delta\" ||\n contentBlock.type === \"signature_delta\"\n ) {\n return {\n chunk: new AIMessageChunk({\n content: [{ index: data.index, ...contentBlock, type: \"thinking\" }],\n 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n content: messages as any,\n additional_kwargs: additionalKwargs,\n tool_calls: toolCalls,\n usage_metadata: usageMetadata,\n response_metadata,\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 +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 // eslint-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 // eslint-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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"standard.js","names":[],"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 // eslint-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 // eslint-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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"}
1
+ {"version":3,"file":"standard.js","names":[],"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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"}
@@ -0,0 +1,316 @@
1
+ //#region src/utils/stream_events.ts
2
+ /**
3
+ * Convert an async iterable of raw Anthropic stream events into
4
+ * LangChain `ChatModelStreamEvent`s.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * const anthropicStream = await client.messages.create({ ..., stream: true });
9
+ * for await (const event of convertAnthropicStream(anthropicStream)) {
10
+ * // event is a ChatModelStreamEvent
11
+ * }
12
+ * ```
13
+ */
14
+ async function* convertAnthropicStream(source, options = {}) {
15
+ const shouldStreamUsage = options.streamUsage ?? true;
16
+ const blockAccumulators = /* @__PURE__ */ new Map();
17
+ let usageSnapshot;
18
+ let stopReason = null;
19
+ for await (const data of source) switch (data.type) {
20
+ case "message_start": {
21
+ const { usage, id, model } = data.message;
22
+ if (usage && shouldStreamUsage) usageSnapshot = buildUsageSnapshot(usage);
23
+ yield {
24
+ type: "message-start",
25
+ id,
26
+ ...usageSnapshot ? { usage: usageSnapshot } : {}
27
+ };
28
+ yield {
29
+ type: "provider",
30
+ provider: "anthropic",
31
+ name: "message_start",
32
+ payload: {
33
+ model,
34
+ id
35
+ }
36
+ };
37
+ break;
38
+ }
39
+ case "message_delta":
40
+ stopReason = data.delta.stop_reason;
41
+ if (shouldStreamUsage && data.usage) {
42
+ if (!usageSnapshot) usageSnapshot = {
43
+ input_tokens: 0,
44
+ output_tokens: data.usage.output_tokens,
45
+ total_tokens: data.usage.output_tokens
46
+ };
47
+ else usageSnapshot = {
48
+ ...usageSnapshot,
49
+ output_tokens: usageSnapshot.output_tokens + data.usage.output_tokens,
50
+ total_tokens: usageSnapshot.input_tokens + usageSnapshot.output_tokens + data.usage.output_tokens
51
+ };
52
+ yield {
53
+ type: "usage",
54
+ usage: usageSnapshot
55
+ };
56
+ }
57
+ if ("context_management" in data.delta && data.delta.context_management) yield {
58
+ type: "provider",
59
+ provider: "anthropic",
60
+ name: "context_management",
61
+ payload: data.delta.context_management
62
+ };
63
+ break;
64
+ case "message_stop":
65
+ yield {
66
+ type: "message-finish",
67
+ reason: mapStopReason(stopReason),
68
+ ...usageSnapshot ? { usage: usageSnapshot } : {},
69
+ responseMetadata: { model_provider: "anthropic" }
70
+ };
71
+ break;
72
+ case "content_block_start": {
73
+ const { index, content_block } = data;
74
+ const mapped = mapBlockToContentBlock(content_block, index);
75
+ blockAccumulators.set(index, {
76
+ accumulated: { ...mapped },
77
+ type: mapped.type
78
+ });
79
+ yield {
80
+ type: "content-block-start",
81
+ index,
82
+ content: mapped
83
+ };
84
+ break;
85
+ }
86
+ case "content_block_delta": {
87
+ const { index, delta } = data;
88
+ const acc = blockAccumulators.get(index);
89
+ if (!acc) break;
90
+ const { accumulated } = applyDelta(acc.accumulated, delta, index);
91
+ acc.accumulated = accumulated;
92
+ yield {
93
+ type: "content-block-delta",
94
+ index,
95
+ content: accumulated
96
+ };
97
+ break;
98
+ }
99
+ case "content_block_stop": {
100
+ const { index } = data;
101
+ const acc = blockAccumulators.get(index);
102
+ if (!acc) break;
103
+ yield {
104
+ type: "content-block-finish",
105
+ index,
106
+ content: finalizeBlock(acc.accumulated)
107
+ };
108
+ blockAccumulators.delete(index);
109
+ break;
110
+ }
111
+ default:
112
+ yield {
113
+ type: "provider",
114
+ provider: "anthropic",
115
+ name: data.type,
116
+ payload: data
117
+ };
118
+ break;
119
+ }
120
+ }
121
+ /**
122
+ * Map Anthropic's stop_reason to the standard FinishReason.
123
+ */
124
+ function mapStopReason(stopReason) {
125
+ switch (stopReason) {
126
+ case "end_turn":
127
+ case "stop_sequence": return "stop";
128
+ case "tool_use": return "tool_use";
129
+ case "max_tokens": return "length";
130
+ default: return "stop";
131
+ }
132
+ }
133
+ /**
134
+ * Build a usage snapshot from Anthropic's usage object.
135
+ * Handles cache token details.
136
+ */
137
+ function buildUsageSnapshot(usage) {
138
+ const cacheCreation = usage.cache_creation_input_tokens ?? 0;
139
+ const cacheRead = usage.cache_read_input_tokens ?? 0;
140
+ const totalInput = usage.input_tokens + cacheCreation + cacheRead;
141
+ return {
142
+ input_tokens: totalInput,
143
+ output_tokens: usage.output_tokens,
144
+ total_tokens: totalInput + usage.output_tokens,
145
+ input_token_details: {
146
+ cache_creation: cacheCreation,
147
+ cache_read: cacheRead
148
+ }
149
+ };
150
+ }
151
+ /**
152
+ * Map an Anthropic content block (from content_block_start) to a
153
+ * LangChain ContentBlock.
154
+ */
155
+ function mapBlockToContentBlock(block, index) {
156
+ switch (block.type) {
157
+ case "text": return {
158
+ type: "text",
159
+ text: block.text ?? "",
160
+ index
161
+ };
162
+ case "thinking": return {
163
+ type: "reasoning",
164
+ reasoning: block.thinking ?? "",
165
+ index
166
+ };
167
+ case "redacted_thinking": return {
168
+ type: "non_standard",
169
+ value: { ...block },
170
+ index
171
+ };
172
+ case "tool_use": return {
173
+ type: "tool_call_chunk",
174
+ id: block.id,
175
+ name: block.name,
176
+ args: "",
177
+ index
178
+ };
179
+ case "server_tool_use": return {
180
+ type: "server_tool_call_chunk",
181
+ id: block.id,
182
+ name: block.name,
183
+ args: "",
184
+ index
185
+ };
186
+ default: return {
187
+ type: "non_standard",
188
+ value: { ...block },
189
+ index
190
+ };
191
+ }
192
+ }
193
+ /**
194
+ * Apply an Anthropic content_block_delta to the accumulated content block.
195
+ * Returns both the incremental delta (as a ContentBlock) and the new
196
+ * accumulated state.
197
+ */
198
+ function applyDelta(accumulated, delta, index) {
199
+ switch (delta.type) {
200
+ case "text_delta": return {
201
+ deltaBlock: {
202
+ type: "text",
203
+ text: delta.text,
204
+ index
205
+ },
206
+ accumulated: {
207
+ ...accumulated,
208
+ text: (accumulated.text ?? "") + delta.text
209
+ }
210
+ };
211
+ case "thinking_delta": return {
212
+ deltaBlock: {
213
+ type: "reasoning",
214
+ reasoning: delta.thinking,
215
+ index
216
+ },
217
+ accumulated: {
218
+ ...accumulated,
219
+ reasoning: (accumulated.reasoning ?? "") + delta.thinking
220
+ }
221
+ };
222
+ case "input_json_delta": return {
223
+ deltaBlock: {
224
+ type: accumulated.type,
225
+ args: delta.partial_json,
226
+ index
227
+ },
228
+ accumulated: {
229
+ ...accumulated,
230
+ args: (accumulated.args ?? "") + delta.partial_json
231
+ }
232
+ };
233
+ case "citations_delta": {
234
+ const newCitation = delta.citation;
235
+ const existingAnnotations = accumulated.annotations ?? [];
236
+ return {
237
+ deltaBlock: {
238
+ type: "text",
239
+ text: "",
240
+ annotations: [newCitation],
241
+ index
242
+ },
243
+ accumulated: {
244
+ ...accumulated,
245
+ annotations: [...existingAnnotations, newCitation]
246
+ }
247
+ };
248
+ }
249
+ case "signature_delta": return {
250
+ deltaBlock: {
251
+ type: "non_standard",
252
+ value: { signature: delta.signature },
253
+ index
254
+ },
255
+ accumulated: {
256
+ ...accumulated,
257
+ signature: delta.signature
258
+ }
259
+ };
260
+ case "compaction_delta": return {
261
+ deltaBlock: {
262
+ type: "non_standard",
263
+ value: { compaction: delta },
264
+ index
265
+ },
266
+ accumulated: {
267
+ ...accumulated,
268
+ value: {
269
+ ...accumulated.value ?? {},
270
+ compaction: delta
271
+ }
272
+ }
273
+ };
274
+ default: return {
275
+ deltaBlock: {
276
+ type: "non_standard",
277
+ value: delta,
278
+ index
279
+ },
280
+ accumulated
281
+ };
282
+ }
283
+ }
284
+ /**
285
+ * Finalize an accumulated content block for the content-block-finish event.
286
+ * For tool calls, parse the accumulated JSON args string.
287
+ */
288
+ function finalizeBlock(accumulated) {
289
+ if (accumulated.type === "tool_call_chunk" || accumulated.type === "server_tool_call_chunk") {
290
+ const finalType = accumulated.type === "tool_call_chunk" ? "tool_call" : "server_tool_call";
291
+ let parsedArgs;
292
+ try {
293
+ parsedArgs = JSON.parse(accumulated.args || "{}");
294
+ } catch {
295
+ return {
296
+ type: "invalid_tool_call",
297
+ id: accumulated.id,
298
+ name: accumulated.name,
299
+ args: accumulated.args,
300
+ error: "Failed to parse tool call arguments as JSON"
301
+ };
302
+ }
303
+ return {
304
+ type: finalType,
305
+ id: accumulated.id,
306
+ name: accumulated.name,
307
+ args: parsedArgs
308
+ };
309
+ }
310
+ const { index: _index, ...rest } = accumulated;
311
+ return rest;
312
+ }
313
+ //#endregion
314
+ exports.convertAnthropicStream = convertAnthropicStream;
315
+
316
+ //# sourceMappingURL=stream_events.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream_events.cjs","names":[],"sources":["../../src/utils/stream_events.ts"],"sourcesContent":["/**\n * Converts a raw Anthropic SSE event stream into LangChain ChatModelStreamEvents.\n *\n * This is a pure converter: it takes an async iterable of native Anthropic\n * `RawMessageStreamEvent`s and yields `ChatModelStreamEvent`s. It handles:\n *\n * - Message lifecycle (`message_start` → `message-start`, `message_stop` → `message-finish`)\n * - Content block lifecycle with fully-qualified accumulated snapshots\n * - Tool call arg accumulation and JSON parsing on finalization\n * - Usage snapshots (input tokens on start, output tokens on delta)\n * - Provider passthrough for unrecognized events\n *\n * @module\n */\n\nimport type Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock } from \"@langchain/core/messages/content\";\nimport type { UsageMetadata } from \"@langchain/core/messages/metadata\";\nimport type { AnthropicMessageStreamEvent } from \"../types.js\";\n\nexport interface ConvertAnthropicStreamOptions {\n /**\n * Whether to emit usage events.\n * @default true\n */\n streamUsage?: boolean;\n}\n\n/**\n * Convert an async iterable of raw Anthropic stream events into\n * LangChain `ChatModelStreamEvent`s.\n *\n * @example\n * ```ts\n * const anthropicStream = await client.messages.create({ ..., stream: true });\n * for await (const event of convertAnthropicStream(anthropicStream)) {\n * // event is a ChatModelStreamEvent\n * }\n * ```\n */\nexport async function* convertAnthropicStream(\n source: AsyncIterable<AnthropicMessageStreamEvent>,\n options: ConvertAnthropicStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n\n // Track accumulated state per content block\n const blockAccumulators = new Map<\n number,\n {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>;\n type: string;\n }\n >();\n let usageSnapshot: UsageMetadata | undefined;\n let stopReason: string | null = null;\n\n for await (const data of source) {\n switch (data.type) {\n case \"message_start\": {\n const { usage, id, model } = data.message;\n if (usage && shouldStreamUsage) {\n usageSnapshot = buildUsageSnapshot(usage);\n }\n yield {\n type: \"message-start\" as const,\n id,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n };\n // Emit response metadata as provider event\n yield {\n type: \"provider\" as const,\n provider: \"anthropic\",\n name: \"message_start\",\n payload: { model, id },\n };\n break;\n }\n\n case \"message_delta\": {\n stopReason = data.delta.stop_reason;\n if (shouldStreamUsage && data.usage) {\n if (!usageSnapshot) {\n usageSnapshot = {\n input_tokens: 0,\n output_tokens: data.usage.output_tokens,\n total_tokens: data.usage.output_tokens,\n };\n } else {\n usageSnapshot = {\n ...usageSnapshot,\n output_tokens:\n usageSnapshot.output_tokens + data.usage.output_tokens,\n total_tokens:\n usageSnapshot.input_tokens +\n usageSnapshot.output_tokens +\n data.usage.output_tokens,\n };\n }\n yield { type: \"usage\" as const, usage: usageSnapshot };\n }\n // Forward context_management as provider event\n if (\n \"context_management\" in data.delta &&\n data.delta.context_management\n ) {\n yield {\n type: \"provider\" as const,\n provider: \"anthropic\",\n name: \"context_management\",\n payload: data.delta.context_management,\n };\n }\n break;\n }\n\n case \"message_stop\": {\n yield {\n type: \"message-finish\" as const,\n reason: mapStopReason(stopReason),\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n responseMetadata: { model_provider: \"anthropic\" },\n };\n break;\n }\n\n // ── Content block lifecycle ───────────────────────────\n case \"content_block_start\": {\n const { index, content_block } = data;\n const mapped = mapBlockToContentBlock(content_block, index);\n blockAccumulators.set(index, {\n accumulated: { ...mapped },\n type: mapped.type,\n });\n yield {\n type: \"content-block-start\" as const,\n index,\n content: mapped,\n };\n break;\n }\n\n case \"content_block_delta\": {\n const { index, delta } = data;\n const acc = blockAccumulators.get(index);\n if (!acc) break;\n\n const { accumulated } = applyDelta(acc.accumulated, delta, index);\n acc.accumulated = accumulated;\n\n yield {\n type: \"content-block-delta\" as const,\n index,\n content: accumulated,\n };\n break;\n }\n\n case \"content_block_stop\": {\n const { index } = data;\n const acc = blockAccumulators.get(index);\n if (!acc) break;\n\n const finalized = finalizeBlock(acc.accumulated);\n yield {\n type: \"content-block-finish\" as const,\n index,\n content: finalized,\n };\n blockAccumulators.delete(index);\n break;\n }\n\n // ── Unhandled events → provider passthrough ───────────\n default: {\n yield {\n type: \"provider\" as const,\n provider: \"anthropic\",\n name: data.type,\n payload: data,\n };\n break;\n }\n }\n }\n}\n\n// ─── Internal helpers ───────────────────────────────────────────\n\n/**\n * Map Anthropic's stop_reason to the standard FinishReason.\n */\nfunction mapStopReason(stopReason: string | null | undefined): FinishReason {\n switch (stopReason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"length\";\n default:\n return \"stop\";\n }\n}\n\n/**\n * Build a usage snapshot from Anthropic's usage object.\n * Handles cache token details.\n */\nfunction buildUsageSnapshot(\n usage: Anthropic.Messages.Usage | Record<string, number>\n): UsageMetadata {\n const cacheCreation =\n (usage as Record<string, number>).cache_creation_input_tokens ?? 0;\n const cacheRead =\n (usage as Record<string, number>).cache_read_input_tokens ?? 0;\n const totalInput = usage.input_tokens + cacheCreation + cacheRead;\n return {\n input_tokens: totalInput,\n output_tokens: usage.output_tokens,\n total_tokens: totalInput + usage.output_tokens,\n input_token_details: {\n cache_creation: cacheCreation,\n cache_read: cacheRead,\n },\n };\n}\n\n/**\n * Map an Anthropic content block (from content_block_start) to a\n * LangChain ContentBlock.\n */\nfunction mapBlockToContentBlock(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n block: any,\n index: number\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): Record<string, any> {\n switch (block.type) {\n case \"text\":\n return {\n type: \"text\" as const,\n text: block.text ?? \"\",\n index,\n };\n case \"thinking\":\n return {\n type: \"reasoning\" as const,\n reasoning: block.thinking ?? \"\",\n index,\n };\n case \"redacted_thinking\":\n return {\n type: \"non_standard\" as const,\n value: { ...block },\n index,\n };\n case \"tool_use\":\n return {\n type: \"tool_call_chunk\" as const,\n id: block.id,\n name: block.name,\n args: \"\",\n index,\n };\n case \"server_tool_use\":\n return {\n type: \"server_tool_call_chunk\" as const,\n id: block.id,\n name: block.name,\n args: \"\",\n index,\n };\n default:\n // document, web_search_tool_result, compaction, etc.\n return {\n type: \"non_standard\" as const,\n value: { ...block },\n index,\n };\n }\n}\n\n/**\n * Apply an Anthropic content_block_delta to the accumulated content block.\n * Returns both the incremental delta (as a ContentBlock) and the new\n * accumulated state.\n */\nfunction applyDelta(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n delta: any,\n index: number\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n): { deltaBlock: Record<string, any>; accumulated: Record<string, any> } {\n switch (delta.type) {\n case \"text_delta\":\n return {\n deltaBlock: { type: \"text\" as const, text: delta.text, index },\n accumulated: {\n ...accumulated,\n text: (accumulated.text ?? \"\") + delta.text,\n },\n };\n\n case \"thinking_delta\":\n return {\n deltaBlock: {\n type: \"reasoning\" as const,\n reasoning: delta.thinking,\n index,\n },\n accumulated: {\n ...accumulated,\n reasoning: (accumulated.reasoning ?? \"\") + delta.thinking,\n },\n };\n\n case \"input_json_delta\":\n return {\n deltaBlock: {\n type: accumulated.type,\n args: delta.partial_json,\n index,\n },\n accumulated: {\n ...accumulated,\n args: (accumulated.args ?? \"\") + delta.partial_json,\n },\n };\n\n case \"citations_delta\": {\n const newCitation = delta.citation;\n const existingAnnotations = accumulated.annotations ?? [];\n return {\n deltaBlock: {\n type: \"text\" as const,\n text: \"\",\n annotations: [newCitation],\n index,\n },\n accumulated: {\n ...accumulated,\n annotations: [...existingAnnotations, newCitation],\n },\n };\n }\n\n case \"signature_delta\":\n return {\n deltaBlock: {\n type: \"non_standard\" as const,\n value: { signature: delta.signature },\n index,\n },\n accumulated: {\n ...accumulated,\n signature: delta.signature,\n },\n };\n\n case \"compaction_delta\":\n return {\n deltaBlock: {\n type: \"non_standard\" as const,\n value: { compaction: delta },\n index,\n },\n accumulated: {\n ...accumulated,\n value: {\n ...(accumulated.value ?? {}),\n compaction: delta,\n },\n },\n };\n\n default:\n return {\n deltaBlock: {\n type: \"non_standard\" as const,\n value: delta,\n index,\n },\n accumulated,\n };\n }\n}\n\n/**\n * Finalize an accumulated content block for the content-block-finish event.\n * For tool calls, parse the accumulated JSON args string.\n */\nfunction finalizeBlock(\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n accumulated: Record<string, any>\n): ContentBlock.Standard {\n if (\n accumulated.type === \"tool_call_chunk\" ||\n accumulated.type === \"server_tool_call_chunk\"\n ) {\n const finalType =\n accumulated.type === \"tool_call_chunk\"\n ? (\"tool_call\" as const)\n : (\"server_tool_call\" as const);\n let parsedArgs: unknown;\n try {\n parsedArgs = JSON.parse(accumulated.args || \"{}\");\n } catch {\n return {\n type: \"invalid_tool_call\" as const,\n id: accumulated.id,\n name: accumulated.name,\n args: accumulated.args,\n error: \"Failed to parse tool call arguments as JSON\",\n } as ContentBlock.Tools.InvalidToolCall;\n }\n return {\n type: finalType,\n id: accumulated.id,\n name: accumulated.name,\n args: parsedArgs,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n }\n\n // Text and reasoning blocks: strip the index for the finalized form\n const { index: _index, ...rest } = accumulated;\n return rest as ContentBlock.Standard;\n}\n"],"mappings":"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"}