@langchain/anthropic
Version:
Anthropic integrations for LangChain.js
1 lines • 19.5 kB
Source Map (JSON)
{"version":3,"file":"standard.cjs","names":["annotation: unknown","annotations: ContentBlock.Citation[]","data: string | Uint8Array","data: Uint8Array","mimeType?: string | null","metadata: unknown","key: string","block: Anthropic.Beta.BetaRequestDocumentBlock","block: Anthropic.Beta.BetaImageBlockParam","mimeType: string","message: BaseMessage","result: Anthropic.Beta.BetaContentBlockParam[]","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":"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"}