@yourgpt/llm-sdk 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { k as LanguageModel, Z as AnthropicProviderConfig, A as AIProvider } from '../../types-C_f95PKp.mjs';
1
+ import { k as LanguageModel, Z as AnthropicProviderConfig, A as AIProvider } from '../../types-D20jKwJW.mjs';
2
2
  import 'zod';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { k as LanguageModel, Z as AnthropicProviderConfig, A as AIProvider } from '../../types-C_f95PKp.js';
1
+ import { k as LanguageModel, Z as AnthropicProviderConfig, A as AIProvider } from '../../types-D20jKwJW.js';
2
2
  import 'zod';
3
3
 
4
4
  /**
@@ -542,6 +542,8 @@ var AnthropicAdapter = class {
542
542
  convertToAnthropicMessages(rawMessages) {
543
543
  const messages = [];
544
544
  const pendingToolResults = [];
545
+ let lastToolCallIds = [];
546
+ let toolResultIndex = 0;
545
547
  for (const msg of rawMessages) {
546
548
  if (msg.role === "system") continue;
547
549
  if (msg.role === "assistant") {
@@ -555,6 +557,8 @@ var AnthropicAdapter = class {
555
557
  }))
556
558
  });
557
559
  pendingToolResults.length = 0;
560
+ lastToolCallIds = [];
561
+ toolResultIndex = 0;
558
562
  }
559
563
  const content = [];
560
564
  if (msg.content && typeof msg.content === "string" && msg.content.trim()) {
@@ -562,6 +566,8 @@ var AnthropicAdapter = class {
562
566
  }
563
567
  const toolCalls = msg.tool_calls;
564
568
  if (toolCalls && toolCalls.length > 0) {
569
+ lastToolCallIds = toolCalls.map((tc) => tc.id);
570
+ toolResultIndex = 0;
565
571
  for (const tc of toolCalls) {
566
572
  let input = {};
567
573
  try {
@@ -580,8 +586,35 @@ var AnthropicAdapter = class {
580
586
  messages.push({ role: "assistant", content });
581
587
  }
582
588
  } else if (msg.role === "tool") {
589
+ let toolCallId = msg.tool_call_id;
590
+ if (!toolCallId && lastToolCallIds.length > 0) {
591
+ toolCallId = lastToolCallIds[toolResultIndex];
592
+ toolResultIndex++;
593
+ console.warn(
594
+ `[llm-sdk] Tool message missing tool_call_id, inferred: ${toolCallId}`
595
+ );
596
+ }
597
+ if (!toolCallId) {
598
+ console.warn(
599
+ "[llm-sdk] Skipping tool message with missing tool_call_id (no inference possible):",
600
+ msg
601
+ );
602
+ continue;
603
+ }
604
+ if (lastToolCallIds.length === 0) {
605
+ console.warn(
606
+ `[llm-sdk] Skipping orphaned tool result (no pending tool_use): ${toolCallId}`
607
+ );
608
+ continue;
609
+ }
610
+ if (!lastToolCallIds.includes(toolCallId)) {
611
+ console.warn(
612
+ `[llm-sdk] Skipping tool result with unexpected tool_call_id: ${toolCallId}`
613
+ );
614
+ continue;
615
+ }
583
616
  pendingToolResults.push({
584
- tool_use_id: msg.tool_call_id,
617
+ tool_use_id: toolCallId,
585
618
  content: typeof msg.content === "string" ? msg.content : JSON.stringify(msg.content)
586
619
  });
587
620
  } else if (msg.role === "user") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/anthropic/provider.ts","../../../src/core/utils.ts","../../../src/adapters/base.ts","../../../src/adapters/anthropic.ts","../../../src/providers/types.ts","../../../src/providers/anthropic/index.ts"],"names":["client","formatMessagesForAnthropic","ANTHROPIC_MODELS"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Anthropic Provider - Modern Pattern\n *\n * @example\n * ```ts\n * import { anthropic } from '@yourgpt/llm-sdk/anthropic';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface AnthropicModelConfig {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n pdf: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, AnthropicModelConfig> = {\n // Claude 4 series\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.7 series\n \"claude-3-7-sonnet-20250219\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-7-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface AnthropicProviderOptions {\n /** API key (defaults to ANTHROPIC_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API */\n baseURL?: string;\n /** Enable extended thinking */\n thinking?: {\n enabled: boolean;\n budgetTokens?: number;\n };\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic language model\n */\nexport function anthropic(\n modelId: string,\n options: AnthropicProviderOptions = {},\n): LanguageModel {\n const apiKey = options.apiKey ?? process.env.ANTHROPIC_API_KEY;\n\n // Lazy-load Anthropic client\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n client = new Anthropic({\n apiKey,\n baseURL: options.baseURL,\n });\n }\n return client;\n }\n\n const modelConfig =\n ANTHROPIC_MODELS[modelId] ?? ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n provider: \"anthropic\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: false,\n supportsThinking: modelConfig.thinking,\n supportsPDF: modelConfig.pdf,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n // Add thinking if enabled\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const response = await client.messages.create(requestOptions);\n\n // Parse response\n let text = \"\";\n const toolCalls: ToolCall[] = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n text += block.text;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n text,\n toolCalls,\n finishReason: mapFinishReason(response.stop_reason),\n usage: {\n promptTokens: response.usage?.input_tokens ?? 0,\n completionTokens: response.usage?.output_tokens ?? 0,\n totalTokens:\n (response.usage?.input_tokens ?? 0) +\n (response.usage?.output_tokens ?? 0),\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const stream = await client.messages.stream(requestOptions);\n\n let currentToolUse: { id: string; name: string; input: string } | null =\n null;\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of stream) {\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n switch (event.type) {\n case \"message_start\":\n if (event.message?.usage) {\n inputTokens = event.message.usage.input_tokens ?? 0;\n }\n break;\n\n case \"content_block_start\":\n if (event.content_block?.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta?.type === \"text_delta\") {\n yield { type: \"text-delta\", text: event.delta.text };\n } else if (\n event.delta?.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolUse.id,\n name: currentToolUse.name,\n args: JSON.parse(currentToolUse.input || \"{}\"),\n },\n };\n currentToolUse = null;\n }\n break;\n\n case \"message_delta\":\n if (event.usage) {\n outputTokens = event.usage.output_tokens ?? 0;\n }\n if (event.delta?.stop_reason) {\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(event.delta.stop_reason),\n usage: {\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n };\n }\n break;\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool-calls\";\n default:\n return \"unknown\";\n }\n}\n\nfunction formatMessagesForAnthropic(messages: CoreMessage[]): {\n system: string;\n messages: any[];\n} {\n let system = \"\";\n const formatted: any[] = [];\n const pendingToolResults: any[] = [];\n\n // Helper to flush pending tool results with validation\n const flushToolResults = () => {\n if (pendingToolResults.length === 0) return;\n\n const validResults = pendingToolResults.filter((tr) => {\n if (!tr.toolCallId) {\n console.warn(\"[llm-sdk] Skipping tool result with missing toolCallId\");\n return false;\n }\n return true;\n });\n\n if (validResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: validResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n }\n pendingToolResults.length = 0;\n };\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system += (system ? \"\\n\" : \"\") + msg.content;\n continue;\n }\n\n // Flush pending tool results before adding assistant messages\n if (msg.role === \"assistant\" && pendingToolResults.length > 0) {\n flushToolResults();\n }\n\n if (msg.role === \"user\") {\n // Flush pending tool results first\n flushToolResults();\n\n if (typeof msg.content === \"string\") {\n formatted.push({ role: \"user\", content: msg.content });\n } else {\n // Handle multimodal content\n const content: any[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n\n if (imageData.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: imageData },\n });\n } else {\n const base64 = imageData.startsWith(\"data:\")\n ? imageData.split(\",\")[1]\n : imageData;\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.mimeType ?? \"image/png\",\n data: base64,\n },\n });\n }\n }\n }\n formatted.push({ role: \"user\", content });\n }\n } else if (msg.role === \"assistant\") {\n const content: any[] = [];\n\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.args,\n });\n }\n }\n\n if (content.length > 0) {\n formatted.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n // Handle both camelCase (SDK format) and snake_case (OpenAI format)\n const toolCallId =\n msg.toolCallId ?? (msg as any).tool_call_id ?? (msg as any).toolUseId;\n\n if (!toolCallId) {\n console.warn(\n \"[llm-sdk] Tool message missing toolCallId, skipping:\",\n msg,\n );\n continue;\n }\n\n pendingToolResults.push({\n toolCallId,\n content: msg.content,\n });\n }\n }\n\n // Flush any remaining tool results\n flushToolResults();\n\n return { system, messages: formatted };\n}\n\nexport { anthropic as createAnthropic };\n","/**\n * Utility functions for llm-sdk\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix = \"id\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Generate a message ID\n */\nexport function generateMessageId(): string {\n return generateId(\"msg\");\n}\n\n/**\n * Generate a conversation/thread ID\n */\nexport function generateThreadId(): string {\n return generateId(\"thread\");\n}\n\n/**\n * Generate a tool call ID\n */\nexport function generateToolCallId(): string {\n return generateId(\"call\");\n}\n","import type {\n Message,\n MessageAttachment,\n ActionDefinition,\n StreamEvent,\n LLMConfig,\n WebSearchConfig,\n} from \"../core/stream-events\";\nimport type { TokenUsage } from \"../core/types\";\n\n/**\n * Request-level LLM configuration overrides\n */\nexport interface RequestLLMConfig {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Chat completion request\n */\nexport interface ChatCompletionRequest {\n /** Conversation messages */\n messages: Message[];\n /**\n * Raw provider-formatted messages (for agent loop with tool calls)\n * When provided, these are used instead of converting from Message[]\n * This allows passing messages with tool_calls and tool role\n */\n rawMessages?: Array<Record<string, unknown>>;\n /** Available actions/tools */\n actions?: ActionDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** LLM configuration overrides */\n config?: RequestLLMConfig;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /**\n * Enable native web search for the provider.\n * When true or configured, the provider's native search is enabled.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * Non-streaming completion result\n */\nexport interface CompletionResult {\n /** Text content */\n content: string;\n /** Tool calls */\n toolCalls: Array<{ id: string; name: string; args: Record<string, unknown> }>;\n /** Thinking content (if extended thinking enabled) */\n thinking?: string;\n /** Token usage for billing/tracking */\n usage?: TokenUsage;\n /** Raw provider response for debugging */\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Base LLM adapter interface\n */\nexport interface LLMAdapter {\n /** Provider name */\n readonly provider: string;\n\n /** Model name */\n readonly model: string;\n\n /**\n * Stream a chat completion\n */\n stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent>;\n\n /**\n * Non-streaming chat completion (for debugging/comparison)\n */\n complete?(request: ChatCompletionRequest): Promise<CompletionResult>;\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory = (config: LLMConfig) => LLMAdapter;\n\n/**\n * Convert messages to provider format (simple text only)\n */\nexport function formatMessages(\n messages: Message[],\n systemPrompt?: string,\n): Array<{ role: string; content: string }> {\n const formatted: Array<{ role: string; content: string }> = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n // Add conversation messages\n for (const msg of messages) {\n formatted.push({\n role: msg.role,\n content: msg.content ?? \"\",\n });\n }\n\n return formatted;\n}\n\n/**\n * Convert ActionParameter to JSON Schema format recursively\n */\nfunction parameterToJsonSchema(param: {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n // Handle array items\n if (param.type === \"array\" && param.items) {\n schema.items = parameterToJsonSchema(\n param.items as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n );\n }\n\n // Handle nested object properties\n if (param.type === \"object\" && param.properties) {\n schema.properties = Object.fromEntries(\n Object.entries(param.properties).map(([key, prop]) => [\n key,\n parameterToJsonSchema(\n prop as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n ),\n ]),\n );\n }\n\n return schema;\n}\n\n/**\n * Convert actions to OpenAI tool format\n */\nexport function formatTools(actions: ActionDefinition[]): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return actions.map((action) => ({\n type: \"function\" as const,\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n parameterToJsonSchema(param),\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n },\n }));\n}\n\n// ============================================\n// Vision/Multimodal Support\n// ============================================\n\n/**\n * Content block types for multimodal messages\n */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n }\n | {\n type: \"document\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n };\n\nexport type OpenAIContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n };\n\n/**\n * Check if a message has image attachments\n * Supports both new format (metadata.attachments) and legacy (attachments)\n */\nexport function hasImageAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return attachments?.some((a) => a.type === \"image\") ?? false;\n}\n\n/**\n * Check if a message has media attachments (images or PDFs)\n */\nexport function hasMediaAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return (\n attachments?.some(\n (a) =>\n a.type === \"image\" ||\n (a.type === \"file\" && a.mimeType === \"application/pdf\"),\n ) ?? false\n );\n}\n\n/**\n * Convert MessageAttachment to Anthropic image content block\n *\n * Anthropic format:\n * {\n * type: \"image\",\n * source: {\n * type: \"base64\",\n * media_type: \"image/png\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicImage(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert MessageAttachment to OpenAI image_url content block\n *\n * OpenAI format:\n * {\n * type: \"image_url\",\n * image_url: {\n * url: \"data:image/png;base64,...\"\n * }\n * }\n */\nexport function attachmentToOpenAIImage(\n attachment: MessageAttachment,\n): OpenAIContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n let imageUrl: string;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Build data URI if not already one\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n return null;\n }\n\n return {\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n detail: \"auto\",\n },\n };\n}\n\n/**\n * Convert MessageAttachment (PDF) to Anthropic document content block\n *\n * Anthropic format:\n * {\n * type: \"document\",\n * source: {\n * type: \"base64\",\n * media_type: \"application/pdf\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicDocument(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n // Only handle PDF files\n if (attachment.type !== \"file\" || attachment.mimeType !== \"application/pdf\") {\n return null;\n }\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert a Message to Anthropic multimodal content blocks\n */\nexport function messageToAnthropicContent(\n message: Message,\n): string | AnthropicContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no media attachments (images or PDFs), return simple string\n if (!hasMediaAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: AnthropicContentBlock[] = [];\n\n // Add media attachments first (Claude recommends media before text)\n if (attachments) {\n for (const attachment of attachments) {\n // Try image first\n const imageBlock = attachmentToAnthropicImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n continue;\n }\n // Try document (PDF)\n const docBlock = attachmentToAnthropicDocument(attachment);\n if (docBlock) {\n blocks.push(docBlock);\n }\n }\n }\n\n // Add text content\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n return blocks;\n}\n\n/**\n * Convert a Message to OpenAI multimodal content blocks\n */\nexport function messageToOpenAIContent(\n message: Message,\n): string | OpenAIContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no image attachments, return simple string\n if (!hasImageAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: OpenAIContentBlock[] = [];\n\n // Add text content first\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n // Add image attachments\n if (attachments) {\n for (const attachment of attachments) {\n const imageBlock = attachmentToOpenAIImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n }\n }\n }\n\n return blocks;\n}\n\n/**\n * Anthropic content block types (extended for tools)\n */\nexport type AnthropicToolUseBlock = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type AnthropicToolResultBlock = {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n};\n\nexport type AnthropicMessageContent =\n | string\n | Array<\n AnthropicContentBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n >;\n\n/**\n * Format messages for Anthropic with full tool support\n * Handles: text, images, tool_use, and tool_result\n *\n * Key differences from OpenAI:\n * - tool_calls become tool_use blocks in assistant content\n * - tool results become tool_result blocks in user content\n */\nexport function formatMessagesForAnthropic(\n messages: Message[],\n systemPrompt?: string,\n): {\n system: string;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }>;\n} {\n const formatted: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }> = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") continue; // System handled separately\n\n if (msg.role === \"assistant\") {\n // Build content array for assistant\n const content: Array<AnthropicContentBlock | AnthropicToolUseBlock> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n formatted.push({\n role: \"assistant\",\n content:\n content.length === 1 && content[0].type === \"text\"\n ? (content[0] as { type: \"text\"; text: string }).text\n : content,\n });\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results go in user message as tool_result blocks\n // Group consecutive tool messages together\n const toolResults: AnthropicToolResultBlock[] = [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? \"\",\n },\n ];\n\n // Look ahead for more consecutive tool messages\n while (i + 1 < messages.length && messages[i + 1].role === \"tool\") {\n i++;\n const nextTool = messages[i];\n if (nextTool.tool_call_id) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: nextTool.tool_call_id,\n content: nextTool.content ?? \"\",\n });\n }\n }\n\n formatted.push({\n role: \"user\",\n content: toolResults,\n });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToAnthropicContent(msg),\n });\n }\n }\n\n return {\n system: systemPrompt || \"\",\n messages: formatted,\n };\n}\n\n/**\n * OpenAI message format with tool support\n */\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentBlock[] }\n | {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n }\n | { role: \"tool\"; content: string; tool_call_id: string };\n\n/**\n * Format messages for OpenAI with full tool support\n * Handles: text, images, tool_calls, and tool results\n */\nexport function formatMessagesForOpenAI(\n messages: Message[],\n systemPrompt?: string,\n): OpenAIMessage[] {\n const formatted: OpenAIMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n formatted.push({ role: \"system\", content: msg.content ?? \"\" });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToOpenAIContent(msg),\n });\n } else if (msg.role === \"assistant\") {\n const assistantMsg: OpenAIMessage = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n (assistantMsg as { tool_calls: typeof msg.tool_calls }).tool_calls =\n msg.tool_calls;\n }\n formatted.push(assistantMsg);\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n formatted.push({\n role: \"tool\",\n content: msg.content ?? \"\",\n tool_call_id: msg.tool_call_id,\n });\n }\n }\n\n return formatted;\n}\n","import type {\n LLMConfig,\n StreamEvent,\n WebSearchConfig,\n Citation,\n} from \"../core/stream-events\";\nimport { generateMessageId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport {\n formatMessagesForAnthropic,\n messageToAnthropicContent,\n type AnthropicContentBlock,\n} from \"./base\";\n\n/**\n * Extended thinking configuration\n */\nexport interface ThinkingConfig {\n type: \"enabled\";\n /** Budget for thinking tokens (minimum 1024) */\n budgetTokens?: number;\n}\n\n/**\n * Anthropic adapter configuration\n */\nexport interface AnthropicAdapterConfig {\n apiKey: string;\n model?: string;\n /** Base URL for API endpoint */\n baseUrl?: string;\n /** Enable extended thinking (for Claude 3.7 Sonnet, Claude 4) */\n thinking?: ThinkingConfig;\n temperature?: number;\n maxTokens?: number;\n /**\n * Enable native web search for Claude.\n * When true, Claude can search the web to answer questions.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * Anthropic LLM Adapter\n *\n * Supports: Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku, etc.\n */\nexport class AnthropicAdapter implements LLMAdapter {\n readonly provider = \"anthropic\";\n readonly model: string;\n\n private client: any; // Anthropic client (lazy loaded)\n private config: AnthropicAdapterConfig;\n\n constructor(config: AnthropicAdapterConfig) {\n this.config = config;\n this.model = config.model || \"claude-3-5-sonnet-latest\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @anthropic-ai/sdk optional\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.client = new Anthropic({\n apiKey: this.config.apiKey,\n });\n }\n return this.client;\n }\n\n /**\n * Convert OpenAI-style messages to Anthropic format\n *\n * OpenAI format:\n * - { role: \"assistant\", content: \"...\", tool_calls: [...] }\n * - { role: \"tool\", tool_call_id: \"...\", content: \"...\" }\n *\n * Anthropic format:\n * - { role: \"assistant\", content: [{ type: \"text\", text: \"...\" }, { type: \"tool_use\", id: \"...\", name: \"...\", input: {...} }] }\n * - { role: \"user\", content: [{ type: \"tool_result\", tool_use_id: \"...\", content: \"...\" }] }\n */\n private convertToAnthropicMessages(\n rawMessages: Array<Record<string, unknown>>,\n ): Array<Record<string, unknown>> {\n const messages: Array<Record<string, unknown>> = [];\n const pendingToolResults: Array<{ tool_use_id: string; content: string }> =\n [];\n\n for (const msg of rawMessages) {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"assistant\") {\n // CRITICAL: Insert pending tool results BEFORE adding any assistant message\n // Anthropic requires: assistant(tool_use) → user(tool_result) → assistant(response)\n // Without this, the sequence becomes: assistant(tool_use) → assistant(response) → user(tool_result)\n // which violates Anthropic's API requirements and causes error:\n // \"tool_use ids were found without tool_result blocks immediately after\"\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Convert assistant message with potential tool_calls\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (\n msg.content &&\n typeof msg.content === \"string\" &&\n msg.content.trim()\n ) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n const toolCalls = msg.tool_calls as\n | Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>\n | undefined;\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n let input = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty object if parse fails\n }\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n // Only add if there's content\n if (content.length > 0) {\n messages.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n // Collect tool results to be bundled into a user message\n pendingToolResults.push({\n tool_use_id: msg.tool_call_id as string,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n } else if (msg.role === \"user\") {\n // First, flush any pending tool results as a user message\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Check if message has attachments (images)\n if (\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0\n ) {\n // Convert to Anthropic multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content && typeof msg.content === \"string\") {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add attachments (images, PDFs)\n for (const attachment of msg.attachments as Array<{\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n if (attachment.url) {\n // Use URL directly (cloud storage) - Anthropic supports URL sources\n content.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n // Use base64 data\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n // Extract base64 from data URL\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n });\n }\n } else if (\n attachment.type === \"file\" &&\n attachment.mimeType === \"application/pdf\"\n ) {\n // PDF documents - Anthropic uses \"document\" type\n if (attachment.url) {\n content.push({\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n });\n }\n }\n }\n\n messages.push({ role: \"user\", content });\n } else {\n // Add user message without attachments\n messages.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n }\n }\n }\n\n // Flush any remaining tool results\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n }\n\n return messages;\n }\n\n /**\n * Build common request options for both streaming and non-streaming\n */\n private buildRequestOptions(request: ChatCompletionRequest): {\n options: Record<string, unknown>;\n messages: Array<Record<string, unknown>>;\n } {\n // Extract system message\n const systemMessage = request.systemPrompt || \"\";\n\n // Use raw messages if provided (for agent loop with tool calls)\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Convert OpenAI-style messages to Anthropic format\n messages = this.convertToAnthropicMessages(request.rawMessages);\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n const formatted = formatMessagesForAnthropic(request.messages, undefined);\n messages = formatted.messages as Array<Record<string, unknown>>;\n }\n\n // Convert actions to Anthropic tool format\n const tools: Array<Record<string, unknown>> =\n request.actions?.map((action) => ({\n name: action.name,\n description: action.description,\n input_schema: {\n type: \"object\" as const,\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n enum: param.enum,\n },\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n })) || [];\n\n // Check for web search configuration (from request or adapter config)\n const webSearchConfig = request.webSearch ?? this.config.webSearch;\n let serverToolConfiguration: Record<string, unknown> | undefined;\n\n if (webSearchConfig) {\n // Add web_search tool (using latest API version)\n // allowed_callers: [\"direct\"] is required for Haiku models\n tools.push({\n type: \"web_search_20260209\",\n name: \"web_search\",\n allowed_callers: [\"direct\"],\n });\n\n // Build server tool configuration\n const wsConfig =\n typeof webSearchConfig === \"object\" ? webSearchConfig : {};\n const webSearchToolConfig: Record<string, unknown> = {};\n\n if (wsConfig.maxUses !== undefined) {\n webSearchToolConfig.max_uses = wsConfig.maxUses;\n }\n\n if (wsConfig.allowedDomains && wsConfig.allowedDomains.length > 0) {\n webSearchToolConfig.allowed_domains = wsConfig.allowedDomains;\n }\n\n if (wsConfig.blockedDomains && wsConfig.blockedDomains.length > 0) {\n webSearchToolConfig.blocked_domains = wsConfig.blockedDomains;\n }\n\n if (wsConfig.userLocation) {\n webSearchToolConfig.user_location = wsConfig.userLocation;\n }\n\n // Only add server_tool_configuration if we have any config\n if (Object.keys(webSearchToolConfig).length > 0) {\n serverToolConfiguration = {\n web_search: webSearchToolConfig,\n };\n }\n }\n\n // Build request options\n const options: Record<string, unknown> = {\n model: request.config?.model || this.model,\n max_tokens: request.config?.maxTokens || this.config.maxTokens || 4096,\n system: systemMessage,\n messages,\n tools: tools.length ? tools : undefined,\n };\n\n // Add server tool configuration for web search\n if (serverToolConfiguration) {\n options.server_tool_configuration = serverToolConfiguration;\n }\n\n // Add thinking configuration if enabled\n if (this.config.thinking?.type === \"enabled\") {\n options.thinking = {\n type: \"enabled\",\n budget_tokens: this.config.thinking.budgetTokens || 10000,\n };\n }\n\n return { options, messages };\n }\n\n /**\n * Non-streaming completion (for debugging/comparison with original studio-ai)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n // Ensure non-streaming mode\n const nonStreamingOptions = {\n ...options,\n stream: false as const,\n } as Record<string, unknown> & { stream: false };\n\n try {\n const response = await client.messages.create(nonStreamingOptions);\n\n // Parse response\n let content = \"\";\n let thinking = \"\";\n const toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n content += block.text;\n } else if (block.type === \"thinking\") {\n thinking += (block as { thinking: string }).thinking;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n content,\n toolCalls,\n thinking: thinking || undefined,\n rawResponse: response as Record<string, unknown>,\n };\n } catch (error) {\n throw error;\n }\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const stream = await client.messages.stream(options);\n\n let currentToolUse: {\n id: string;\n name: string;\n input: string;\n } | null = null;\n\n let isInThinkingBlock = false;\n\n // Track citations from web search\n const collectedCitations: Citation[] = [];\n let citationIndex = 0;\n\n // Track usage - Anthropic sends input_tokens in message_start and output_tokens in message_delta\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n for await (const event of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n switch (event.type) {\n case \"message_start\":\n // Capture input tokens from message_start\n if (event.message?.usage) {\n usage = {\n prompt_tokens: event.message.usage.input_tokens,\n completion_tokens: 0,\n total_tokens: event.message.usage.input_tokens,\n };\n }\n break;\n\n case \"message_delta\":\n // Capture output tokens from message_delta\n if (event.usage && usage) {\n usage.completion_tokens = event.usage.output_tokens;\n usage.total_tokens =\n usage.prompt_tokens + event.usage.output_tokens;\n }\n break;\n\n case \"content_block_start\":\n if (event.content_block.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n // Don't emit action events for native web_search - citations handle the UI\n if (currentToolUse.name !== \"web_search\") {\n yield {\n type: \"action:start\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n } else if (event.content_block.type === \"web_search_tool_result\") {\n // Extract citations from web search results\n const webSearchResult = event.content_block as {\n type: \"web_search_tool_result\";\n tool_use_id: string;\n content: Array<{\n type: \"web_search_result\";\n title: string;\n url: string;\n page_age?: string | null;\n }>;\n };\n if (\n webSearchResult.content &&\n Array.isArray(webSearchResult.content)\n ) {\n for (const result of webSearchResult.content) {\n if (result.type === \"web_search_result\" && result.url) {\n citationIndex++;\n const domain = extractDomain(result.url);\n collectedCitations.push({\n index: citationIndex,\n url: result.url,\n title: result.title || domain,\n domain,\n favicon: domain\n ? `https://www.google.com/s2/favicons?domain=${domain}&sz=32`\n : undefined,\n });\n }\n }\n }\n // Don't emit action:end for native web_search - citations handle the UI\n } else if (event.content_block.type === \"thinking\") {\n // Start of thinking block\n isInThinkingBlock = true;\n yield { type: \"thinking:start\" };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta.type === \"text_delta\") {\n yield { type: \"message:delta\", content: event.delta.text };\n } else if (event.delta.type === \"citations_delta\") {\n // Handle citations_delta events from web search\n const citationsDelta = event.delta as {\n type: \"citations_delta\";\n citation: {\n type: string;\n url?: string;\n title?: string;\n cited_text?: string;\n };\n };\n\n if (citationsDelta.citation?.url) {\n citationIndex++;\n const domain = extractDomain(citationsDelta.citation.url);\n collectedCitations.push({\n index: citationIndex,\n url: citationsDelta.citation.url,\n title: citationsDelta.citation.title || domain,\n citedText: citationsDelta.citation.cited_text,\n domain,\n favicon: domain\n ? `https://www.google.com/s2/favicons?domain=${domain}&sz=32`\n : undefined,\n });\n }\n } else if (event.delta.type === \"thinking_delta\") {\n // Thinking content delta\n yield { type: \"thinking:delta\", content: event.delta.thinking };\n } else if (\n event.delta.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n // Don't emit action events for native web_search - citations handle the UI\n if (currentToolUse.name !== \"web_search\") {\n yield {\n type: \"action:args\",\n id: currentToolUse.id,\n args: currentToolUse.input,\n };\n // For server-side tools, emit action:end immediately\n // as Anthropic handles execution and results come inline\n yield {\n type: \"action:end\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n currentToolUse = null;\n }\n if (isInThinkingBlock) {\n yield { type: \"thinking:end\" };\n isInThinkingBlock = false;\n }\n break;\n\n case \"message_stop\":\n break;\n }\n }\n\n // Emit citations if we collected any\n if (collectedCitations.length > 0) {\n // Deduplicate citations by URL\n const uniqueCitations = deduplicateCitations(collectedCitations);\n yield { type: \"citation\", citations: uniqueCitations };\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\", usage };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"ANTHROPIC_ERROR\",\n };\n }\n }\n}\n\n/**\n * Extract domain from URL\n */\nfunction extractDomain(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.hostname;\n } catch {\n return \"\";\n }\n}\n\n/**\n * Deduplicate citations by URL\n */\nfunction deduplicateCitations(citations: Citation[]): Citation[] {\n const seen = new Map<string, Citation>();\n let index = 0;\n for (const citation of citations) {\n if (!seen.has(citation.url)) {\n index++;\n seen.set(citation.url, { ...citation, index });\n }\n }\n return Array.from(seen.values());\n}\n\n/**\n * Create Anthropic adapter\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig,\n): AnthropicAdapter {\n return new AnthropicAdapter(config);\n}\n","/**\n * Provider Types\n *\n * Defines interfaces for:\n * 1. Provider Formatters (for tool transformations in agent loop)\n * 2. Multi-provider architecture (AIProvider, capabilities, configs)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type { LLMAdapter } from \"../adapters/base\";\n\n// ============================================\n// Provider Formatter Types (for agent loop)\n// ============================================\n\n/**\n * Provider formatter interface\n *\n * Each provider implements this interface to handle:\n * - Tool definition transformation\n * - Tool call parsing from responses\n * - Tool result formatting\n * - Stop reason detection\n */\nexport interface ProviderFormatter {\n /**\n * Transform unified tool definitions to provider format\n */\n transformTools(tools: ToolDefinition[]): unknown[];\n\n /**\n * Parse tool calls from provider response\n */\n parseToolCalls(response: unknown): UnifiedToolCall[];\n\n /**\n * Format tool results for provider\n */\n formatToolResults(results: UnifiedToolResult[]): unknown[];\n\n /**\n * Check if response indicates tool use is requested\n */\n isToolUseStop(response: unknown): boolean;\n\n /**\n * Check if response indicates end of turn\n */\n isEndTurnStop(response: unknown): boolean;\n\n /**\n * Get stop reason string from response\n */\n getStopReason(response: unknown): string;\n\n /**\n * Extract text content from response\n */\n extractTextContent(response: unknown): string;\n\n /**\n * Build assistant message with tool calls for conversation history\n */\n buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n ): unknown;\n\n /**\n * Build user message with tool results for conversation history\n */\n buildToolResultMessage(results: UnifiedToolResult[]): unknown;\n}\n\n// ============================================\n// Anthropic Tool Types\n// ============================================\n\n/**\n * Anthropic tool definition format\n */\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Anthropic tool_use block from response\n */\nexport interface AnthropicToolUse {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Anthropic tool_result block\n */\nexport interface AnthropicToolResult {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n}\n\n// ============================================\n// OpenAI Tool Types\n// ============================================\n\n/**\n * OpenAI tool definition format\n */\nexport interface OpenAITool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n };\n}\n\n/**\n * OpenAI tool call from response\n */\nexport interface OpenAIToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n}\n\n/**\n * OpenAI tool result message\n */\nexport interface OpenAIToolResult {\n role: \"tool\";\n tool_call_id: string;\n content: string;\n}\n\n// ============================================\n// Gemini Tool Types\n// ============================================\n\n/**\n * Google Gemini function declaration\n */\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Gemini function call from response\n */\nexport interface GeminiFunctionCall {\n name: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Gemini function response\n */\nexport interface GeminiFunctionResponse {\n name: string;\n response: Record<string, unknown>;\n}\n\n// ============================================\n// Provider Capabilities (for UI feature flags)\n// ============================================\n\n/**\n * Capabilities of a model for UI feature flags\n * UI components can use this to enable/disable features\n */\nexport interface ProviderCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports extended thinking (Claude, DeepSeek) */\n supportsThinking: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Supports audio inputs */\n supportsAudio: boolean;\n /** Supports video inputs */\n supportsVideo: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n /** Supported audio MIME types */\n supportedAudioTypes?: string[];\n /** Supported video MIME types */\n supportedVideoTypes?: string[];\n /** Supports JSON mode / structured output */\n supportsJsonMode?: boolean;\n /** Supports system messages */\n supportsSystemMessages?: boolean;\n}\n\n// ============================================\n// AI Provider Interface\n// ============================================\n\n/**\n * AI Provider interface (object form)\n *\n * Wraps existing LLMAdapter with additional metadata:\n * - Supported models list\n * - Per-model capabilities\n * - Provider name\n */\nexport interface AIProviderObject {\n /** Provider name (e.g., 'openai', 'anthropic') */\n readonly name: string;\n\n /** List of supported model IDs */\n readonly supportedModels: string[];\n\n /**\n * Get a language model adapter for the given model ID\n * Returns the existing LLMAdapter interface - no breaking changes\n */\n languageModel(modelId: string): LLMAdapter;\n\n /**\n * Get capabilities for a specific model\n * UI components use this to enable/disable features\n */\n getCapabilities(modelId: string): ProviderCapabilities;\n\n /**\n * Optional: Get an embedding model (future expansion)\n */\n embeddingModel?(modelId: string): EmbeddingModel;\n}\n\n/**\n * Callable AI Provider (Vercel AI SDK style)\n *\n * A function that returns a LanguageModel when called with a model ID,\n * but also has properties for provider metadata and methods.\n *\n * @example\n * ```typescript\n * const openai = createOpenAI({ apiKey: '...' });\n *\n * // Callable - returns LanguageModel directly (Vercel AI SDK style)\n * const model = openai('gpt-4o');\n *\n * // Also supports method calls (backward compatible)\n * const model2 = openai.languageModel('gpt-4o');\n *\n * // Check capabilities\n * const caps = openai.getCapabilities('gpt-4o');\n * if (caps.supportsVision) {\n * // Show image upload button\n * }\n * ```\n */\nexport interface AIProvider extends AIProviderObject {\n /**\n * Call the provider directly with a model ID to get a LanguageModel\n * This is the Vercel AI SDK style pattern\n */\n (modelId: string): LLMAdapter;\n}\n\n/**\n * Helper to create a callable AIProvider\n * Combines a callable function with AIProvider properties\n */\nexport function createCallableProvider(\n providerFn: (modelId: string) => LLMAdapter,\n properties: Omit<AIProviderObject, \"languageModel\">,\n): AIProvider {\n // Define 'name' property using defineProperty since it's read-only on functions\n Object.defineProperty(providerFn, \"name\", {\n value: properties.name,\n writable: false,\n configurable: true,\n });\n\n // Assign other properties\n Object.assign(providerFn, {\n supportedModels: properties.supportedModels,\n languageModel: providerFn,\n getCapabilities: properties.getCapabilities,\n embeddingModel: properties.embeddingModel,\n });\n\n return providerFn as AIProvider;\n}\n\n/**\n * Embedding model interface (for future expansion)\n */\nexport interface EmbeddingModel {\n readonly provider: string;\n readonly modelId: string;\n embed(texts: string[]): Promise<number[][]>;\n}\n\n// ============================================\n// Provider-Specific Configurations\n// ============================================\n\n/**\n * Base provider configuration\n */\nexport interface BaseProviderConfig {\n /** API key (falls back to environment variable) */\n apiKey?: string;\n /** Custom base URL */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Custom headers to include */\n headers?: Record<string, string>;\n}\n\n/**\n * OpenAI provider configuration\n */\nexport interface OpenAIProviderConfig extends BaseProviderConfig {\n /** OpenAI organization ID */\n organization?: string;\n /** OpenAI project ID */\n project?: string;\n /** Vision detail level for images */\n imageDetail?: \"auto\" | \"low\" | \"high\";\n}\n\n/**\n * Anthropic provider configuration\n */\nexport interface AnthropicProviderConfig extends BaseProviderConfig {\n /** Extended thinking budget in tokens (minimum 1024) */\n thinkingBudget?: number;\n /** Enable prompt caching */\n cacheControl?: boolean;\n}\n\n/**\n * Google provider configuration\n */\nexport interface GoogleProviderConfig extends BaseProviderConfig {\n /** Safety settings */\n safetySettings?: GoogleSafetySetting[];\n /** Grounding configuration (for web search) */\n groundingConfig?: GoogleGroundingConfig;\n}\n\n/**\n * Google safety setting\n */\nexport interface GoogleSafetySetting {\n category:\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\";\n threshold:\n | \"BLOCK_NONE\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_HIGH_AND_ABOVE\";\n}\n\n/**\n * Google grounding configuration\n */\nexport interface GoogleGroundingConfig {\n /** Enable Google Search grounding */\n googleSearchRetrieval?: boolean;\n}\n\n/**\n * xAI provider configuration\n */\nexport interface XAIProviderConfig extends BaseProviderConfig {\n // xAI uses OpenAI-compatible API, no extra config needed\n}\n\n/**\n * Azure OpenAI provider configuration\n */\nexport interface AzureProviderConfig extends BaseProviderConfig {\n /** Azure resource name */\n resourceName: string;\n /** Deployment name */\n deploymentName: string;\n /** API version (default: 2024-02-15-preview) */\n apiVersion?: string;\n}\n\n/**\n * Ollama model-specific options\n * These map to Ollama's native API options\n */\nexport interface OllamaModelOptions {\n /** Context window size (default varies by model) */\n num_ctx?: number;\n /** Max tokens to predict (-1 = infinite, -2 = fill context) */\n num_predict?: number;\n /** Mirostat sampling (0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0) */\n mirostat?: 0 | 1 | 2;\n /** Mirostat learning rate (default: 0.1) */\n mirostat_eta?: number;\n /** Mirostat target entropy (default: 5.0) */\n mirostat_tau?: number;\n /** Repeat penalty (default: 1.1) */\n repeat_penalty?: number;\n /** Random seed for reproducibility (-1 = random) */\n seed?: number;\n /** Top-k sampling (default: 40) */\n top_k?: number;\n /** Top-p (nucleus) sampling (default: 0.9) */\n top_p?: number;\n /** Min-p sampling (default: 0.0) */\n min_p?: number;\n /** Stop sequences */\n stop?: string[];\n /** Temperature override (also available in config) */\n temperature?: number;\n}\n\n/**\n * Ollama provider configuration\n */\nexport interface OllamaProviderConfig extends BaseProviderConfig {\n /** Default Ollama-specific model options */\n options?: OllamaModelOptions;\n}\n\n// ============================================\n// Model Information\n// ============================================\n\n/**\n * Model information for a provider\n */\nexport interface ModelInfo {\n /** Model ID */\n id: string;\n /** Display name */\n name: string;\n /** Description */\n description?: string;\n /** Capabilities */\n capabilities: ProviderCapabilities;\n /** Context window size */\n contextWindow: number;\n /** Pricing info (optional) */\n pricing?: {\n inputPerMillion?: number;\n outputPerMillion?: number;\n };\n}\n\n// ============================================\n// Default Capabilities\n// ============================================\n\n/**\n * Default capabilities for unknown models\n */\nexport const DEFAULT_CAPABILITIES: ProviderCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n};\n","/**\n * Anthropic Provider\n *\n * Modern pattern: anthropic('claude-3-5-sonnet') returns a LanguageModel\n * Legacy pattern: createAnthropic({ apiKey }) returns an AIProvider\n */\n\n// NEW: Modern pattern - anthropic() function\nexport { anthropic, createAnthropic as createAnthropicModel } from \"./provider\";\nexport type { AnthropicProviderOptions } from \"./provider\";\n\nimport { createAnthropicAdapter } from \"../../adapters/anthropic\";\nimport {\n createCallableProvider,\n type AIProvider,\n type ProviderCapabilities,\n type AnthropicProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, ModelCapabilities> = {\n // Claude 4 series (latest)\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 64000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 32000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic provider (callable, Vercel AI SDK style)\n *\n * @example\n * ```typescript\n * const anthropic = createAnthropic({\n * apiKey: '...',\n * thinkingBudget: 10000, // Enable extended thinking\n * });\n *\n * // Callable - Vercel AI SDK style\n * const model = anthropic('claude-sonnet-4-20250514');\n *\n * // Also supports method call (backward compatible)\n * const model2 = anthropic.languageModel('claude-sonnet-4-20250514');\n *\n * // Check capabilities\n * const caps = anthropic.getCapabilities('claude-sonnet-4-20250514');\n * ```\n */\nexport function createAnthropic(\n config: AnthropicProviderConfig = {},\n): AIProvider {\n const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY ?? \"\";\n\n // Create the callable function\n const providerFn = (modelId: string) => {\n return createAnthropicAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n thinking: config.thinkingBudget\n ? { type: \"enabled\", budgetTokens: config.thinkingBudget }\n : undefined,\n });\n };\n\n // Get capabilities helper\n const getCapabilities = (modelId: string): ProviderCapabilities => {\n const model =\n ANTHROPIC_MODELS[modelId] ?? ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: model.thinking,\n supportsStreaming: true,\n supportsPDF: true,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n };\n };\n\n return createCallableProvider(providerFn, {\n name: \"anthropic\",\n supportedModels: Object.keys(ANTHROPIC_MODELS),\n getCapabilities,\n });\n}\n\n// Alias for consistency\nexport const createAnthropicProvider = createAnthropic;\n"]}
1
+ {"version":3,"sources":["../../../src/providers/anthropic/provider.ts","../../../src/core/utils.ts","../../../src/adapters/base.ts","../../../src/adapters/anthropic.ts","../../../src/providers/types.ts","../../../src/providers/anthropic/index.ts"],"names":["client","formatMessagesForAnthropic","ANTHROPIC_MODELS"],"mappings":";;;AAqCA,IAAM,gBAAA,GAAyD;AAAA;AAAA,EAE7D,0BAAA,EAA4B;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,4BAAA,EAA8B;AAAA,IAC5B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,4BAAA,EAA8B;AAAA,IAC5B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,2BAAA,EAA6B;AAAA,IAC3B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,wBAAA,EAA0B;AAAA,IACxB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACb;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,SAAA,EAAW;AAAA;AAEf,CAAA;AAyBO,SAAS,SAAA,CACd,OAAA,EACA,OAAA,GAAoC,EAAC,EACtB;AACf,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,iBAAA;AAG7C,EAAA,IAAI,MAAA,GAAc,IAAA;AAClB,EAAA,eAAe,SAAA,GAA0B;AACvC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,MAAM,OAAO,mBAAmB,CAAA;AAC/D,MAAA,MAAA,GAAS,IAAI,SAAA,CAAU;AAAA,QACrB,MAAA;AAAA,QACA,SAAS,OAAA,CAAQ;AAAA,OAClB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GACJ,gBAAA,CAAiB,OAAO,CAAA,IAAK,iBAAiB,0BAA0B,CAAA;AAE1E,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,WAAA;AAAA,IACV,OAAA;AAAA,IAEA,YAAA,EAAc;AAAA,MACZ,gBAAgB,WAAA,CAAY,MAAA;AAAA,MAC5B,eAAe,WAAA,CAAY,KAAA;AAAA,MAC3B,iBAAA,EAAmB,IAAA;AAAA,MACnB,gBAAA,EAAkB,KAAA;AAAA,MAClB,kBAAkB,WAAA,CAAY,QAAA;AAAA,MAC9B,aAAa,WAAA,CAAY,GAAA;AAAA,MACzB,WAAW,WAAA,CAAY,SAAA;AAAA,MACvB,mBAAA,EAAqB,YAAY,MAAA,GAC7B,CAAC,aAAa,YAAA,EAAc,WAAA,EAAa,YAAY,CAAA,GACrD;AAAC,KACP;AAAA,IAEA,MAAM,WAAW,MAAA,EAAqD;AACpE,MAAA,MAAMA,OAAAA,GAAS,MAAM,SAAA,EAAU;AAE/B,MAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,0BAAA,CAA2B,OAAO,QAAQ,CAAA;AAEvE,MAAA,MAAM,cAAA,GAAsB;AAAA,QAC1B,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,QAChC,QAAQ,MAAA,IAAU,MAAA;AAAA,QAClB,QAAA;AAAA,QACA,OAAO,MAAA,CAAO;AAAA,OAChB;AAEA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,QAAA,cAAA,CAAe,cAAc,MAAA,CAAO,WAAA;AAAA,MACtC;AAGA,MAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,OAAA,IAAW,WAAA,CAAY,QAAA,EAAU;AACrD,QAAA,cAAA,CAAe,QAAA,GAAW;AAAA,UACxB,IAAA,EAAM,SAAA;AAAA,UACN,aAAA,EAAe,OAAA,CAAQ,QAAA,CAAS,YAAA,IAAgB;AAAA,SAClD;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAMA,OAAAA,CAAO,QAAA,CAAS,OAAO,cAAc,CAAA;AAG5D,MAAA,IAAI,IAAA,GAAO,EAAA;AACX,MAAA,MAAM,YAAwB,EAAC;AAE/B,MAAA,KAAA,MAAW,KAAA,IAAS,SAAS,OAAA,EAAS;AACpC,QAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,UAAA,IAAA,IAAQ,KAAA,CAAM,IAAA;AAAA,QAChB,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACpC,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,MAAM,KAAA,CAAM;AAAA,WACb,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA,EAAc,eAAA,CAAgB,QAAA,CAAS,WAAW,CAAA;AAAA,QAClD,KAAA,EAAO;AAAA,UACL,YAAA,EAAc,QAAA,CAAS,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,UAC9C,gBAAA,EAAkB,QAAA,CAAS,KAAA,EAAO,aAAA,IAAiB,CAAA;AAAA,UACnD,cACG,QAAA,CAAS,KAAA,EAAO,gBAAgB,CAAA,KAChC,QAAA,CAAS,OAAO,aAAA,IAAiB,CAAA;AAAA,SACtC;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,IACF,CAAA;AAAA,IAEA,OAAO,SAAS,MAAA,EAAuD;AACrE,MAAA,MAAMA,OAAAA,GAAS,MAAM,SAAA,EAAU;AAE/B,MAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,0BAAA,CAA2B,OAAO,QAAQ,CAAA;AAEvE,MAAA,MAAM,cAAA,GAAsB;AAAA,QAC1B,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,OAAO,SAAA,IAAa,IAAA;AAAA,QAChC,QAAQ,MAAA,IAAU,MAAA;AAAA,QAClB,QAAA;AAAA,QACA,OAAO,MAAA,CAAO;AAAA,OAChB;AAEA,MAAA,IAAI,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACpC,QAAA,cAAA,CAAe,cAAc,MAAA,CAAO,WAAA;AAAA,MACtC;AAEA,MAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,OAAA,IAAW,WAAA,CAAY,QAAA,EAAU;AACrD,QAAA,cAAA,CAAe,QAAA,GAAW;AAAA,UACxB,IAAA,EAAM,SAAA;AAAA,UACN,aAAA,EAAe,OAAA,CAAQ,QAAA,CAAS,YAAA,IAAgB;AAAA,SAClD;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAMA,OAAAA,CAAO,QAAA,CAAS,OAAO,cAAc,CAAA;AAE1D,MAAA,IAAI,cAAA,GACF,IAAA;AACF,MAAA,IAAI,WAAA,GAAc,CAAA;AAClB,MAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,QAAA,IAAI,MAAA,CAAO,QAAQ,OAAA,EAAS;AAC1B,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAI,KAAA,CAAM,SAAS,CAAA,EAAE;AACnD,UAAA;AAAA,QACF;AAEA,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,eAAA;AACH,YAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,cAAA,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,YAAA,IAAgB,CAAA;AAAA,YACpD;AACA,YAAA;AAAA,UAEF,KAAK,qBAAA;AACH,YAAA,IAAI,KAAA,CAAM,aAAA,EAAe,IAAA,KAAS,UAAA,EAAY;AAC5C,cAAA,cAAA,GAAiB;AAAA,gBACf,EAAA,EAAI,MAAM,aAAA,CAAc,EAAA;AAAA,gBACxB,IAAA,EAAM,MAAM,aAAA,CAAc,IAAA;AAAA,gBAC1B,KAAA,EAAO;AAAA,eACT;AAAA,YACF;AACA,YAAA;AAAA,UAEF,KAAK,qBAAA;AACH,YAAA,IAAI,KAAA,CAAM,KAAA,EAAO,IAAA,KAAS,YAAA,EAAc;AACtC,cAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,KAAA,CAAM,MAAM,IAAA,EAAK;AAAA,YACrD,CAAA,MAAA,IACE,KAAA,CAAM,KAAA,EAAO,IAAA,KAAS,sBACtB,cAAA,EACA;AACA,cAAA,cAAA,CAAe,KAAA,IAAS,MAAM,KAAA,CAAM,YAAA;AAAA,YACtC;AACA,YAAA;AAAA,UAEF,KAAK,oBAAA;AACH,YAAA,IAAI,cAAA,EAAgB;AAClB,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,WAAA;AAAA,gBACN,QAAA,EAAU;AAAA,kBACR,IAAI,cAAA,CAAe,EAAA;AAAA,kBACnB,MAAM,cAAA,CAAe,IAAA;AAAA,kBACrB,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,SAAS,IAAI;AAAA;AAC/C,eACF;AACA,cAAA,cAAA,GAAiB,IAAA;AAAA,YACnB;AACA,YAAA;AAAA,UAEF,KAAK,eAAA;AACH,YAAA,IAAI,MAAM,KAAA,EAAO;AACf,cAAA,YAAA,GAAe,KAAA,CAAM,MAAM,aAAA,IAAiB,CAAA;AAAA,YAC9C;AACA,YAAA,IAAI,KAAA,CAAM,OAAO,WAAA,EAAa;AAC5B,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,QAAA;AAAA,gBACN,YAAA,EAAc,eAAA,CAAgB,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AAAA,gBACrD,KAAA,EAAO;AAAA,kBACL,YAAA,EAAc,WAAA;AAAA,kBACd,gBAAA,EAAkB,YAAA;AAAA,kBAClB,aAAa,WAAA,GAAc;AAAA;AAC7B,eACF;AAAA,YACF;AACA,YAAA;AAAA;AACJ,MACF;AAAA,IACF;AAAA,GACF;AACF;AAMA,SAAS,gBAAgB,MAAA,EAAqC;AAC5D,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,UAAA;AAAA,IACL,KAAK,eAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,2BAA2B,QAAA,EAGlC;AACA,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,MAAM,YAAmB,EAAC;AAC1B,EAAA,MAAM,qBAA4B,EAAC;AAGnC,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AAErC,IAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,MAAA,CAAO,CAAC,EAAA,KAAO;AACrD,MAAA,IAAI,CAAC,GAAG,UAAA,EAAY;AAClB,QAAA,OAAA,CAAQ,KAAK,wDAAwD,CAAA;AACrE,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UACjC,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,EAAA,CAAG,UAAA;AAAA,UAChB,SAAS,EAAA,CAAG;AAAA,SACd,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AACA,IAAA,kBAAA,CAAmB,MAAA,GAAS,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,MAAA,IAAA,CAAW,MAAA,GAAS,IAAA,GAAO,EAAA,IAAM,GAAA,CAAI,OAAA;AACrC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,kBAAA,CAAmB,SAAS,CAAA,EAAG;AAC7D,MAAA,gBAAA,EAAiB;AAAA,IACnB;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AAEvB,MAAA,gBAAA,EAAiB;AAEjB,MAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACnC,QAAA,SAAA,CAAU,KAAK,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AAAA,MACvD,CAAA,MAAO;AAEL,QAAA,MAAM,UAAiB,EAAC;AACxB,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,OAAA,EAAS;AAC9B,UAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,YAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,UAChD,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,OAAA,EAAS;AAChC,YAAA,MAAM,SAAA,GACJ,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAClB,IAAA,CAAK,KAAA,GACL,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAE/C,YAAA,IAAI,SAAA,CAAU,UAAA,CAAW,MAAM,CAAA,EAAG;AAChC,cAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,gBACX,IAAA,EAAM,OAAA;AAAA,gBACN,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,KAAK,SAAA;AAAU,eACvC,CAAA;AAAA,YACH,CAAA,MAAO;AACL,cAAA,MAAM,MAAA,GAAS,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA,GACvC,UAAU,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,GACtB,SAAA;AACJ,cAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,gBACX,IAAA,EAAM,OAAA;AAAA,gBACN,MAAA,EAAQ;AAAA,kBACN,IAAA,EAAM,QAAA;AAAA,kBACN,UAAA,EAAY,KAAK,QAAA,IAAY,WAAA;AAAA,kBAC7B,IAAA,EAAM;AAAA;AACR,eACD,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AACA,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,WAAA,EAAa;AACnC,MAAA,MAAM,UAAiB,EAAC;AAExB,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAAA,MAClD;AAEA,MAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAC7C,QAAA,KAAA,MAAW,EAAA,IAAM,IAAI,SAAA,EAAW;AAC9B,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,UAAA;AAAA,YACN,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,MAAM,EAAA,CAAG,IAAA;AAAA,YACT,OAAO,EAAA,CAAG;AAAA,WACX,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,SAAS,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAE9B,MAAA,MAAM,UAAA,GACJ,GAAA,CAAI,UAAA,IAAe,GAAA,CAAY,gBAAiB,GAAA,CAAY,SAAA;AAE9D,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,sDAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,QACtB,UAAA;AAAA,QACA,SAAS,GAAA,CAAI;AAAA,OACd,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,gBAAA,EAAiB;AAEjB,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,SAAA,EAAU;AACvC;;;ACreO,SAAS,UAAA,CAAW,SAAS,IAAA,EAAc;AAChD,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC9E;AAKO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,OAAO,WAAW,KAAK,CAAA;AACzB;;;ACuPO,SAAS,oBAAoB,OAAA,EAA2B;AAC7D,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,EAAU,WAAA;AACtC,EAAA,OACE,WAAA,EAAa,IAAA;AAAA,IACX,CAAC,MACC,CAAA,CAAE,IAAA,KAAS,WACV,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,QAAA,KAAa;AAAA,GACzC,IAAK,KAAA;AAET;AAeO,SAAS,2BACd,UAAA,EAC8B;AAC9B,EAAA,IAAI,UAAA,CAAW,IAAA,KAAS,OAAA,EAAS,OAAO,IAAA;AAGxC,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,KAAK,UAAA,CAAW;AAAA;AAClB,KACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,OAAO,IAAA;AAG7B,EAAA,IAAI,aAAa,UAAA,CAAW,IAAA;AAC5B,EAAA,IAAI,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAClC,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,IAAA,IAAI,eAAe,EAAA,EAAI;AACrB,MAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,WAAW,QAAA,IAAY,WAAA;AAAA,MACnC,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAsDO,SAAS,8BACd,UAAA,EAC8B;AAE9B,EAAA,IAAI,UAAA,CAAW,IAAA,KAAS,MAAA,IAAU,UAAA,CAAW,aAAa,iBAAA,EAAmB;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,KAAA;AAAA,QACN,KAAK,UAAA,CAAW;AAAA;AAClB,KACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAM,OAAO,IAAA;AAG7B,EAAA,IAAI,aAAa,UAAA,CAAW,IAAA;AAC5B,EAAA,IAAI,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAClC,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,IAAA,IAAI,eAAe,EAAA,EAAI;AACrB,MAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,iBAAA;AAAA,MACZ,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAKO,SAAS,0BACd,OAAA,EACkC;AAClC,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,EAAU,WAAA;AACtC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,EAAA;AAGnC,EAAA,IAAI,CAAC,mBAAA,CAAoB,OAAO,CAAA,EAAG;AACjC,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAkC,EAAC;AAGzC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AAEpC,MAAA,MAAM,UAAA,GAAa,2BAA2B,UAAU,CAAA;AACxD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,KAAK,UAAU,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,8BAA8B,UAAU,CAAA;AACzD,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,EAC7C;AAEA,EAAA,OAAO,MAAA;AACT;AAmEO,SAASC,2BAAAA,CACd,UACA,YAAA,EAOA;AACA,EAAA,MAAM,YAGD,EAAC;AAEN,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AAEtB,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AAE3B,IAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAE5B,MAAA,MAAM,UAAgE,EAAC;AAGvE,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAAA,MAClD;AAGA,MAAA,IAAI,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/C,QAAA,KAAA,MAAW,EAAA,IAAM,IAAI,UAAA,EAAY;AAC/B,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,UAAA;AAAA,YACN,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,YAClB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,SAAS,SAAS;AAAA,WACxC,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EACE,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,KAAS,MAAA,GACvC,OAAA,CAAQ,CAAC,CAAA,CAAqC,IAAA,GAC/C;AAAA,OACP,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,IAAI,YAAA,EAAc;AAGlD,MAAA,MAAM,WAAA,GAA0C;AAAA,QAC9C;AAAA,UACE,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,GAAA,CAAI,YAAA;AAAA,UACjB,OAAA,EAAS,IAAI,OAAA,IAAW;AAAA;AAC1B,OACF;AAGA,MAAA,OAAO,CAAA,GAAI,IAAI,QAAA,CAAS,MAAA,IAAU,SAAS,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AACjE,QAAA,CAAA,EAAA;AACA,QAAA,MAAM,QAAA,GAAW,SAAS,CAAC,CAAA;AAC3B,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,WAAA,CAAY,IAAA,CAAK;AAAA,YACf,IAAA,EAAM,aAAA;AAAA,YACN,aAAa,QAAA,CAAS,YAAA;AAAA,YACtB,OAAA,EAAS,SAAS,OAAA,IAAW;AAAA,WAC9B,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAC9B,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,0BAA0B,GAAG;AAAA,OACvC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAwB,EAAA;AAAA,IACxB,QAAA,EAAU;AAAA,GACZ;AACF;;;ACljBO,IAAM,mBAAN,MAA6C;AAAA,EAOlD,YAAY,MAAA,EAAgC;AAN5C,IAAA,IAAA,CAAS,QAAA,GAAW,WAAA;AAOlB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,0BAAA;AAAA,EAC/B;AAAA,EAEA,MAAc,SAAA,GAAY;AACxB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAEhB,MAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,MAAM,OAAO,mBAAmB,CAAA;AAC/D,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU;AAAA,QAC1B,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,OACrB,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,2BACN,WAAA,EACgC;AAChC,IAAA,MAAM,WAA2C,EAAC;AAClD,IAAA,MAAM,qBACJ,EAAC;AAGH,IAAA,IAAI,kBAA4B,EAAC;AACjC,IAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAE7B,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AAE3B,MAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAM5B,QAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,kBAAA,CAAmB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,cACvC,IAAA,EAAM,aAAA;AAAA,cACN,aAAa,EAAA,CAAG,WAAA;AAAA,cAChB,SAAS,EAAA,CAAG;AAAA,aACd,CAAE;AAAA,WACH,CAAA;AACD,UAAA,kBAAA,CAAmB,MAAA,GAAS,CAAA;AAG5B,UAAA,eAAA,GAAkB,EAAC;AACnB,UAAA,eAAA,GAAkB,CAAA;AAAA,QACpB;AAGA,QAAA,MAAM,UAA0C,EAAC;AAGjD,QAAA,IACE,GAAA,CAAI,WACJ,OAAO,GAAA,CAAI,YAAY,QAAA,IACvB,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAK,EACjB;AACA,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAAA,QAClD;AAGA,QAAA,MAAM,YAAY,GAAA,CAAI,UAAA;AAQtB,QAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAErC,UAAA,eAAA,GAAkB,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,KAAO,GAAG,EAAE,CAAA;AAC7C,UAAA,eAAA,GAAkB,CAAA;AAElB,UAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,YAAA,IAAI,QAAQ,EAAC;AACb,YAAA,IAAI;AACF,cAAA,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA,CAAS,SAAS,CAAA;AAAA,YAC1C,CAAA,CAAA,MAAQ;AAAA,YAER;AACA,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,IAAA,EAAM,UAAA;AAAA,cACN,IAAI,EAAA,CAAG,EAAA;AAAA,cACP,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,cAClB;AAAA,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,SAAS,CAAA;AAAA,QAC9C;AAAA,MACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAE9B,QAAA,IAAI,aAAa,GAAA,CAAI,YAAA;AAGrB,QAAA,IAAI,CAAC,UAAA,IAAc,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAC7C,UAAA,UAAA,GAAa,gBAAgB,eAAe,CAAA;AAC5C,UAAA,eAAA,EAAA;AACA,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,0DAA0D,UAAU,CAAA;AAAA,WACtE;AAAA,QACF;AAEA,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,oFAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAIA,QAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,kEAAkE,UAAU,CAAA;AAAA,WAC9E;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,UAAU,CAAA,EAAG;AACzC,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,gEAAgE,UAAU,CAAA;AAAA,WAC5E;AACA,UAAA;AAAA,QACF;AAEA,QAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,UACtB,WAAA,EAAa,UAAA;AAAA,UACb,OAAA,EACE,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GACnB,IAAI,OAAA,GACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO;AAAA,SACjC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAE9B,QAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,kBAAA,CAAmB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,cACvC,IAAA,EAAM,aAAA;AAAA,cACN,aAAa,EAAA,CAAG,WAAA;AAAA,cAChB,SAAS,EAAA,CAAG;AAAA,aACd,CAAE;AAAA,WACH,CAAA;AACD,UAAA,kBAAA,CAAmB,MAAA,GAAS,CAAA;AAAA,QAC9B;AAGA,QAAA,IACE,GAAA,CAAI,WAAA,IACJ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA,IAC7B,GAAA,CAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EACzB;AAEA,UAAA,MAAM,UAA0C,EAAC;AAGjD,UAAA,IAAI,GAAA,CAAI,OAAA,IAAW,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AAClD,YAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAAA,UAClD;AAGA,UAAA,KAAA,MAAW,UAAA,IAAc,IAAI,WAAA,EAKzB;AACF,YAAA,IAAI,UAAA,CAAW,SAAS,OAAA,EAAS;AAC/B,cAAA,IAAI,WAAW,GAAA,EAAK;AAElB,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,OAAA;AAAA,kBACN,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,KAAA;AAAA,oBACN,KAAK,UAAA,CAAW;AAAA;AAClB,iBACD,CAAA;AAAA,cACH,CAAA,MAAA,IAAW,WAAW,IAAA,EAAM;AAE1B,gBAAA,IAAI,aAAa,UAAA,CAAW,IAAA;AAC5B,gBAAA,IAAI,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAElC,kBAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,kBAAA,IAAI,eAAe,EAAA,EAAI;AACrB,oBAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,kBAC9C;AAAA,gBACF;AACA,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,OAAA;AAAA,kBACN,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY,WAAW,QAAA,IAAY,WAAA;AAAA,oBACnC,IAAA,EAAM;AAAA;AACR,iBACD,CAAA;AAAA,cACH;AAAA,YACF,WACE,UAAA,CAAW,IAAA,KAAS,MAAA,IACpB,UAAA,CAAW,aAAa,iBAAA,EACxB;AAEA,cAAA,IAAI,WAAW,GAAA,EAAK;AAClB,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,UAAA;AAAA,kBACN,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,KAAA;AAAA,oBACN,KAAK,UAAA,CAAW;AAAA;AAClB,iBACD,CAAA;AAAA,cACH,CAAA,MAAA,IAAW,WAAW,IAAA,EAAM;AAC1B,gBAAA,IAAI,aAAa,UAAA,CAAW,IAAA;AAC5B,gBAAA,IAAI,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAClC,kBAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AACzC,kBAAA,IAAI,eAAe,EAAA,EAAI;AACrB,oBAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,kBAC9C;AAAA,gBACF;AACA,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,UAAA;AAAA,kBACN,MAAA,EAAQ;AAAA,oBACN,IAAA,EAAM,QAAA;AAAA,oBACN,UAAA,EAAY,iBAAA;AAAA,oBACZ,IAAA,EAAM;AAAA;AACR,iBACD,CAAA;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAEA,UAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAAA,QACzC,CAAA,MAAO;AAEL,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EACE,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GACnB,IAAI,OAAA,GACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO;AAAA,WACjC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,kBAAA,CAAmB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,UACvC,IAAA,EAAM,aAAA;AAAA,UACN,aAAa,EAAA,CAAG,WAAA;AAAA,UAChB,SAAS,EAAA,CAAG;AAAA,SACd,CAAE;AAAA,OACH,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAA,EAG1B;AAEA,IAAA,MAAM,aAAA,GAAgB,QAAQ,YAAA,IAAgB,EAAA;AAG9C,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AAEzD,MAAA,QAAA,GAAW,IAAA,CAAK,0BAAA,CAA2B,OAAA,CAAQ,WAAW,CAAA;AAAA,IAChE,CAAA,MAAO;AAEL,MAAA,MAAM,SAAA,GAAYA,2BAAAA,CAA2B,OAAA,CAAQ,QAAmB,CAAA;AACxE,MAAA,QAAA,GAAW,SAAA,CAAU,QAAA;AAAA,IACvB;AAGA,IAAA,MAAM,KAAA,GACJ,OAAA,CAAQ,OAAA,EAAS,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAChC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,YAAA,EAAc;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,MAAA,CAAO,UAAA,GACf,MAAA,CAAO,WAAA;AAAA,UACL,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,YACtD,GAAA;AAAA,YACA;AAAA,cACE,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,MAAM,KAAA,CAAM;AAAA;AACd,WACD;AAAA,YAEH,EAAC;AAAA,QACL,QAAA,EAAU,MAAA,CAAO,UAAA,GACb,MAAA,CAAO,OAAA,CAAQ,OAAO,UAAU,CAAA,CAC7B,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,CAAM,QAAQ,CAAA,CACpC,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA,GACrB;AAAC;AACP,KACF,CAAE,KAAK,EAAC;AAGV,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,SAAA;AACzD,IAAA,IAAI,uBAAA;AAEJ,IAAA,IAAI,eAAA,EAAiB;AAGnB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,qBAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,eAAA,EAAiB,CAAC,QAAQ;AAAA,OAC3B,CAAA;AAGD,MAAA,MAAM,QAAA,GACJ,OAAO,eAAA,KAAoB,QAAA,GAAW,kBAAkB,EAAC;AAC3D,MAAA,MAAM,sBAA+C,EAAC;AAEtD,MAAA,IAAI,QAAA,CAAS,YAAY,MAAA,EAAW;AAClC,QAAA,mBAAA,CAAoB,WAAW,QAAA,CAAS,OAAA;AAAA,MAC1C;AAEA,MAAA,IAAI,QAAA,CAAS,cAAA,IAAkB,QAAA,CAAS,cAAA,CAAe,SAAS,CAAA,EAAG;AACjE,QAAA,mBAAA,CAAoB,kBAAkB,QAAA,CAAS,cAAA;AAAA,MACjD;AAEA,MAAA,IAAI,QAAA,CAAS,cAAA,IAAkB,QAAA,CAAS,cAAA,CAAe,SAAS,CAAA,EAAG;AACjE,QAAA,mBAAA,CAAoB,kBAAkB,QAAA,CAAS,cAAA;AAAA,MACjD;AAEA,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,mBAAA,CAAoB,gBAAgB,QAAA,CAAS,YAAA;AAAA,MAC/C;AAGA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,mBAAmB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC/C,QAAA,uBAAA,GAA0B;AAAA,UACxB,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,KAAA;AAAA,MACrC,YAAY,OAAA,CAAQ,MAAA,EAAQ,SAAA,IAAa,IAAA,CAAK,OAAO,SAAA,IAAa,IAAA;AAAA,MAClE,MAAA,EAAQ,aAAA;AAAA,MACR,QAAA;AAAA,MACA,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,KAAA,GAAQ;AAAA,KAChC;AAGA,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,OAAA,CAAQ,yBAAA,GAA4B,uBAAA;AAAA,IACtC;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,IAAA,KAAS,SAAA,EAAW;AAC5C,MAAA,OAAA,CAAQ,QAAA,GAAW;AAAA,QACjB,IAAA,EAAM,SAAA;AAAA,QACN,aAAA,EAAe,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,YAAA,IAAgB;AAAA,OACtD;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAAA,EAA2D;AACxE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAGpD,IAAA,MAAM,mBAAA,GAAsB;AAAA,MAC1B,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,QAAA,CAAS,OAAO,mBAAmB,CAAA;AAGjE,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,MAAM,YAID,EAAC;AAEN,MAAA,KAAA,MAAW,KAAA,IAAS,SAAS,OAAA,EAAS;AACpC,QAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,UAAA,OAAA,IAAW,KAAA,CAAM,IAAA;AAAA,QACnB,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACpC,UAAA,QAAA,IAAa,KAAA,CAA+B,QAAA;AAAA,QAC9C,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACpC,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,MAAM,KAAA,CAAM;AAAA,WACb,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAU,QAAA,IAAY,KAAA,CAAA;AAAA,QACtB,WAAA,EAAa;AAAA,OACf;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,OAAA,EAA6D;AACzE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAEpD,IAAA,MAAM,YAAY,iBAAA,EAAkB;AAGpC,IAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,EAAA,EAAI,SAAA,EAAU;AAE7C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAS,OAAO,OAAO,CAAA;AAEnD,MAAA,IAAI,cAAA,GAIO,IAAA;AAEX,MAAA,IAAI,iBAAA,GAAoB,KAAA;AAGxB,MAAA,MAAM,qBAAiC,EAAC;AACxC,MAAA,IAAI,aAAA,GAAgB,CAAA;AAGpB,MAAA,IAAI,KAAA;AAQJ,MAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAEhC,QAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,UAAA;AAAA,QACF;AAEA,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,eAAA;AAEH,YAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,cAAA,KAAA,GAAQ;AAAA,gBACN,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,YAAA;AAAA,gBACnC,iBAAA,EAAmB,CAAA;AAAA,gBACnB,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM;AAAA,eACpC;AAAA,YACF;AACA,YAAA;AAAA,UAEF,KAAK,eAAA;AAEH,YAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,cAAA,KAAA,CAAM,iBAAA,GAAoB,MAAM,KAAA,CAAM,aAAA;AACtC,cAAA,KAAA,CAAM,YAAA,GACJ,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,KAAA,CAAM,aAAA;AAAA,YACtC;AACA,YAAA;AAAA,UAEF,KAAK,qBAAA;AACH,YAAA,IAAI,KAAA,CAAM,aAAA,CAAc,IAAA,KAAS,UAAA,EAAY;AAC3C,cAAA,cAAA,GAAiB;AAAA,gBACf,EAAA,EAAI,MAAM,aAAA,CAAc,EAAA;AAAA,gBACxB,IAAA,EAAM,MAAM,aAAA,CAAc,IAAA;AAAA,gBAC1B,KAAA,EAAO;AAAA,eACT;AAEA,cAAA,IAAI,cAAA,CAAe,SAAS,YAAA,EAAc;AACxC,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,cAAA;AAAA,kBACN,IAAI,cAAA,CAAe,EAAA;AAAA,kBACnB,MAAM,cAAA,CAAe;AAAA,iBACvB;AAAA,cACF;AAAA,YACF,CAAA,MAAA,IAAW,KAAA,CAAM,aAAA,CAAc,IAAA,KAAS,wBAAA,EAA0B;AAEhE,cAAA,MAAM,kBAAkB,KAAA,CAAM,aAAA;AAU9B,cAAA,IACE,gBAAgB,OAAA,IAChB,KAAA,CAAM,OAAA,CAAQ,eAAA,CAAgB,OAAO,CAAA,EACrC;AACA,gBAAA,KAAA,MAAW,MAAA,IAAU,gBAAgB,OAAA,EAAS;AAC5C,kBAAA,IAAI,MAAA,CAAO,IAAA,KAAS,mBAAA,IAAuB,MAAA,CAAO,GAAA,EAAK;AACrD,oBAAA,aAAA,EAAA;AACA,oBAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,GAAG,CAAA;AACvC,oBAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,sBACtB,KAAA,EAAO,aAAA;AAAA,sBACP,KAAK,MAAA,CAAO,GAAA;AAAA,sBACZ,KAAA,EAAO,OAAO,KAAA,IAAS,MAAA;AAAA,sBACvB,MAAA;AAAA,sBACA,OAAA,EAAS,MAAA,GACL,CAAA,0CAAA,EAA6C,MAAM,CAAA,MAAA,CAAA,GACnD,KAAA;AAAA,qBACL,CAAA;AAAA,kBACH;AAAA,gBACF;AAAA,cACF;AAAA,YAEF,CAAA,MAAA,IAAW,KAAA,CAAM,aAAA,CAAc,IAAA,KAAS,UAAA,EAAY;AAElD,cAAA,iBAAA,GAAoB,IAAA;AACpB,cAAA,MAAM,EAAE,MAAM,gBAAA,EAAiB;AAAA,YACjC;AACA,YAAA;AAAA,UAEF,KAAK,qBAAA;AACH,YAAA,IAAI,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACrC,cAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,OAAA,EAAS,KAAA,CAAM,MAAM,IAAA,EAAK;AAAA,YAC3D,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,iBAAA,EAAmB;AAEjD,cAAA,MAAM,iBAAiB,KAAA,CAAM,KAAA;AAU7B,cAAA,IAAI,cAAA,CAAe,UAAU,GAAA,EAAK;AAChC,gBAAA,aAAA,EAAA;AACA,gBAAA,MAAM,MAAA,GAAS,aAAA,CAAc,cAAA,CAAe,QAAA,CAAS,GAAG,CAAA;AACxD,gBAAA,kBAAA,CAAmB,IAAA,CAAK;AAAA,kBACtB,KAAA,EAAO,aAAA;AAAA,kBACP,GAAA,EAAK,eAAe,QAAA,CAAS,GAAA;AAAA,kBAC7B,KAAA,EAAO,cAAA,CAAe,QAAA,CAAS,KAAA,IAAS,MAAA;AAAA,kBACxC,SAAA,EAAW,eAAe,QAAA,CAAS,UAAA;AAAA,kBACnC,MAAA;AAAA,kBACA,OAAA,EAAS,MAAA,GACL,CAAA,0CAAA,EAA6C,MAAM,CAAA,MAAA,CAAA,GACnD,KAAA;AAAA,iBACL,CAAA;AAAA,cACH;AAAA,YACF,CAAA,MAAA,IAAW,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,gBAAA,EAAkB;AAEhD,cAAA,MAAM,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,KAAA,CAAM,MAAM,QAAA,EAAS;AAAA,YAChE,CAAA,MAAA,IACE,KAAA,CAAM,KAAA,CAAM,IAAA,KAAS,sBACrB,cAAA,EACA;AACA,cAAA,cAAA,CAAe,KAAA,IAAS,MAAM,KAAA,CAAM,YAAA;AAAA,YACtC;AACA,YAAA;AAAA,UAEF,KAAK,oBAAA;AACH,YAAA,IAAI,cAAA,EAAgB;AAElB,cAAA,IAAI,cAAA,CAAe,SAAS,YAAA,EAAc;AACxC,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,aAAA;AAAA,kBACN,IAAI,cAAA,CAAe,EAAA;AAAA,kBACnB,MAAM,cAAA,CAAe;AAAA,iBACvB;AAGA,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,YAAA;AAAA,kBACN,IAAI,cAAA,CAAe,EAAA;AAAA,kBACnB,MAAM,cAAA,CAAe;AAAA,iBACvB;AAAA,cACF;AACA,cAAA,cAAA,GAAiB,IAAA;AAAA,YACnB;AACA,YAAA,IAAI,iBAAA,EAAmB;AACrB,cAAA,MAAM,EAAE,MAAM,cAAA,EAAe;AAC7B,cAAA,iBAAA,GAAoB,KAAA;AAAA,YACtB;AACA,YAAA;AAAA,UAEF,KAAK,cAAA;AACH,YAAA;AAAA;AACJ,MACF;AAGA,MAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AAEjC,QAAA,MAAM,eAAA,GAAkB,qBAAqB,kBAAkB,CAAA;AAC/D,QAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,SAAA,EAAW,eAAA,EAAgB;AAAA,MACvD;AAGA,MAAA,MAAM,EAAE,MAAM,aAAA,EAAc;AAC5B,MAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,QAClD,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAKA,SAAS,cAAc,GAAA,EAAqB;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,MAAA,CAAO,QAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAKA,SAAS,qBAAqB,SAAA,EAAmC;AAC/D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAsB;AACvC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,MAAA,KAAA,EAAA;AACA,MAAA,IAAA,CAAK,IAAI,QAAA,CAAS,GAAA,EAAK,EAAE,GAAG,QAAA,EAAU,OAAO,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA;AACjC;AAKO,SAAS,uBACd,MAAA,EACkB;AAClB,EAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AACpC;;;AC9bO,SAAS,sBAAA,CACd,YACA,UAAA,EACY;AAEZ,EAAA,MAAA,CAAO,cAAA,CAAe,YAAY,MAAA,EAAQ;AAAA,IACxC,OAAO,UAAA,CAAW,IAAA;AAAA,IAClB,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc;AAAA,GACf,CAAA;AAGD,EAAA,MAAA,CAAO,OAAO,UAAA,EAAY;AAAA,IACxB,iBAAiB,UAAA,CAAW,eAAA;AAAA,IAC5B,aAAA,EAAe,UAAA;AAAA,IACf,iBAAiB,UAAA,CAAW,eAAA;AAAA,IAC5B,gBAAgB,UAAA,CAAW;AAAA,GAC5B,CAAA;AAED,EAAA,OAAO,UAAA;AACT;;;AC/RA,IAAMC,iBAAAA,GAAsD;AAAA;AAAA,EAE1D,0BAAA,EAA4B;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,0BAAA,EAA4B;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,2BAAA,EAA6B;AAAA,IAC3B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA;AAAA,EAGA,sBAAA,EAAwB;AAAA,IACtB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,wBAAA,EAA0B;AAAA,IACxB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,0BAAA,EAA4B;AAAA,IAC1B,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AAAA,EACA,yBAAA,EAA2B;AAAA,IACzB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW;AAAA;AAEf,CAAA;AA0BO,SAAS,eAAA,CACd,MAAA,GAAkC,EAAC,EACvB;AACZ,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,OAAA,CAAQ,IAAI,iBAAA,IAAqB,EAAA;AAGjE,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AACtC,IAAA,OAAO,sBAAA,CAAuB;AAAA,MAC5B,MAAA;AAAA,MACA,KAAA,EAAO,OAAA;AAAA,MACP,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAA,EAAU,OAAO,cAAA,GACb,EAAE,MAAM,SAAA,EAAW,YAAA,EAAc,MAAA,CAAO,cAAA,EAAe,GACvD;AAAA,KACL,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAA0C;AACjE,IAAA,MAAM,KAAA,GACJA,iBAAAA,CAAiB,OAAO,CAAA,IAAKA,kBAAiB,0BAA0B,CAAA;AAE1E,IAAA,OAAO;AAAA,MACL,gBAAgB,KAAA,CAAM,MAAA;AAAA,MACtB,eAAe,KAAA,CAAM,KAAA;AAAA,MACrB,kBAAkB,KAAA,CAAM,QAAA;AAAA,MACxB,iBAAA,EAAmB,IAAA;AAAA,MACnB,WAAA,EAAa,IAAA;AAAA,MACb,aAAA,EAAe,KAAA;AAAA,MACf,aAAA,EAAe,KAAA;AAAA,MACf,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,mBAAA,EAAqB;AAAA,QACnB,WAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,gBAAA,EAAkB,KAAA;AAAA,MAClB,sBAAA,EAAwB;AAAA,KAC1B;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,uBAAuB,UAAA,EAAY;AAAA,IACxC,IAAA,EAAM,WAAA;AAAA,IACN,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAKA,iBAAgB,CAAA;AAAA,IAC7C;AAAA,GACD,CAAA;AACH;AAGO,IAAM,uBAAA,GAA0B","file":"index.js","sourcesContent":["/**\n * Anthropic Provider - Modern Pattern\n *\n * @example\n * ```ts\n * import { anthropic } from '@yourgpt/llm-sdk/anthropic';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface AnthropicModelConfig {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n pdf: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, AnthropicModelConfig> = {\n // Claude 4 series\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.7 series\n \"claude-3-7-sonnet-20250219\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-7-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface AnthropicProviderOptions {\n /** API key (defaults to ANTHROPIC_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API */\n baseURL?: string;\n /** Enable extended thinking */\n thinking?: {\n enabled: boolean;\n budgetTokens?: number;\n };\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic language model\n */\nexport function anthropic(\n modelId: string,\n options: AnthropicProviderOptions = {},\n): LanguageModel {\n const apiKey = options.apiKey ?? process.env.ANTHROPIC_API_KEY;\n\n // Lazy-load Anthropic client\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n client = new Anthropic({\n apiKey,\n baseURL: options.baseURL,\n });\n }\n return client;\n }\n\n const modelConfig =\n ANTHROPIC_MODELS[modelId] ?? ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n provider: \"anthropic\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: false,\n supportsThinking: modelConfig.thinking,\n supportsPDF: modelConfig.pdf,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n // Add thinking if enabled\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const response = await client.messages.create(requestOptions);\n\n // Parse response\n let text = \"\";\n const toolCalls: ToolCall[] = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n text += block.text;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n text,\n toolCalls,\n finishReason: mapFinishReason(response.stop_reason),\n usage: {\n promptTokens: response.usage?.input_tokens ?? 0,\n completionTokens: response.usage?.output_tokens ?? 0,\n totalTokens:\n (response.usage?.input_tokens ?? 0) +\n (response.usage?.output_tokens ?? 0),\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const stream = await client.messages.stream(requestOptions);\n\n let currentToolUse: { id: string; name: string; input: string } | null =\n null;\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of stream) {\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n switch (event.type) {\n case \"message_start\":\n if (event.message?.usage) {\n inputTokens = event.message.usage.input_tokens ?? 0;\n }\n break;\n\n case \"content_block_start\":\n if (event.content_block?.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta?.type === \"text_delta\") {\n yield { type: \"text-delta\", text: event.delta.text };\n } else if (\n event.delta?.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolUse.id,\n name: currentToolUse.name,\n args: JSON.parse(currentToolUse.input || \"{}\"),\n },\n };\n currentToolUse = null;\n }\n break;\n\n case \"message_delta\":\n if (event.usage) {\n outputTokens = event.usage.output_tokens ?? 0;\n }\n if (event.delta?.stop_reason) {\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(event.delta.stop_reason),\n usage: {\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n };\n }\n break;\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool-calls\";\n default:\n return \"unknown\";\n }\n}\n\nfunction formatMessagesForAnthropic(messages: CoreMessage[]): {\n system: string;\n messages: any[];\n} {\n let system = \"\";\n const formatted: any[] = [];\n const pendingToolResults: any[] = [];\n\n // Helper to flush pending tool results with validation\n const flushToolResults = () => {\n if (pendingToolResults.length === 0) return;\n\n const validResults = pendingToolResults.filter((tr) => {\n if (!tr.toolCallId) {\n console.warn(\"[llm-sdk] Skipping tool result with missing toolCallId\");\n return false;\n }\n return true;\n });\n\n if (validResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: validResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n }\n pendingToolResults.length = 0;\n };\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system += (system ? \"\\n\" : \"\") + msg.content;\n continue;\n }\n\n // Flush pending tool results before adding assistant messages\n if (msg.role === \"assistant\" && pendingToolResults.length > 0) {\n flushToolResults();\n }\n\n if (msg.role === \"user\") {\n // Flush pending tool results first\n flushToolResults();\n\n if (typeof msg.content === \"string\") {\n formatted.push({ role: \"user\", content: msg.content });\n } else {\n // Handle multimodal content\n const content: any[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n\n if (imageData.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: imageData },\n });\n } else {\n const base64 = imageData.startsWith(\"data:\")\n ? imageData.split(\",\")[1]\n : imageData;\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.mimeType ?? \"image/png\",\n data: base64,\n },\n });\n }\n }\n }\n formatted.push({ role: \"user\", content });\n }\n } else if (msg.role === \"assistant\") {\n const content: any[] = [];\n\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.args,\n });\n }\n }\n\n if (content.length > 0) {\n formatted.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n // Handle both camelCase (SDK format) and snake_case (OpenAI format)\n const toolCallId =\n msg.toolCallId ?? (msg as any).tool_call_id ?? (msg as any).toolUseId;\n\n if (!toolCallId) {\n console.warn(\n \"[llm-sdk] Tool message missing toolCallId, skipping:\",\n msg,\n );\n continue;\n }\n\n pendingToolResults.push({\n toolCallId,\n content: msg.content,\n });\n }\n }\n\n // Flush any remaining tool results\n flushToolResults();\n\n return { system, messages: formatted };\n}\n\nexport { anthropic as createAnthropic };\n","/**\n * Utility functions for llm-sdk\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix = \"id\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Generate a message ID\n */\nexport function generateMessageId(): string {\n return generateId(\"msg\");\n}\n\n/**\n * Generate a conversation/thread ID\n */\nexport function generateThreadId(): string {\n return generateId(\"thread\");\n}\n\n/**\n * Generate a tool call ID\n */\nexport function generateToolCallId(): string {\n return generateId(\"call\");\n}\n","import type {\n Message,\n MessageAttachment,\n ActionDefinition,\n StreamEvent,\n LLMConfig,\n WebSearchConfig,\n} from \"../core/stream-events\";\nimport type { TokenUsage } from \"../core/types\";\n\n/**\n * Request-level LLM configuration overrides\n */\nexport interface RequestLLMConfig {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/**\n * Chat completion request\n */\nexport interface ChatCompletionRequest {\n /** Conversation messages */\n messages: Message[];\n /**\n * Raw provider-formatted messages (for agent loop with tool calls)\n * When provided, these are used instead of converting from Message[]\n * This allows passing messages with tool_calls and tool role\n */\n rawMessages?: Array<Record<string, unknown>>;\n /** Available actions/tools */\n actions?: ActionDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** LLM configuration overrides */\n config?: RequestLLMConfig;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /**\n * Enable native web search for the provider.\n * When true or configured, the provider's native search is enabled.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * Non-streaming completion result\n */\nexport interface CompletionResult {\n /** Text content */\n content: string;\n /** Tool calls */\n toolCalls: Array<{ id: string; name: string; args: Record<string, unknown> }>;\n /** Thinking content (if extended thinking enabled) */\n thinking?: string;\n /** Token usage for billing/tracking */\n usage?: TokenUsage;\n /** Raw provider response for debugging */\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Base LLM adapter interface\n */\nexport interface LLMAdapter {\n /** Provider name */\n readonly provider: string;\n\n /** Model name */\n readonly model: string;\n\n /**\n * Stream a chat completion\n */\n stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent>;\n\n /**\n * Non-streaming chat completion (for debugging/comparison)\n */\n complete?(request: ChatCompletionRequest): Promise<CompletionResult>;\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory = (config: LLMConfig) => LLMAdapter;\n\n/**\n * Convert messages to provider format (simple text only)\n */\nexport function formatMessages(\n messages: Message[],\n systemPrompt?: string,\n): Array<{ role: string; content: string }> {\n const formatted: Array<{ role: string; content: string }> = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n // Add conversation messages\n for (const msg of messages) {\n formatted.push({\n role: msg.role,\n content: msg.content ?? \"\",\n });\n }\n\n return formatted;\n}\n\n/**\n * Convert ActionParameter to JSON Schema format recursively\n */\nfunction parameterToJsonSchema(param: {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n // Handle array items\n if (param.type === \"array\" && param.items) {\n schema.items = parameterToJsonSchema(\n param.items as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n );\n }\n\n // Handle nested object properties\n if (param.type === \"object\" && param.properties) {\n schema.properties = Object.fromEntries(\n Object.entries(param.properties).map(([key, prop]) => [\n key,\n parameterToJsonSchema(\n prop as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n ),\n ]),\n );\n }\n\n return schema;\n}\n\n/**\n * Convert actions to OpenAI tool format\n */\nexport function formatTools(actions: ActionDefinition[]): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return actions.map((action) => ({\n type: \"function\" as const,\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n parameterToJsonSchema(param),\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n },\n }));\n}\n\n// ============================================\n// Vision/Multimodal Support\n// ============================================\n\n/**\n * Content block types for multimodal messages\n */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n }\n | {\n type: \"document\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n };\n\nexport type OpenAIContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n };\n\n/**\n * Check if a message has image attachments\n * Supports both new format (metadata.attachments) and legacy (attachments)\n */\nexport function hasImageAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return attachments?.some((a) => a.type === \"image\") ?? false;\n}\n\n/**\n * Check if a message has media attachments (images or PDFs)\n */\nexport function hasMediaAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return (\n attachments?.some(\n (a) =>\n a.type === \"image\" ||\n (a.type === \"file\" && a.mimeType === \"application/pdf\"),\n ) ?? false\n );\n}\n\n/**\n * Convert MessageAttachment to Anthropic image content block\n *\n * Anthropic format:\n * {\n * type: \"image\",\n * source: {\n * type: \"base64\",\n * media_type: \"image/png\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicImage(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert MessageAttachment to OpenAI image_url content block\n *\n * OpenAI format:\n * {\n * type: \"image_url\",\n * image_url: {\n * url: \"data:image/png;base64,...\"\n * }\n * }\n */\nexport function attachmentToOpenAIImage(\n attachment: MessageAttachment,\n): OpenAIContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n let imageUrl: string;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Build data URI if not already one\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n return null;\n }\n\n return {\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n detail: \"auto\",\n },\n };\n}\n\n/**\n * Convert MessageAttachment (PDF) to Anthropic document content block\n *\n * Anthropic format:\n * {\n * type: \"document\",\n * source: {\n * type: \"base64\",\n * media_type: \"application/pdf\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicDocument(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n // Only handle PDF files\n if (attachment.type !== \"file\" || attachment.mimeType !== \"application/pdf\") {\n return null;\n }\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert a Message to Anthropic multimodal content blocks\n */\nexport function messageToAnthropicContent(\n message: Message,\n): string | AnthropicContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no media attachments (images or PDFs), return simple string\n if (!hasMediaAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: AnthropicContentBlock[] = [];\n\n // Add media attachments first (Claude recommends media before text)\n if (attachments) {\n for (const attachment of attachments) {\n // Try image first\n const imageBlock = attachmentToAnthropicImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n continue;\n }\n // Try document (PDF)\n const docBlock = attachmentToAnthropicDocument(attachment);\n if (docBlock) {\n blocks.push(docBlock);\n }\n }\n }\n\n // Add text content\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n return blocks;\n}\n\n/**\n * Convert a Message to OpenAI multimodal content blocks\n */\nexport function messageToOpenAIContent(\n message: Message,\n): string | OpenAIContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no image attachments, return simple string\n if (!hasImageAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: OpenAIContentBlock[] = [];\n\n // Add text content first\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n // Add image attachments\n if (attachments) {\n for (const attachment of attachments) {\n const imageBlock = attachmentToOpenAIImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n }\n }\n }\n\n return blocks;\n}\n\n/**\n * Anthropic content block types (extended for tools)\n */\nexport type AnthropicToolUseBlock = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type AnthropicToolResultBlock = {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n};\n\nexport type AnthropicMessageContent =\n | string\n | Array<\n AnthropicContentBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n >;\n\n/**\n * Format messages for Anthropic with full tool support\n * Handles: text, images, tool_use, and tool_result\n *\n * Key differences from OpenAI:\n * - tool_calls become tool_use blocks in assistant content\n * - tool results become tool_result blocks in user content\n */\nexport function formatMessagesForAnthropic(\n messages: Message[],\n systemPrompt?: string,\n): {\n system: string;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }>;\n} {\n const formatted: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }> = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") continue; // System handled separately\n\n if (msg.role === \"assistant\") {\n // Build content array for assistant\n const content: Array<AnthropicContentBlock | AnthropicToolUseBlock> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n formatted.push({\n role: \"assistant\",\n content:\n content.length === 1 && content[0].type === \"text\"\n ? (content[0] as { type: \"text\"; text: string }).text\n : content,\n });\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results go in user message as tool_result blocks\n // Group consecutive tool messages together\n const toolResults: AnthropicToolResultBlock[] = [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? \"\",\n },\n ];\n\n // Look ahead for more consecutive tool messages\n while (i + 1 < messages.length && messages[i + 1].role === \"tool\") {\n i++;\n const nextTool = messages[i];\n if (nextTool.tool_call_id) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: nextTool.tool_call_id,\n content: nextTool.content ?? \"\",\n });\n }\n }\n\n formatted.push({\n role: \"user\",\n content: toolResults,\n });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToAnthropicContent(msg),\n });\n }\n }\n\n return {\n system: systemPrompt || \"\",\n messages: formatted,\n };\n}\n\n/**\n * OpenAI message format with tool support\n */\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentBlock[] }\n | {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n }\n | { role: \"tool\"; content: string; tool_call_id: string };\n\n/**\n * Format messages for OpenAI with full tool support\n * Handles: text, images, tool_calls, and tool results\n */\nexport function formatMessagesForOpenAI(\n messages: Message[],\n systemPrompt?: string,\n): OpenAIMessage[] {\n const formatted: OpenAIMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n formatted.push({ role: \"system\", content: msg.content ?? \"\" });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToOpenAIContent(msg),\n });\n } else if (msg.role === \"assistant\") {\n const assistantMsg: OpenAIMessage = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n (assistantMsg as { tool_calls: typeof msg.tool_calls }).tool_calls =\n msg.tool_calls;\n }\n formatted.push(assistantMsg);\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n formatted.push({\n role: \"tool\",\n content: msg.content ?? \"\",\n tool_call_id: msg.tool_call_id,\n });\n }\n }\n\n return formatted;\n}\n","import type {\n LLMConfig,\n StreamEvent,\n WebSearchConfig,\n Citation,\n} from \"../core/stream-events\";\nimport { generateMessageId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport {\n formatMessagesForAnthropic,\n messageToAnthropicContent,\n type AnthropicContentBlock,\n} from \"./base\";\n\n/**\n * Extended thinking configuration\n */\nexport interface ThinkingConfig {\n type: \"enabled\";\n /** Budget for thinking tokens (minimum 1024) */\n budgetTokens?: number;\n}\n\n/**\n * Anthropic adapter configuration\n */\nexport interface AnthropicAdapterConfig {\n apiKey: string;\n model?: string;\n /** Base URL for API endpoint */\n baseUrl?: string;\n /** Enable extended thinking (for Claude 3.7 Sonnet, Claude 4) */\n thinking?: ThinkingConfig;\n temperature?: number;\n maxTokens?: number;\n /**\n * Enable native web search for Claude.\n * When true, Claude can search the web to answer questions.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * Anthropic LLM Adapter\n *\n * Supports: Claude 3.5 Sonnet, Claude 3 Opus, Claude 3 Haiku, etc.\n */\nexport class AnthropicAdapter implements LLMAdapter {\n readonly provider = \"anthropic\";\n readonly model: string;\n\n private client: any; // Anthropic client (lazy loaded)\n private config: AnthropicAdapterConfig;\n\n constructor(config: AnthropicAdapterConfig) {\n this.config = config;\n this.model = config.model || \"claude-3-5-sonnet-latest\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @anthropic-ai/sdk optional\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.client = new Anthropic({\n apiKey: this.config.apiKey,\n });\n }\n return this.client;\n }\n\n /**\n * Convert OpenAI-style messages to Anthropic format\n *\n * OpenAI format:\n * - { role: \"assistant\", content: \"...\", tool_calls: [...] }\n * - { role: \"tool\", tool_call_id: \"...\", content: \"...\" }\n *\n * Anthropic format:\n * - { role: \"assistant\", content: [{ type: \"text\", text: \"...\" }, { type: \"tool_use\", id: \"...\", name: \"...\", input: {...} }] }\n * - { role: \"user\", content: [{ type: \"tool_result\", tool_use_id: \"...\", content: \"...\" }] }\n */\n private convertToAnthropicMessages(\n rawMessages: Array<Record<string, unknown>>,\n ): Array<Record<string, unknown>> {\n const messages: Array<Record<string, unknown>> = [];\n const pendingToolResults: Array<{ tool_use_id: string; content: string }> =\n [];\n\n // Track tool_use ids from assistant messages for inference\n let lastToolCallIds: string[] = [];\n let toolResultIndex = 0;\n\n for (const msg of rawMessages) {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") continue;\n\n if (msg.role === \"assistant\") {\n // CRITICAL: Insert pending tool results BEFORE adding any assistant message\n // Anthropic requires: assistant(tool_use) → user(tool_result) → assistant(response)\n // Without this, the sequence becomes: assistant(tool_use) → assistant(response) → user(tool_result)\n // which violates Anthropic's API requirements and causes error:\n // \"tool_use ids were found without tool_result blocks immediately after\"\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n // Clear tracking - tool results have been flushed, any subsequent\n // tool results without a new tool_use are orphaned\n lastToolCallIds = [];\n toolResultIndex = 0;\n }\n\n // Convert assistant message with potential tool_calls\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (\n msg.content &&\n typeof msg.content === \"string\" &&\n msg.content.trim()\n ) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n const toolCalls = msg.tool_calls as\n | Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>\n | undefined;\n\n if (toolCalls && toolCalls.length > 0) {\n // Track tool call IDs for inferring missing tool_call_id in tool messages\n lastToolCallIds = toolCalls.map((tc) => tc.id);\n toolResultIndex = 0;\n\n for (const tc of toolCalls) {\n let input = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty object if parse fails\n }\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input,\n });\n }\n }\n\n // Only add if there's content\n if (content.length > 0) {\n messages.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n // Collect tool results to be bundled into a user message\n let toolCallId = msg.tool_call_id as string | undefined;\n\n // If tool_call_id is missing, try to infer from preceding assistant's tool_calls\n if (!toolCallId && lastToolCallIds.length > 0) {\n toolCallId = lastToolCallIds[toolResultIndex];\n toolResultIndex++;\n console.warn(\n `[llm-sdk] Tool message missing tool_call_id, inferred: ${toolCallId}`,\n );\n }\n\n if (!toolCallId) {\n console.warn(\n \"[llm-sdk] Skipping tool message with missing tool_call_id (no inference possible):\",\n msg,\n );\n continue;\n }\n\n // Skip orphaned tool results (no pending tool_use to match)\n // This happens when there's a duplicate/stale tool result in the conversation\n if (lastToolCallIds.length === 0) {\n console.warn(\n `[llm-sdk] Skipping orphaned tool result (no pending tool_use): ${toolCallId}`,\n );\n continue;\n }\n\n // Skip if this tool_call_id is not in the expected list\n if (!lastToolCallIds.includes(toolCallId)) {\n console.warn(\n `[llm-sdk] Skipping tool result with unexpected tool_call_id: ${toolCallId}`,\n );\n continue;\n }\n\n pendingToolResults.push({\n tool_use_id: toolCallId,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n } else if (msg.role === \"user\") {\n // First, flush any pending tool results as a user message\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n // Check if message has attachments (images)\n if (\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0\n ) {\n // Convert to Anthropic multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content && typeof msg.content === \"string\") {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add attachments (images, PDFs)\n for (const attachment of msg.attachments as Array<{\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n if (attachment.url) {\n // Use URL directly (cloud storage) - Anthropic supports URL sources\n content.push({\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n // Use base64 data\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n // Extract base64 from data URL\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n });\n }\n } else if (\n attachment.type === \"file\" &&\n attachment.mimeType === \"application/pdf\"\n ) {\n // PDF documents - Anthropic uses \"document\" type\n if (attachment.url) {\n content.push({\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n });\n } else if (attachment.data) {\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n content.push({\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n });\n }\n }\n }\n\n messages.push({ role: \"user\", content });\n } else {\n // Add user message without attachments\n messages.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content),\n });\n }\n }\n }\n\n // Flush any remaining tool results\n if (pendingToolResults.length > 0) {\n messages.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.tool_use_id,\n content: tr.content,\n })),\n });\n }\n\n return messages;\n }\n\n /**\n * Build common request options for both streaming and non-streaming\n */\n private buildRequestOptions(request: ChatCompletionRequest): {\n options: Record<string, unknown>;\n messages: Array<Record<string, unknown>>;\n } {\n // Extract system message\n const systemMessage = request.systemPrompt || \"\";\n\n // Use raw messages if provided (for agent loop with tool calls)\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Convert OpenAI-style messages to Anthropic format\n messages = this.convertToAnthropicMessages(request.rawMessages);\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n const formatted = formatMessagesForAnthropic(request.messages, undefined);\n messages = formatted.messages as Array<Record<string, unknown>>;\n }\n\n // Convert actions to Anthropic tool format\n const tools: Array<Record<string, unknown>> =\n request.actions?.map((action) => ({\n name: action.name,\n description: action.description,\n input_schema: {\n type: \"object\" as const,\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n enum: param.enum,\n },\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n })) || [];\n\n // Check for web search configuration (from request or adapter config)\n const webSearchConfig = request.webSearch ?? this.config.webSearch;\n let serverToolConfiguration: Record<string, unknown> | undefined;\n\n if (webSearchConfig) {\n // Add web_search tool (using latest API version)\n // allowed_callers: [\"direct\"] is required for Haiku models\n tools.push({\n type: \"web_search_20260209\",\n name: \"web_search\",\n allowed_callers: [\"direct\"],\n });\n\n // Build server tool configuration\n const wsConfig =\n typeof webSearchConfig === \"object\" ? webSearchConfig : {};\n const webSearchToolConfig: Record<string, unknown> = {};\n\n if (wsConfig.maxUses !== undefined) {\n webSearchToolConfig.max_uses = wsConfig.maxUses;\n }\n\n if (wsConfig.allowedDomains && wsConfig.allowedDomains.length > 0) {\n webSearchToolConfig.allowed_domains = wsConfig.allowedDomains;\n }\n\n if (wsConfig.blockedDomains && wsConfig.blockedDomains.length > 0) {\n webSearchToolConfig.blocked_domains = wsConfig.blockedDomains;\n }\n\n if (wsConfig.userLocation) {\n webSearchToolConfig.user_location = wsConfig.userLocation;\n }\n\n // Only add server_tool_configuration if we have any config\n if (Object.keys(webSearchToolConfig).length > 0) {\n serverToolConfiguration = {\n web_search: webSearchToolConfig,\n };\n }\n }\n\n // Build request options\n const options: Record<string, unknown> = {\n model: request.config?.model || this.model,\n max_tokens: request.config?.maxTokens || this.config.maxTokens || 4096,\n system: systemMessage,\n messages,\n tools: tools.length ? tools : undefined,\n };\n\n // Add server tool configuration for web search\n if (serverToolConfiguration) {\n options.server_tool_configuration = serverToolConfiguration;\n }\n\n // Add thinking configuration if enabled\n if (this.config.thinking?.type === \"enabled\") {\n options.thinking = {\n type: \"enabled\",\n budget_tokens: this.config.thinking.budgetTokens || 10000,\n };\n }\n\n return { options, messages };\n }\n\n /**\n * Non-streaming completion (for debugging/comparison with original studio-ai)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n // Ensure non-streaming mode\n const nonStreamingOptions = {\n ...options,\n stream: false as const,\n } as Record<string, unknown> & { stream: false };\n\n try {\n const response = await client.messages.create(nonStreamingOptions);\n\n // Parse response\n let content = \"\";\n let thinking = \"\";\n const toolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n content += block.text;\n } else if (block.type === \"thinking\") {\n thinking += (block as { thinking: string }).thinking;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n content,\n toolCalls,\n thinking: thinking || undefined,\n rawResponse: response as Record<string, unknown>,\n };\n } catch (error) {\n throw error;\n }\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const { options } = this.buildRequestOptions(request);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n const stream = await client.messages.stream(options);\n\n let currentToolUse: {\n id: string;\n name: string;\n input: string;\n } | null = null;\n\n let isInThinkingBlock = false;\n\n // Track citations from web search\n const collectedCitations: Citation[] = [];\n let citationIndex = 0;\n\n // Track usage - Anthropic sends input_tokens in message_start and output_tokens in message_delta\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n for await (const event of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n switch (event.type) {\n case \"message_start\":\n // Capture input tokens from message_start\n if (event.message?.usage) {\n usage = {\n prompt_tokens: event.message.usage.input_tokens,\n completion_tokens: 0,\n total_tokens: event.message.usage.input_tokens,\n };\n }\n break;\n\n case \"message_delta\":\n // Capture output tokens from message_delta\n if (event.usage && usage) {\n usage.completion_tokens = event.usage.output_tokens;\n usage.total_tokens =\n usage.prompt_tokens + event.usage.output_tokens;\n }\n break;\n\n case \"content_block_start\":\n if (event.content_block.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n // Don't emit action events for native web_search - citations handle the UI\n if (currentToolUse.name !== \"web_search\") {\n yield {\n type: \"action:start\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n } else if (event.content_block.type === \"web_search_tool_result\") {\n // Extract citations from web search results\n const webSearchResult = event.content_block as {\n type: \"web_search_tool_result\";\n tool_use_id: string;\n content: Array<{\n type: \"web_search_result\";\n title: string;\n url: string;\n page_age?: string | null;\n }>;\n };\n if (\n webSearchResult.content &&\n Array.isArray(webSearchResult.content)\n ) {\n for (const result of webSearchResult.content) {\n if (result.type === \"web_search_result\" && result.url) {\n citationIndex++;\n const domain = extractDomain(result.url);\n collectedCitations.push({\n index: citationIndex,\n url: result.url,\n title: result.title || domain,\n domain,\n favicon: domain\n ? `https://www.google.com/s2/favicons?domain=${domain}&sz=32`\n : undefined,\n });\n }\n }\n }\n // Don't emit action:end for native web_search - citations handle the UI\n } else if (event.content_block.type === \"thinking\") {\n // Start of thinking block\n isInThinkingBlock = true;\n yield { type: \"thinking:start\" };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta.type === \"text_delta\") {\n yield { type: \"message:delta\", content: event.delta.text };\n } else if (event.delta.type === \"citations_delta\") {\n // Handle citations_delta events from web search\n const citationsDelta = event.delta as {\n type: \"citations_delta\";\n citation: {\n type: string;\n url?: string;\n title?: string;\n cited_text?: string;\n };\n };\n\n if (citationsDelta.citation?.url) {\n citationIndex++;\n const domain = extractDomain(citationsDelta.citation.url);\n collectedCitations.push({\n index: citationIndex,\n url: citationsDelta.citation.url,\n title: citationsDelta.citation.title || domain,\n citedText: citationsDelta.citation.cited_text,\n domain,\n favicon: domain\n ? `https://www.google.com/s2/favicons?domain=${domain}&sz=32`\n : undefined,\n });\n }\n } else if (event.delta.type === \"thinking_delta\") {\n // Thinking content delta\n yield { type: \"thinking:delta\", content: event.delta.thinking };\n } else if (\n event.delta.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n // Don't emit action events for native web_search - citations handle the UI\n if (currentToolUse.name !== \"web_search\") {\n yield {\n type: \"action:args\",\n id: currentToolUse.id,\n args: currentToolUse.input,\n };\n // For server-side tools, emit action:end immediately\n // as Anthropic handles execution and results come inline\n yield {\n type: \"action:end\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\n }\n currentToolUse = null;\n }\n if (isInThinkingBlock) {\n yield { type: \"thinking:end\" };\n isInThinkingBlock = false;\n }\n break;\n\n case \"message_stop\":\n break;\n }\n }\n\n // Emit citations if we collected any\n if (collectedCitations.length > 0) {\n // Deduplicate citations by URL\n const uniqueCitations = deduplicateCitations(collectedCitations);\n yield { type: \"citation\", citations: uniqueCitations };\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\", usage };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"ANTHROPIC_ERROR\",\n };\n }\n }\n}\n\n/**\n * Extract domain from URL\n */\nfunction extractDomain(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.hostname;\n } catch {\n return \"\";\n }\n}\n\n/**\n * Deduplicate citations by URL\n */\nfunction deduplicateCitations(citations: Citation[]): Citation[] {\n const seen = new Map<string, Citation>();\n let index = 0;\n for (const citation of citations) {\n if (!seen.has(citation.url)) {\n index++;\n seen.set(citation.url, { ...citation, index });\n }\n }\n return Array.from(seen.values());\n}\n\n/**\n * Create Anthropic adapter\n */\nexport function createAnthropicAdapter(\n config: AnthropicAdapterConfig,\n): AnthropicAdapter {\n return new AnthropicAdapter(config);\n}\n","/**\n * Provider Types\n *\n * Defines interfaces for:\n * 1. Provider Formatters (for tool transformations in agent loop)\n * 2. Multi-provider architecture (AIProvider, capabilities, configs)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type { LLMAdapter } from \"../adapters/base\";\n\n// ============================================\n// Provider Formatter Types (for agent loop)\n// ============================================\n\n/**\n * Provider formatter interface\n *\n * Each provider implements this interface to handle:\n * - Tool definition transformation\n * - Tool call parsing from responses\n * - Tool result formatting\n * - Stop reason detection\n */\nexport interface ProviderFormatter {\n /**\n * Transform unified tool definitions to provider format\n */\n transformTools(tools: ToolDefinition[]): unknown[];\n\n /**\n * Parse tool calls from provider response\n */\n parseToolCalls(response: unknown): UnifiedToolCall[];\n\n /**\n * Format tool results for provider\n */\n formatToolResults(results: UnifiedToolResult[]): unknown[];\n\n /**\n * Check if response indicates tool use is requested\n */\n isToolUseStop(response: unknown): boolean;\n\n /**\n * Check if response indicates end of turn\n */\n isEndTurnStop(response: unknown): boolean;\n\n /**\n * Get stop reason string from response\n */\n getStopReason(response: unknown): string;\n\n /**\n * Extract text content from response\n */\n extractTextContent(response: unknown): string;\n\n /**\n * Build assistant message with tool calls for conversation history\n */\n buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n ): unknown;\n\n /**\n * Build user message with tool results for conversation history\n */\n buildToolResultMessage(results: UnifiedToolResult[]): unknown;\n}\n\n// ============================================\n// Anthropic Tool Types\n// ============================================\n\n/**\n * Anthropic tool definition format\n */\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Anthropic tool_use block from response\n */\nexport interface AnthropicToolUse {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Anthropic tool_result block\n */\nexport interface AnthropicToolResult {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n}\n\n// ============================================\n// OpenAI Tool Types\n// ============================================\n\n/**\n * OpenAI tool definition format\n */\nexport interface OpenAITool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n };\n}\n\n/**\n * OpenAI tool call from response\n */\nexport interface OpenAIToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n}\n\n/**\n * OpenAI tool result message\n */\nexport interface OpenAIToolResult {\n role: \"tool\";\n tool_call_id: string;\n content: string;\n}\n\n// ============================================\n// Gemini Tool Types\n// ============================================\n\n/**\n * Google Gemini function declaration\n */\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Gemini function call from response\n */\nexport interface GeminiFunctionCall {\n name: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Gemini function response\n */\nexport interface GeminiFunctionResponse {\n name: string;\n response: Record<string, unknown>;\n}\n\n// ============================================\n// Provider Capabilities (for UI feature flags)\n// ============================================\n\n/**\n * Capabilities of a model for UI feature flags\n * UI components can use this to enable/disable features\n */\nexport interface ProviderCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports extended thinking (Claude, DeepSeek) */\n supportsThinking: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Supports audio inputs */\n supportsAudio: boolean;\n /** Supports video inputs */\n supportsVideo: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n /** Supported audio MIME types */\n supportedAudioTypes?: string[];\n /** Supported video MIME types */\n supportedVideoTypes?: string[];\n /** Supports JSON mode / structured output */\n supportsJsonMode?: boolean;\n /** Supports system messages */\n supportsSystemMessages?: boolean;\n}\n\n// ============================================\n// AI Provider Interface\n// ============================================\n\n/**\n * AI Provider interface (object form)\n *\n * Wraps existing LLMAdapter with additional metadata:\n * - Supported models list\n * - Per-model capabilities\n * - Provider name\n */\nexport interface AIProviderObject {\n /** Provider name (e.g., 'openai', 'anthropic') */\n readonly name: string;\n\n /** List of supported model IDs */\n readonly supportedModels: string[];\n\n /**\n * Get a language model adapter for the given model ID\n * Returns the existing LLMAdapter interface - no breaking changes\n */\n languageModel(modelId: string): LLMAdapter;\n\n /**\n * Get capabilities for a specific model\n * UI components use this to enable/disable features\n */\n getCapabilities(modelId: string): ProviderCapabilities;\n\n /**\n * Optional: Get an embedding model (future expansion)\n */\n embeddingModel?(modelId: string): EmbeddingModel;\n}\n\n/**\n * Callable AI Provider (Vercel AI SDK style)\n *\n * A function that returns a LanguageModel when called with a model ID,\n * but also has properties for provider metadata and methods.\n *\n * @example\n * ```typescript\n * const openai = createOpenAI({ apiKey: '...' });\n *\n * // Callable - returns LanguageModel directly (Vercel AI SDK style)\n * const model = openai('gpt-4o');\n *\n * // Also supports method calls (backward compatible)\n * const model2 = openai.languageModel('gpt-4o');\n *\n * // Check capabilities\n * const caps = openai.getCapabilities('gpt-4o');\n * if (caps.supportsVision) {\n * // Show image upload button\n * }\n * ```\n */\nexport interface AIProvider extends AIProviderObject {\n /**\n * Call the provider directly with a model ID to get a LanguageModel\n * This is the Vercel AI SDK style pattern\n */\n (modelId: string): LLMAdapter;\n}\n\n/**\n * Helper to create a callable AIProvider\n * Combines a callable function with AIProvider properties\n */\nexport function createCallableProvider(\n providerFn: (modelId: string) => LLMAdapter,\n properties: Omit<AIProviderObject, \"languageModel\">,\n): AIProvider {\n // Define 'name' property using defineProperty since it's read-only on functions\n Object.defineProperty(providerFn, \"name\", {\n value: properties.name,\n writable: false,\n configurable: true,\n });\n\n // Assign other properties\n Object.assign(providerFn, {\n supportedModels: properties.supportedModels,\n languageModel: providerFn,\n getCapabilities: properties.getCapabilities,\n embeddingModel: properties.embeddingModel,\n });\n\n return providerFn as AIProvider;\n}\n\n/**\n * Embedding model interface (for future expansion)\n */\nexport interface EmbeddingModel {\n readonly provider: string;\n readonly modelId: string;\n embed(texts: string[]): Promise<number[][]>;\n}\n\n// ============================================\n// Provider-Specific Configurations\n// ============================================\n\n/**\n * Base provider configuration\n */\nexport interface BaseProviderConfig {\n /** API key (falls back to environment variable) */\n apiKey?: string;\n /** Custom base URL */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Custom headers to include */\n headers?: Record<string, string>;\n}\n\n/**\n * OpenAI provider configuration\n */\nexport interface OpenAIProviderConfig extends BaseProviderConfig {\n /** OpenAI organization ID */\n organization?: string;\n /** OpenAI project ID */\n project?: string;\n /** Vision detail level for images */\n imageDetail?: \"auto\" | \"low\" | \"high\";\n}\n\n/**\n * Anthropic provider configuration\n */\nexport interface AnthropicProviderConfig extends BaseProviderConfig {\n /** Extended thinking budget in tokens (minimum 1024) */\n thinkingBudget?: number;\n /** Enable prompt caching */\n cacheControl?: boolean;\n}\n\n/**\n * Google provider configuration\n */\nexport interface GoogleProviderConfig extends BaseProviderConfig {\n /** Safety settings */\n safetySettings?: GoogleSafetySetting[];\n /** Grounding configuration (for web search) */\n groundingConfig?: GoogleGroundingConfig;\n}\n\n/**\n * Google safety setting\n */\nexport interface GoogleSafetySetting {\n category:\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\";\n threshold:\n | \"BLOCK_NONE\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_HIGH_AND_ABOVE\";\n}\n\n/**\n * Google grounding configuration\n */\nexport interface GoogleGroundingConfig {\n /** Enable Google Search grounding */\n googleSearchRetrieval?: boolean;\n}\n\n/**\n * xAI provider configuration\n */\nexport interface XAIProviderConfig extends BaseProviderConfig {\n // xAI uses OpenAI-compatible API, no extra config needed\n}\n\n/**\n * Azure OpenAI provider configuration\n */\nexport interface AzureProviderConfig extends BaseProviderConfig {\n /** Azure resource name */\n resourceName: string;\n /** Deployment name */\n deploymentName: string;\n /** API version (default: 2024-02-15-preview) */\n apiVersion?: string;\n}\n\n/**\n * Ollama model-specific options\n * These map to Ollama's native API options\n */\nexport interface OllamaModelOptions {\n /** Context window size (default varies by model) */\n num_ctx?: number;\n /** Max tokens to predict (-1 = infinite, -2 = fill context) */\n num_predict?: number;\n /** Mirostat sampling (0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0) */\n mirostat?: 0 | 1 | 2;\n /** Mirostat learning rate (default: 0.1) */\n mirostat_eta?: number;\n /** Mirostat target entropy (default: 5.0) */\n mirostat_tau?: number;\n /** Repeat penalty (default: 1.1) */\n repeat_penalty?: number;\n /** Random seed for reproducibility (-1 = random) */\n seed?: number;\n /** Top-k sampling (default: 40) */\n top_k?: number;\n /** Top-p (nucleus) sampling (default: 0.9) */\n top_p?: number;\n /** Min-p sampling (default: 0.0) */\n min_p?: number;\n /** Stop sequences */\n stop?: string[];\n /** Temperature override (also available in config) */\n temperature?: number;\n}\n\n/**\n * Ollama provider configuration\n */\nexport interface OllamaProviderConfig extends BaseProviderConfig {\n /** Default Ollama-specific model options */\n options?: OllamaModelOptions;\n}\n\n// ============================================\n// Model Information\n// ============================================\n\n/**\n * Model information for a provider\n */\nexport interface ModelInfo {\n /** Model ID */\n id: string;\n /** Display name */\n name: string;\n /** Description */\n description?: string;\n /** Capabilities */\n capabilities: ProviderCapabilities;\n /** Context window size */\n contextWindow: number;\n /** Pricing info (optional) */\n pricing?: {\n inputPerMillion?: number;\n outputPerMillion?: number;\n };\n}\n\n// ============================================\n// Default Capabilities\n// ============================================\n\n/**\n * Default capabilities for unknown models\n */\nexport const DEFAULT_CAPABILITIES: ProviderCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n};\n","/**\n * Anthropic Provider\n *\n * Modern pattern: anthropic('claude-3-5-sonnet') returns a LanguageModel\n * Legacy pattern: createAnthropic({ apiKey }) returns an AIProvider\n */\n\n// NEW: Modern pattern - anthropic() function\nexport { anthropic, createAnthropic as createAnthropicModel } from \"./provider\";\nexport type { AnthropicProviderOptions } from \"./provider\";\n\nimport { createAnthropicAdapter } from \"../../adapters/anthropic\";\nimport {\n createCallableProvider,\n type AIProvider,\n type ProviderCapabilities,\n type AnthropicProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, ModelCapabilities> = {\n // Claude 4 series (latest)\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 64000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 32000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic provider (callable, Vercel AI SDK style)\n *\n * @example\n * ```typescript\n * const anthropic = createAnthropic({\n * apiKey: '...',\n * thinkingBudget: 10000, // Enable extended thinking\n * });\n *\n * // Callable - Vercel AI SDK style\n * const model = anthropic('claude-sonnet-4-20250514');\n *\n * // Also supports method call (backward compatible)\n * const model2 = anthropic.languageModel('claude-sonnet-4-20250514');\n *\n * // Check capabilities\n * const caps = anthropic.getCapabilities('claude-sonnet-4-20250514');\n * ```\n */\nexport function createAnthropic(\n config: AnthropicProviderConfig = {},\n): AIProvider {\n const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY ?? \"\";\n\n // Create the callable function\n const providerFn = (modelId: string) => {\n return createAnthropicAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n thinking: config.thinkingBudget\n ? { type: \"enabled\", budgetTokens: config.thinkingBudget }\n : undefined,\n });\n };\n\n // Get capabilities helper\n const getCapabilities = (modelId: string): ProviderCapabilities => {\n const model =\n ANTHROPIC_MODELS[modelId] ?? ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: model.thinking,\n supportsStreaming: true,\n supportsPDF: true,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n };\n };\n\n return createCallableProvider(providerFn, {\n name: \"anthropic\",\n supportedModels: Object.keys(ANTHROPIC_MODELS),\n getCapabilities,\n });\n}\n\n// Alias for consistency\nexport const createAnthropicProvider = createAnthropic;\n"]}