@yourgpt/llm-sdk 2.1.0 → 2.1.2

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 +1 @@
1
- {"version":3,"sources":["../../src/adapters/base.ts","../../src/core/utils.ts","../../src/adapters/openai.ts","../../src/adapters/anthropic.ts","../../src/adapters/ollama.ts","../../src/adapters/google.ts","../../src/adapters/xai.ts","../../src/adapters/azure.ts"],"names":["extractDomain","deduplicateCitations","chunk"],"mappings":"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","file":"index.mjs","sourcesContent":["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","/**\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 LLMConfig,\n StreamEvent,\n WebSearchConfig,\n Citation,\n} from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n/**\n * OpenAI adapter configuration\n */\nexport interface OpenAIAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /**\n * Enable native web search for GPT models.\n * Uses OpenAI's web_search_preview tool.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * OpenAI LLM Adapter\n *\n * Supports: GPT-4, GPT-4o, GPT-3.5-turbo, etc.\n */\nexport class OpenAIAdapter implements LLMAdapter {\n readonly provider = \"openai\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: OpenAIAdapterConfig;\n\n constructor(config: OpenAIAdapterConfig) {\n this.config = config;\n this.model = config.model || \"gpt-4o\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make openai optional\n const { default: OpenAI } = await import(\"openai\");\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\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 let imageUrl: string;\n\n if (attachment.url) {\n // Use URL directly (cloud storage)\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Use base64 data\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n continue; // Skip if no data or URL\n }\n\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n // Build tools array\n const tools: Array<Record<string, unknown>> = request.actions?.length\n ? formatTools(request.actions)\n : [];\n\n // Check for web search configuration (from request or adapter config)\n const webSearchConfig = request.webSearch ?? this.config.webSearch;\n\n if (webSearchConfig) {\n // Add web_search_preview tool for OpenAI\n const webSearchTool: Record<string, unknown> = {\n type: \"web_search_preview\",\n };\n\n // Add search context config if provided\n const wsConfig =\n typeof webSearchConfig === \"object\" ? webSearchConfig : {};\n\n if (wsConfig.userLocation) {\n webSearchTool.search_context_size = \"medium\"; // OpenAI uses size, not location\n }\n\n tools.push(webSearchTool);\n }\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.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n // Track citations from web search\n const collectedCitations: Citation[] = [];\n let citationIndex = 0;\n\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n const choice = chunk.choices[0];\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle annotations (citations from web search) - OpenAI includes these in delta\n const annotations = (\n delta as {\n annotations?: Array<{\n type: string;\n url_citation?: { url: string; title?: string };\n }>;\n }\n )?.annotations;\n\n if (annotations && annotations.length > 0) {\n for (const annotation of annotations) {\n if (\n annotation.type === \"url_citation\" &&\n annotation.url_citation?.url\n ) {\n citationIndex++;\n const url = annotation.url_citation.url;\n const domain = extractDomain(url);\n collectedCitations.push({\n index: citationIndex,\n url,\n title: annotation.url_citation.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\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Capture usage from final chunk (OpenAI sends it with stream_options.include_usage)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n };\n }\n\n // Check for finish\n if (choice?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit citations if we collected any\n if (collectedCitations.length > 0) {\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: \"OPENAI_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 OpenAI adapter\n */\nexport function createOpenAIAdapter(\n config: OpenAIAdapterConfig,\n): OpenAIAdapter {\n return new OpenAIAdapter(config);\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","import type {\n StreamEvent,\n Message,\n MessageAttachment,\n} from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessages, formatTools } from \"./base\";\nimport type { OllamaModelOptions } from \"../providers/types\";\n\n/**\n * Ollama adapter configuration\n */\nexport interface OllamaAdapterConfig {\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /** Ollama-specific model options */\n options?: OllamaModelOptions;\n}\n\n/**\n * Ollama message format with vision support\n */\ninterface OllamaMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n images?: string[];\n tool_calls?: Array<{\n id?: string;\n function: {\n name: string;\n arguments: Record<string, unknown>;\n };\n }>;\n tool_call_id?: string;\n}\n\n/**\n * Extract base64 data from attachment\n * Removes data URI prefix if present\n */\nfunction extractBase64Data(data: string): string {\n if (data.startsWith(\"data:\")) {\n const commaIndex = data.indexOf(\",\");\n if (commaIndex !== -1) {\n return data.slice(commaIndex + 1);\n }\n }\n return data;\n}\n\n/**\n * Download image from URL and convert to base64\n * Following Vercel AI SDK pattern\n */\nasync function downloadImageAsBase64(url: string): Promise<string | null> {\n try {\n const response = await fetch(url);\n if (!response.ok) return null;\n\n const buffer = await response.arrayBuffer();\n const base64 = Buffer.from(buffer).toString(\"base64\");\n return base64;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract images from message attachments\n * Returns array of base64 strings (Ollama format)\n */\nasync function extractImagesFromAttachments(\n attachments?: MessageAttachment[],\n): Promise<string[]> {\n if (!attachments) return [];\n\n const images: string[] = [];\n\n for (const attachment of attachments) {\n if (attachment.type !== \"image\") continue;\n\n if (attachment.data) {\n // Use base64 data directly\n images.push(extractBase64Data(attachment.data));\n } else if (attachment.url) {\n // Download image from URL (like Vercel AI SDK does)\n const base64 = await downloadImageAsBase64(attachment.url);\n if (base64) {\n images.push(base64);\n }\n }\n }\n\n return images;\n}\n\n/**\n * Format messages for Ollama with vision and tool support\n */\nasync function formatMessagesForOllama(\n messages: Message[],\n systemPrompt?: string,\n): Promise<OllamaMessage[]> {\n const formatted: OllamaMessage[] = [];\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 const baseMessage: OllamaMessage = {\n role: msg.role as OllamaMessage[\"role\"],\n content: msg.content ?? \"\",\n };\n\n // Handle image attachments (vision support)\n if (msg.role === \"user\" && msg.metadata?.attachments) {\n const images = await extractImagesFromAttachments(\n msg.metadata.attachments,\n );\n if (images.length > 0) {\n baseMessage.images = images;\n }\n }\n\n // Handle tool calls on assistant messages\n if (\n msg.role === \"assistant\" &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n baseMessage.tool_calls = msg.tool_calls.map((tc) => ({\n id: tc.id,\n function: {\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n },\n }));\n }\n\n // Handle tool results\n if (msg.role === \"tool\" && msg.tool_call_id) {\n baseMessage.tool_call_id = msg.tool_call_id;\n }\n\n formatted.push(baseMessage);\n }\n\n return formatted;\n}\n\n/**\n * Process raw messages for Ollama\n * Handles conversion of attachments to Ollama image format\n */\nasync function processRawMessagesForOllama(\n rawMessages: Array<Record<string, unknown>>,\n systemPrompt?: string,\n): Promise<OllamaMessage[]> {\n const processed: OllamaMessage[] = [];\n\n // Add system prompt if provided and not already present\n if (systemPrompt) {\n const hasSystem = rawMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n processed.push({ role: \"system\", content: systemPrompt });\n }\n }\n\n for (const msg of rawMessages) {\n const baseMessage: OllamaMessage = {\n role: msg.role as OllamaMessage[\"role\"],\n content: (msg.content as string) ?? \"\",\n };\n\n // Handle attachments for vision\n if (\n msg.role === \"user\" &&\n msg.attachments &&\n Array.isArray(msg.attachments)\n ) {\n const attachments = msg.attachments as MessageAttachment[];\n const images = await extractImagesFromAttachments(attachments);\n if (images.length > 0) {\n baseMessage.images = images;\n }\n }\n\n // Handle tool calls\n if (msg.tool_calls && Array.isArray(msg.tool_calls)) {\n baseMessage.tool_calls = (\n msg.tool_calls as Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>\n ).map((tc) => ({\n id: tc.id,\n function: {\n name: tc.function.name,\n arguments:\n typeof tc.function.arguments === \"string\"\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments,\n },\n }));\n }\n\n // Handle tool result\n if (msg.tool_call_id) {\n baseMessage.tool_call_id = msg.tool_call_id as string;\n }\n\n processed.push(baseMessage);\n }\n\n return processed;\n}\n\n/**\n * Ollama LLM Adapter (Local models)\n *\n * Supports: Llama 3, Mistral, Phi, Gemma, CodeLlama, LLaVA (vision), etc.\n *\n * Features:\n * - Tool/function calling (OpenAI-compatible format)\n * - Vision support (images via base64)\n * - Ollama-specific options (num_ctx, mirostat, etc.)\n * - Raw message support for agent loop\n */\nexport class OllamaAdapter implements LLMAdapter {\n readonly provider = \"ollama\";\n readonly model: string;\n\n private baseUrl: string;\n private config: OllamaAdapterConfig;\n\n constructor(config: OllamaAdapterConfig = {}) {\n this.config = config;\n this.model = config.model || \"llama3\";\n this.baseUrl = config.baseUrl || \"http://localhost:11434\";\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n // Prepare messages - use rawMessages if provided (for agent loop), otherwise format from Message[]\n let messages: OllamaMessage[];\n\n if (request.rawMessages && request.rawMessages.length > 0) {\n messages = await processRawMessagesForOllama(\n request.rawMessages,\n request.systemPrompt,\n );\n } else {\n messages = await formatMessagesForOllama(\n request.messages,\n request.systemPrompt,\n );\n }\n\n // Format tools for Ollama (OpenAI-compatible format)\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n // Build Ollama options\n const ollamaOptions: Record<string, unknown> = {\n temperature: request.config?.temperature ?? this.config.temperature,\n };\n\n // Add num_predict for maxTokens\n const maxTokens = request.config?.maxTokens ?? this.config.maxTokens;\n if (maxTokens !== undefined) {\n ollamaOptions.num_predict = maxTokens;\n }\n\n // Merge in Ollama-specific options\n if (this.config.options) {\n Object.assign(ollamaOptions, this.config.options);\n }\n\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: request.config?.model || this.model,\n messages,\n tools,\n stream: true,\n options: ollamaOptions,\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new Error(`Ollama API error: ${response.status} - ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let hasEmittedToolCalls = false;\n\n // Track accumulated tool calls for streaming\n const toolCallsInProgress: Map<\n number,\n { id: string; name: string; arguments: Record<string, unknown> }\n > = new Map();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const chunk = JSON.parse(line);\n\n // Handle content\n if (chunk.message?.content) {\n yield { type: \"message:delta\", content: chunk.message.content };\n }\n\n // Handle tool calls from Ollama\n if (chunk.message?.tool_calls && !hasEmittedToolCalls) {\n for (let i = 0; i < chunk.message.tool_calls.length; i++) {\n const toolCall = chunk.message.tool_calls[i];\n const toolCallId = toolCall.id || generateToolCallId();\n\n // Store the tool call\n toolCallsInProgress.set(i, {\n id: toolCallId,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || {},\n });\n\n // Emit action start\n yield {\n type: \"action:start\",\n id: toolCallId,\n name: toolCall.function?.name || \"\",\n };\n\n // Emit action args (Ollama sends complete args, not streamed)\n yield {\n type: \"action:args\",\n id: toolCallId,\n args: JSON.stringify(toolCall.function?.arguments || {}),\n };\n }\n hasEmittedToolCalls = true;\n }\n\n // Ollama indicates completion with done: true\n if (chunk.done) {\n break;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n if ((error as Error).name === \"AbortError\") {\n yield { type: \"done\" };\n } else {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n\n // Provide helpful error messages for common issues\n let code = \"OLLAMA_ERROR\";\n let message = errorMessage;\n\n if (\n errorMessage.includes(\"ECONNREFUSED\") ||\n errorMessage.includes(\"fetch failed\")\n ) {\n message = `Cannot connect to Ollama at ${this.baseUrl}. Make sure Ollama is running (ollama serve).`;\n code = \"OLLAMA_CONNECTION_ERROR\";\n } else if (\n errorMessage.includes(\"model\") &&\n errorMessage.includes(\"not found\")\n ) {\n message = `Model \"${this.model}\" not found. Pull it with: ollama pull ${this.model}`;\n code = \"OLLAMA_MODEL_NOT_FOUND\";\n }\n\n yield {\n type: \"error\",\n message,\n code,\n };\n }\n }\n }\n}\n\n/**\n * Create Ollama adapter\n */\nexport function createOllamaAdapter(\n config?: OllamaAdapterConfig,\n): OllamaAdapter {\n return new OllamaAdapter(config);\n}\n","/**\n * Google Gemini LLM Adapter\n *\n * Supports: Gemini 2.0, 1.5 Pro, 1.5 Flash, etc.\n * Features: Vision, Audio, Video, PDF, Tools/Function Calling, Google Search Grounding\n */\n\nimport type {\n LLMConfig,\n StreamEvent,\n Message,\n WebSearchConfig,\n Citation,\n} from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Google adapter configuration\n */\nexport interface GoogleAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /** Safety settings */\n safetySettings?: Array<{\n category: string;\n threshold: string;\n }>;\n /**\n * Enable native Google Search grounding for Gemini.\n * When true, Gemini can search Google to answer questions.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * Gemini content part types\n */\ntype GeminiPart =\n | { text: string }\n | { inlineData: { mimeType: string; data: string } }\n | { functionCall: { name: string; args: Record<string, unknown> } }\n | { functionResponse: { name: string; response: Record<string, unknown> } };\n\n/**\n * Gemini message format\n */\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\n/**\n * Gemini tool format\n */\ninterface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: {\n type: string;\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\n// ============================================\n// Content Conversion\n// ============================================\n\n/**\n * Convert attachment to Gemini inline data part\n * Note: Gemini requires base64 data for inline images. URL-based attachments\n * are not directly supported and will be skipped.\n */\nfunction attachmentToGeminiPart(attachment: {\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n}): GeminiPart | null {\n // Gemini requires base64 data - URL-based attachments not supported\n if (!attachment.data) {\n // TODO: Could fetch URL and convert to base64, but that adds latency\n console.warn(\n \"Gemini adapter: URL-based attachments not supported, skipping\",\n );\n return null;\n }\n\n if (attachment.type === \"image\") {\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 inlineData: {\n mimeType: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n }\n\n // Support for audio/video if present\n if (attachment.type === \"audio\" || attachment.type === \"video\") {\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 inlineData: {\n mimeType:\n attachment.mimeType ||\n (attachment.type === \"audio\" ? \"audio/mp3\" : \"video/mp4\"),\n data: base64Data,\n },\n };\n }\n\n return null;\n}\n\n/**\n * Convert Message to Gemini content format\n */\nfunction messageToGeminiContent(msg: Message): GeminiContent | null {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") return null;\n\n const parts: GeminiPart[] = [];\n\n // Handle tool messages - convert to function response\n if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results need to be sent as functionResponse\n let responseData: Record<string, unknown>;\n try {\n responseData = JSON.parse(msg.content || \"{}\");\n } catch {\n responseData = { result: msg.content || \"\" };\n }\n\n // Need to get the tool name from somewhere - use tool_call_id as fallback\n // In practice, we'd need to track the mapping\n const toolName =\n (msg.metadata as { toolName?: string })?.toolName || \"tool\";\n\n parts.push({\n functionResponse: {\n name: toolName,\n response: responseData,\n },\n });\n\n return { role: \"user\", parts };\n }\n\n // Add text content\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n // Add attachments (images, audio, video)\n const attachments = msg.metadata?.attachments;\n if (attachments && Array.isArray(attachments)) {\n for (const attachment of attachments) {\n const part = attachmentToGeminiPart(attachment);\n if (part) {\n parts.push(part);\n }\n }\n }\n\n // Handle assistant messages with tool_calls\n if (msg.role === \"assistant\" && msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty args\n }\n parts.push({\n functionCall: {\n name: tc.function.name,\n args,\n },\n });\n }\n }\n\n if (parts.length === 0) return null;\n\n return {\n role: msg.role === \"assistant\" ? \"model\" : \"user\",\n parts,\n };\n}\n\n/**\n * Convert tools to Gemini function declarations\n */\nfunction formatToolsForGemini(\n actions: ChatCompletionRequest[\"actions\"],\n): { functionDeclarations: GeminiFunctionDeclaration[] } | undefined {\n if (!actions || actions.length === 0) return undefined;\n\n return {\n functionDeclarations: actions.map((action) => ({\n name: action.name,\n description: action.description,\n parameters: action.parameters\n ? {\n type: \"object\",\n properties: 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 required: Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key),\n }\n : undefined,\n })),\n };\n}\n\n// ============================================\n// Adapter Implementation\n// ============================================\n\n/**\n * Google Gemini LLM Adapter\n */\nexport class GoogleAdapter implements LLMAdapter {\n readonly provider = \"google\";\n readonly model: string;\n\n private client: any; // GoogleGenerativeAI client (lazy loaded)\n private config: GoogleAdapterConfig;\n\n constructor(config: GoogleAdapterConfig) {\n this.config = config;\n this.model = config.model || \"gemini-2.0-flash\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @google/generative-ai optional\n const { GoogleGenerativeAI } = await import(\"@google/generative-ai\");\n this.client = new GoogleGenerativeAI(this.config.apiKey);\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const modelId = request.config?.model || this.model;\n\n // Check for web search configuration (from request or adapter config)\n const webSearchConfig = request.webSearch ?? this.config.webSearch;\n\n // Get the generative model\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: this.config.safetySettings,\n });\n\n // Build contents array\n let contents: GeminiContent[] = [];\n let systemInstruction: string | undefined;\n\n // Handle raw messages (for agent loop)\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages\n for (const msg of request.rawMessages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg as unknown as Message);\n if (content) {\n contents.push(content);\n }\n }\n\n // Add system prompt if provided\n if (request.systemPrompt && !systemInstruction) {\n systemInstruction = request.systemPrompt;\n }\n } else {\n // Format from Message[]\n for (const msg of request.messages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg);\n if (content) {\n contents.push(content);\n }\n }\n\n if (request.systemPrompt) {\n systemInstruction = request.systemPrompt;\n }\n }\n\n // Ensure conversation starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n // Add an empty user message if needed\n contents = [{ role: \"user\", parts: [{ text: \"\" }] }, ...contents];\n }\n\n // Merge consecutive same-role messages (Gemini requires alternating roles)\n const mergedContents: GeminiContent[] = [];\n for (const content of contents) {\n const last = mergedContents[mergedContents.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n mergedContents.push({ ...content, parts: [...content.parts] });\n }\n }\n\n // Prepare tools\n const functionTools = formatToolsForGemini(request.actions);\n\n // Build tools array - combine function declarations with google search if enabled\n const toolsArray: Array<Record<string, unknown>> = [];\n\n if (functionTools) {\n toolsArray.push(functionTools);\n }\n\n // Add Google Search grounding if enabled\n if (webSearchConfig) {\n toolsArray.push({\n google_search: {},\n });\n }\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n // Start chat session with system instruction\n const chat = model.startChat({\n history: mergedContents.slice(0, -1), // All but the last message\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: toolsArray.length > 0 ? toolsArray : undefined,\n generationConfig: {\n temperature: request.config?.temperature ?? this.config.temperature,\n maxOutputTokens: request.config?.maxTokens ?? this.config.maxTokens,\n },\n });\n\n // Get the last message content\n const lastMessage = mergedContents[mergedContents.length - 1];\n\n // Stream response\n const result = await chat.sendMessageStream(lastMessage.parts);\n\n let currentToolCall: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n } | null = null;\n\n // Track citations from grounding metadata\n const collectedCitations: Citation[] = [];\n\n for await (const chunk of result.stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate?.content?.parts) continue;\n\n for (const part of candidate.content.parts) {\n // Handle text content\n if (\"text\" in part && part.text) {\n yield { type: \"message:delta\", content: part.text };\n }\n\n // Handle function calls\n if (\"functionCall\" in part && part.functionCall) {\n const fc = part.functionCall;\n const toolId = generateToolCallId();\n\n // Complete previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: JSON.stringify(currentToolCall.args),\n };\n }\n\n currentToolCall = {\n id: toolId,\n name: fc.name,\n args: fc.args || {},\n };\n\n yield {\n type: \"action:start\",\n id: toolId,\n name: fc.name,\n };\n }\n }\n\n // Check for finish reason\n if (candidate.finishReason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: JSON.stringify(currentToolCall.args),\n };\n }\n }\n\n // Extract grounding metadata (citations) from candidate\n const groundingMetadata = (\n candidate as {\n groundingMetadata?: {\n groundingChunks?: Array<{\n web?: { uri: string; title?: string };\n }>;\n searchEntryPoint?: { renderedContent?: string };\n };\n }\n )?.groundingMetadata;\n\n if (groundingMetadata?.groundingChunks) {\n for (const chunk of groundingMetadata.groundingChunks) {\n if (chunk.web?.uri) {\n const url = chunk.web.uri;\n const domain = extractDomain(url);\n // Check if we already have this citation\n if (!collectedCitations.some((c) => c.url === url)) {\n collectedCitations.push({\n index: collectedCitations.length + 1,\n url,\n title: chunk.web.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 }\n }\n\n // Get usage from the final response\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n try {\n const response = await result.response;\n if (response.usageMetadata) {\n usage = {\n prompt_tokens: response.usageMetadata.promptTokenCount || 0,\n completion_tokens: response.usageMetadata.candidatesTokenCount || 0,\n total_tokens: response.usageMetadata.totalTokenCount || 0,\n };\n }\n\n // Also check final response for grounding metadata\n const finalCandidate = response.candidates?.[0];\n const finalGrounding = (\n finalCandidate as {\n groundingMetadata?: {\n groundingChunks?: Array<{\n web?: { uri: string; title?: string };\n }>;\n };\n }\n )?.groundingMetadata;\n\n if (finalGrounding?.groundingChunks) {\n for (const chunk of finalGrounding.groundingChunks) {\n if (chunk.web?.uri) {\n const url = chunk.web.uri;\n const domain = extractDomain(url);\n if (!collectedCitations.some((c) => c.url === url)) {\n collectedCitations.push({\n index: collectedCitations.length + 1,\n url,\n title: chunk.web.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 }\n } catch {\n // Ignore usage retrieval errors\n }\n\n // Emit citations if we collected any\n if (collectedCitations.length > 0) {\n yield { type: \"citation\", citations: collectedCitations };\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: \"GOOGLE_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const modelId = request.config?.model || this.model;\n\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: this.config.safetySettings,\n });\n\n // Build contents (same as stream)\n let contents: GeminiContent[] = [];\n let systemInstruction: string | undefined;\n\n for (const msg of request.messages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg);\n if (content) {\n contents.push(content);\n }\n }\n\n if (request.systemPrompt) {\n systemInstruction = request.systemPrompt;\n }\n\n // Ensure conversation starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n contents = [{ role: \"user\", parts: [{ text: \"\" }] }, ...contents];\n }\n\n // Merge consecutive same-role messages\n const mergedContents: GeminiContent[] = [];\n for (const content of contents) {\n const last = mergedContents[mergedContents.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n mergedContents.push({ ...content, parts: [...content.parts] });\n }\n }\n\n const tools = formatToolsForGemini(request.actions);\n\n const chat = model.startChat({\n history: mergedContents.slice(0, -1),\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: tools ? [tools] : undefined,\n generationConfig: {\n temperature: request.config?.temperature ?? this.config.temperature,\n maxOutputTokens: request.config?.maxTokens ?? this.config.maxTokens,\n },\n });\n\n const lastMessage = mergedContents[mergedContents.length - 1];\n const result = await chat.sendMessage(lastMessage.parts);\n const response = result.response;\n\n // Extract content and tool calls\n let textContent = \"\";\n const toolCalls: CompletionResult[\"toolCalls\"] = [];\n\n const candidate = response.candidates?.[0];\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n if (\"text\" in part && part.text) {\n textContent += part.text;\n }\n if (\"functionCall\" in part && part.functionCall) {\n toolCalls.push({\n id: generateToolCallId(),\n name: part.functionCall.name,\n args: part.functionCall.args || {},\n });\n }\n }\n }\n\n return {\n content: textContent,\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create Google Gemini adapter\n */\nexport function createGoogleAdapter(\n config: GoogleAdapterConfig,\n): GoogleAdapter {\n return new GoogleAdapter(config);\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 * xAI Grok LLM Adapter\n *\n * xAI uses an OpenAI-compatible API, so this adapter extends OpenAIAdapter\n * with a different base URL.\n *\n * Supports: Grok-2, Grok-2-mini, Grok-beta\n * Features: Vision, Tools/Function Calling\n */\n\nimport type { LLMConfig, StreamEvent } from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * xAI adapter configuration\n */\nexport interface XAIAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n// Default xAI API endpoint\nconst XAI_BASE_URL = \"https://api.x.ai/v1\";\n\n// ============================================\n// Adapter Implementation\n// ============================================\n\n/**\n * xAI Grok LLM Adapter\n *\n * Uses OpenAI-compatible API with xAI's endpoint\n */\nexport class XAIAdapter implements LLMAdapter {\n readonly provider = \"xai\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: XAIAdapterConfig;\n\n constructor(config: XAIAdapterConfig) {\n this.config = config;\n this.model = config.model || \"grok-2\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Use OpenAI SDK with xAI base URL\n const { default: OpenAI } = await import(\"openai\");\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl || XAI_BASE_URL,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\n for (const attachment of msg.attachments as Array<{\n type: string;\n data: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n // Convert to OpenAI image_url format\n let imageUrl = attachment.data;\n if (!imageUrl.startsWith(\"data:\")) {\n imageUrl = `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n }\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\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.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Check for finish\n if (chunk.choices[0]?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"XAI_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n messages = request.rawMessages as Array<Record<string, unknown>>;\n if (request.systemPrompt) {\n const hasSystem = messages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...messages,\n ];\n }\n }\n } else {\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const response = await client.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice?.message;\n\n const toolCalls = (message?.tool_calls || []).map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }));\n\n return {\n content: message?.content || \"\",\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create xAI Grok adapter\n */\nexport function createXAIAdapter(config: XAIAdapterConfig): XAIAdapter {\n return new XAIAdapter(config);\n}\n","/**\n * Azure OpenAI LLM Adapter\n *\n * Azure OpenAI uses Microsoft's cloud infrastructure with\n * different authentication and URL patterns than standard OpenAI.\n *\n * Supports: Any OpenAI model deployed on Azure (GPT-4, GPT-4o, etc.)\n * Features: Vision, Tools/Function Calling (depends on deployed model)\n */\n\nimport type { LLMConfig, StreamEvent } from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Azure OpenAI adapter configuration\n */\nexport interface AzureAdapterConfig {\n /** Azure OpenAI API key */\n apiKey: string;\n /** Azure resource name (e.g., 'my-resource') */\n resourceName: string;\n /** Azure deployment name (e.g., 'gpt-4o-deployment') */\n deploymentName: string;\n /** API version (default: 2024-08-01-preview) */\n apiVersion?: string;\n temperature?: number;\n maxTokens?: number;\n /** Custom endpoint URL (optional, overrides resourceName) */\n baseUrl?: string;\n}\n\n// Default Azure API version\nconst DEFAULT_API_VERSION = \"2024-08-01-preview\";\n\n/**\n * Build Azure OpenAI endpoint URL\n */\nfunction buildAzureEndpoint(\n resourceName: string,\n deploymentName: string,\n apiVersion: string,\n): string {\n return `https://${resourceName}.openai.azure.com/openai/deployments/${deploymentName}`;\n}\n\n// ============================================\n// Adapter Implementation\n// ============================================\n\n/**\n * Azure OpenAI LLM Adapter\n *\n * Uses Azure's OpenAI service with Azure-specific authentication\n */\nexport class AzureAdapter implements LLMAdapter {\n readonly provider = \"azure\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: AzureAdapterConfig;\n\n constructor(config: AzureAdapterConfig) {\n this.config = config;\n this.model = config.deploymentName;\n }\n\n private async getClient() {\n if (!this.client) {\n // Use OpenAI SDK with Azure configuration\n const { AzureOpenAI } = await import(\"openai\");\n\n const apiVersion = this.config.apiVersion || DEFAULT_API_VERSION;\n const endpoint =\n this.config.baseUrl ||\n buildAzureEndpoint(\n this.config.resourceName,\n this.config.deploymentName,\n apiVersion,\n );\n\n this.client = new AzureOpenAI({\n apiKey: this.config.apiKey,\n endpoint,\n apiVersion,\n deployment: this.config.deploymentName,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\n for (const attachment of msg.attachments as Array<{\n type: string;\n data: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n // Convert to OpenAI image_url format\n let imageUrl = attachment.data;\n if (!imageUrl.startsWith(\"data:\")) {\n imageUrl = `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n }\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\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.chat.completions.create({\n // Azure uses deployment name, not model name\n model: this.config.deploymentName,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Check for finish\n if (chunk.choices[0]?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"AZURE_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n messages = request.rawMessages as Array<Record<string, unknown>>;\n if (request.systemPrompt) {\n const hasSystem = messages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...messages,\n ];\n }\n }\n } else {\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const response = await client.chat.completions.create({\n model: this.config.deploymentName,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice?.message;\n\n const toolCalls = (message?.tool_calls || []).map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }));\n\n return {\n content: message?.content || \"\",\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create Azure OpenAI adapter\n */\nexport function createAzureAdapter(config: AzureAdapterConfig): AzureAdapter {\n return new AzureAdapter(config);\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/base.ts","../../src/core/utils.ts","../../src/adapters/openai.ts","../../src/adapters/anthropic.ts","../../src/adapters/ollama.ts","../../src/adapters/google.ts","../../src/adapters/xai.ts","../../src/adapters/azure.ts"],"names":["extractDomain","deduplicateCitations","chunk"],"mappings":"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","file":"index.mjs","sourcesContent":["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","/**\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 LLMConfig,\n StreamEvent,\n WebSearchConfig,\n Citation,\n} from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n/**\n * OpenAI adapter configuration\n */\nexport interface OpenAIAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /**\n * Enable native web search for GPT models.\n * Uses OpenAI's web_search_preview tool.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * OpenAI LLM Adapter\n *\n * Supports: GPT-4, GPT-4o, GPT-3.5-turbo, etc.\n */\nexport class OpenAIAdapter implements LLMAdapter {\n readonly provider = \"openai\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: OpenAIAdapterConfig;\n\n constructor(config: OpenAIAdapterConfig) {\n this.config = config;\n this.model = config.model || \"gpt-4o\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make openai optional\n const { default: OpenAI } = await import(\"openai\");\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\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 let imageUrl: string;\n\n if (attachment.url) {\n // Use URL directly (cloud storage)\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Use base64 data\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n continue; // Skip if no data or URL\n }\n\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n // Build tools array\n const tools: Array<Record<string, unknown>> = request.actions?.length\n ? formatTools(request.actions)\n : [];\n\n // Check for web search configuration (from request or adapter config)\n const webSearchConfig = request.webSearch ?? this.config.webSearch;\n\n if (webSearchConfig) {\n // Add web_search_preview tool for OpenAI\n const webSearchTool: Record<string, unknown> = {\n type: \"web_search_preview\",\n };\n\n // Add search context config if provided\n const wsConfig =\n typeof webSearchConfig === \"object\" ? webSearchConfig : {};\n\n if (wsConfig.userLocation) {\n webSearchTool.search_context_size = \"medium\"; // OpenAI uses size, not location\n }\n\n tools.push(webSearchTool);\n }\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.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools: tools.length > 0 ? tools : undefined,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n // Track citations from web search\n const collectedCitations: Citation[] = [];\n let citationIndex = 0;\n\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n const choice = chunk.choices[0];\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle annotations (citations from web search) - OpenAI includes these in delta\n const annotations = (\n delta as {\n annotations?: Array<{\n type: string;\n url_citation?: { url: string; title?: string };\n }>;\n }\n )?.annotations;\n\n if (annotations && annotations.length > 0) {\n for (const annotation of annotations) {\n if (\n annotation.type === \"url_citation\" &&\n annotation.url_citation?.url\n ) {\n citationIndex++;\n const url = annotation.url_citation.url;\n const domain = extractDomain(url);\n collectedCitations.push({\n index: citationIndex,\n url,\n title: annotation.url_citation.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\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Capture usage from final chunk (OpenAI sends it with stream_options.include_usage)\n if (chunk.usage) {\n usage = {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n };\n }\n\n // Check for finish\n if (choice?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit citations if we collected any\n if (collectedCitations.length > 0) {\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: \"OPENAI_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 OpenAI adapter\n */\nexport function createOpenAIAdapter(\n config: OpenAIAdapterConfig,\n): OpenAIAdapter {\n return new OpenAIAdapter(config);\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","import type {\n StreamEvent,\n Message,\n MessageAttachment,\n} from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessages, formatTools } from \"./base\";\nimport type { OllamaModelOptions } from \"../providers/types\";\n\n/**\n * Ollama adapter configuration\n */\nexport interface OllamaAdapterConfig {\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /** Ollama-specific model options */\n options?: OllamaModelOptions;\n}\n\n/**\n * Ollama message format with vision support\n */\ninterface OllamaMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n images?: string[];\n tool_calls?: Array<{\n id?: string;\n function: {\n name: string;\n arguments: Record<string, unknown>;\n };\n }>;\n tool_call_id?: string;\n}\n\n/**\n * Extract base64 data from attachment\n * Removes data URI prefix if present\n */\nfunction extractBase64Data(data: string): string {\n if (data.startsWith(\"data:\")) {\n const commaIndex = data.indexOf(\",\");\n if (commaIndex !== -1) {\n return data.slice(commaIndex + 1);\n }\n }\n return data;\n}\n\n/**\n * Download image from URL and convert to base64\n * Following Vercel AI SDK pattern\n */\nasync function downloadImageAsBase64(url: string): Promise<string | null> {\n try {\n const response = await fetch(url);\n if (!response.ok) return null;\n\n const buffer = await response.arrayBuffer();\n const base64 = Buffer.from(buffer).toString(\"base64\");\n return base64;\n } catch {\n return null;\n }\n}\n\n/**\n * Extract images from message attachments\n * Returns array of base64 strings (Ollama format)\n */\nasync function extractImagesFromAttachments(\n attachments?: MessageAttachment[],\n): Promise<string[]> {\n if (!attachments) return [];\n\n const images: string[] = [];\n\n for (const attachment of attachments) {\n if (attachment.type !== \"image\") continue;\n\n if (attachment.data) {\n // Use base64 data directly\n images.push(extractBase64Data(attachment.data));\n } else if (attachment.url) {\n // Download image from URL (like Vercel AI SDK does)\n const base64 = await downloadImageAsBase64(attachment.url);\n if (base64) {\n images.push(base64);\n }\n }\n }\n\n return images;\n}\n\n/**\n * Format messages for Ollama with vision and tool support\n */\nasync function formatMessagesForOllama(\n messages: Message[],\n systemPrompt?: string,\n): Promise<OllamaMessage[]> {\n const formatted: OllamaMessage[] = [];\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 const baseMessage: OllamaMessage = {\n role: msg.role as OllamaMessage[\"role\"],\n content: msg.content ?? \"\",\n };\n\n // Handle image attachments (vision support)\n if (msg.role === \"user\" && msg.metadata?.attachments) {\n const images = await extractImagesFromAttachments(\n msg.metadata.attachments,\n );\n if (images.length > 0) {\n baseMessage.images = images;\n }\n }\n\n // Handle tool calls on assistant messages\n if (\n msg.role === \"assistant\" &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n baseMessage.tool_calls = msg.tool_calls.map((tc) => ({\n id: tc.id,\n function: {\n name: tc.function.name,\n arguments: JSON.parse(tc.function.arguments),\n },\n }));\n }\n\n // Handle tool results\n if (msg.role === \"tool\" && msg.tool_call_id) {\n baseMessage.tool_call_id = msg.tool_call_id;\n }\n\n formatted.push(baseMessage);\n }\n\n return formatted;\n}\n\n/**\n * Process raw messages for Ollama\n * Handles conversion of attachments to Ollama image format\n */\nasync function processRawMessagesForOllama(\n rawMessages: Array<Record<string, unknown>>,\n systemPrompt?: string,\n): Promise<OllamaMessage[]> {\n const processed: OllamaMessage[] = [];\n\n // Add system prompt if provided and not already present\n if (systemPrompt) {\n const hasSystem = rawMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n processed.push({ role: \"system\", content: systemPrompt });\n }\n }\n\n for (const msg of rawMessages) {\n const baseMessage: OllamaMessage = {\n role: msg.role as OllamaMessage[\"role\"],\n content: (msg.content as string) ?? \"\",\n };\n\n // Handle attachments for vision\n if (\n msg.role === \"user\" &&\n msg.attachments &&\n Array.isArray(msg.attachments)\n ) {\n const attachments = msg.attachments as MessageAttachment[];\n const images = await extractImagesFromAttachments(attachments);\n if (images.length > 0) {\n baseMessage.images = images;\n }\n }\n\n // Handle tool calls\n if (msg.tool_calls && Array.isArray(msg.tool_calls)) {\n baseMessage.tool_calls = (\n msg.tool_calls as Array<{\n id: string;\n type: string;\n function: { name: string; arguments: string };\n }>\n ).map((tc) => ({\n id: tc.id,\n function: {\n name: tc.function.name,\n arguments:\n typeof tc.function.arguments === \"string\"\n ? JSON.parse(tc.function.arguments)\n : tc.function.arguments,\n },\n }));\n }\n\n // Handle tool result\n if (msg.tool_call_id) {\n baseMessage.tool_call_id = msg.tool_call_id as string;\n }\n\n processed.push(baseMessage);\n }\n\n return processed;\n}\n\n/**\n * Ollama LLM Adapter (Local models)\n *\n * Supports: Llama 3, Mistral, Phi, Gemma, CodeLlama, LLaVA (vision), etc.\n *\n * Features:\n * - Tool/function calling (OpenAI-compatible format)\n * - Vision support (images via base64)\n * - Ollama-specific options (num_ctx, mirostat, etc.)\n * - Raw message support for agent loop\n */\nexport class OllamaAdapter implements LLMAdapter {\n readonly provider = \"ollama\";\n readonly model: string;\n\n private baseUrl: string;\n private config: OllamaAdapterConfig;\n\n constructor(config: OllamaAdapterConfig = {}) {\n this.config = config;\n this.model = config.model || \"llama3\";\n this.baseUrl = config.baseUrl || \"http://localhost:11434\";\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n // Prepare messages - use rawMessages if provided (for agent loop), otherwise format from Message[]\n let messages: OllamaMessage[];\n\n if (request.rawMessages && request.rawMessages.length > 0) {\n messages = await processRawMessagesForOllama(\n request.rawMessages,\n request.systemPrompt,\n );\n } else {\n messages = await formatMessagesForOllama(\n request.messages,\n request.systemPrompt,\n );\n }\n\n // Format tools for Ollama (OpenAI-compatible format)\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n // Build Ollama options\n const ollamaOptions: Record<string, unknown> = {\n temperature: request.config?.temperature ?? this.config.temperature,\n };\n\n // Add num_predict for maxTokens\n const maxTokens = request.config?.maxTokens ?? this.config.maxTokens;\n if (maxTokens !== undefined) {\n ollamaOptions.num_predict = maxTokens;\n }\n\n // Merge in Ollama-specific options\n if (this.config.options) {\n Object.assign(ollamaOptions, this.config.options);\n }\n\n const response = await fetch(`${this.baseUrl}/api/chat`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: request.config?.model || this.model,\n messages,\n tools,\n stream: true,\n options: ollamaOptions,\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\");\n throw new Error(`Ollama API error: ${response.status} - ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error(\"No response body\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let hasEmittedToolCalls = false;\n\n // Track accumulated tool calls for streaming\n const toolCallsInProgress: Map<\n number,\n { id: string; name: string; arguments: Record<string, unknown> }\n > = new Map();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n try {\n const chunk = JSON.parse(line);\n\n // Handle content\n if (chunk.message?.content) {\n yield { type: \"message:delta\", content: chunk.message.content };\n }\n\n // Handle tool calls from Ollama\n if (chunk.message?.tool_calls && !hasEmittedToolCalls) {\n for (let i = 0; i < chunk.message.tool_calls.length; i++) {\n const toolCall = chunk.message.tool_calls[i];\n const toolCallId = toolCall.id || generateToolCallId();\n\n // Store the tool call\n toolCallsInProgress.set(i, {\n id: toolCallId,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || {},\n });\n\n // Emit action start\n yield {\n type: \"action:start\",\n id: toolCallId,\n name: toolCall.function?.name || \"\",\n };\n\n // Emit action args (Ollama sends complete args, not streamed)\n yield {\n type: \"action:args\",\n id: toolCallId,\n args: JSON.stringify(toolCall.function?.arguments || {}),\n };\n }\n hasEmittedToolCalls = true;\n }\n\n // Ollama indicates completion with done: true\n if (chunk.done) {\n break;\n }\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n if ((error as Error).name === \"AbortError\") {\n yield { type: \"done\" };\n } else {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n\n // Provide helpful error messages for common issues\n let code = \"OLLAMA_ERROR\";\n let message = errorMessage;\n\n if (\n errorMessage.includes(\"ECONNREFUSED\") ||\n errorMessage.includes(\"fetch failed\")\n ) {\n message = `Cannot connect to Ollama at ${this.baseUrl}. Make sure Ollama is running (ollama serve).`;\n code = \"OLLAMA_CONNECTION_ERROR\";\n } else if (\n errorMessage.includes(\"model\") &&\n errorMessage.includes(\"not found\")\n ) {\n message = `Model \"${this.model}\" not found. Pull it with: ollama pull ${this.model}`;\n code = \"OLLAMA_MODEL_NOT_FOUND\";\n }\n\n yield {\n type: \"error\",\n message,\n code,\n };\n }\n }\n }\n}\n\n/**\n * Create Ollama adapter\n */\nexport function createOllamaAdapter(\n config?: OllamaAdapterConfig,\n): OllamaAdapter {\n return new OllamaAdapter(config);\n}\n","/**\n * Google Gemini LLM Adapter\n *\n * Supports: Gemini 2.0, 1.5 Pro, 1.5 Flash, etc.\n * Features: Vision, Audio, Video, PDF, Tools/Function Calling, Google Search Grounding\n */\n\nimport type {\n LLMConfig,\n StreamEvent,\n Message,\n WebSearchConfig,\n Citation,\n} from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Google adapter configuration\n */\nexport interface GoogleAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /** Safety settings */\n safetySettings?: Array<{\n category: string;\n threshold: string;\n }>;\n /**\n * Enable native Google Search grounding for Gemini.\n * When true, Gemini can search Google to answer questions.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * Gemini content part types\n */\ntype GeminiPart =\n | { text: string }\n | { inlineData: { mimeType: string; data: string } }\n | { functionCall: { name: string; args: Record<string, unknown> } }\n | { functionResponse: { name: string; response: Record<string, unknown> } };\n\n/**\n * Gemini message format\n */\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\n/**\n * Gemini tool format\n */\ninterface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: {\n type: string;\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\n// ============================================\n// Content Conversion\n// ============================================\n\n/**\n * Convert attachment to Gemini inline data part\n * Note: Gemini requires base64 data for inline images. URL-based attachments\n * are not directly supported and will be skipped.\n */\nfunction attachmentToGeminiPart(attachment: {\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n}): GeminiPart | null {\n // Gemini requires base64 data - URL-based attachments not supported\n if (!attachment.data) {\n // TODO: Could fetch URL and convert to base64, but that adds latency\n console.warn(\n \"Gemini adapter: URL-based attachments not supported, skipping\",\n );\n return null;\n }\n\n if (attachment.type === \"image\") {\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 inlineData: {\n mimeType: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n }\n\n // Support for audio/video if present\n if (attachment.type === \"audio\" || attachment.type === \"video\") {\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 inlineData: {\n mimeType:\n attachment.mimeType ||\n (attachment.type === \"audio\" ? \"audio/mp3\" : \"video/mp4\"),\n data: base64Data,\n },\n };\n }\n\n return null;\n}\n\n/**\n * Convert Message to Gemini content format\n */\nfunction messageToGeminiContent(msg: Message): GeminiContent | null {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") return null;\n\n const parts: GeminiPart[] = [];\n\n // Handle tool messages - convert to function response\n if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results need to be sent as functionResponse\n let responseData: Record<string, unknown>;\n try {\n responseData = JSON.parse(msg.content || \"{}\");\n } catch {\n responseData = { result: msg.content || \"\" };\n }\n\n // Need to get the tool name from somewhere - use tool_call_id as fallback\n // In practice, we'd need to track the mapping\n const toolName =\n (msg.metadata as { toolName?: string })?.toolName || \"tool\";\n\n parts.push({\n functionResponse: {\n name: toolName,\n response: responseData,\n },\n });\n\n return { role: \"user\", parts };\n }\n\n // Add text content\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n // Add attachments (images, audio, video)\n const attachments = msg.metadata?.attachments;\n if (attachments && Array.isArray(attachments)) {\n for (const attachment of attachments) {\n const part = attachmentToGeminiPart(attachment);\n if (part) {\n parts.push(part);\n }\n }\n }\n\n // Handle assistant messages with tool_calls\n if (msg.role === \"assistant\" && msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty args\n }\n parts.push({\n functionCall: {\n name: tc.function.name,\n args,\n },\n });\n }\n }\n\n if (parts.length === 0) return null;\n\n return {\n role: msg.role === \"assistant\" ? \"model\" : \"user\",\n parts,\n };\n}\n\n/**\n * Convert tools to Gemini function declarations\n */\nfunction formatToolsForGemini(\n actions: ChatCompletionRequest[\"actions\"],\n): { functionDeclarations: GeminiFunctionDeclaration[] } | undefined {\n if (!actions || actions.length === 0) return undefined;\n\n return {\n functionDeclarations: actions.map((action) => ({\n name: action.name,\n description: action.description,\n parameters: action.parameters\n ? {\n type: \"object\",\n properties: 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 required: Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key),\n }\n : undefined,\n })),\n };\n}\n\n// ============================================\n// Adapter Implementation\n// ============================================\n\n/**\n * Google Gemini LLM Adapter\n */\nexport class GoogleAdapter implements LLMAdapter {\n readonly provider = \"google\";\n readonly model: string;\n\n private client: any; // GoogleGenerativeAI client (lazy loaded)\n private config: GoogleAdapterConfig;\n\n constructor(config: GoogleAdapterConfig) {\n this.config = config;\n this.model = config.model || \"gemini-2.0-flash\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @google/generative-ai optional\n const { GoogleGenerativeAI } = await import(\"@google/generative-ai\");\n this.client = new GoogleGenerativeAI(this.config.apiKey);\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const modelId = request.config?.model || this.model;\n\n // Check for web search configuration (from request or adapter config)\n const webSearchConfig = request.webSearch ?? this.config.webSearch;\n\n // Get the generative model\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: this.config.safetySettings,\n });\n\n // Build contents array\n let contents: GeminiContent[] = [];\n let systemInstruction: string | undefined;\n\n // Handle raw messages (for agent loop)\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages\n for (const msg of request.rawMessages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg as unknown as Message);\n if (content) {\n contents.push(content);\n }\n }\n\n // Add system prompt if provided\n if (request.systemPrompt && !systemInstruction) {\n systemInstruction = request.systemPrompt;\n }\n } else {\n // Format from Message[]\n for (const msg of request.messages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg);\n if (content) {\n contents.push(content);\n }\n }\n\n if (request.systemPrompt) {\n systemInstruction = request.systemPrompt;\n }\n }\n\n // Ensure conversation starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n // Add an empty user message if needed\n contents = [{ role: \"user\", parts: [{ text: \"\" }] }, ...contents];\n }\n\n // Merge consecutive same-role messages (Gemini requires alternating roles)\n const mergedContents: GeminiContent[] = [];\n for (const content of contents) {\n const last = mergedContents[mergedContents.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n mergedContents.push({ ...content, parts: [...content.parts] });\n }\n }\n\n // Prepare tools\n const functionTools = formatToolsForGemini(request.actions);\n\n // Build tools array - combine function declarations with google search if enabled\n const toolsArray: Array<Record<string, unknown>> = [];\n\n if (functionTools) {\n toolsArray.push(functionTools);\n }\n\n // Add Google Search grounding if enabled\n if (webSearchConfig) {\n toolsArray.push({\n google_search: {},\n });\n }\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n // Start chat session with system instruction\n const chat = model.startChat({\n history: mergedContents.slice(0, -1), // All but the last message\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: toolsArray.length > 0 ? toolsArray : undefined,\n generationConfig: {\n temperature: request.config?.temperature ?? this.config.temperature,\n maxOutputTokens: request.config?.maxTokens ?? this.config.maxTokens,\n },\n });\n\n // Get the last message content\n const lastMessage = mergedContents[mergedContents.length - 1];\n\n // Stream response\n const result = await chat.sendMessageStream(lastMessage.parts);\n\n let currentToolCall: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n } | null = null;\n\n // Track citations from grounding metadata\n const collectedCitations: Citation[] = [];\n\n for await (const chunk of result.stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate?.content?.parts) continue;\n\n for (const part of candidate.content.parts) {\n // Handle text content\n if (\"text\" in part && part.text) {\n yield { type: \"message:delta\", content: part.text };\n }\n\n // Handle function calls\n if (\"functionCall\" in part && part.functionCall) {\n const fc = part.functionCall;\n const toolId = generateToolCallId();\n\n // Complete previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: JSON.stringify(currentToolCall.args),\n };\n }\n\n currentToolCall = {\n id: toolId,\n name: fc.name,\n args: fc.args || {},\n };\n\n yield {\n type: \"action:start\",\n id: toolId,\n name: fc.name,\n };\n }\n }\n\n // Check for finish reason\n if (candidate.finishReason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: JSON.stringify(currentToolCall.args),\n };\n }\n }\n\n // Extract grounding metadata (citations) from candidate\n const groundingMetadata = (\n candidate as {\n groundingMetadata?: {\n groundingChunks?: Array<{\n web?: { uri: string; title?: string };\n }>;\n searchEntryPoint?: { renderedContent?: string };\n };\n }\n )?.groundingMetadata;\n\n if (groundingMetadata?.groundingChunks) {\n for (const chunk of groundingMetadata.groundingChunks) {\n if (chunk.web?.uri) {\n const url = chunk.web.uri;\n const domain = extractDomain(url);\n // Check if we already have this citation\n if (!collectedCitations.some((c) => c.url === url)) {\n collectedCitations.push({\n index: collectedCitations.length + 1,\n url,\n title: chunk.web.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 }\n }\n\n // Get usage from the final response\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n try {\n const response = await result.response;\n if (response.usageMetadata) {\n usage = {\n prompt_tokens: response.usageMetadata.promptTokenCount || 0,\n completion_tokens: response.usageMetadata.candidatesTokenCount || 0,\n total_tokens: response.usageMetadata.totalTokenCount || 0,\n };\n }\n\n // Also check final response for grounding metadata\n const finalCandidate = response.candidates?.[0];\n const finalGrounding = (\n finalCandidate as {\n groundingMetadata?: {\n groundingChunks?: Array<{\n web?: { uri: string; title?: string };\n }>;\n };\n }\n )?.groundingMetadata;\n\n if (finalGrounding?.groundingChunks) {\n for (const chunk of finalGrounding.groundingChunks) {\n if (chunk.web?.uri) {\n const url = chunk.web.uri;\n const domain = extractDomain(url);\n if (!collectedCitations.some((c) => c.url === url)) {\n collectedCitations.push({\n index: collectedCitations.length + 1,\n url,\n title: chunk.web.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 }\n } catch {\n // Ignore usage retrieval errors\n }\n\n // Emit citations if we collected any\n if (collectedCitations.length > 0) {\n yield { type: \"citation\", citations: collectedCitations };\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: \"GOOGLE_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const modelId = request.config?.model || this.model;\n\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: this.config.safetySettings,\n });\n\n // Build contents (same as stream)\n let contents: GeminiContent[] = [];\n let systemInstruction: string | undefined;\n\n for (const msg of request.messages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg);\n if (content) {\n contents.push(content);\n }\n }\n\n if (request.systemPrompt) {\n systemInstruction = request.systemPrompt;\n }\n\n // Ensure conversation starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n contents = [{ role: \"user\", parts: [{ text: \"\" }] }, ...contents];\n }\n\n // Merge consecutive same-role messages\n const mergedContents: GeminiContent[] = [];\n for (const content of contents) {\n const last = mergedContents[mergedContents.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n mergedContents.push({ ...content, parts: [...content.parts] });\n }\n }\n\n const tools = formatToolsForGemini(request.actions);\n\n const chat = model.startChat({\n history: mergedContents.slice(0, -1),\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: tools ? [tools] : undefined,\n generationConfig: {\n temperature: request.config?.temperature ?? this.config.temperature,\n maxOutputTokens: request.config?.maxTokens ?? this.config.maxTokens,\n },\n });\n\n const lastMessage = mergedContents[mergedContents.length - 1];\n const result = await chat.sendMessage(lastMessage.parts);\n const response = result.response;\n\n // Extract content and tool calls\n let textContent = \"\";\n const toolCalls: CompletionResult[\"toolCalls\"] = [];\n\n const candidate = response.candidates?.[0];\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n if (\"text\" in part && part.text) {\n textContent += part.text;\n }\n if (\"functionCall\" in part && part.functionCall) {\n toolCalls.push({\n id: generateToolCallId(),\n name: part.functionCall.name,\n args: part.functionCall.args || {},\n });\n }\n }\n }\n\n return {\n content: textContent,\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create Google Gemini adapter\n */\nexport function createGoogleAdapter(\n config: GoogleAdapterConfig,\n): GoogleAdapter {\n return new GoogleAdapter(config);\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 * xAI Grok LLM Adapter\n *\n * xAI uses an OpenAI-compatible API, so this adapter extends OpenAIAdapter\n * with a different base URL.\n *\n * Supports: Grok-2, Grok-2-mini, Grok-beta\n * Features: Vision, Tools/Function Calling\n */\n\nimport type { LLMConfig, StreamEvent } from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * xAI adapter configuration\n */\nexport interface XAIAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n// Default xAI API endpoint\nconst XAI_BASE_URL = \"https://api.x.ai/v1\";\n\n// ============================================\n// Adapter Implementation\n// ============================================\n\n/**\n * xAI Grok LLM Adapter\n *\n * Uses OpenAI-compatible API with xAI's endpoint\n */\nexport class XAIAdapter implements LLMAdapter {\n readonly provider = \"xai\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: XAIAdapterConfig;\n\n constructor(config: XAIAdapterConfig) {\n this.config = config;\n this.model = config.model || \"grok-2\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Use OpenAI SDK with xAI base URL\n const { default: OpenAI } = await import(\"openai\");\n this.client = new OpenAI({\n apiKey: this.config.apiKey,\n baseURL: this.config.baseUrl || XAI_BASE_URL,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\n for (const attachment of msg.attachments as Array<{\n type: string;\n data: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n // Convert to OpenAI image_url format\n let imageUrl = attachment.data;\n if (!imageUrl.startsWith(\"data:\")) {\n imageUrl = `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n }\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\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.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Check for finish\n if (chunk.choices[0]?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"XAI_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n messages = request.rawMessages as Array<Record<string, unknown>>;\n if (request.systemPrompt) {\n const hasSystem = messages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...messages,\n ];\n }\n }\n } else {\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const response = await client.chat.completions.create({\n model: request.config?.model || this.model,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice?.message;\n\n const toolCalls = (message?.tool_calls || []).map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }));\n\n return {\n content: message?.content || \"\",\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create xAI Grok adapter\n */\nexport function createXAIAdapter(config: XAIAdapterConfig): XAIAdapter {\n return new XAIAdapter(config);\n}\n","/**\n * Azure OpenAI LLM Adapter\n *\n * Azure OpenAI uses Microsoft's cloud infrastructure with\n * different authentication and URL patterns than standard OpenAI.\n *\n * Supports: Any OpenAI model deployed on Azure (GPT-4, GPT-4o, etc.)\n * Features: Vision, Tools/Function Calling (depends on deployed model)\n */\n\nimport type { LLMConfig, StreamEvent } from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Azure OpenAI adapter configuration\n */\nexport interface AzureAdapterConfig {\n /** Azure OpenAI API key */\n apiKey: string;\n /** Azure resource name (e.g., 'my-resource') */\n resourceName: string;\n /** Azure deployment name (e.g., 'gpt-4o-deployment') */\n deploymentName: string;\n /** API version (default: 2024-08-01-preview) */\n apiVersion?: string;\n temperature?: number;\n maxTokens?: number;\n /** Custom endpoint URL (optional, overrides resourceName) */\n baseUrl?: string;\n}\n\n// Default Azure API version\nconst DEFAULT_API_VERSION = \"2024-08-01-preview\";\n\n/**\n * Build Azure OpenAI endpoint URL\n */\nfunction buildAzureEndpoint(\n resourceName: string,\n deploymentName: string,\n apiVersion: string,\n): string {\n return `https://${resourceName}.openai.azure.com/openai/deployments/${deploymentName}`;\n}\n\n// ============================================\n// Adapter Implementation\n// ============================================\n\n/**\n * Azure OpenAI LLM Adapter\n *\n * Uses Azure's OpenAI service with Azure-specific authentication\n */\nexport class AzureAdapter implements LLMAdapter {\n readonly provider = \"azure\";\n readonly model: string;\n\n private client: any; // OpenAI client (lazy loaded)\n private config: AzureAdapterConfig;\n\n constructor(config: AzureAdapterConfig) {\n this.config = config;\n this.model = config.deploymentName;\n }\n\n private async getClient() {\n if (!this.client) {\n // Use OpenAI SDK with Azure configuration\n const { AzureOpenAI } = await import(\"openai\");\n\n const apiVersion = this.config.apiVersion || DEFAULT_API_VERSION;\n const endpoint =\n this.config.baseUrl ||\n buildAzureEndpoint(\n this.config.resourceName,\n this.config.deploymentName,\n apiVersion,\n );\n\n this.client = new AzureOpenAI({\n apiKey: this.config.apiKey,\n endpoint,\n apiVersion,\n deployment: this.config.deploymentName,\n });\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n\n // Use raw messages if provided (for agent loop with tool calls), otherwise format from Message[]\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages - convert any attachments to OpenAI vision format\n const processedMessages = request.rawMessages.map((msg) => {\n // Check if message has attachments (images)\n const hasAttachments =\n msg.attachments &&\n Array.isArray(msg.attachments) &&\n msg.attachments.length > 0;\n\n if (hasAttachments) {\n // Convert to OpenAI multimodal content format\n const content: Array<Record<string, unknown>> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Add image attachments\n for (const attachment of msg.attachments as Array<{\n type: string;\n data: string;\n mimeType?: string;\n }>) {\n if (attachment.type === \"image\") {\n // Convert to OpenAI image_url format\n let imageUrl = attachment.data;\n if (!imageUrl.startsWith(\"data:\")) {\n imageUrl = `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n }\n content.push({\n type: \"image_url\",\n image_url: { url: imageUrl, detail: \"auto\" },\n });\n }\n }\n\n return { ...msg, content, attachments: undefined };\n }\n return msg;\n });\n\n // Add system prompt at the start if provided and not already present\n if (request.systemPrompt) {\n const hasSystem = processedMessages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...processedMessages,\n ];\n } else {\n messages = processedMessages;\n }\n } else {\n messages = processedMessages;\n }\n } else {\n // Format from Message[] with multimodal support (images, attachments)\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\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.chat.completions.create({\n // Azure uses deployment name, not model name\n model: this.config.deploymentName,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n stream: true,\n });\n\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n for await (const chunk of stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const delta = chunk.choices[0]?.delta;\n\n // Handle content\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle tool calls\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n // New tool call\n if (toolCall.id) {\n // End previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n\n currentToolCall = {\n id: toolCall.id,\n name: toolCall.function?.name || \"\",\n arguments: toolCall.function?.arguments || \"\",\n };\n\n yield {\n type: \"action:start\",\n id: currentToolCall.id,\n name: currentToolCall.name,\n };\n } else if (currentToolCall && toolCall.function?.arguments) {\n // Append to current tool call arguments\n currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n // Check for finish\n if (chunk.choices[0]?.finish_reason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\n }\n }\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\" };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"AZURE_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n\n let messages: Array<Record<string, unknown>>;\n if (request.rawMessages && request.rawMessages.length > 0) {\n messages = request.rawMessages as Array<Record<string, unknown>>;\n if (request.systemPrompt) {\n const hasSystem = messages.some((m) => m.role === \"system\");\n if (!hasSystem) {\n messages = [\n { role: \"system\", content: request.systemPrompt },\n ...messages,\n ];\n }\n }\n } else {\n messages = formatMessagesForOpenAI(\n request.messages,\n request.systemPrompt,\n ) as Array<Record<string, unknown>>;\n }\n\n const tools = request.actions?.length\n ? formatTools(request.actions)\n : undefined;\n\n const response = await client.chat.completions.create({\n model: this.config.deploymentName,\n messages,\n tools,\n temperature: request.config?.temperature ?? this.config.temperature,\n max_tokens: request.config?.maxTokens ?? this.config.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice?.message;\n\n const toolCalls = (message?.tool_calls || []).map((tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }));\n\n return {\n content: message?.content || \"\",\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create Azure OpenAI adapter\n */\nexport function createAzureAdapter(config: AzureAdapterConfig): AzureAdapter {\n return new AzureAdapter(config);\n}\n"]}