@catalystlabs/tryai
Version:
Dead simple AI library. One line setup. Zero config. Just works.
1 lines • 31.7 kB
Source Map (JSON)
{"version":3,"sources":["../providers/anthropic.ts"],"sourcesContent":["/**\n * Anthropic Provider - Complete Feature Implementation\n *\n * Supports all Anthropic API features: Messages, Models, Files, Extended Thinking,\n * Streaming, Images, PDFs, Search Results, MCP Tools, and more\n */\n\nimport type { AIProvider, AIResponse, ForgeConfig } from \"../types\";\nimport type {\n\tAnthropicMessage,\n\tAnthropicContentBlock,\n\tAnthropicRequestBody,\n\tAnthropicResponse,\n\tAnthropicStreamChunk,\n\tProviderOptions,\n} from \"../types/provider-types\";\nimport { parseSSEStream } from \"../utils/sse-parser\";\n\nexport class AnthropicProvider implements AIProvider {\n\tprivate config: ForgeConfig;\n\tprivate baseURL: string;\n\tprivate headers: Record<string, string>;\n\n\tconstructor(config: ForgeConfig) {\n\t\tthis.config = config;\n\t\tthis.baseURL = config.baseURL || \"https://api.anthropic.com\";\n\n\t\tif (!config.apiKey) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Anthropic API key is required. Set ANTHROPIC_API_KEY environment variable or pass apiKey in config.\"\n\t\t\t);\n\t\t}\n\n\t\t// Validate API key format\n\t\tthis.validateApiKey();\n\n\t\t// Set up headers with comprehensive beta support\n\t\tthis.headers = {\n\t\t\t\"x-api-key\": this.config.apiKey!,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\"anthropic-version\": \"2023-06-01\",\n\t\t\t\"anthropic-beta\": [\n\t\t\t\t\"files-api-2025-04-14\",\n\t\t\t\t\"search-results-2025-06-09\",\n\t\t\t\t\"mcp-client-2025-04-04\",\n\t\t\t\t\"interleaved-thinking-2025-05-14\",\n\t\t\t].join(\",\"),\n\t\t};\n\t}\n\n\tasync complete(\n\t\tmessage: string | AnthropicMessage[],\n\t\toptions?: ProviderOptions\n\t): Promise<AIResponse> {\n\t\tconst { requestBody } = this.prepareRequest(message, options, false);\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.baseURL}/v1/messages`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: this.headers,\n\t\t\t\tbody: JSON.stringify(requestBody),\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow this.handleErrorResponse(\n\t\t\t\t\tresponse,\n\t\t\t\t\tawait this.safeJsonParse(response)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as AnthropicResponse;\n\n\t\t\t// Extract text content from response\n\t\t\tconst textContent = this.extractTextContent(data.content);\n\n\t\t\tif (!textContent) {\n\t\t\t\tthrow new Error(\"No text content in Anthropic response\");\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcontent: textContent,\n\t\t\t\tmodel: data.model,\n\t\t\t\tusage: data.usage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tpromptTokens: data.usage.input_tokens,\n\t\t\t\t\t\t\tcompletionTokens: data.usage.output_tokens,\n\t\t\t\t\t\t\ttotalTokens: data.usage.input_tokens + data.usage.output_tokens,\n\t\t\t\t\t }\n\t\t\t\t\t: undefined,\n\t\t\t};\n\t\t} catch (error: any) {\n\t\t\tif (error.message.includes(\"Anthropic\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new Error(`Anthropic request failed: ${error.message}`);\n\t\t}\n\t}\n\n\tasync *stream(\n\t\tmessage: string | AnthropicMessage[],\n\t\toptions?: ProviderOptions\n\t): AsyncGenerator<AIResponse, void, unknown> {\n\t\tconst { requestBody } = this.prepareRequest(message, options, true);\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.baseURL}/v1/messages`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: this.headers,\n\t\t\t\tbody: JSON.stringify(requestBody),\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow this.handleErrorResponse(\n\t\t\t\t\tresponse,\n\t\t\t\t\tawait this.safeJsonParse(response)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Parse SSE stream with comprehensive event handling\n\t\t\tfor await (const event of parseSSEStream(response)) {\n\t\t\t\tif (!event.data || event.data === \"[DONE]\") continue;\n\t\t\t\tif (event.event === \"ping\") continue;\n\n\t\t\t\tlet chunk: AnthropicStreamChunk;\n\t\t\t\ttry {\n\t\t\t\t\tchunk = JSON.parse(event.data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.warn(\"Failed to parse Anthropic stream chunk:\", event.data);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Handle all Anthropic stream event types\n\t\t\t\tswitch (chunk.type) {\n\t\t\t\t\tcase \"content_block_delta\":\n\t\t\t\t\t\tif (chunk.delta?.type === \"text_delta\" && chunk.delta.text) {\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\tcontent: chunk.delta.text,\n\t\t\t\t\t\t\t\tmodel: requestBody.model,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tchunk.delta?.type === \"thinking_delta\" &&\n\t\t\t\t\t\t\tchunk.delta.thinking\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Extended thinking content\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\tcontent: chunk.delta.thinking,\n\t\t\t\t\t\t\t\tmodel: requestBody.model,\n\t\t\t\t\t\t\t\tmetadata: { type: \"thinking\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\tchunk.delta?.type === \"input_json_delta\" &&\n\t\t\t\t\t\t\tchunk.delta.partial_json\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Tool parameter streaming\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\tcontent: chunk.delta.partial_json,\n\t\t\t\t\t\t\t\tmodel: requestBody.model,\n\t\t\t\t\t\t\t\tmetadata: { type: \"tool_input\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"content_block_start\":\n\t\t\t\t\t\t// Handle different content block types\n\t\t\t\t\t\tif (chunk.content_block?.type === \"thinking\") {\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tmodel: requestBody.model,\n\t\t\t\t\t\t\t\tmetadata: { type: \"thinking_start\" },\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else if (chunk.content_block?.type === \"tool_use\") {\n\t\t\t\t\t\t\tyield {\n\t\t\t\t\t\t\t\tcontent: \"\",\n\t\t\t\t\t\t\t\tmodel: requestBody.model,\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\ttype: \"tool_use_start\",\n\t\t\t\t\t\t\t\t\ttool_name: chunk.content_block.name,\n\t\t\t\t\t\t\t\t\ttool_id: chunk.content_block.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"message_start\":\n\t\t\t\t\t\t// Stream started\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"message_delta\":\n\t\t\t\t\t\t// Usage updates and stop reasons\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"message_stop\":\n\t\t\t\t\t\t// Stream ended\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\tconst errorMessage =\n\t\t\t\t\t\t\ttypeof chunk.message === \"string\"\n\t\t\t\t\t\t\t\t? chunk.message\n\t\t\t\t\t\t\t\t: chunk.error?.message || \"Unknown streaming error\";\n\t\t\t\t\t\tthrow new Error(`Anthropic streaming error: ${errorMessage}`);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tif (error.message.includes(\"Anthropic\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new Error(`Anthropic streaming failed: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * List available models from Anthropic\n\t */\n\tasync listModels(\n\t\tbeforeId?: string,\n\t\tafterId?: string,\n\t\tlimit: number = 20\n\t): Promise<any[]> {\n\t\ttry {\n\t\t\tconst url = new URL(`${this.baseURL}/v1/models`);\n\t\t\tif (beforeId) url.searchParams.append(\"before_id\", beforeId);\n\t\t\tif (afterId) url.searchParams.append(\"after_id\", afterId);\n\t\t\tif (limit !== 20) url.searchParams.append(\"limit\", limit.toString());\n\n\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: this.headers,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to list models: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as {\n\t\t\t\tdata: any[];\n\t\t\t\thas_more: boolean;\n\t\t\t\tfirst_id?: string;\n\t\t\t\tlast_id?: string;\n\t\t\t};\n\t\t\treturn data.data || [];\n\t\t} catch (error: any) {\n\t\t\tthrow new Error(`Failed to list Anthropic models: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Upload a file to Anthropic Files API\n\t */\n\tasync uploadFile(file: Buffer | Blob, filename?: string): Promise<string> {\n\t\tconst formData = new FormData();\n\n\t\tconst fileBlob = (\n\t\t\tfile instanceof Buffer\n\t\t\t\t? new Blob([\n\t\t\t\t\t\tfile.buffer.slice(\n\t\t\t\t\t\t\tfile.byteOffset,\n\t\t\t\t\t\t\tfile.byteOffset + file.byteLength\n\t\t\t\t\t\t),\n\t\t\t\t ])\n\t\t\t\t: file\n\t\t) as Blob;\n\n\t\tif (filename) {\n\t\t\tformData.append(\"file\", fileBlob, filename);\n\t\t} else {\n\t\t\tformData.append(\"file\", fileBlob);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.baseURL}/v1/files`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-api-key\": this.config.apiKey!,\n\t\t\t\t\t\"anthropic-version\": \"2023-06-01\",\n\t\t\t\t\t\"anthropic-beta\": \"files-api-2025-04-14\",\n\t\t\t\t},\n\t\t\t\tbody: formData,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorData: any;\n\t\t\t\ttry {\n\t\t\t\t\terrorData = await response.json();\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`File upload failed: ${response.status} ${response.statusText}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (errorData.error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`File upload failed: ${errorData.error.message || \"Unknown error\"}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`File upload failed: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as { id: string };\n\t\t\treturn data.id;\n\t\t} catch (error: any) {\n\t\t\tif (error.message.includes(\"File upload failed\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new Error(`Failed to upload file: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Delete a file from Anthropic\n\t */\n\tasync deleteFile(fileId: string): Promise<boolean> {\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.baseURL}/v1/files/${fileId}`, {\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-api-key\": this.config.apiKey!,\n\t\t\t\t\t\"anthropic-version\": \"2023-06-01\",\n\t\t\t\t\t\"anthropic-beta\": \"files-api-2025-04-14\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorData: any;\n\t\t\t\ttry {\n\t\t\t\t\terrorData = await response.json();\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to delete file: ${response.status} ${response.statusText}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (errorData.error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to delete file: ${\n\t\t\t\t\t\t\terrorData.error.message || \"Unknown error\"\n\t\t\t\t\t\t}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to delete file: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} catch (error: any) {\n\t\t\tif (error.message.includes(\"Failed to delete file\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new Error(`Error deleting file: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Get file metadata from Anthropic\n\t */\n\tasync getFile(fileId: string): Promise<any> {\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.baseURL}/v1/files/${fileId}`, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-api-key\": this.config.apiKey!,\n\t\t\t\t\t\"anthropic-version\": \"2023-06-01\",\n\t\t\t\t\t\"anthropic-beta\": \"files-api-2025-04-14\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorData: any;\n\t\t\t\ttry {\n\t\t\t\t\terrorData = await response.json();\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to retrieve file: ${response.status} ${response.statusText}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (errorData.error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to retrieve file: ${\n\t\t\t\t\t\t\terrorData.error.message || \"Unknown error\"\n\t\t\t\t\t\t}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to retrieve file: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn await response.json();\n\t\t} catch (error: any) {\n\t\t\tif (error.message.includes(\"Failed to retrieve file\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new Error(`Error retrieving file: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * List files from Anthropic\n\t */\n\tasync listFiles(): Promise<any[]> {\n\t\ttry {\n\t\t\tconst response = await fetch(`${this.baseURL}/v1/files`, {\n\t\t\t\tmethod: \"GET\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"x-api-key\": this.config.apiKey!,\n\t\t\t\t\t\"anthropic-version\": \"2023-06-01\",\n\t\t\t\t\t\"anthropic-beta\": \"files-api-2025-04-14\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorData: any;\n\t\t\t\ttry {\n\t\t\t\t\terrorData = await response.json();\n\t\t\t\t} catch {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to list files: ${response.status} ${response.statusText}`\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (errorData.error) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to list files: ${\n\t\t\t\t\t\t\terrorData.error.message || \"Unknown error\"\n\t\t\t\t\t\t}`\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to list files: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst data = (await response.json()) as { data: any[] };\n\t\t\treturn data.data || [];\n\t\t} catch (error: any) {\n\t\t\tif (error.message.includes(\"Failed to list files\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new Error(`Error listing files: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Download file content from Anthropic\n\t */\n\tasync downloadFile(fileId: string): Promise<ArrayBuffer> {\n\t\ttry {\n\t\t\tconst response = await fetch(\n\t\t\t\t`${this.baseURL}/v1/files/${fileId}/content`,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"x-api-key\": this.config.apiKey!,\n\t\t\t\t\t\t\"anthropic-version\": \"2023-06-01\",\n\t\t\t\t\t\t\"anthropic-beta\": \"files-api-2025-04-14\",\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Failed to download file: ${response.status} ${response.statusText}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn await response.arrayBuffer();\n\t\t} catch (error: any) {\n\t\t\tthrow new Error(`Error downloading file: ${error.message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Build message array with enhanced content types\n\t */\n\tbuildMessages(\n\t\tsystemPrompt: string | null,\n\t\tuserMessage: string,\n\t\thistory?: Array<{ role: \"user\" | \"assistant\"; content: string }>\n\t): { system?: string; messages: AnthropicMessage[] } {\n\t\tconst messages: AnthropicMessage[] = [];\n\n\t\t// Add conversation history\n\t\tif (history && history.length > 0) {\n\t\t\tfor (const msg of history) {\n\t\t\t\tmessages.push({\n\t\t\t\t\trole: msg.role,\n\t\t\t\t\tcontent: msg.content,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Add current user message\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tcontent: userMessage,\n\t\t});\n\n\t\treturn {\n\t\t\tsystem: systemPrompt || undefined,\n\t\t\tmessages,\n\t\t};\n\t}\n\n\t/**\n\t * Create a message with image content\n\t */\n\tcreateImageMessage(\n\t\ttext: string,\n\t\timageData: string,\n\t\tmediaType:\n\t\t\t| \"image/jpeg\"\n\t\t\t| \"image/png\"\n\t\t\t| \"image/gif\"\n\t\t\t| \"image/webp\" = \"image/jpeg\"\n\t): AnthropicMessage {\n\t\treturn {\n\t\t\trole: \"user\",\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"image\",\n\t\t\t\t\tsource: {\n\t\t\t\t\t\ttype: \"base64\",\n\t\t\t\t\t\tmedia_type: mediaType,\n\t\t\t\t\t\tdata: imageData,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: text,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\t/**\n\t * Create a message with PDF document\n\t */\n\tcreateDocumentMessage(\n\t\ttext: string,\n\t\tfileId: string,\n\t\ttitle?: string,\n\t\tcitations: boolean = true\n\t): AnthropicMessage {\n\t\treturn {\n\t\t\trole: \"user\",\n\t\t\tcontent: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"document\",\n\t\t\t\t\tsource: {\n\t\t\t\t\t\ttype: \"file\",\n\t\t\t\t\t\tfile_id: fileId,\n\t\t\t\t\t},\n\t\t\t\t\ttitle: title,\n\t\t\t\t\tcitations: citations ? { enabled: true } : undefined,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: text,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\t/**\n\t * Create a message with search results\n\t */\n\tcreateSearchResultsMessage(\n\t\ttext: string,\n\t\tsearchResults: Array<{\n\t\t\tsource: string;\n\t\t\ttitle: string;\n\t\t\tcontent: string;\n\t\t}>\n\t): AnthropicMessage {\n\t\tconst content: AnthropicContentBlock[] = [];\n\n\t\t// Add search results\n\t\tfor (const result of searchResults) {\n\t\t\tcontent.push({\n\t\t\t\ttype: \"search_result\",\n\t\t\t\tsource: result.source,\n\t\t\t\ttitle: result.title,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: result.content,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tcitations: { enabled: true },\n\t\t\t});\n\t\t}\n\n\t\t// Add user text\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: text,\n\t\t});\n\n\t\treturn {\n\t\t\trole: \"user\",\n\t\t\tcontent: content,\n\t\t};\n\t}\n\n\t/**\n\t * Prepare request body with all supported features\n\t */\n\tprivate prepareRequest(\n\t\tmessage: string | AnthropicMessage[],\n\t\toptions?: ProviderOptions,\n\t\tstreaming: boolean = false\n\t): {\n\t\tsystem?: string;\n\t\tmessages: AnthropicMessage[];\n\t\trequestBody: AnthropicRequestBody;\n\t} {\n\t\tlet system: string | undefined = options?.system;\n\t\tlet messages: AnthropicMessage[] = [];\n\n\t\tif (typeof message === \"string\") {\n\t\t\tmessages = [{ role: \"user\", content: message }];\n\t\t} else {\n\t\t\tmessages = Array.isArray(message) ? message : [message];\n\t\t}\n\n\t\t// Extract system message if present in messages\n\t\tconst systemMsg = messages.find((m) => m.role === \"system\");\n\t\tif (systemMsg) {\n\t\t\tsystem =\n\t\t\t\tsystem ||\n\t\t\t\t(typeof systemMsg.content === \"string\"\n\t\t\t\t\t? systemMsg.content\n\t\t\t\t\t: this.extractTextContent(\n\t\t\t\t\t\t\tsystemMsg.content as AnthropicContentBlock[]\n\t\t\t\t\t ));\n\t\t\tmessages = messages.filter((m) => m.role !== \"system\");\n\t\t}\n\n\t\tconst requestBody: AnthropicRequestBody = {\n\t\t\tmodel: options?.model || this.config.model || \"claude-sonnet-4-20250514\",\n\t\t\tmessages: messages,\n\t\t\tmax_tokens: options?.maxTokens || this.config.maxTokens || 4096,\n\t\t\ttemperature: options?.temperature ?? this.config.temperature ?? 0.7,\n\t\t\t...(streaming && { stream: true }),\n\t\t\t...(system && { system }),\n\t\t\t...(options?.topP !== undefined && { top_p: options.topP }),\n\t\t\t...(options?.topK !== undefined && { top_k: options.topK }),\n\t\t\t...(options?.stopSequences && { stop_sequences: options.stopSequences }),\n\t\t\t...(options?.tools && { tools: this.convertTools(options.tools) }),\n\t\t\t...(options?.toolChoice && {\n\t\t\t\ttool_choice: this.convertToolChoice(options.toolChoice),\n\t\t\t}),\n\t\t\t// Extended thinking support\n\t\t\t...(options?.thinking && {\n\t\t\t\tthinking: {\n\t\t\t\t\ttype: \"enabled\",\n\t\t\t\t\tbudget_tokens: options.thinking.budget_tokens || 10000,\n\t\t\t\t},\n\t\t\t}),\n\t\t\t// MCP servers support\n\t\t\t...(options?.mcpServers && { mcp_servers: options.mcpServers }),\n\t\t\t// Service tier\n\t\t\t...(options?.serviceTier && { service_tier: options.serviceTier }),\n\t\t\t// Container support\n\t\t\t...(options?.container && { container: options.container }),\n\t\t\t// Metadata\n\t\t\t...(options?.metadata && { metadata: options.metadata }),\n\t\t};\n\n\t\treturn { system, messages, requestBody };\n\t}\n\n\t/**\n\t * Extract text content from Anthropic response\n\t */\n\tprivate extractTextContent(content: AnthropicContentBlock[]): string {\n\t\tconst textBlocks = content.filter(\n\t\t\t(block) => block.type === \"text\" && block.text\n\t\t);\n\t\treturn textBlocks.map((block) => block.text).join(\"\");\n\t}\n\n\t/**\n\t * Convert tools to Anthropic format\n\t */\n\tprivate convertTools(tools: any[]): any[] {\n\t\treturn tools\n\t\t\t.map((tool) => {\n\t\t\t\tif (tool.type === \"function\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: tool.function?.name || tool.name,\n\t\t\t\t\t\tdescription: tool.function?.description || tool.description || \"\",\n\t\t\t\t\t\tinput_schema: tool.function?.parameters ||\n\t\t\t\t\t\t\ttool.parameters || {\n\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn tool;\n\t\t\t})\n\t\t\t.filter(Boolean);\n\t}\n\n\t/**\n\t * Convert tool choice to Anthropic format\n\t */\n\tprivate convertToolChoice(toolChoice: any): any {\n\t\tif (typeof toolChoice === \"string\") {\n\t\t\tswitch (toolChoice) {\n\t\t\t\tcase \"none\":\n\t\t\t\t\treturn { type: \"none\" };\n\t\t\t\tcase \"auto\":\n\t\t\t\t\treturn { type: \"auto\" };\n\t\t\t\tcase \"required\":\n\t\t\t\t\treturn { type: \"any\" };\n\t\t\t\tdefault:\n\t\t\t\t\treturn { type: \"auto\" };\n\t\t\t}\n\t\t}\n\n\t\tif (toolChoice?.type === \"function\" && toolChoice?.function?.name) {\n\t\t\treturn {\n\t\t\t\ttype: \"tool\",\n\t\t\t\tname: toolChoice.function.name,\n\t\t\t};\n\t\t}\n\n\t\treturn toolChoice || { type: \"auto\" };\n\t}\n\n\t/**\n\t * Validate API key format\n\t */\n\tprivate validateApiKey(): void {\n\t\tif (!this.config.apiKey) {\n\t\t\tthrow new Error(\"Anthropic API key is required\");\n\t\t}\n\n\t\t// Anthropic keys typically start with \"sk-ant-\"\n\t\tif (!this.config.apiKey.startsWith(\"sk-ant-\")) {\n\t\t\tconsole.warn('Anthropic API key should start with \"sk-ant-\"');\n\t\t}\n\t}\n\n\t/**\n\t * Handle error responses\n\t */\n\tprivate handleErrorResponse(response: Response, errorData: any): Error {\n\t\tif (errorData?.error) {\n\t\t\tconst error = errorData.error;\n\t\t\treturn new Error(\n\t\t\t\t`Anthropic API error: ${error.message || \"Unknown error\"} (type: ${\n\t\t\t\t\terror.type\n\t\t\t\t})`\n\t\t\t);\n\t\t} else if (errorData?.type === \"error\") {\n\t\t\treturn new Error(\n\t\t\t\t`Anthropic API error: ${errorData.message || \"Unknown error\"}`\n\t\t\t);\n\t\t}\n\t\treturn new Error(\n\t\t\t`Anthropic API error: ${response.status} ${response.statusText}`\n\t\t);\n\t}\n\n\t/**\n\t * Safe JSON parsing\n\t */\n\tprivate async safeJsonParse(response: Response): Promise<any> {\n\t\ttry {\n\t\t\treturn await response.json();\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["AnthropicProvider","config","message","options","requestBody","response","data","textContent","error","event","parseSSEStream","chunk","errorMessage","beforeId","afterId","limit","url","file","filename","formData","fileBlob","errorData","fileId","systemPrompt","userMessage","history","messages","msg","text","imageData","mediaType","title","citations","searchResults","content","result","streaming","system","systemMsg","m","block","tools","tool","toolChoice"]}