@langchain/anthropic
Version:
Anthropic integrations for LangChain.js
1 lines • 19.2 kB
Source Map (JSON)
{"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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"}