@yourgpt/llm-sdk 0.1.0 → 0.1.1
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.
- package/README.md +61 -40
- package/dist/adapters/index.d.mts +4 -258
- package/dist/adapters/index.d.ts +4 -258
- package/dist/adapters/index.js +0 -113
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +1 -112
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/base-D_FyHFKj.d.mts +235 -0
- package/dist/base-D_FyHFKj.d.ts +235 -0
- package/dist/index.d.mts +145 -450
- package/dist/index.d.ts +145 -450
- package/dist/index.js +1837 -307
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1827 -305
- package/dist/index.mjs.map +1 -1
- package/dist/providers/anthropic/index.d.mts +61 -0
- package/dist/providers/anthropic/index.d.ts +61 -0
- package/dist/providers/anthropic/index.js +939 -0
- package/dist/providers/anthropic/index.js.map +1 -0
- package/dist/providers/anthropic/index.mjs +934 -0
- package/dist/providers/anthropic/index.mjs.map +1 -0
- package/dist/providers/azure/index.d.mts +38 -0
- package/dist/providers/azure/index.d.ts +38 -0
- package/dist/providers/azure/index.js +380 -0
- package/dist/providers/azure/index.js.map +1 -0
- package/dist/providers/azure/index.mjs +377 -0
- package/dist/providers/azure/index.mjs.map +1 -0
- package/dist/providers/google/index.d.mts +72 -0
- package/dist/providers/google/index.d.ts +72 -0
- package/dist/providers/google/index.js +790 -0
- package/dist/providers/google/index.js.map +1 -0
- package/dist/providers/google/index.mjs +785 -0
- package/dist/providers/google/index.mjs.map +1 -0
- package/dist/providers/ollama/index.d.mts +24 -0
- package/dist/providers/ollama/index.d.ts +24 -0
- package/dist/providers/ollama/index.js +235 -0
- package/dist/providers/ollama/index.js.map +1 -0
- package/dist/providers/ollama/index.mjs +232 -0
- package/dist/providers/ollama/index.mjs.map +1 -0
- package/dist/providers/openai/index.d.mts +82 -0
- package/dist/providers/openai/index.d.ts +82 -0
- package/dist/providers/openai/index.js +679 -0
- package/dist/providers/openai/index.js.map +1 -0
- package/dist/providers/openai/index.mjs +674 -0
- package/dist/providers/openai/index.mjs.map +1 -0
- package/dist/providers/xai/index.d.mts +78 -0
- package/dist/providers/xai/index.d.ts +78 -0
- package/dist/providers/xai/index.js +671 -0
- package/dist/providers/xai/index.js.map +1 -0
- package/dist/providers/xai/index.mjs +666 -0
- package/dist/providers/xai/index.mjs.map +1 -0
- package/dist/types-BBCZ3Fxy.d.mts +308 -0
- package/dist/types-CdORv1Yu.d.mts +338 -0
- package/dist/types-CdORv1Yu.d.ts +338 -0
- package/dist/types-DcoCaVVC.d.ts +308 -0
- package/package.json +34 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/base.ts","../src/adapters/openai.ts","../src/adapters/anthropic.ts","../src/adapters/groq.ts","../src/adapters/ollama.ts","../src/adapters/google.ts","../src/adapters/xai.ts","../src/adapters/azure.ts","../src/server/streaming.ts","../src/server/runtime.ts","../src/server/integrations.ts","../src/providers/registry.ts","../src/providers/openai/index.ts","../src/providers/anthropic/index.ts","../src/providers/groq/index.ts","../src/providers/ollama/index.ts","../src/providers/google/index.ts","../src/providers/xai/index.ts","../src/providers/azure/index.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/providers/formatter-registry.ts","../src/providers/index.ts","../src/server/agent-loop.ts"],"names":["generateMessageId","generateToolCallId","createMessage","Hono","cors","transformTools","parseToolCalls","extractTextContent","formatToolResults","isToolUseStop","isEndTurnStop","getStopReason","buildAssistantToolMessage","buildToolResultMessage"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n Message,\n MessageAttachment,\n ActionDefinition,\n StreamEvent,\n LLMConfig,\n} from \"@yourgpt/copilot-sdk/core\";\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?: Partial<LLMConfig>;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\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 /** Raw provider response for debugging */\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Base LLM adapter interface\n */\nexport interface LLMAdapter {\n /** Provider name */\n readonly provider: string;\n\n /** Model name */\n readonly model: string;\n\n /**\n * Stream a chat completion\n */\n stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent>;\n\n /**\n * Non-streaming chat completion (for debugging/comparison)\n */\n complete?(request: ChatCompletionRequest): Promise<CompletionResult>;\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory = (config: LLMConfig) => LLMAdapter;\n\n/**\n * Convert messages to provider format (simple text only)\n */\nexport function formatMessages(\n messages: Message[],\n systemPrompt?: string,\n): Array<{ role: string; content: string }> {\n const formatted: Array<{ role: string; content: string }> = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n // Add conversation messages\n for (const msg of messages) {\n formatted.push({\n role: msg.role,\n content: msg.content ?? \"\",\n });\n }\n\n return formatted;\n}\n\n/**\n * Convert ActionParameter to JSON Schema format recursively\n */\nfunction parameterToJsonSchema(param: {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n // Handle array items\n if (param.type === \"array\" && param.items) {\n schema.items = parameterToJsonSchema(\n param.items as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n );\n }\n\n // Handle nested object properties\n if (param.type === \"object\" && param.properties) {\n schema.properties = Object.fromEntries(\n Object.entries(param.properties).map(([key, prop]) => [\n key,\n parameterToJsonSchema(\n prop as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n ),\n ]),\n );\n }\n\n return schema;\n}\n\n/**\n * Convert actions to OpenAI tool format\n */\nexport function formatTools(actions: ActionDefinition[]): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return actions.map((action) => ({\n type: \"function\" as const,\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n parameterToJsonSchema(param),\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n },\n }));\n}\n\n// ============================================\n// Vision/Multimodal Support\n// ============================================\n\n/**\n * Content block types for multimodal messages\n */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n }\n | {\n type: \"document\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n };\n\nexport type OpenAIContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n };\n\n/**\n * Check if a message has image attachments\n * Supports both new format (metadata.attachments) and legacy (attachments)\n */\nexport function hasImageAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return attachments?.some((a) => a.type === \"image\") ?? false;\n}\n\n/**\n * Check if a message has media attachments (images or PDFs)\n */\nexport function hasMediaAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return (\n attachments?.some(\n (a) =>\n a.type === \"image\" ||\n (a.type === \"file\" && a.mimeType === \"application/pdf\"),\n ) ?? false\n );\n}\n\n/**\n * Convert MessageAttachment to Anthropic image content block\n *\n * Anthropic format:\n * {\n * type: \"image\",\n * source: {\n * type: \"base64\",\n * media_type: \"image/png\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicImage(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert MessageAttachment to OpenAI image_url content block\n *\n * OpenAI format:\n * {\n * type: \"image_url\",\n * image_url: {\n * url: \"data:image/png;base64,...\"\n * }\n * }\n */\nexport function attachmentToOpenAIImage(\n attachment: MessageAttachment,\n): OpenAIContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n let imageUrl: string;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Build data URI if not already one\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n return null;\n }\n\n return {\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n detail: \"auto\",\n },\n };\n}\n\n/**\n * Convert MessageAttachment (PDF) to Anthropic document content block\n *\n * Anthropic format:\n * {\n * type: \"document\",\n * source: {\n * type: \"base64\",\n * media_type: \"application/pdf\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicDocument(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n // Only handle PDF files\n if (attachment.type !== \"file\" || attachment.mimeType !== \"application/pdf\") {\n return null;\n }\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert a Message to Anthropic multimodal content blocks\n */\nexport function messageToAnthropicContent(\n message: Message,\n): string | AnthropicContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no media attachments (images or PDFs), return simple string\n if (!hasMediaAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: AnthropicContentBlock[] = [];\n\n // Add media attachments first (Claude recommends media before text)\n if (attachments) {\n for (const attachment of attachments) {\n // Try image first\n const imageBlock = attachmentToAnthropicImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n continue;\n }\n // Try document (PDF)\n const docBlock = attachmentToAnthropicDocument(attachment);\n if (docBlock) {\n blocks.push(docBlock);\n }\n }\n }\n\n // Add text content\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n return blocks;\n}\n\n/**\n * Convert a Message to OpenAI multimodal content blocks\n */\nexport function messageToOpenAIContent(\n message: Message,\n): string | OpenAIContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no image attachments, return simple string\n if (!hasImageAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: OpenAIContentBlock[] = [];\n\n // Add text content first\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n // Add image attachments\n if (attachments) {\n for (const attachment of attachments) {\n const imageBlock = attachmentToOpenAIImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n }\n }\n }\n\n return blocks;\n}\n\n/**\n * Anthropic content block types (extended for tools)\n */\nexport type AnthropicToolUseBlock = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type AnthropicToolResultBlock = {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n};\n\nexport type AnthropicMessageContent =\n | string\n | Array<\n AnthropicContentBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n >;\n\n/**\n * Format messages for Anthropic with full tool support\n * Handles: text, images, tool_use, and tool_result\n *\n * Key differences from OpenAI:\n * - tool_calls become tool_use blocks in assistant content\n * - tool results become tool_result blocks in user content\n */\nexport function formatMessagesForAnthropic(\n messages: Message[],\n systemPrompt?: string,\n): {\n system: string;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }>;\n} {\n const formatted: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }> = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") continue; // System handled separately\n\n if (msg.role === \"assistant\") {\n // Build content array for assistant\n const content: Array<AnthropicContentBlock | AnthropicToolUseBlock> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n formatted.push({\n role: \"assistant\",\n content:\n content.length === 1 && content[0].type === \"text\"\n ? (content[0] as { type: \"text\"; text: string }).text\n : content,\n });\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results go in user message as tool_result blocks\n // Group consecutive tool messages together\n const toolResults: AnthropicToolResultBlock[] = [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? \"\",\n },\n ];\n\n // Look ahead for more consecutive tool messages\n while (i + 1 < messages.length && messages[i + 1].role === \"tool\") {\n i++;\n const nextTool = messages[i];\n if (nextTool.tool_call_id) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: nextTool.tool_call_id,\n content: nextTool.content ?? \"\",\n });\n }\n }\n\n formatted.push({\n role: \"user\",\n content: toolResults,\n });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToAnthropicContent(msg),\n });\n }\n }\n\n return {\n system: systemPrompt || \"\",\n messages: formatted,\n };\n}\n\n/**\n * OpenAI message format with tool support\n */\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentBlock[] }\n | {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n }\n | { role: \"tool\"; content: string; tool_call_id: string };\n\n/**\n * Format messages for OpenAI with full tool support\n * Handles: text, images, tool_calls, and tool results\n */\nexport function formatMessagesForOpenAI(\n messages: Message[],\n systemPrompt?: string,\n): OpenAIMessage[] {\n const formatted: OpenAIMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n formatted.push({ role: \"system\", content: msg.content ?? \"\" });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToOpenAIContent(msg),\n });\n } else if (msg.role === \"assistant\") {\n const assistantMsg: OpenAIMessage = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n (assistantMsg as { tool_calls: typeof msg.tool_calls }).tool_calls =\n msg.tool_calls;\n }\n formatted.push(assistantMsg);\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n formatted.push({\n role: \"tool\",\n content: msg.content ?? \"\",\n tool_call_id: msg.tool_call_id,\n });\n }\n }\n\n return formatted;\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n/**\n * OpenAI adapter configuration\n */\nexport interface OpenAIAdapterConfig extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n baseUrl?: string;\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 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: \"OPENAI_ERROR\",\n };\n }\n }\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 { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n /** Enable extended thinking (for Claude 3.7 Sonnet, Claude 4) */\n thinking?: ThinkingConfig;\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 = 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 // 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 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 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 \"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 yield {\n type: \"action:start\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\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 === \"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 yield {\n type: \"action:args\",\n id: currentToolUse.id,\n args: currentToolUse.input,\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 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: \"ANTHROPIC_ERROR\",\n };\n }\n }\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 { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessages, formatTools } from \"./base\";\n\n/**\n * Groq adapter configuration\n */\nexport interface GroqAdapterConfig extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n}\n\n/**\n * Groq LLM Adapter (Fast inference)\n *\n * Supports: Llama 3.1, Mixtral, Gemma, etc.\n */\nexport class GroqAdapter implements LLMAdapter {\n readonly provider = \"groq\";\n readonly model: string;\n\n private config: GroqAdapterConfig;\n\n constructor(config: GroqAdapterConfig) {\n this.config = config;\n this.model = config.model || \"llama-3.1-70b-versatile\";\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const messages = formatMessages(request.messages, request.systemPrompt);\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 // Groq uses OpenAI-compatible API\n const response = await fetch(\n \"https://api.groq.com/openai/v1/chat/completions\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\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 signal: request.signal,\n },\n );\n\n if (!response.ok) {\n throw new Error(`Groq API error: ${response.status}`);\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\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\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.startsWith(\"data: \")) continue;\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") continue;\n\n try {\n const chunk = JSON.parse(data);\n const delta = chunk.choices?.[0]?.delta;\n\n if (delta?.content) {\n yield { type: \"message:delta\", content: delta.content };\n }\n\n // Handle tool calls (Groq supports function calling)\n if (delta?.tool_calls) {\n for (const toolCall of delta.tool_calls) {\n if (toolCall.id) {\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 currentToolCall.arguments += toolCall.function.arguments;\n }\n }\n }\n\n if (chunk.choices?.[0]?.finish_reason && currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: currentToolCall.arguments,\n };\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 yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"GROQ_ERROR\",\n };\n }\n }\n }\n}\n\n/**\n * Create Groq adapter\n */\nexport function createGroqAdapter(config: GroqAdapterConfig): GroqAdapter {\n return new GroqAdapter(config);\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessages } from \"./base\";\n\n/**\n * Ollama adapter configuration\n */\nexport interface OllamaAdapterConfig extends Partial<LLMConfig> {\n model?: string;\n baseUrl?: string;\n}\n\n/**\n * Ollama LLM Adapter (Local models)\n *\n * Supports: Llama 3, Mistral, Phi, Gemma, CodeLlama, etc.\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 const messages = formatMessages(request.messages, request.systemPrompt);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\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 stream: true,\n options: {\n temperature: request.config?.temperature ?? this.config.temperature,\n num_predict: request.config?.maxTokens ?? this.config.maxTokens,\n },\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.status}`);\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\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 if (chunk.message?.content) {\n yield { type: \"message:delta\", content: chunk.message.content };\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 yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"OLLAMA_ERROR\",\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\n */\n\nimport type {\n LLMConfig,\n StreamEvent,\n Message,\n} from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n /** Safety settings */\n safetySettings?: Array<{\n category: string;\n threshold: string;\n }>;\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 // 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 tools = formatToolsForGemini(request.actions);\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: 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 // 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 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\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: \"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 * 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 \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n baseUrl?: string;\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 \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\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 /** 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","import type { StreamEvent } from \"@yourgpt/copilot-sdk/core\";\n\n/**\n * Create SSE response headers\n */\nexport function createSSEHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n };\n}\n\n/**\n * Format event as SSE data\n */\nexport function formatSSEData(event: StreamEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n\n/**\n * Create a ReadableStream from an async generator of events\n */\nexport function createEventStream(\n generator: AsyncGenerator<StreamEvent>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n const data = formatSSEData(event);\n controller.enqueue(encoder.encode(data));\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n controller.enqueue(encoder.encode(formatSSEData(errorEvent)));\n } finally {\n // Send done event\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n }\n },\n });\n}\n\n/**\n * Create SSE Response object\n */\nexport function createSSEResponse(\n generator: AsyncGenerator<StreamEvent>,\n): Response {\n return new Response(createEventStream(generator), {\n headers: createSSEHeaders(),\n });\n}\n","import type {\n Message,\n ActionDefinition,\n ActionParameter,\n StreamEvent,\n ToolDefinition,\n ToolCallInfo,\n AssistantToolMessage,\n DoneEventMessage,\n ToolResponse,\n AIResponseMode,\n AIContent,\n ToolContext,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type { AIProvider } from \"../providers/types\";\nimport { createMessage } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"../adapters\";\nimport {\n createOpenAIAdapter,\n createAnthropicAdapter,\n createGroqAdapter,\n createOllamaAdapter,\n} from \"../adapters\";\nimport type { RuntimeConfig, ChatRequest } from \"./types\";\nimport { createSSEResponse } from \"./streaming\";\n\n// ============================================\n// AI Response Control\n// ============================================\n\n/**\n * Build the content string sent to AI for a tool result.\n *\n * This function transforms tool results based on the tool's aiResponseMode and aiContext settings,\n * controlling what information the AI receives to generate its response.\n *\n * @param tool - The tool definition (may include aiResponseMode, aiContext)\n * @param result - The tool result (may include _aiResponseMode, _aiContext, _aiContent overrides)\n * @param args - The arguments passed to the tool\n * @returns The content string to send to the AI, or multimodal content array\n */\nfunction buildToolResultForAI(\n tool: ToolDefinition | undefined,\n result: ToolResponse | unknown,\n args: Record<string, unknown>,\n): string | AIContent[] {\n // Type guard for ToolResponse with AI response fields\n const typedResult = result as ToolResponse | undefined;\n\n // Determine response mode (result override > tool config > default 'full')\n const responseMode: AIResponseMode =\n typedResult?._aiResponseMode ?? tool?.aiResponseMode ?? \"full\";\n\n // Check for multimodal content (images, etc.) - always include if present\n if (typedResult?._aiContent && typedResult._aiContent.length > 0) {\n return typedResult._aiContent;\n }\n\n // Get AI context (result override > tool config > undefined)\n let aiContext: string | undefined;\n\n if (typedResult?._aiContext) {\n aiContext = typedResult._aiContext;\n } else if (tool?.aiContext) {\n aiContext =\n typeof tool.aiContext === \"function\"\n ? tool.aiContext(typedResult as ToolResponse, args)\n : tool.aiContext;\n }\n\n // Apply response mode\n switch (responseMode) {\n case \"none\":\n // Minimal message so AI knows tool executed\n return aiContext ?? \"[Result displayed to user]\";\n\n case \"brief\":\n // Use context if available, otherwise minimal acknowledgment\n return (\n aiContext ?? `[Tool ${tool?.name ?? \"unknown\"} executed successfully]`\n );\n\n case \"full\":\n default:\n // Include context as prefix if available, then full data\n const fullData = JSON.stringify(result);\n return aiContext ? `${aiContext}\\n\\nFull data: ${fullData}` : fullData;\n }\n}\n\n/**\n * Serialize tool result content for API message.\n * Handles both string and multimodal (AIContent[]) results.\n */\nfunction serializeToolResultContent(\n content: string | AIContent[],\n): string | Array<{ type: string; [key: string]: unknown }> {\n if (typeof content === \"string\") {\n return content;\n }\n\n // Convert AIContent to API format (OpenAI multimodal format)\n return content.map((item) => {\n if (item.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${item.mediaType};base64,${item.data}`,\n },\n };\n }\n // Text content\n return {\n type: \"text\",\n text: item.text,\n };\n });\n}\n\n/**\n * Extract headers from HTTP request as a plain object\n */\nfunction extractHeaders(request?: Request): Record<string, string> {\n if (!request) return {};\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n return headers;\n}\n\n/**\n * Build ToolContext from runtime config and HTTP request\n */\nfunction buildToolContext(\n toolCallId: string,\n signal: AbortSignal | undefined,\n threadId: string | undefined,\n httpRequest: Request | undefined,\n toolContextData: Record<string, unknown> | undefined,\n): ToolContext {\n const headers = extractHeaders(httpRequest);\n return {\n signal,\n threadId,\n toolCallId,\n headers,\n request: httpRequest\n ? {\n method: httpRequest.method,\n url: httpRequest.url,\n headers,\n }\n : undefined,\n data: toolContextData,\n };\n}\n\n/**\n * Copilot SDK Runtime\n *\n * Handles chat requests and manages LLM interactions.\n */\nexport class Runtime {\n private adapter: LLMAdapter;\n private config: RuntimeConfig;\n private actions: Map<string, ActionDefinition> = new Map();\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n\n // Create adapter based on configuration type\n if (\"provider\" in config && config.provider) {\n // NEW: Use AIProvider to get adapter\n this.adapter = config.provider.languageModel(config.model);\n } else if (\"adapter\" in config && config.adapter) {\n // EXISTING: Direct adapter\n this.adapter = config.adapter;\n } else {\n // EXISTING: Legacy LLM config\n this.adapter = this.createAdapter(config);\n }\n\n // Register actions (legacy)\n if (config.actions) {\n for (const action of config.actions) {\n this.actions.set(action.name, action);\n }\n }\n\n // Register tools (new)\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Create LLM adapter based on config\n */\n private createAdapter(config: RuntimeConfig): LLMAdapter {\n if (!(\"llm\" in config) || !config.llm) {\n throw new Error(\n \"LLM configuration is required when adapter is not provided\",\n );\n }\n const { llm } = config;\n\n switch (llm.provider) {\n case \"openai\":\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"anthropic\":\n return createAnthropicAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"groq\":\n return createGroqAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"ollama\":\n return createOllamaAdapter({\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n default:\n // Default to OpenAI-compatible\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n }\n }\n\n /**\n * Process a chat request and return streaming response\n */\n async *processChat(\n request: ChatRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n // Convert request messages to Message type\n const messages: Message[] = request.messages.map((m, i) =>\n createMessage({\n id: `msg_${i}`,\n role: m.role as Message[\"role\"],\n content: m.content,\n }),\n );\n\n // Merge actions from config and request\n const allActions = [...this.actions.values()];\n if (request.actions) {\n for (const action of request.actions) {\n if (!this.actions.has(action.name)) {\n allActions.push({\n name: action.name,\n description: action.description,\n parameters: action.parameters as ActionDefinition[\"parameters\"],\n handler: async () => {\n // Client-side action - will be handled by frontend\n return { handled: false };\n },\n });\n }\n }\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages,\n actions: allActions.length > 0 ? allActions : undefined,\n systemPrompt: request.systemPrompt || this.config.systemPrompt,\n config: request.config,\n signal,\n };\n\n // Stream response from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process events and handle tool calls\n for await (const event of stream) {\n // Handle action execution\n if (event.type === \"action:args\") {\n const action = this.actions.get(event.id);\n if (action) {\n try {\n const args = JSON.parse(event.args);\n const result = await action.handler(args);\n yield {\n type: \"action:end\",\n id: event.id,\n result,\n };\n } catch (error) {\n yield {\n type: \"action:end\",\n id: event.id,\n error: error instanceof Error ? error.message : \"Action failed\",\n };\n }\n } else {\n // Forward to client for handling\n yield event;\n }\n } else {\n yield event;\n }\n }\n }\n\n /**\n * Handle HTTP request (for use with any framework)\n */\n async handleRequest(request: Request): Promise<Response> {\n try {\n const body = (await request.json()) as ChatRequest;\n\n if (this.config.debug) {\n console.log(\"[Copilot SDK] Request:\", JSON.stringify(body, null, 2));\n }\n\n // Create abort controller from request signal\n const signal = request.signal;\n\n // Use agent loop if tools are present or explicitly enabled\n const hasTools =\n (body.tools && body.tools.length > 0) || this.tools.size > 0;\n const useAgentLoop = hasTools || this.config.agentLoop?.enabled;\n\n // NON-STREAMING: Return JSON response instead of SSE\n if (body.streaming === false) {\n return this.handleNonStreamingRequest(\n body,\n signal,\n useAgentLoop || false,\n request,\n );\n }\n\n // STREAMING: Process chat and return SSE response\n const generator = useAgentLoop\n ? this.processChatWithLoop(body, signal, undefined, undefined, request)\n : this.processChat(body, signal);\n return createSSEResponse(generator);\n } catch (error) {\n console.error(\"[Copilot SDK] Error:\", error);\n\n return new Response(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Handle non-streaming request - returns JSON instead of SSE\n */\n private async handleNonStreamingRequest(\n body: ChatRequest,\n signal: AbortSignal | undefined,\n useAgentLoop: boolean,\n httpRequest: Request,\n ): Promise<Response> {\n try {\n const generator = useAgentLoop\n ? this.processChatWithLoop(\n body,\n signal,\n undefined,\n undefined,\n httpRequest,\n )\n : this.processChat(body, signal);\n\n // Collect all events\n const events: StreamEvent[] = [];\n let content = \"\";\n const toolCalls: ToolCallInfo[] = [];\n const toolResults: Array<{ id: string; result: unknown }> = [];\n let messages: DoneEventMessage[] | undefined;\n let requiresAction = false;\n let error: { message: string; code?: string } | undefined;\n\n for await (const event of generator) {\n events.push(event);\n\n switch (event.type) {\n case \"message:delta\":\n content += event.content;\n break;\n case \"action:start\":\n toolCalls.push({ id: event.id, name: event.name, args: {} });\n break;\n case \"action:args\":\n const tc = toolCalls.find((t) => t.id === event.id);\n if (tc) {\n try {\n tc.args = JSON.parse(event.args || \"{}\");\n } catch {\n tc.args = {};\n }\n }\n break;\n case \"action:end\":\n toolResults.push({\n id: event.id,\n result: event.result || event.error,\n });\n break;\n case \"tool_calls\":\n // Client-side tool calls\n break;\n case \"done\":\n messages = event.messages;\n requiresAction = event.requiresAction || false;\n break;\n case \"error\":\n error = { message: event.message, code: event.code };\n break;\n }\n }\n\n // Build JSON response\n const response = {\n success: !error,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n toolResults: toolResults.length > 0 ? toolResults : undefined,\n messages,\n requiresAction,\n error,\n // Include raw events for debugging\n _events: this.config.debug ? events : undefined,\n };\n\n console.log(\"[Copilot SDK] Non-streaming response:\", {\n contentLength: content.length,\n toolCalls: toolCalls.length,\n toolResults: toolResults.length,\n messagesCount: messages?.length,\n requiresAction,\n hasError: !!error,\n });\n\n return new Response(JSON.stringify(response), {\n status: error ? 500 : 200,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n } catch (err) {\n console.error(\"[Copilot SDK] Non-streaming error:\", err);\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n message: err instanceof Error ? err.message : \"Unknown error\",\n },\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Get registered actions\n */\n getActions(): ActionDefinition[] {\n return [...this.actions.values()];\n }\n\n /**\n * Register a new action\n */\n registerAction(action: ActionDefinition): void {\n this.actions.set(action.name, action);\n }\n\n /**\n * Unregister an action\n */\n unregisterAction(name: string): void {\n this.actions.delete(name);\n }\n\n /**\n * Register a new tool\n */\n registerTool(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregisterTool(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get registered tools\n */\n getTools(): ToolDefinition[] {\n return [...this.tools.values()];\n }\n\n /**\n * Get the AI provider name from config\n */\n private getProviderName(): string {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.provider.name;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.provider;\n }\n // Default to openai if using custom adapter\n return \"openai\";\n }\n\n /**\n * Get the AI provider instance (if using provider config)\n */\n getProvider(): AIProvider | null {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.provider as AIProvider;\n }\n return null;\n }\n\n /**\n * Get the current model ID\n */\n getModel(): string {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.model;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.model || \"unknown\";\n }\n return this.adapter.model;\n }\n\n /**\n * Process a chat request with tool support (Vercel AI SDK pattern)\n *\n * This method:\n * 1. Streams response from adapter\n * 2. Detects tool calls from streaming events\n * 3. Server-side tools are executed immediately\n * 4. Client-side tool calls are yielded for client to execute\n * 5. Loop continues until no more tool calls or max iterations reached\n * 6. Returns all new messages in the done event for client to append\n */\n async *processChatWithLoop(\n request: ChatRequest,\n signal?: AbortSignal,\n // Internal: accumulated messages from recursive calls (for returning in done event)\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n // HTTP request for extracting headers (auth context)\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const debug = this.config.debug || this.config.agentLoop?.debug;\n\n // Check if non-streaming mode is requested\n // Use non-streaming for better comparison with original studio-ai behavior\n if (request.streaming === false) {\n if (debug) {\n console.log(\"[Copilot SDK] Using non-streaming mode\");\n }\n // Delegate to non-streaming implementation\n for await (const event of this.processChatWithLoopNonStreaming(\n request,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Track new messages created during this request\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Processing chat with ${allTools.length} tools`,\n );\n // Log messages with attachments for debugging vision support\n for (let i = 0; i < request.messages.length; i++) {\n const msg = request.messages[i];\n const hasAttachments = msg.attachments && msg.attachments.length > 0;\n if (hasAttachments) {\n console.log(\n `[Copilot SDK] Message ${i} (${msg.role}) has ${msg.attachments!.length} attachments:`,\n msg.attachments!.map((a) => ({\n type: a.type,\n mimeType: a.mimeType,\n dataLength: a.data?.length || 0,\n })),\n );\n }\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Accumulate data from stream\n let accumulatedText = \"\";\n const toolCalls: ToolCallInfo[] = [];\n let currentToolCall: { id: string; name: string; args: string } | null =\n null;\n\n // Create completion request\n // Use rawMessages if provided (when client sends tool results in messages)\n const completionRequest: ChatCompletionRequest = {\n messages: [], // Not used when rawMessages is provided\n rawMessages: request.messages as Array<Record<string, unknown>>,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n };\n\n // Stream from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process stream events\n for await (const event of stream) {\n switch (event.type) {\n case \"message:start\":\n case \"message:end\":\n yield event; // Forward to client\n break;\n\n case \"message:delta\":\n accumulatedText += event.content;\n yield event; // Forward text to client\n break;\n\n case \"action:start\":\n currentToolCall = { id: event.id, name: event.name, args: \"\" };\n if (debug) {\n console.log(`[Copilot SDK] Tool call started: ${event.name}`);\n }\n yield event; // Forward to client\n break;\n\n case \"action:args\":\n if (currentToolCall) {\n try {\n const parsedArgs = JSON.parse(event.args || \"{}\");\n if (debug) {\n console.log(\n `[Copilot SDK] Tool args for ${currentToolCall.name}:`,\n parsedArgs,\n );\n }\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: parsedArgs,\n });\n } catch (e) {\n console.error(\n \"[Copilot SDK] Failed to parse tool args:\",\n event.args,\n e,\n );\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: {},\n });\n }\n currentToolCall = null;\n }\n yield event; // Forward to client\n break;\n\n case \"error\":\n yield event;\n return; // Exit on error\n\n case \"done\":\n // Don't yield done yet - we need to check for tool calls first\n break;\n\n default:\n yield event;\n }\n }\n\n // Check if we got tool calls\n if (toolCalls.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Detected ${toolCalls.length} tool calls:`,\n toolCalls.map((t) => t.name),\n );\n }\n\n // Separate server-side and client-side tool calls\n const serverToolCalls: ToolCallInfo[] = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push(tc);\n }\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing server-side tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const result = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n result,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If there are server-side tools executed, continue the loop by making another LLM call\n if (serverToolResults.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Server tools executed, continuing conversation...`,\n );\n }\n\n // Create assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: serverToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Create tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] = serverToolResults.map(\n (tr) => {\n const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);\n // Serialize content (handles both string and multimodal)\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n },\n );\n\n // Add to accumulated messages for client\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Build messages for next LLM call (cast DoneEventMessage to Record for request)\n const messagesWithResults: Array<Record<string, unknown>> = [\n ...(request.messages as Array<Record<string, unknown>>),\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<Record<string, unknown>>),\n ];\n\n // Make recursive call with updated messages\n const nextRequest: ChatRequest = {\n ...request,\n messages: messagesWithResults as ChatRequest[\"messages\"],\n };\n\n // Continue the agent loop - pass accumulated messages and HTTP request\n for await (const event of this.processChatWithLoop(\n nextRequest,\n signal,\n newMessages,\n true, // Mark as recursive\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // If there are client-side tools, send them to client\n if (clientToolCalls.length > 0) {\n // Build assistant message with tool_calls for client to include in next request\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Add to accumulated messages (cast to DoneEventMessage since structure matches)\n newMessages.push(assistantMessage as DoneEventMessage);\n\n // Yield tool_calls event (Vercel AI SDK pattern)\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n // Signal that client needs to execute tools and send results\n // Include accumulated messages so client can update state\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - add final assistant message and we're done\n if (accumulatedText) {\n newMessages.push({\n role: \"assistant\" as const,\n content: accumulatedText,\n });\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Stream complete, returning ${newMessages.length} new messages`,\n );\n }\n\n // Return all accumulated messages for client to append\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n } as StreamEvent;\n }\n\n /**\n * Non-streaming agent loop implementation\n *\n * Uses adapter.complete() instead of stream() for:\n * - Better comparison with original studio-ai behavior\n * - Easier debugging (full response at once)\n * - More predictable retry behavior\n */\n private async *processChatWithLoopNonStreaming(\n request: ChatRequest,\n signal?: AbortSignal,\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const debug = this.config.debug || this.config.agentLoop?.debug;\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Main agent loop\n let iteration = 0;\n let conversationMessages = request.messages as Array<\n Record<string, unknown>\n >;\n\n while (iteration < maxIterations) {\n iteration++;\n\n if (debug) {\n console.log(`[Copilot SDK] Iteration ${iteration}/${maxIterations}`);\n }\n\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"error\",\n message: \"Aborted\",\n code: \"ABORTED\",\n } as StreamEvent;\n return;\n }\n\n // Check if adapter supports non-streaming\n if (!this.adapter.complete) {\n if (debug) {\n console.log(\n \"[Copilot SDK] Adapter does not support non-streaming, falling back to streaming\",\n );\n }\n // Fall back to streaming by delegating to the streaming implementation\n // But set streaming to true to avoid infinite loop\n const streamingRequest = { ...request, streaming: true };\n for await (const event of this.processChatWithLoop(\n streamingRequest,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages: [],\n rawMessages: conversationMessages,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n };\n\n try {\n // Call the non-streaming complete method\n const result = await this.adapter.complete(completionRequest);\n\n if (debug) {\n console.log(\n `[Copilot SDK] Got response: ${result.content.length} chars, ${result.toolCalls.length} tool calls`,\n );\n }\n\n // Emit message events (for SSE compatibility)\n yield { type: \"message:start\", id: `msg_${Date.now()}` } as StreamEvent;\n if (result.content) {\n yield {\n type: \"message:delta\",\n content: result.content,\n } as StreamEvent;\n }\n yield { type: \"message:end\" } as StreamEvent;\n\n // Check for tool calls\n if (result.toolCalls.length > 0) {\n // Separate server and client tools\n const serverToolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of result.toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n }\n }\n\n // Emit tool call events\n for (const tc of result.toolCalls) {\n yield {\n type: \"action:start\",\n id: tc.id,\n name: tc.name,\n } as StreamEvent;\n yield {\n type: \"action:args\",\n id: tc.id,\n args: JSON.stringify(tc.args),\n } as StreamEvent;\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const toolResult = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: toolResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n result: toolResult,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If server tools were executed, continue the loop\n if (serverToolResults.length > 0) {\n // Build assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Build tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] =\n serverToolResults.map((tr) => {\n const aiContent = buildToolResultForAI(\n tr.tool,\n tr.result,\n tr.args,\n );\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n });\n\n // Add to accumulated messages\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Update conversation for next iteration\n conversationMessages = [\n ...conversationMessages,\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<\n Record<string, unknown>\n >),\n ];\n\n // Continue loop\n continue;\n }\n\n // Client tools - yield for client to execute and return\n if (clientToolCalls.length > 0) {\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n newMessages.push(assistantMessage as DoneEventMessage);\n\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - we're done\n if (result.content) {\n newMessages.push({\n role: \"assistant\" as const,\n content: result.content,\n });\n }\n\n if (debug) {\n console.log(`[Copilot SDK] Complete after ${iteration} iterations`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n } as StreamEvent;\n return;\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"COMPLETION_ERROR\",\n } as StreamEvent;\n return;\n }\n }\n\n // Max iterations reached\n if (debug) {\n console.log(`[Copilot SDK] Max iterations (${maxIterations}) reached`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n } as StreamEvent;\n }\n\n /**\n * Convert tools to legacy action format (for adapter compatibility)\n */\n private convertToolsToActions(tools: ToolDefinition[]): ActionDefinition[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: this.convertInputSchemaToParameters(tool.inputSchema),\n handler: tool.handler || (async () => ({ handled: false })),\n }));\n }\n\n /**\n * Convert JSON Schema property to ActionParameter format recursively\n */\n private convertSchemaProperty(prop: unknown): ActionParameter {\n const p = prop as {\n type?: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n };\n\n type ParamType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n const typeMap: Record<string, ParamType> = {\n string: \"string\",\n number: \"number\",\n integer: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n };\n\n const result: ActionParameter = {\n type: typeMap[p.type || \"string\"] || \"string\",\n };\n\n if (p.description) {\n result.description = p.description;\n }\n\n if (p.enum) {\n result.enum = p.enum;\n }\n\n // Preserve items for array types\n if (p.type === \"array\" && p.items) {\n result.items = this.convertSchemaProperty(p.items);\n }\n\n // Preserve properties for object types\n if (p.type === \"object\" && p.properties) {\n result.properties = Object.fromEntries(\n Object.entries(p.properties).map(([key, val]) => [\n key,\n this.convertSchemaProperty(val),\n ]),\n );\n }\n\n return result;\n }\n\n /**\n * Convert JSON Schema to legacy parameters format\n */\n private convertInputSchemaToParameters(\n schema: ToolDefinition[\"inputSchema\"],\n ): Record<string, ActionParameter> {\n const parameters: Record<string, ActionParameter> = {};\n\n for (const [name, prop] of Object.entries(schema.properties)) {\n const converted = this.convertSchemaProperty(prop);\n parameters[name] = {\n ...converted,\n required: schema.required?.includes(name),\n };\n }\n\n return parameters;\n }\n}\n\n/**\n * Create runtime instance\n */\nexport function createRuntime(config: RuntimeConfig): Runtime {\n return new Runtime(config);\n}\n","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type { Runtime } from \"./runtime\";\nimport type { RuntimeConfig } from \"./types\";\nimport { createRuntime } from \"./runtime\";\nimport { createSSEResponse } from \"./streaming\";\n\n/**\n * Create Hono app with chat endpoint\n */\nexport function createHonoApp(runtime: Runtime): Hono {\n const app = new Hono();\n\n // Enable CORS\n app.use(\"*\", cors());\n\n // Health check\n app.get(\"/\", (c) => {\n return c.json({ status: \"ok\", provider: \"yourgpt-copilot\" });\n });\n\n // Chat endpoint at root (for Next.js App Router mounting)\n // e.g., mounted at /api/chat/openai → POST /api/chat/openai works\n app.post(\"/\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint (standard - single turn)\n // Also available at /chat sub-path for flexibility\n app.post(\"/chat\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint with agent loop (multi-turn with tools)\n // Note: With Vercel AI SDK pattern, this is the same as /chat\n // Client sends tool results in messages, server doesn't wait\n app.post(\"/chat/loop\", async (c) => {\n try {\n const body = await c.req.json();\n const signal = c.req.raw.signal;\n\n // Process with tool support\n const generator = runtime.processChatWithLoop(body, signal);\n return createSSEResponse(generator);\n } catch (error) {\n return c.json(\n { error: error instanceof Error ? error.message : \"Unknown error\" },\n 500,\n );\n }\n });\n\n // Get available actions (legacy)\n app.get(\"/actions\", (c) => {\n const actions = runtime.getActions().map((a) => ({\n name: a.name,\n description: a.description,\n parameters: a.parameters,\n }));\n return c.json({ actions });\n });\n\n // Get available tools (new)\n app.get(\"/tools\", (c) => {\n const tools = runtime.getTools().map((t) => ({\n name: t.name,\n description: t.description,\n location: t.location,\n inputSchema: t.inputSchema,\n }));\n return c.json({ tools });\n });\n\n // Get model capabilities (for UI feature flags)\n app.get(\"/capabilities\", (c) => {\n const provider = runtime.getProvider();\n const model = runtime.getModel();\n\n if (provider) {\n const capabilities = provider.getCapabilities(model);\n return c.json({\n provider: provider.name,\n model,\n capabilities,\n supportedModels: provider.supportedModels,\n });\n }\n\n // Fallback for legacy config (no provider instance)\n return c.json({\n provider: \"unknown\",\n model,\n capabilities: {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n },\n supportedModels: [],\n });\n });\n\n return app;\n}\n\n/**\n * Next.js App Router handler\n *\n * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { createNextHandler } from '@yourgpt/llm-sdk';\n *\n * const handler = createNextHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * });\n *\n * export const POST = handler;\n * ```\n */\nexport function createNextHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n\n return async function handler(request: Request): Promise<Response> {\n return runtime.handleRequest(request);\n };\n}\n\n/**\n * Express middleware\n *\n * @example\n * ```ts\n * import express from 'express';\n * import { createExpressMiddleware } from '@yourgpt/llm-sdk';\n *\n * const app = express();\n *\n * app.use('/api/chat', createExpressMiddleware({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * }));\n * ```\n */\nexport function createExpressMiddleware(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n const app = createHonoApp(runtime);\n\n // Return Hono's fetch handler wrapped for Express\n return async (\n req: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body: unknown;\n },\n res: {\n status: (code: number) => { json: (data: unknown) => void };\n setHeader: (name: string, value: string) => void;\n write: (data: string) => void;\n end: () => void;\n },\n ) => {\n try {\n // Convert Express request to Fetch Request\n const url = new URL(req.url, \"http://localhost\");\n const request = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== \"GET\" ? JSON.stringify(req.body) : undefined,\n });\n\n // Handle with runtime\n const response = await runtime.handleRequest(request);\n\n // Set response headers\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n // Stream response body\n if (response.body) {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(decoder.decode(value));\n }\n }\n\n res.end();\n } catch (error) {\n res.status(500).json({\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n };\n}\n\n/**\n * Node.js HTTP handler\n *\n * @example\n * ```ts\n * import http from 'http';\n * import { createNodeHandler } from '@yourgpt/llm-sdk';\n *\n * const handler = createNodeHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * });\n *\n * const server = http.createServer(handler);\n * server.listen(3001);\n * ```\n */\nexport function createNodeHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n const app = createHonoApp(runtime);\n\n return app.fetch;\n}\n","/**\n * Provider Registry\n *\n * Central registry for AI providers.\n * Allows dynamic registration and lookup of providers.\n */\n\nimport type { AIProvider, ProviderCapabilities } from \"./types\";\n\n// ============================================\n// Registry\n// ============================================\n\n/**\n * Registry of provider factory functions\n * Key: provider name (e.g., 'openai')\n * Value: factory function that creates the provider\n */\nconst providerFactories = new Map<\n string,\n (config?: Record<string, unknown>) => AIProvider\n>();\n\n/**\n * Register a provider factory\n *\n * @param name Provider name (e.g., 'openai')\n * @param factory Factory function that creates the provider\n *\n * @example\n * ```typescript\n * registerProvider('openai', (config) => createOpenAI(config));\n * ```\n */\nexport function registerProvider(\n name: string,\n factory: (config?: Record<string, unknown>) => AIProvider,\n): void {\n providerFactories.set(name, factory);\n}\n\n/**\n * Get a provider by name\n *\n * @param name Provider name\n * @param config Optional configuration\n * @returns Provider instance or undefined if not found\n *\n * @example\n * ```typescript\n * const openai = getProvider('openai', { apiKey: '...' });\n * ```\n */\nexport function getProvider(\n name: string,\n config?: Record<string, unknown>,\n): AIProvider | undefined {\n const factory = providerFactories.get(name);\n if (!factory) {\n return undefined;\n }\n return factory(config);\n}\n\n/**\n * Check if a provider is registered\n */\nexport function hasProvider(name: string): boolean {\n return providerFactories.has(name);\n}\n\n/**\n * List all registered provider names\n */\nexport function listProviders(): string[] {\n return Array.from(providerFactories.keys());\n}\n\n/**\n * Unregister a provider (useful for testing)\n */\nexport function unregisterProvider(name: string): boolean {\n return providerFactories.delete(name);\n}\n\n/**\n * Clear all registered providers (useful for testing)\n */\nexport function clearProviders(): void {\n providerFactories.clear();\n}\n\n// ============================================\n// Provider Info\n// ============================================\n\n/**\n * Get all available providers with their models\n * Useful for building UI model selectors\n */\nexport function getAvailableProviders(): Array<{\n name: string;\n models: string[];\n}> {\n const result: Array<{ name: string; models: string[] }> = [];\n\n for (const [name, factory] of providerFactories) {\n try {\n const provider = factory();\n result.push({\n name,\n models: provider.supportedModels,\n });\n } catch {\n // Skip providers that fail to initialize (e.g., missing API key)\n result.push({\n name,\n models: [],\n });\n }\n }\n\n return result;\n}\n\n/**\n * Get capabilities for a specific provider and model\n */\nexport function getModelCapabilities(\n providerName: string,\n modelId: string,\n): ProviderCapabilities | undefined {\n const provider = getProvider(providerName);\n if (!provider) {\n return undefined;\n }\n return provider.getCapabilities(modelId);\n}\n","/**\n * OpenAI Provider\n *\n * Wraps the existing OpenAIAdapter with provider interface.\n * Adds model capabilities and metadata.\n */\n\nimport { createOpenAIAdapter } from \"../../adapters/openai\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n OpenAIProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n audio: boolean;\n jsonMode: boolean;\n maxTokens: number;\n}\n\nconst OPENAI_MODELS: Record<string, ModelCapabilities> = {\n // GPT-4o series\n \"gpt-4o\": {\n vision: true,\n tools: true,\n audio: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-mini\": {\n vision: true,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-2024-11-20\": {\n vision: true,\n tools: true,\n audio: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-2024-08-06\": {\n vision: true,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n\n // GPT-4 Turbo series\n \"gpt-4-turbo\": {\n vision: true,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4-turbo-preview\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n\n // GPT-4 series\n \"gpt-4\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: false,\n maxTokens: 8192,\n },\n \"gpt-4-32k\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: false,\n maxTokens: 32768,\n },\n\n // GPT-3.5 series\n \"gpt-3.5-turbo\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 16385,\n },\n \"gpt-3.5-turbo-16k\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 16385,\n },\n\n // O1 reasoning series\n o1: {\n vision: true,\n tools: false, // O1 doesn't support tools yet\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n \"o1-mini\": {\n vision: true,\n tools: false,\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n \"o1-preview\": {\n vision: true,\n tools: false,\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n\n // O3 reasoning series\n \"o3-mini\": {\n vision: true,\n tools: false,\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an OpenAI provider\n *\n * @example\n * ```typescript\n * const openai = createOpenAI({ apiKey: '...' });\n * const adapter = openai.languageModel('gpt-4o');\n * const caps = openai.getCapabilities('gpt-4o');\n * ```\n */\nexport function createOpenAI(config: OpenAIProviderConfig = {}): AIProvider {\n const apiKey = config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\";\n\n return {\n name: \"openai\",\n supportedModels: Object.keys(OPENAI_MODELS),\n\n languageModel(modelId: string) {\n return createOpenAIAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model = OPENAI_MODELS[modelId] ?? OPENAI_MODELS[\"gpt-4o\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false, // OpenAI doesn't have extended thinking\n supportsStreaming: true,\n supportsPDF: false, // OpenAI doesn't support PDFs directly\n supportsAudio: model.audio,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n supportedAudioTypes: model.audio\n ? [\"audio/mp3\", \"audio/wav\", \"audio/webm\"]\n : [],\n supportsJsonMode: model.jsonMode,\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createOpenAIProvider = createOpenAI;\n","/**\n * Anthropic Provider\n *\n * Wraps the existing AnthropicAdapter with provider interface.\n * Adds model capabilities and metadata including extended thinking support.\n */\n\nimport { createAnthropicAdapter } from \"../../adapters/anthropic\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n AnthropicProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, ModelCapabilities> = {\n // Claude 4 series (latest)\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 64000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 32000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic provider\n *\n * @example\n * ```typescript\n * const anthropic = createAnthropic({\n * apiKey: '...',\n * thinkingBudget: 10000, // Enable extended thinking\n * });\n * const adapter = anthropic.languageModel('claude-sonnet-4-20250514');\n * const caps = anthropic.getCapabilities('claude-sonnet-4-20250514');\n * ```\n */\nexport function createAnthropic(\n config: AnthropicProviderConfig = {},\n): AIProvider {\n const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY ?? \"\";\n\n return {\n name: \"anthropic\",\n supportedModels: Object.keys(ANTHROPIC_MODELS),\n\n languageModel(modelId: string) {\n return createAnthropicAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n thinking: config.thinkingBudget\n ? { type: \"enabled\", budgetTokens: config.thinkingBudget }\n : undefined,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model =\n ANTHROPIC_MODELS[modelId] ??\n ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: model.thinking,\n supportsStreaming: true,\n supportsPDF: true, // Claude supports PDFs\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ],\n supportsJsonMode: false, // Anthropic doesn't have JSON mode\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createAnthropicProvider = createAnthropic;\n","/**\n * Groq Provider\n *\n * Wraps the existing GroqAdapter with provider interface.\n * Groq provides fast inference for open-source models.\n */\n\nimport { createGroqAdapter } from \"../../adapters/groq\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n GroqProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n}\n\nconst GROQ_MODELS: Record<string, ModelCapabilities> = {\n // Llama 3.3 series\n \"llama-3.3-70b-versatile\": {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n \"llama-3.3-70b-specdec\": {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n\n // Llama 3.2 Vision series\n \"llama-3.2-90b-vision-preview\": {\n vision: true,\n tools: true,\n maxTokens: 8192,\n },\n \"llama-3.2-11b-vision-preview\": {\n vision: true,\n tools: true,\n maxTokens: 8192,\n },\n\n // Llama 3.1 series\n \"llama-3.1-70b-versatile\": {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n \"llama-3.1-8b-instant\": {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n\n // Mixtral series\n \"mixtral-8x7b-32768\": {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n\n // Gemma series\n \"gemma2-9b-it\": {\n vision: false,\n tools: false,\n maxTokens: 8192,\n },\n\n // DeepSeek\n \"deepseek-r1-distill-llama-70b\": {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create a Groq provider\n *\n * @example\n * ```typescript\n * const groq = createGroq({ apiKey: '...' });\n * const adapter = groq.languageModel('llama-3.3-70b-versatile');\n * ```\n */\nexport function createGroq(config: GroqProviderConfig = {}): AIProvider {\n const apiKey = config.apiKey ?? process.env.GROQ_API_KEY ?? \"\";\n\n return {\n name: \"groq\",\n supportedModels: Object.keys(GROQ_MODELS),\n\n languageModel(modelId: string) {\n return createGroqAdapter({\n apiKey,\n model: modelId,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model =\n GROQ_MODELS[modelId] ?? GROQ_MODELS[\"llama-3.3-70b-versatile\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n supportsJsonMode: true,\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createGroqProvider = createGroq;\n","/**\n * Ollama Provider\n *\n * Wraps the existing OllamaAdapter with provider interface.\n * Ollama runs models locally on your machine.\n */\n\nimport { createOllamaAdapter } from \"../../adapters/ollama\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n OllamaProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n}\n\n// Common Ollama models - users can run any model\nconst OLLAMA_MODELS: Record<string, ModelCapabilities> = {\n // Llama series\n llama3: {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"llama3:70b\": {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"llama3.2\": {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"llama3.2-vision\": {\n vision: true,\n tools: true,\n maxTokens: 8192,\n },\n\n // Mistral series\n mistral: {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"mistral-nemo\": {\n vision: false,\n tools: true,\n maxTokens: 128000,\n },\n mixtral: {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n\n // CodeLlama\n codellama: {\n vision: false,\n tools: false,\n maxTokens: 16384,\n },\n\n // Phi series\n phi3: {\n vision: false,\n tools: true,\n maxTokens: 4096,\n },\n \"phi3:medium\": {\n vision: false,\n tools: true,\n maxTokens: 4096,\n },\n\n // Gemma series\n gemma2: {\n vision: false,\n tools: false,\n maxTokens: 8192,\n },\n \"gemma2:27b\": {\n vision: false,\n tools: false,\n maxTokens: 8192,\n },\n\n // Qwen series\n qwen2: {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n \"qwen2.5-coder\": {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n\n // LLaVA (vision)\n llava: {\n vision: true,\n tools: false,\n maxTokens: 4096,\n },\n\n // DeepSeek\n deepseek: {\n vision: false,\n tools: true,\n maxTokens: 16384,\n },\n \"deepseek-coder\": {\n vision: false,\n tools: false,\n maxTokens: 16384,\n },\n};\n\n// Default capabilities for unknown models\nconst DEFAULT_MODEL_CAPS: ModelCapabilities = {\n vision: false,\n tools: false,\n maxTokens: 4096,\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Ollama provider\n *\n * @example\n * ```typescript\n * const ollama = createOllama({ baseUrl: 'http://localhost:11434' });\n * const adapter = ollama.languageModel('llama3');\n * ```\n */\nexport function createOllama(config: OllamaProviderConfig = {}): AIProvider {\n const baseUrl = config.baseUrl ?? \"http://localhost:11434\";\n\n return {\n name: \"ollama\",\n supportedModels: Object.keys(OLLAMA_MODELS),\n\n languageModel(modelId: string) {\n return createOllamaAdapter({\n model: modelId,\n baseUrl,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n // Try exact match first, then try base model name\n const baseModelName = modelId.split(\":\")[0];\n const model =\n OLLAMA_MODELS[modelId] ??\n OLLAMA_MODELS[baseModelName] ??\n DEFAULT_MODEL_CAPS;\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\"]\n : [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createOllamaProvider = createOllama;\n","/**\n * Google Provider\n *\n * Wraps the GoogleAdapter with provider interface.\n * Adds model capabilities and metadata for multimodal support.\n *\n * Features:\n * - Vision (images)\n * - Audio input\n * - Video input\n * - PDF documents\n * - Tools/Function calling\n * - Massive context windows (up to 2M tokens)\n */\n\nimport { createGoogleAdapter } from \"../../adapters/google\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n GoogleProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n audio: boolean;\n video: boolean;\n pdf: boolean;\n maxTokens: number;\n outputTokens: number;\n}\n\nconst GOOGLE_MODELS: Record<string, ModelCapabilities> = {\n // Gemini 2.0 series (latest)\n \"gemini-2.0-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n \"gemini-2.0-flash-lite\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n\n // Gemini 2.5 series (experimental)\n \"gemini-2.5-pro-preview-05-06\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 65536,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 65536,\n },\n\n // Gemini 1.5 series\n \"gemini-1.5-pro\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 2000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-pro-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 2000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-flash-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-flash-8b\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n\n // Gemini 1.0 series (legacy)\n \"gemini-1.0-pro\": {\n vision: false,\n tools: true,\n audio: false,\n video: false,\n pdf: false,\n maxTokens: 30720,\n outputTokens: 2048,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create a Google provider\n *\n * @example\n * ```typescript\n * const google = createGoogle({\n * apiKey: '...',\n * });\n * const adapter = google.languageModel('gemini-2.0-flash');\n * const caps = google.getCapabilities('gemini-2.0-flash');\n *\n * if (caps.supportsVideo) {\n * // Show video upload button\n * }\n * ```\n */\nexport function createGoogle(config: GoogleProviderConfig = {}): AIProvider {\n const apiKey = config.apiKey ?? process.env.GOOGLE_API_KEY ?? \"\";\n\n return {\n name: \"google\",\n supportedModels: Object.keys(GOOGLE_MODELS),\n\n languageModel(modelId: string) {\n return createGoogleAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n safetySettings: config.safetySettings,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model = GOOGLE_MODELS[modelId] ?? GOOGLE_MODELS[\"gemini-2.0-flash\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false, // Gemini doesn't have extended thinking like Claude\n supportsStreaming: true,\n supportsPDF: model.pdf,\n supportsAudio: model.audio,\n supportsVideo: model.video,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/heic\",\n \"image/heif\",\n ]\n : [],\n supportedAudioTypes: model.audio\n ? [\n \"audio/mp3\",\n \"audio/wav\",\n \"audio/aiff\",\n \"audio/aac\",\n \"audio/ogg\",\n \"audio/flac\",\n ]\n : [],\n supportedVideoTypes: model.video\n ? [\n \"video/mp4\",\n \"video/mpeg\",\n \"video/mov\",\n \"video/avi\",\n \"video/webm\",\n \"video/mkv\",\n ]\n : [],\n supportsJsonMode: true, // Gemini supports JSON mode\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createGoogleProvider = createGoogle;\n","/**\n * xAI Provider\n *\n * Wraps the XAIAdapter with provider interface.\n * xAI's Grok models are cutting-edge AI models with vision and tool support.\n *\n * Features:\n * - Vision (images)\n * - Tools/Function calling\n * - Real-time information (trained on X/Twitter data)\n */\n\nimport { createXAIAdapter } from \"../../adapters/xai\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n XAIProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n outputTokens: number;\n}\n\nconst XAI_MODELS: Record<string, ModelCapabilities> = {\n // Grok 2 series (latest)\n \"grok-2\": {\n vision: true,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n \"grok-2-latest\": {\n vision: true,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n \"grok-2-mini\": {\n vision: false,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n \"grok-2-mini-latest\": {\n vision: false,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n\n // Grok Vision\n \"grok-2-vision\": {\n vision: true,\n tools: true,\n maxTokens: 32768,\n outputTokens: 4096,\n },\n \"grok-2-vision-latest\": {\n vision: true,\n tools: true,\n maxTokens: 32768,\n outputTokens: 4096,\n },\n\n // Grok Beta (legacy)\n \"grok-beta\": {\n vision: false,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n \"grok-vision-beta\": {\n vision: true,\n tools: true,\n maxTokens: 8192,\n outputTokens: 4096,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an xAI provider\n *\n * @example\n * ```typescript\n * const xai = createXAI({\n * apiKey: '...',\n * });\n * const adapter = xai.languageModel('grok-2');\n * const caps = xai.getCapabilities('grok-2');\n * ```\n */\nexport function createXAI(config: XAIProviderConfig = {}): AIProvider {\n const apiKey = config.apiKey ?? process.env.XAI_API_KEY ?? \"\";\n\n return {\n name: \"xai\",\n supportedModels: Object.keys(XAI_MODELS),\n\n languageModel(modelId: string) {\n return createXAIAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model = XAI_MODELS[modelId] ?? XAI_MODELS[\"grok-2\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n supportsJsonMode: false, // xAI doesn't support JSON mode yet\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createXAIProvider = createXAI;\n","/**\n * Azure OpenAI Provider\n *\n * Wraps the AzureAdapter with provider interface.\n * Azure OpenAI provides enterprise-grade OpenAI models with Azure security.\n *\n * Features:\n * - Vision (for supported deployments)\n * - Tools/Function calling\n * - Enterprise security & compliance\n * - Private networking options\n *\n * Note: Capabilities depend on which model is deployed, not a model ID.\n * The provider attempts to detect capabilities from the deployment name.\n */\n\nimport { createAzureAdapter } from \"../../adapters/azure\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n AzureProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Capability Patterns\n// ============================================\n\n/**\n * Detect model capabilities from deployment name\n * Azure deployments are user-named, so we look for common patterns\n */\nfunction detectCapabilitiesFromDeployment(deploymentName: string): {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n} {\n const name = deploymentName.toLowerCase();\n\n // GPT-4o variants (vision, tools, 128k context)\n if (name.includes(\"gpt-4o\") || name.includes(\"gpt4o\")) {\n return { vision: true, tools: true, maxTokens: 128000 };\n }\n\n // GPT-4 Turbo with vision\n if (\n (name.includes(\"gpt-4\") || name.includes(\"gpt4\")) &&\n (name.includes(\"turbo\") || name.includes(\"vision\"))\n ) {\n return { vision: true, tools: true, maxTokens: 128000 };\n }\n\n // GPT-4 base\n if (name.includes(\"gpt-4\") || name.includes(\"gpt4\")) {\n return { vision: false, tools: true, maxTokens: 8192 };\n }\n\n // GPT-3.5 Turbo\n if (\n name.includes(\"gpt-35\") ||\n name.includes(\"gpt-3.5\") ||\n name.includes(\"gpt35\")\n ) {\n return { vision: false, tools: true, maxTokens: 16385 };\n }\n\n // o1 reasoning models\n if (name.includes(\"o1\")) {\n return { vision: true, tools: false, maxTokens: 128000 };\n }\n\n // Default fallback\n return { vision: false, tools: true, maxTokens: 8192 };\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Azure OpenAI provider\n *\n * @example\n * ```typescript\n * const azure = createAzure({\n * apiKey: '...',\n * resourceName: 'my-azure-resource',\n * deploymentName: 'gpt-4o-deployment',\n * });\n * const adapter = azure.languageModel('gpt-4o-deployment');\n * const caps = azure.getCapabilities('gpt-4o-deployment');\n * ```\n */\nexport function createAzure(config: AzureProviderConfig): AIProvider {\n const apiKey = config.apiKey ?? process.env.AZURE_OPENAI_API_KEY ?? \"\";\n const resourceName =\n config.resourceName ?? process.env.AZURE_OPENAI_RESOURCE ?? \"\";\n const defaultDeployment =\n config.deploymentName ?? process.env.AZURE_OPENAI_DEPLOYMENT ?? \"\";\n\n // For Azure, the \"supported models\" are actually deployment names\n // We include the default deployment as the main \"model\"\n const supportedModels = defaultDeployment ? [defaultDeployment] : [];\n\n return {\n name: \"azure\",\n supportedModels,\n\n languageModel(deploymentName: string) {\n return createAzureAdapter({\n apiKey,\n resourceName,\n deploymentName: deploymentName || defaultDeployment,\n apiVersion: config.apiVersion,\n baseUrl: config.baseUrl,\n });\n },\n\n getCapabilities(deploymentName: string): ProviderCapabilities {\n const detected = detectCapabilitiesFromDeployment(\n deploymentName || defaultDeployment,\n );\n\n return {\n supportsVision: detected.vision,\n supportsTools: detected.tools,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: detected.maxTokens,\n supportedImageTypes: detected.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n supportsJsonMode: true,\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createAzureProvider = createAzure;\n","/**\n * OpenAI Provider Formatter\n *\n * Transformation functions for OpenAI API format\n * Also used by xAI/Grok (they use OpenAI-compatible format)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type {\n ProviderFormatter,\n OpenAITool,\n OpenAIToolCall,\n OpenAIToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to OpenAI format\n */\nexport function transformTools(tools: ToolDefinition[]): OpenAITool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from OpenAI response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n const toolCalls = (message?.tool_calls as OpenAIToolCall[]) || [];\n\n return toolCalls.map((tc) => {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch (e) {\n console.error(\n \"Failed to parse tool arguments:\",\n tc.function.arguments,\n e,\n );\n }\n return {\n id: tc.id,\n name: tc.function.name,\n input,\n };\n });\n}\n\n/**\n * Extract text content from OpenAI response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n return (message?.content as string) || \"\";\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for OpenAI\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): OpenAIToolResult[] {\n return results.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"tool_calls\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return (choices?.[0]?.finish_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for OpenAI format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n return {\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.input),\n },\n })),\n };\n}\n\n/**\n * Build tool result messages for OpenAI\n * In OpenAI format, each tool result is a separate message\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n // OpenAI expects each tool result as a separate message\n // Return an array to be spread into the conversation\n return formatToolResults(results);\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * OpenAI provider formatter\n */\nexport const openaiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Anthropic/Claude Provider Formatter\n *\n * Transformation functions for Anthropic API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type {\n ProviderFormatter,\n AnthropicTool,\n AnthropicToolUse,\n AnthropicToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Anthropic format\n */\nexport function transformTools(tools: ToolDefinition[]): AnthropicTool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Anthropic response content\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content\n .filter((block): block is AnthropicToolUse => block?.type === \"tool_use\")\n .map((block) => ({\n id: block.id,\n name: block.name,\n input: block.input || {},\n }));\n}\n\n/**\n * Extract text content from Anthropic response\n */\nexport function extractTextContent(response: unknown): string {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n return content\n .filter((block) => block?.type === \"text\")\n .map((block) => (block as { text?: string }).text || \"\")\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Anthropic\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): AnthropicToolResult[] {\n return results.map((r) => ({\n type: \"tool_result\" as const,\n tool_use_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n return resp?.stop_reason === \"tool_use\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const stopReason = resp?.stop_reason;\n return stopReason === \"end_turn\" || stopReason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n return (resp?.stop_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Anthropic format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const content: unknown[] = [];\n\n if (textContent) {\n content.push({ type: \"text\", text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.input,\n });\n });\n\n return { role: \"assistant\", content };\n}\n\n/**\n * Build user message with tool results for Anthropic\n * In Anthropic format, tool results are sent as a user message with tool_result blocks\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n return {\n role: \"user\",\n content: formatToolResults(results),\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Anthropic provider formatter\n */\nexport const anthropicFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Google Gemini Provider Formatter\n *\n * Transformation functions for Google Gemini API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type {\n ProviderFormatter,\n GeminiFunctionDeclaration,\n GeminiFunctionCall,\n GeminiFunctionResponse,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Gemini format\n */\nexport function transformTools(\n tools: ToolDefinition[],\n): Array<{ functionDeclarations: GeminiFunctionDeclaration[] }> {\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n })),\n },\n ];\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Gemini response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return [];\n\n const functionCalls: UnifiedToolCall[] = [];\n\n for (const part of parts) {\n const functionCall = part.functionCall as GeminiFunctionCall | undefined;\n if (functionCall) {\n functionCalls.push({\n id: `gemini_${Date.now()}_${functionCalls.length}`, // Gemini doesn't provide IDs\n name: functionCall.name,\n input: functionCall.args || {},\n });\n }\n }\n\n return functionCalls;\n}\n\n/**\n * Extract text content from Gemini response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return \"\";\n\n return parts\n .filter((part) => typeof part.text === \"string\")\n .map((part) => part.text as string)\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Gemini\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): GeminiFunctionResponse[] {\n return results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n return {\n name: r.toolCallId.split(\"_\").slice(2).join(\"_\") || \"unknown\", // Extract name from ID\n response,\n };\n });\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return false;\n\n return parts.some((part) => part.functionCall !== undefined);\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const finishReason = candidates?.[0]?.finishReason as string | undefined;\n\n return finishReason === \"STOP\" || finishReason === \"END_TURN\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n return (candidates?.[0]?.finishReason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Gemini format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const parts: unknown[] = [];\n\n if (textContent) {\n parts.push({ text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n parts.push({\n functionCall: {\n name: tc.name,\n args: tc.input,\n },\n });\n });\n\n return {\n role: \"model\",\n parts,\n };\n}\n\n/**\n * Build user message with tool results for Gemini\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n const parts = results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n // Extract tool name from the result - we need to track this separately\n // For now, use a placeholder since Gemini doesn't use IDs\n return {\n functionResponse: {\n name: \"tool\", // This should be the actual tool name\n response,\n },\n };\n });\n\n return {\n role: \"user\",\n parts,\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Gemini provider formatter\n */\nexport const geminiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Provider Formatter Registry\n *\n * Maps provider names to their formatters for the agent loop.\n * Formatters handle tool transformations between unified format and provider-specific formats.\n */\n\nimport type { ProviderFormatter } from \"./types\";\nimport { openaiFormatter } from \"./openai\";\nimport { anthropicFormatter } from \"./anthropic\";\nimport { geminiFormatter } from \"./gemini\";\n\n// ============================================\n// Formatter Registry\n// ============================================\n\n/**\n * Map of provider names to their formatters\n */\nconst formatters: Record<string, ProviderFormatter> = {\n openai: openaiFormatter,\n anthropic: anthropicFormatter,\n google: geminiFormatter,\n gemini: geminiFormatter, // Alias\n // OpenAI-compatible providers use openaiFormatter\n groq: openaiFormatter,\n ollama: openaiFormatter,\n xai: openaiFormatter,\n azure: openaiFormatter,\n};\n\n/**\n * Get a formatter for a specific provider\n *\n * @param provider - Provider name (e.g., 'openai', 'anthropic', 'google')\n * @returns The provider's formatter\n * @throws Error if provider is not supported\n *\n * @example\n * ```typescript\n * const formatter = getFormatter('openai');\n * const tools = formatter.transformTools(unifiedTools);\n * ```\n */\nexport function getFormatter(provider: string): ProviderFormatter {\n const formatter = formatters[provider.toLowerCase()];\n if (!formatter) {\n throw new Error(\n `Unsupported provider: ${provider}. Supported providers: ${Object.keys(formatters).join(\", \")}`,\n );\n }\n return formatter;\n}\n\n/**\n * Check if a provider is supported\n *\n * @param provider - Provider name to check\n * @returns True if provider has a formatter\n *\n * @example\n * ```typescript\n * if (isProviderSupported('openai')) {\n * // Use the provider\n * }\n * ```\n */\nexport function isProviderSupported(provider: string): boolean {\n return provider.toLowerCase() in formatters;\n}\n\n/**\n * Get list of supported providers\n *\n * @returns Array of supported provider names\n *\n * @example\n * ```typescript\n * const providers = getSupportedProviders();\n * // ['openai', 'anthropic', 'google', ...]\n * ```\n */\nexport function getSupportedProviders(): string[] {\n return Object.keys(formatters);\n}\n\n/**\n * Register a custom formatter for a provider\n *\n * @param provider - Provider name\n * @param formatter - Formatter implementation\n *\n * @example\n * ```typescript\n * registerFormatter('custom-provider', myCustomFormatter);\n * ```\n */\nexport function registerFormatter(\n provider: string,\n formatter: ProviderFormatter,\n): void {\n formatters[provider.toLowerCase()] = formatter;\n}\n","/**\n * Providers\n *\n * Multi-provider architecture for Copilot SDK.\n * Each provider wraps existing adapters with capabilities metadata.\n *\n * @example\n * ```typescript\n * import { createOpenAI, createAnthropic } from '@yourgpt/llm-sdk';\n *\n * // Create a provider\n * const openai = createOpenAI({ apiKey: '...' });\n *\n * // Get a model adapter (returns existing LLMAdapter)\n * const adapter = openai.languageModel('gpt-4o');\n *\n * // Check capabilities (for UI feature flags)\n * const caps = openai.getCapabilities('gpt-4o');\n * if (caps.supportsVision) {\n * // Enable image upload\n * }\n * ```\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport type {\n // Core types\n AIProvider,\n ProviderCapabilities,\n EmbeddingModel,\n ModelInfo,\n // Base config\n BaseProviderConfig,\n // Provider-specific configs\n OpenAIProviderConfig,\n AnthropicProviderConfig,\n GoogleProviderConfig,\n XAIProviderConfig,\n AzureProviderConfig,\n GroqProviderConfig,\n OllamaProviderConfig,\n // Google-specific\n GoogleSafetySetting,\n GoogleGroundingConfig,\n} from \"./types\";\n\nexport { DEFAULT_CAPABILITIES } from \"./types\";\n\n// ============================================\n// Registry\n// ============================================\n\nexport {\n registerProvider,\n getProvider,\n hasProvider,\n listProviders,\n unregisterProvider,\n clearProviders,\n getAvailableProviders,\n getModelCapabilities,\n} from \"./registry\";\n\n// ============================================\n// Provider Factories (from subdirectories)\n// ============================================\n\n// OpenAI\nexport { createOpenAI, createOpenAIProvider } from \"./openai/index\";\n\n// Anthropic\nexport { createAnthropic, createAnthropicProvider } from \"./anthropic/index\";\n\n// Groq\nexport { createGroq, createGroqProvider } from \"./groq/index\";\n\n// Ollama\nexport { createOllama, createOllamaProvider } from \"./ollama/index\";\n\n// Google\nexport { createGoogle, createGoogleProvider } from \"./google/index\";\n\n// xAI\nexport { createXAI, createXAIProvider } from \"./xai/index\";\n\n// Azure\nexport { createAzure, createAzureProvider } from \"./azure/index\";\n\n// ============================================\n// Provider Formatters (for agentic loop)\n// ============================================\n\nexport { openaiFormatter } from \"./openai\";\nexport { anthropicFormatter } from \"./anthropic\";\nexport { geminiFormatter } from \"./gemini\";\n\n// Formatter registry helpers\nexport {\n getFormatter,\n isProviderSupported,\n getSupportedProviders,\n} from \"./formatter-registry\";\n\n// Formatter types (from types.ts)\nexport type {\n ProviderFormatter,\n // OpenAI tool types\n OpenAITool,\n OpenAIToolCall,\n OpenAIToolResult,\n // Anthropic tool types\n AnthropicTool,\n AnthropicToolUse,\n AnthropicToolResult,\n // Gemini tool types\n GeminiFunctionDeclaration,\n GeminiFunctionCall,\n GeminiFunctionResponse,\n} from \"./types\";\n\n// ============================================\n// Auto-register built-in providers\n// ============================================\n\nimport { registerProvider } from \"./registry\";\nimport { createOpenAI } from \"./openai/index\";\nimport { createAnthropic } from \"./anthropic/index\";\nimport { createGroq } from \"./groq/index\";\nimport { createOllama } from \"./ollama/index\";\nimport { createGoogle } from \"./google/index\";\nimport { createXAI } from \"./xai/index\";\nimport { createAzure } from \"./azure/index\";\n\n// Register with default configs (API keys from env)\nregisterProvider(\"openai\", (config) => createOpenAI(config as any));\nregisterProvider(\"anthropic\", (config) => createAnthropic(config as any));\nregisterProvider(\"groq\", (config) => createGroq(config as any));\nregisterProvider(\"ollama\", (config) => createOllama(config as any));\nregisterProvider(\"google\", (config) => createGoogle(config as any));\nregisterProvider(\"xai\", (config) => createXAI(config as any));\nregisterProvider(\"azure\", (config) => createAzure(config as any));\n","/**\n * Agent Loop Implementation\n *\n * Server-side agentic loop that:\n * 1. Calls LLM with tools\n * 2. Parses tool calls from response\n * 3. Executes server-side tools or requests client execution\n * 4. Loops until LLM returns end_turn or max iterations reached\n *\n * Streams events to client via SSE for real-time updates\n */\n\nimport type {\n StreamEvent,\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n ToolResponse,\n AIProvider,\n AgentLoopConfig,\n Message,\n} from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateToolCallId,\n generateMessageId,\n} from \"@yourgpt/copilot-sdk/core\";\nimport { getFormatter } from \"../providers\";\n\n// ========================================\n// Constants\n// ========================================\n\n/** Default maximum iterations */\nconst DEFAULT_MAX_ITERATIONS = 20;\n\n// ========================================\n// Types\n// ========================================\n\n/**\n * Agent loop options\n */\nexport interface AgentLoopOptions {\n /** Initial messages */\n messages: Message[];\n /** Available tools */\n tools: ToolDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** AI provider */\n provider: AIProvider;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Loop configuration */\n config?: AgentLoopConfig;\n /**\n * LLM call function\n * Should call the LLM and return the raw response\n */\n callLLM: (messages: unknown[], tools: unknown[]) => Promise<unknown>;\n /**\n * Server-side tool executor\n * Called when a server-side tool needs to be executed\n */\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n /**\n * Callback to wait for client tool result\n * Called when a client-side tool needs to be executed\n * Should return a Promise that resolves when client sends result\n */\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n}\n\n/**\n * Internal conversation message format\n */\ninterface ConversationMessage {\n role: string;\n content: unknown;\n [key: string]: unknown;\n}\n\n// ========================================\n// Main Agent Loop\n// ========================================\n\n/**\n * Run the agentic loop\n *\n * @yields Stream events for each step of the loop\n */\nexport async function* runAgentLoop(\n options: AgentLoopOptions,\n): AsyncGenerator<StreamEvent> {\n const {\n messages,\n tools,\n systemPrompt,\n provider,\n signal,\n config,\n callLLM,\n executeServerTool,\n waitForClientToolResult,\n } = options;\n\n const maxIterations = config?.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n const debug = config?.debug ?? false;\n const formatter = getFormatter(provider);\n\n // Separate server and client tools\n const serverTools = tools.filter((t) => t.location === \"server\");\n const clientTools = tools.filter((t) => t.location === \"client\");\n const allTools = [...serverTools, ...clientTools];\n\n // Transform tools to provider format\n const providerTools = formatter.transformTools(allTools);\n\n // Build conversation\n const conversation: ConversationMessage[] = buildConversation(\n messages,\n systemPrompt,\n );\n\n let iteration = 0;\n\n if (debug) {\n console.log(\"[AgentLoop] Starting with\", {\n messageCount: messages.length,\n toolCount: allTools.length,\n serverToolCount: serverTools.length,\n clientToolCount: clientTools.length,\n maxIterations,\n });\n }\n\n // Main loop\n while (iteration < maxIterations) {\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n aborted: true,\n };\n return;\n }\n\n iteration++;\n\n // Emit iteration progress\n yield {\n type: \"loop:iteration\",\n iteration,\n maxIterations,\n };\n\n if (debug) {\n console.log(`[AgentLoop] Iteration ${iteration}/${maxIterations}`);\n }\n\n try {\n // Call LLM\n const response = await callLLM(conversation, providerTools);\n\n // Parse tool calls and text from response\n const toolCalls = formatter.parseToolCalls(response);\n const textContent = formatter.extractTextContent(response);\n\n // Emit text content as message\n if (textContent) {\n const messageId = generateMessageId();\n yield { type: \"message:start\", id: messageId };\n yield { type: \"message:delta\", content: textContent };\n yield { type: \"message:end\" };\n }\n\n // Check if we should use tools\n if (formatter.isToolUseStop(response) && toolCalls.length > 0) {\n if (debug) {\n console.log(\n \"[AgentLoop] Tool calls:\",\n toolCalls.map((tc) => tc.name),\n );\n }\n\n // Execute tools\n const results = await executeToolCalls(\n toolCalls,\n tools,\n executeServerTool,\n waitForClientToolResult,\n function* (event: StreamEvent) {\n yield event;\n },\n debug,\n );\n\n // Emit tool results\n for (const result of results) {\n const toolCall = toolCalls.find((tc) => tc.id === result.toolCallId);\n if (toolCall) {\n yield {\n type: \"tool:result\",\n id: result.toolCallId,\n name: toolCall.name,\n result: JSON.parse(result.content) as ToolResponse,\n };\n }\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMessage = formatter.buildAssistantToolMessage(\n toolCalls,\n textContent,\n );\n conversation.push(assistantMessage as ConversationMessage);\n\n // Add tool results to conversation\n const toolResultMessage = formatter.buildToolResultMessage(results);\n if (Array.isArray(toolResultMessage)) {\n // OpenAI format returns array of messages\n conversation.push(...(toolResultMessage as ConversationMessage[]));\n } else {\n conversation.push(toolResultMessage as ConversationMessage);\n }\n\n // Continue loop\n continue;\n }\n\n // Check for end turn\n if (formatter.isEndTurnStop(response)) {\n if (debug) {\n console.log(\"[AgentLoop] End turn detected\");\n }\n break;\n }\n\n // Unknown stop reason - break to be safe\n const stopReason = formatter.getStopReason(response);\n if (debug) {\n console.log(\"[AgentLoop] Unknown stop reason:\", stopReason);\n }\n break;\n } catch (error) {\n if (debug) {\n console.error(\"[AgentLoop] Error:\", error);\n }\n\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"AGENT_LOOP_ERROR\",\n };\n\n break;\n }\n }\n\n // Emit completion\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n maxIterationsReached: iteration >= maxIterations,\n };\n\n yield { type: \"done\" };\n}\n\n// ========================================\n// Helper Functions\n// ========================================\n\n/**\n * Build conversation from messages\n */\nfunction buildConversation(\n messages: Message[],\n systemPrompt?: string,\n): ConversationMessage[] {\n const conversation: ConversationMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n conversation.push({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Add messages\n for (const msg of messages) {\n conversation.push({\n role: msg.role,\n content: msg.content,\n });\n }\n\n return conversation;\n}\n\n/**\n * Execute tool calls\n */\nasync function executeToolCalls(\n toolCalls: UnifiedToolCall[],\n tools: ToolDefinition[],\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n emitEvent?: (event: StreamEvent) => void,\n debug?: boolean,\n): Promise<UnifiedToolResult[]> {\n const results: UnifiedToolResult[] = [];\n\n for (const toolCall of toolCalls) {\n const tool = tools.find((t) => t.name === toolCall.name);\n\n if (!tool) {\n // Unknown tool\n if (debug) {\n console.warn(`[AgentLoop] Unknown tool: ${toolCall.name}`);\n }\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n }),\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n });\n continue;\n }\n\n // Emit action start\n emitEvent?.({\n type: \"action:start\",\n id: toolCall.id,\n name: toolCall.name,\n });\n\n // Emit arguments\n emitEvent?.({\n type: \"action:args\",\n id: toolCall.id,\n args: JSON.stringify(toolCall.input),\n });\n\n try {\n let response: ToolResponse;\n\n if (tool.location === \"server\") {\n // Server-side tool\n if (tool.handler) {\n response = await tool.handler(toolCall.input);\n } else if (executeServerTool) {\n response = await executeServerTool(toolCall.name, toolCall.input);\n } else {\n response = {\n success: false,\n error: `No handler for server tool: ${toolCall.name}`,\n };\n }\n } else {\n // Client-side tool\n if (waitForClientToolResult) {\n // Wait for client result (client handles execution)\n response = await waitForClientToolResult(\n toolCall.id,\n toolCall.name,\n toolCall.input,\n );\n } else {\n response = {\n success: false,\n error: `No client tool handler for: ${toolCall.name}`,\n };\n }\n }\n\n // Emit action end\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n result: response,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify(response),\n success: response.success,\n error: response.error,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Tool execution failed\";\n\n // Emit action end with error\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n error: errorMessage,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: errorMessage,\n }),\n success: false,\n error: errorMessage,\n });\n }\n }\n\n return results;\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport { DEFAULT_MAX_ITERATIONS };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/tool.ts","../src/core/generate-text.ts","../src/core/stream-text.ts","../src/core/types.ts","../src/providers/openai/provider.ts","../src/providers/anthropic/provider.ts","../src/providers/xai/provider.ts","../src/providers/google/provider.ts","../src/adapters/base.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","../src/server/streaming.ts","../src/server/runtime.ts","../src/server/integrations.ts","../src/providers/registry.ts","../src/providers/openai/index.ts","../src/providers/anthropic/index.ts","../src/providers/ollama/index.ts","../src/providers/google/index.ts","../src/providers/xai/index.ts","../src/providers/azure/index.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/providers/formatter-registry.ts","../src/providers/index.ts","../src/server/agent-loop.ts"],"names":["result","buildMessages","formatToolsForProvider","client","mapFinishReason","formatMessagesForAnthropic","formatMessagesForOpenAI","generateMessageId","formatToolsForGemini","generateToolCallId","tool","createMessage","Hono","cors","OPENAI_MODELS","ANTHROPIC_MODELS","GOOGLE_MODELS","XAI_MODELS","transformTools","parseToolCalls","extractTextContent","formatToolResults","isToolUseStop","isEndTurnStop","getStopReason","buildAssistantToolMessage","buildToolResultMessage"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Tool Helper\n *\n * Create type-safe tools with Zod schema validation.\n *\n * @example\n * ```ts\n * import { tool } from '@yourgpt/llm-sdk';\n * import { z } from 'zod';\n *\n * const weatherTool = tool({\n * description: 'Get current weather for a city',\n * parameters: z.object({\n * city: z.string().describe('City name'),\n * unit: z.enum(['celsius', 'fahrenheit']).optional(),\n * }),\n * execute: async ({ city, unit }) => {\n * const data = await fetchWeather(city);\n * return { temperature: data.temp, condition: data.condition };\n * },\n * });\n * ```\n */\n\nimport type { z } from \"zod\";\nimport type { Tool, ToolContext } from \"./types\";\n\n/**\n * Configuration for creating a tool\n */\nexport interface ToolConfig<TParams extends z.ZodType, TResult = unknown> {\n /** Description of what the tool does (shown to LLM) */\n description: string;\n\n /** Zod schema defining the tool's parameters */\n parameters: TParams;\n\n /** Function to execute when the tool is called */\n execute: (params: z.infer<TParams>, context: ToolContext) => Promise<TResult>;\n}\n\n/**\n * Create a type-safe tool definition\n *\n * @param config - Tool configuration with description, parameters, and execute function\n * @returns A Tool object that can be passed to generateText/streamText\n *\n * @example\n * ```ts\n * const searchTool = tool({\n * description: 'Search for products in the database',\n * parameters: z.object({\n * query: z.string(),\n * maxResults: z.number().optional().default(10),\n * }),\n * execute: async ({ query, maxResults }) => {\n * return await db.products.search(query, maxResults);\n * },\n * });\n *\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'Find me some headphones',\n * tools: { search: searchTool },\n * });\n * ```\n */\nexport function tool<TParams extends z.ZodType, TResult = unknown>(\n config: ToolConfig<TParams, TResult>,\n): Tool<z.infer<TParams>, TResult> {\n return {\n description: config.description,\n parameters: config.parameters,\n execute: config.execute,\n };\n}\n\n/**\n * Convert a Tool's Zod schema to JSON Schema format\n * Used internally when sending tools to LLM providers\n */\nexport function toolToJsonSchema(toolDef: Tool): {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n} {\n const schema = zodToJsonSchema(toolDef.parameters);\n return {\n type: \"object\",\n properties: schema.properties ?? {},\n required: schema.required,\n };\n}\n\n/**\n * Convert Zod schema to JSON Schema\n * Handles common Zod types used in tool definitions\n */\nfunction zodToJsonSchema(schema: z.ZodType): {\n type?: string;\n properties?: Record<string, unknown>;\n required?: string[];\n items?: unknown;\n enum?: unknown[];\n description?: string;\n} {\n const def = (schema as unknown as { _def: unknown })._def as Record<\n string,\n unknown\n >;\n const typeName = def.typeName as string;\n\n // Handle descriptions\n const description = def.description as string | undefined;\n\n switch (typeName) {\n case \"ZodString\":\n return { type: \"string\", description };\n\n case \"ZodNumber\":\n return { type: \"number\", description };\n\n case \"ZodBoolean\":\n return { type: \"boolean\", description };\n\n case \"ZodEnum\": {\n const values = def.values as unknown[];\n return { type: \"string\", enum: values, description };\n }\n\n case \"ZodArray\": {\n const innerType = def.type as z.ZodType;\n return {\n type: \"array\",\n items: zodToJsonSchema(innerType),\n description,\n };\n }\n\n case \"ZodObject\": {\n const shape = def.shape as () => Record<string, z.ZodType>;\n const shapeObj = shape();\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shapeObj)) {\n properties[key] = zodToJsonSchema(value);\n\n // Check if required (not optional, not nullable, not with default)\n const valueDef = (value as unknown as { _def: Record<string, unknown> })\n ._def;\n const isOptional =\n valueDef.typeName === \"ZodOptional\" ||\n valueDef.typeName === \"ZodNullable\" ||\n valueDef.typeName === \"ZodDefault\";\n\n if (!isOptional) {\n required.push(key);\n }\n }\n\n return {\n type: \"object\",\n properties,\n required: required.length > 0 ? required : undefined,\n description,\n };\n }\n\n case \"ZodOptional\":\n case \"ZodNullable\": {\n const innerType = def.innerType as z.ZodType;\n return zodToJsonSchema(innerType);\n }\n\n case \"ZodDefault\": {\n const innerType = def.innerType as z.ZodType;\n return zodToJsonSchema(innerType);\n }\n\n case \"ZodLiteral\": {\n const value = def.value;\n if (typeof value === \"string\") {\n return { type: \"string\", enum: [value], description };\n }\n if (typeof value === \"number\") {\n return { type: \"number\", enum: [value], description };\n }\n if (typeof value === \"boolean\") {\n return { type: \"boolean\", enum: [value], description };\n }\n return { description };\n }\n\n case \"ZodUnion\": {\n // For simple string unions, convert to enum\n const options = def.options as z.ZodType[];\n const stringLiterals: string[] = [];\n\n for (const option of options) {\n const optDef = (option as unknown as { _def: Record<string, unknown> })\n ._def;\n if (\n optDef.typeName === \"ZodLiteral\" &&\n typeof optDef.value === \"string\"\n ) {\n stringLiterals.push(optDef.value as string);\n }\n }\n\n if (stringLiterals.length === options.length) {\n return { type: \"string\", enum: stringLiterals, description };\n }\n\n // For complex unions, just return the first option's schema\n return zodToJsonSchema(options[0]);\n }\n\n default:\n // Fallback for unknown types\n return { type: \"string\", description };\n }\n}\n\n/**\n * Format tools for OpenAI API format\n */\nexport function formatToolsForOpenAI(tools: Record<string, Tool>): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return Object.entries(tools).map(([name, toolDef]) => ({\n type: \"function\" as const,\n function: {\n name,\n description: toolDef.description,\n parameters: toolToJsonSchema(toolDef),\n },\n }));\n}\n\n/**\n * Format tools for Anthropic API format\n */\nexport function formatToolsForAnthropic(tools: Record<string, Tool>): Array<{\n name: string;\n description: string;\n input_schema: object;\n}> {\n return Object.entries(tools).map(([name, toolDef]) => ({\n name,\n description: toolDef.description,\n input_schema: toolToJsonSchema(toolDef),\n }));\n}\n\n/**\n * Format tools for Google Gemini API format\n */\nexport function formatToolsForGoogle(tools: Record<string, Tool>): Array<{\n functionDeclarations: Array<{\n name: string;\n description: string;\n parameters?: object;\n }>;\n}> {\n return [\n {\n functionDeclarations: Object.entries(tools).map(([name, toolDef]) => ({\n name,\n description: toolDef.description,\n parameters: toolToJsonSchema(toolDef),\n })),\n },\n ];\n}\n","/**\n * generateText - Generate text using a language model\n *\n * @example\n * ```ts\n * import { generateText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * // Simple usage\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'Explain quantum computing in simple terms.',\n * });\n * console.log(result.text);\n *\n * // With tools (agentic)\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'What is the weather in Tokyo?',\n * tools: { weather: weatherTool },\n * maxSteps: 5,\n * });\n * ```\n */\n\nimport type {\n GenerateTextParams,\n GenerateTextResult,\n GenerateStep,\n CoreMessage,\n Tool,\n ToolCall,\n ToolResult,\n TokenUsage,\n FinishReason,\n} from \"./types\";\nimport { formatToolsForOpenAI, formatToolsForAnthropic } from \"./tool\";\n\n/**\n * Generate text using a language model\n *\n * @param params - Generation parameters\n * @returns Promise resolving to generation result with text, usage, and tool interactions\n */\nexport async function generateText(\n params: GenerateTextParams,\n): Promise<GenerateTextResult> {\n const { model, tools, maxSteps = 1, signal } = params;\n\n // Build initial messages\n let messages = buildMessages(params);\n const steps: GenerateStep[] = [];\n const allToolCalls: ToolCall[] = [];\n const allToolResults: ToolResult[] = [];\n\n // Agent loop - keep going until no more tool calls or max steps reached\n for (let step = 0; step < maxSteps; step++) {\n // Check for abort\n if (signal?.aborted) {\n throw new Error(\"Generation aborted\");\n }\n\n // Format tools for this model's provider\n const formattedTools = tools\n ? formatToolsForProvider(tools, model.provider)\n : undefined;\n\n // Call model\n const result = await model.doGenerate({\n messages,\n tools: formattedTools,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n signal,\n });\n\n // Record this step\n const stepToolResults: ToolResult[] = [];\n\n // If there are tool calls, execute them\n if (result.toolCalls && result.toolCalls.length > 0 && tools) {\n allToolCalls.push(...result.toolCalls);\n\n // Execute each tool\n for (const call of result.toolCalls) {\n const toolDef = tools[call.name];\n if (!toolDef) {\n const errorResult: ToolResult = {\n toolCallId: call.id,\n result: { error: `Tool not found: ${call.name}` },\n };\n stepToolResults.push(errorResult);\n allToolResults.push(errorResult);\n continue;\n }\n\n try {\n // Validate and execute\n const parsedArgs = toolDef.parameters.parse(call.args);\n const toolResult = await toolDef.execute(parsedArgs, {\n toolCallId: call.id,\n abortSignal: signal,\n messages,\n });\n\n const result: ToolResult = {\n toolCallId: call.id,\n result: toolResult,\n };\n stepToolResults.push(result);\n allToolResults.push(result);\n } catch (error) {\n const errorResult: ToolResult = {\n toolCallId: call.id,\n result: {\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n },\n };\n stepToolResults.push(errorResult);\n allToolResults.push(errorResult);\n }\n }\n }\n\n // Record step\n steps.push({\n text: result.text,\n toolCalls: result.toolCalls,\n toolResults: stepToolResults,\n finishReason: result.finishReason,\n usage: result.usage,\n });\n\n // If no tool calls, we're done\n if (!result.toolCalls || result.toolCalls.length === 0) {\n break;\n }\n\n // Add assistant message with tool calls\n const assistantMessage: AssistantMessage = {\n role: \"assistant\",\n content: result.text || null,\n toolCalls: result.toolCalls,\n };\n messages = [...messages, assistantMessage];\n\n // Add tool result messages\n for (const tr of stepToolResults) {\n const toolMessage: ToolMessage = {\n role: \"tool\",\n toolCallId: tr.toolCallId,\n content: JSON.stringify(tr.result),\n };\n messages = [...messages, toolMessage];\n }\n }\n\n // Build final result\n const lastStep = steps[steps.length - 1];\n\n return {\n text: lastStep?.text ?? \"\",\n usage: sumUsage(steps),\n finishReason: lastStep?.finishReason ?? \"stop\",\n steps,\n toolCalls: allToolCalls,\n toolResults: allToolResults,\n response: {\n messages,\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\ninterface AssistantMessage {\n role: \"assistant\";\n content: string | null;\n toolCalls?: ToolCall[];\n}\n\ninterface ToolMessage {\n role: \"tool\";\n toolCallId: string;\n content: string;\n}\n\n/**\n * Build initial messages from params\n */\nfunction buildMessages(params: GenerateTextParams): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n // Add system prompt if provided\n if (params.system) {\n messages.push({ role: \"system\", content: params.system });\n }\n\n // Add existing messages\n if (params.messages) {\n messages.push(...params.messages);\n }\n\n // Add prompt as user message if provided\n if (params.prompt) {\n messages.push({ role: \"user\", content: params.prompt });\n }\n\n return messages;\n}\n\n/**\n * Format tools based on provider\n */\nfunction formatToolsForProvider(\n tools: Record<string, Tool>,\n provider: string,\n): unknown[] {\n switch (provider) {\n case \"anthropic\":\n return formatToolsForAnthropic(tools);\n case \"openai\":\n case \"xai\":\n case \"azure\":\n default:\n return formatToolsForOpenAI(tools);\n }\n}\n\n/**\n * Sum token usage across all steps\n */\nfunction sumUsage(steps: GenerateStep[]): TokenUsage {\n return steps.reduce(\n (acc, step) => ({\n promptTokens: acc.promptTokens + (step.usage?.promptTokens ?? 0),\n completionTokens:\n acc.completionTokens + (step.usage?.completionTokens ?? 0),\n totalTokens: acc.totalTokens + (step.usage?.totalTokens ?? 0),\n }),\n { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n );\n}\n","/**\n * streamText - Stream text from a language model\n *\n * @example\n * ```ts\n * import { streamText } from '@yourgpt/llm-sdk';\n * import { openai } from '@yourgpt/llm-sdk/openai';\n *\n * // Simple streaming\n * const result = await streamText({\n * model: openai('gpt-4o'),\n * prompt: 'Tell me a story.',\n * });\n *\n * // Option 1: Iterate text chunks\n * for await (const chunk of result.textStream) {\n * process.stdout.write(chunk);\n * }\n *\n * // Option 2: Get full text\n * const text = await result.text;\n *\n * // Option 3: Return as Response (for API routes)\n * return result.toTextStreamResponse();\n * ```\n */\n\nimport type {\n StreamTextParams,\n StreamTextResult,\n StreamPart,\n CoreMessage,\n Tool,\n ToolCall,\n TokenUsage,\n FinishReason,\n ResponseOptions,\n StreamChunk,\n} from \"./types\";\nimport { formatToolsForOpenAI, formatToolsForAnthropic } from \"./tool\";\n\n/**\n * Stream text from a language model\n *\n * @param params - Stream parameters\n * @returns Promise resolving to stream result with text stream and helpers\n */\nexport async function streamText(\n params: StreamTextParams,\n): Promise<StreamTextResult> {\n const { model, tools, maxSteps = 1, signal } = params;\n\n // State for collecting results\n let fullText = \"\";\n let finalUsage: TokenUsage = {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n let finalFinishReason: FinishReason = \"stop\";\n\n // Create the stream generator\n async function* createFullStream(): AsyncGenerator<StreamPart> {\n let messages = buildMessages(params);\n\n for (let step = 0; step < maxSteps; step++) {\n yield { type: \"step-start\", step };\n\n // Check for abort\n if (signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Stream aborted\") };\n return;\n }\n\n // Format tools for this model's provider\n const formattedTools = tools\n ? formatToolsForProvider(tools, model.provider)\n : undefined;\n\n // Collect data from this step\n let stepText = \"\";\n const toolCalls: ToolCall[] = [];\n let currentToolCall: Partial<ToolCall> | null = null;\n let stepFinishReason: FinishReason = \"stop\";\n\n try {\n // Stream from model\n for await (const chunk of model.doStream({\n messages,\n tools: formattedTools,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n signal,\n })) {\n switch (chunk.type) {\n case \"text-delta\":\n stepText += chunk.text;\n fullText += chunk.text;\n yield { type: \"text-delta\", text: chunk.text };\n break;\n\n case \"tool-call\":\n toolCalls.push(chunk.toolCall);\n yield {\n type: \"tool-call-complete\",\n toolCall: chunk.toolCall,\n };\n break;\n\n case \"finish\":\n stepFinishReason = chunk.finishReason;\n finalFinishReason = chunk.finishReason;\n if (chunk.usage) {\n finalUsage = {\n promptTokens:\n finalUsage.promptTokens + chunk.usage.promptTokens,\n completionTokens:\n finalUsage.completionTokens + chunk.usage.completionTokens,\n totalTokens: finalUsage.totalTokens + chunk.usage.totalTokens,\n };\n }\n break;\n\n case \"error\":\n yield { type: \"error\", error: chunk.error };\n return;\n }\n }\n } catch (error) {\n yield {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n return;\n }\n\n yield { type: \"step-finish\", step, finishReason: stepFinishReason };\n\n // If no tool calls, we're done\n if (toolCalls.length === 0 || !tools) {\n break;\n }\n\n // Execute tools and continue\n const assistantMessage: CoreMessage = {\n role: \"assistant\",\n content: stepText || null,\n toolCalls,\n };\n messages = [...messages, assistantMessage];\n\n // Execute each tool\n for (const call of toolCalls) {\n const toolDef = tools[call.name];\n if (!toolDef) {\n const errorResult = { error: `Tool not found: ${call.name}` };\n yield {\n type: \"tool-result\",\n toolCallId: call.id,\n result: errorResult,\n };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(errorResult),\n },\n ];\n continue;\n }\n\n try {\n const parsedArgs = toolDef.parameters.parse(call.args);\n const result = await toolDef.execute(parsedArgs, {\n toolCallId: call.id,\n abortSignal: signal,\n messages,\n });\n\n yield { type: \"tool-result\", toolCallId: call.id, result };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(result),\n },\n ];\n } catch (error) {\n const errorResult = {\n error:\n error instanceof Error ? error.message : \"Tool execution failed\",\n };\n yield {\n type: \"tool-result\",\n toolCallId: call.id,\n result: errorResult,\n };\n messages = [\n ...messages,\n {\n role: \"tool\",\n toolCallId: call.id,\n content: JSON.stringify(errorResult),\n },\n ];\n }\n }\n }\n\n // Final finish event\n yield {\n type: \"finish\",\n finishReason: finalFinishReason,\n usage: finalUsage,\n };\n }\n\n // Create text-only stream\n async function* createTextStream(): AsyncIterable<string> {\n for await (const part of createFullStream()) {\n if (part.type === \"text-delta\") {\n yield part.text;\n }\n }\n }\n\n // Promises for lazy evaluation\n let textPromise: Promise<string> | undefined;\n let usagePromise: Promise<TokenUsage> | undefined;\n let finishReasonPromise: Promise<FinishReason> | undefined;\n\n // Consume stream to get final values\n async function consumeStream(): Promise<void> {\n for await (const _ of createFullStream()) {\n // Just consume to completion\n }\n }\n\n return {\n textStream: createTextStream(),\n fullStream: createFullStream(),\n\n get text(): Promise<string> {\n if (!textPromise) {\n textPromise = consumeStream().then(() => fullText);\n }\n return textPromise;\n },\n\n get usage(): Promise<TokenUsage> {\n if (!usagePromise) {\n usagePromise = consumeStream().then(() => finalUsage);\n }\n return usagePromise;\n },\n\n get finishReason(): Promise<FinishReason> {\n if (!finishReasonPromise) {\n finishReasonPromise = consumeStream().then(() => finalFinishReason);\n }\n return finishReasonPromise;\n },\n\n toTextStreamResponse(options?: ResponseOptions): Response {\n const stream = createTextStreamReadable(createTextStream());\n return new Response(stream, {\n status: options?.status ?? 200,\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...options?.headers,\n },\n });\n },\n\n toDataStreamResponse(options?: ResponseOptions): Response {\n const stream = createDataStreamReadable(createFullStream());\n return new Response(stream, {\n status: options?.status ?? 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n ...options?.headers,\n },\n });\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Build initial messages from params\n */\nfunction buildMessages(params: StreamTextParams): CoreMessage[] {\n const messages: CoreMessage[] = [];\n\n if (params.system) {\n messages.push({ role: \"system\", content: params.system });\n }\n\n if (params.messages) {\n messages.push(...params.messages);\n }\n\n if (params.prompt) {\n messages.push({ role: \"user\", content: params.prompt });\n }\n\n return messages;\n}\n\n/**\n * Format tools based on provider\n */\nfunction formatToolsForProvider(\n tools: Record<string, Tool>,\n provider: string,\n): unknown[] {\n switch (provider) {\n case \"anthropic\":\n return formatToolsForAnthropic(tools);\n case \"openai\":\n case \"xai\":\n case \"azure\":\n default:\n return formatToolsForOpenAI(tools);\n }\n}\n\n/**\n * Create a ReadableStream from text async iterable\n */\nfunction createTextStreamReadable(\n textStream: AsyncIterable<string>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const text of textStream) {\n controller.enqueue(encoder.encode(text));\n }\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n}\n\n/**\n * Create a ReadableStream for SSE data stream\n */\nfunction createDataStreamReadable(\n fullStream: AsyncIterable<StreamPart>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const part of fullStream) {\n const data = JSON.stringify(part);\n controller.enqueue(encoder.encode(`data: ${data}\\n\\n`));\n }\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (error) {\n const errorData = JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n });\n controller.enqueue(encoder.encode(`data: ${errorData}\\n\\n`));\n controller.close();\n }\n },\n });\n}\n","/**\n * Core Types for @yourgpt/llm-sdk\n *\n * Modern, instance-based types following Vercel AI SDK patterns.\n */\n\nimport type { z } from \"zod\";\n\n// ============================================\n// Language Model Types\n// ============================================\n\n/**\n * A language model instance that can generate text.\n * This is what provider functions like `openai('gpt-4o')` return.\n */\nexport interface LanguageModel {\n /** Provider identifier (e.g., 'openai', 'anthropic') */\n readonly provider: string;\n\n /** Model identifier (e.g., 'gpt-4o', 'claude-3-5-sonnet') */\n readonly modelId: string;\n\n /** Model capabilities for feature detection */\n readonly capabilities: ModelCapabilities;\n\n /**\n * Generate a complete response (non-streaming)\n * Used internally by generateText()\n */\n doGenerate(params: DoGenerateParams): Promise<DoGenerateResult>;\n\n /**\n * Stream a response\n * Used internally by streamText()\n */\n doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk>;\n}\n\n/**\n * Model capabilities for UI feature flags\n */\nexport interface ModelCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports JSON mode / structured output */\n supportsJsonMode: boolean;\n /** Supports extended thinking (Claude) */\n supportsThinking: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n}\n\n/**\n * Default capabilities for unknown models\n */\nexport const DEFAULT_CAPABILITIES: ModelCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsStreaming: true,\n supportsJsonMode: false,\n supportsThinking: false,\n supportsPDF: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n};\n\n// ============================================\n// Message Types\n// ============================================\n\n/**\n * Core message types for LLM conversations\n */\nexport type CoreMessage =\n | SystemMessage\n | UserMessage\n | AssistantMessage\n | ToolMessage;\n\nexport interface SystemMessage {\n role: \"system\";\n content: string;\n}\n\nexport interface UserMessage {\n role: \"user\";\n content: string | UserContentPart[];\n}\n\nexport interface AssistantMessage {\n role: \"assistant\";\n content: string | null;\n toolCalls?: ToolCall[];\n}\n\nexport interface ToolMessage {\n role: \"tool\";\n toolCallId: string;\n content: string;\n}\n\n/**\n * Content parts for multimodal user messages\n */\nexport type UserContentPart = TextPart | ImagePart | FilePart;\n\nexport interface TextPart {\n type: \"text\";\n text: string;\n}\n\nexport interface ImagePart {\n type: \"image\";\n /** Base64 data or URL */\n image: string | Uint8Array;\n /** MIME type (e.g., 'image/png') */\n mimeType?: string;\n}\n\nexport interface FilePart {\n type: \"file\";\n /** Base64 data or URL */\n data: string;\n /** MIME type (e.g., 'application/pdf') */\n mimeType: string;\n}\n\n// ============================================\n// Tool Types\n// ============================================\n\n/**\n * Tool definition with Zod schema support\n */\nexport interface Tool<TParams = unknown, TResult = unknown> {\n /** Tool description for the LLM */\n description: string;\n /** Zod schema for parameters */\n parameters: z.ZodType<TParams>;\n /** Execute function */\n execute: (params: TParams, context: ToolContext) => Promise<TResult>;\n}\n\n/**\n * Context passed to tool execute function\n */\nexport interface ToolContext {\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal;\n /** Unique tool call ID */\n toolCallId: string;\n /** Optional: messages in conversation */\n messages?: CoreMessage[];\n}\n\n/**\n * Tool call from LLM response\n */\nexport interface ToolCall {\n /** Unique ID for this tool call */\n id: string;\n /** Tool name */\n name: string;\n /** Parsed arguments */\n args: Record<string, unknown>;\n}\n\n/**\n * Tool execution result\n */\nexport interface ToolResult {\n /** Tool call ID this result corresponds to */\n toolCallId: string;\n /** Result data (will be JSON stringified for LLM) */\n result: unknown;\n}\n\n// ============================================\n// Generation Types\n// ============================================\n\n/**\n * Parameters for model.doGenerate() and model.doStream()\n */\nexport interface DoGenerateParams {\n /** Messages to send to LLM */\n messages: CoreMessage[];\n /** Tools available to the LLM (already formatted for provider) */\n tools?: unknown[];\n /** Temperature (0-2) */\n temperature?: number;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/**\n * Result from model.doGenerate()\n */\nexport interface DoGenerateResult {\n /** Generated text content */\n text: string;\n /** Tool calls requested by the LLM */\n toolCalls: ToolCall[];\n /** Why generation stopped */\n finishReason: FinishReason;\n /** Token usage */\n usage: TokenUsage;\n /** Raw provider response (for debugging) */\n rawResponse?: unknown;\n}\n\n/**\n * Finish reason for generation\n */\nexport type FinishReason =\n | \"stop\"\n | \"length\"\n | \"tool-calls\"\n | \"content-filter\"\n | \"error\"\n | \"unknown\";\n\n/**\n * Token usage statistics\n */\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n}\n\n// ============================================\n// Streaming Types\n// ============================================\n\n/**\n * Stream chunk from model.doStream()\n */\nexport type StreamChunk =\n | TextDeltaChunk\n | ToolCallChunk\n | ToolResultChunk\n | FinishChunk\n | ErrorChunk;\n\nexport interface TextDeltaChunk {\n type: \"text-delta\";\n text: string;\n}\n\nexport interface ToolCallChunk {\n type: \"tool-call\";\n toolCall: ToolCall;\n}\n\nexport interface ToolResultChunk {\n type: \"tool-result\";\n toolCallId: string;\n result: unknown;\n}\n\nexport interface FinishChunk {\n type: \"finish\";\n finishReason: FinishReason;\n usage?: TokenUsage;\n}\n\nexport interface ErrorChunk {\n type: \"error\";\n error: Error;\n}\n\n// ============================================\n// Generate Text Types\n// ============================================\n\n/**\n * Parameters for generateText()\n */\nexport interface GenerateTextParams {\n /** Language model to use */\n model: LanguageModel;\n /** Simple prompt (converted to user message) */\n prompt?: string;\n /** System prompt */\n system?: string;\n /** Full message history */\n messages?: CoreMessage[];\n /** Tools available to the LLM */\n tools?: Record<string, Tool>;\n /** Maximum agentic steps (tool call loops) */\n maxSteps?: number;\n /** Temperature (0-2) */\n temperature?: number;\n /** Maximum tokens to generate */\n maxTokens?: number;\n /** Abort signal */\n signal?: AbortSignal;\n}\n\n/**\n * Result from generateText()\n */\nexport interface GenerateTextResult {\n /** Final text output */\n text: string;\n /** Token usage */\n usage: TokenUsage;\n /** Why generation stopped */\n finishReason: FinishReason;\n /** All steps taken (for agentic workflows) */\n steps: GenerateStep[];\n /** All tool calls made across all steps */\n toolCalls: ToolCall[];\n /** All tool results across all steps */\n toolResults: ToolResult[];\n /** Final message list including tool interactions */\n response: {\n messages: CoreMessage[];\n };\n}\n\n/**\n * A single step in the generation process\n */\nexport interface GenerateStep {\n /** Text generated in this step */\n text: string;\n /** Tool calls made in this step */\n toolCalls: ToolCall[];\n /** Tool results from this step */\n toolResults: ToolResult[];\n /** Finish reason for this step */\n finishReason: FinishReason;\n /** Token usage for this step */\n usage: TokenUsage;\n}\n\n// ============================================\n// Stream Text Types\n// ============================================\n\n/**\n * Parameters for streamText() - same as generateText\n */\nexport type StreamTextParams = GenerateTextParams;\n\n/**\n * Result from streamText()\n */\nexport interface StreamTextResult {\n /** Async iterable of text chunks only */\n textStream: AsyncIterable<string>;\n\n /** Async iterable of all stream parts */\n fullStream: AsyncIterable<StreamPart>;\n\n /** Promise that resolves to full text when complete */\n readonly text: Promise<string>;\n\n /** Promise that resolves to usage when complete */\n readonly usage: Promise<TokenUsage>;\n\n /** Promise that resolves to finish reason when complete */\n readonly finishReason: Promise<FinishReason>;\n\n /** Convert to plain text streaming Response */\n toTextStreamResponse(options?: ResponseOptions): Response;\n\n /** Convert to data stream Response (SSE with tool calls) */\n toDataStreamResponse(options?: ResponseOptions): Response;\n}\n\n/**\n * Stream part for fullStream\n */\nexport type StreamPart =\n | { type: \"text-delta\"; text: string }\n | { type: \"tool-call-start\"; toolCallId: string; toolName: string }\n | { type: \"tool-call-delta\"; toolCallId: string; argsText: string }\n | { type: \"tool-call-complete\"; toolCall: ToolCall }\n | { type: \"tool-result\"; toolCallId: string; result: unknown }\n | { type: \"step-start\"; step: number }\n | { type: \"step-finish\"; step: number; finishReason: FinishReason }\n | { type: \"finish\"; finishReason: FinishReason; usage: TokenUsage }\n | { type: \"error\"; error: Error };\n\n/**\n * Options for Response helpers\n */\nexport interface ResponseOptions {\n /** Additional headers */\n headers?: Record<string, string>;\n /** Response status (default: 200) */\n status?: number;\n}\n","/**\n * OpenAI Provider - Modern Pattern\n *\n * Returns a LanguageModel instance that can be used directly with\n * generateText() and streamText().\n *\n * @example\n * ```ts\n * import { openai } from '@yourgpt/llm-sdk/openai';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: openai('gpt-4o'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n ModelCapabilities,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface OpenAIModelConfig {\n vision: boolean;\n tools: boolean;\n jsonMode: boolean;\n maxTokens: number;\n}\n\nconst OPENAI_MODELS: Record<string, OpenAIModelConfig> = {\n // GPT-4o series\n \"gpt-4o\": { vision: true, tools: true, jsonMode: true, maxTokens: 128000 },\n \"gpt-4o-mini\": {\n vision: true,\n tools: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-2024-11-20\": {\n vision: true,\n tools: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-2024-08-06\": {\n vision: true,\n tools: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n\n // GPT-4 Turbo\n \"gpt-4-turbo\": {\n vision: true,\n tools: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4-turbo-preview\": {\n vision: false,\n tools: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n\n // GPT-4\n \"gpt-4\": { vision: false, tools: true, jsonMode: false, maxTokens: 8192 },\n \"gpt-4-32k\": {\n vision: false,\n tools: true,\n jsonMode: false,\n maxTokens: 32768,\n },\n\n // GPT-3.5\n \"gpt-3.5-turbo\": {\n vision: false,\n tools: true,\n jsonMode: true,\n maxTokens: 16385,\n },\n\n // O1 series (reasoning)\n o1: { vision: true, tools: false, jsonMode: false, maxTokens: 128000 },\n \"o1-mini\": { vision: true, tools: false, jsonMode: false, maxTokens: 128000 },\n \"o1-preview\": {\n vision: true,\n tools: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n\n // O3 series\n \"o3-mini\": { vision: true, tools: false, jsonMode: false, maxTokens: 128000 },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface OpenAIProviderOptions {\n /** API key (defaults to OPENAI_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API (defaults to https://api.openai.com/v1) */\n baseURL?: string;\n /** Organization ID */\n organization?: string;\n /** Default headers */\n headers?: Record<string, string>;\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an OpenAI language model\n *\n * @param modelId - Model ID (e.g., 'gpt-4o', 'gpt-4o-mini')\n * @param options - Provider options\n * @returns LanguageModel instance\n *\n * @example\n * ```ts\n * // Basic usage\n * const model = openai('gpt-4o');\n *\n * // With custom options\n * const model = openai('gpt-4o', {\n * apiKey: 'sk-...',\n * baseURL: 'https://custom-endpoint.com/v1',\n * });\n * ```\n */\nexport function openai(\n modelId: string,\n options: OpenAIProviderOptions = {},\n): LanguageModel {\n const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY;\n const baseURL = options.baseURL ?? \"https://api.openai.com/v1\";\n\n // Lazy-load OpenAI client\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: OpenAI } = await import(\"openai\");\n client = new OpenAI({\n apiKey,\n baseURL,\n organization: options.organization,\n defaultHeaders: options.headers,\n });\n }\n return client;\n }\n\n // Get model config\n const modelConfig = OPENAI_MODELS[modelId] ?? OPENAI_MODELS[\"gpt-4o\"];\n\n return {\n provider: \"openai\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: modelConfig.jsonMode,\n supportsThinking: false,\n supportsPDF: false,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const messages = formatMessagesForOpenAI(params.messages);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice.message;\n\n // Parse tool calls\n const toolCalls: ToolCall[] = (message.tool_calls ?? []).map(\n (tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }),\n );\n\n return {\n text: message.content ?? \"\",\n toolCalls,\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage?.prompt_tokens ?? 0,\n completionTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const messages = formatMessagesForOpenAI(params.messages);\n\n const stream = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n stream: true,\n });\n\n // Track current tool call being built\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n let totalPromptTokens = 0;\n let totalCompletionTokens = 0;\n\n for await (const chunk of stream) {\n // Check abort\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n const choice = chunk.choices[0];\n const delta = choice?.delta;\n\n // Text content\n if (delta?.content) {\n yield { type: \"text-delta\", text: delta.content };\n }\n\n // Tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n // New tool call - emit previous if exists\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n }\n currentToolCall = {\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n };\n } else if (currentToolCall && tc.function?.arguments) {\n // Append arguments\n currentToolCall.arguments += tc.function.arguments;\n }\n }\n }\n\n // Finish reason\n if (choice?.finish_reason) {\n // Emit pending tool call\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n currentToolCall = null;\n }\n\n // Usage from final chunk (if available)\n if (chunk.usage) {\n totalPromptTokens = chunk.usage.prompt_tokens;\n totalCompletionTokens = chunk.usage.completion_tokens;\n }\n\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: totalPromptTokens,\n completionTokens: totalCompletionTokens,\n totalTokens: totalPromptTokens + totalCompletionTokens,\n },\n };\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Map OpenAI finish reason to our FinishReason type\n */\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Format CoreMessage[] for OpenAI API\n */\nfunction formatMessagesForOpenAI(messages: CoreMessage[]): any[] {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"system\":\n return { role: \"system\", content: msg.content };\n\n case \"user\":\n if (typeof msg.content === \"string\") {\n return { role: \"user\", content: msg.content };\n }\n // Handle multimodal content\n return {\n role: \"user\",\n content: msg.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n const url = imageData.startsWith(\"data:\")\n ? imageData\n : `data:${part.mimeType ?? \"image/png\"};base64,${imageData}`;\n return { type: \"image_url\", image_url: { url, detail: \"auto\" } };\n }\n return { type: \"text\", text: \"\" };\n }),\n };\n\n case \"assistant\":\n const assistantMsg: any = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n assistantMsg.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n }));\n }\n return assistantMsg;\n\n case \"tool\":\n return {\n role: \"tool\",\n tool_call_id: msg.toolCallId,\n content: msg.content,\n };\n\n default:\n return msg;\n }\n });\n}\n\n// Also export as createOpenAI for backward compatibility\nexport { openai as createOpenAI };\n","/**\n * Anthropic Provider - Modern Pattern\n *\n * @example\n * ```ts\n * import { anthropic } from '@yourgpt/llm-sdk/anthropic';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: anthropic('claude-3-5-sonnet-20241022'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface AnthropicModelConfig {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n pdf: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, AnthropicModelConfig> = {\n // Claude 4 series\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.7 series\n \"claude-3-7-sonnet-20250219\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-7-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n pdf: true,\n maxTokens: 200000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n pdf: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface AnthropicProviderOptions {\n /** API key (defaults to ANTHROPIC_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API */\n baseURL?: string;\n /** Enable extended thinking */\n thinking?: {\n enabled: boolean;\n budgetTokens?: number;\n };\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic language model\n */\nexport function anthropic(\n modelId: string,\n options: AnthropicProviderOptions = {},\n): LanguageModel {\n const apiKey = options.apiKey ?? process.env.ANTHROPIC_API_KEY;\n\n // Lazy-load Anthropic client\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n client = new Anthropic({\n apiKey,\n baseURL: options.baseURL,\n });\n }\n return client;\n }\n\n const modelConfig =\n ANTHROPIC_MODELS[modelId] ?? ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n provider: \"anthropic\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: false,\n supportsThinking: modelConfig.thinking,\n supportsPDF: modelConfig.pdf,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n // Add thinking if enabled\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const response = await client.messages.create(requestOptions);\n\n // Parse response\n let text = \"\";\n const toolCalls: ToolCall[] = [];\n\n for (const block of response.content) {\n if (block.type === \"text\") {\n text += block.text;\n } else if (block.type === \"tool_use\") {\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n });\n }\n }\n\n return {\n text,\n toolCalls,\n finishReason: mapFinishReason(response.stop_reason),\n usage: {\n promptTokens: response.usage?.input_tokens ?? 0,\n completionTokens: response.usage?.output_tokens ?? 0,\n totalTokens:\n (response.usage?.input_tokens ?? 0) +\n (response.usage?.output_tokens ?? 0),\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const { system, messages } = formatMessagesForAnthropic(params.messages);\n\n const requestOptions: any = {\n model: modelId,\n max_tokens: params.maxTokens ?? 4096,\n system: system || undefined,\n messages,\n tools: params.tools as any,\n };\n\n if (params.temperature !== undefined) {\n requestOptions.temperature = params.temperature;\n }\n\n if (options.thinking?.enabled && modelConfig.thinking) {\n requestOptions.thinking = {\n type: \"enabled\",\n budget_tokens: options.thinking.budgetTokens ?? 10000,\n };\n }\n\n const stream = await client.messages.stream(requestOptions);\n\n let currentToolUse: { id: string; name: string; input: string } | null =\n null;\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of stream) {\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n switch (event.type) {\n case \"message_start\":\n if (event.message?.usage) {\n inputTokens = event.message.usage.input_tokens ?? 0;\n }\n break;\n\n case \"content_block_start\":\n if (event.content_block?.type === \"tool_use\") {\n currentToolUse = {\n id: event.content_block.id,\n name: event.content_block.name,\n input: \"\",\n };\n }\n break;\n\n case \"content_block_delta\":\n if (event.delta?.type === \"text_delta\") {\n yield { type: \"text-delta\", text: event.delta.text };\n } else if (\n event.delta?.type === \"input_json_delta\" &&\n currentToolUse\n ) {\n currentToolUse.input += event.delta.partial_json;\n }\n break;\n\n case \"content_block_stop\":\n if (currentToolUse) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolUse.id,\n name: currentToolUse.name,\n args: JSON.parse(currentToolUse.input || \"{}\"),\n },\n };\n currentToolUse = null;\n }\n break;\n\n case \"message_delta\":\n if (event.usage) {\n outputTokens = event.usage.output_tokens ?? 0;\n }\n if (event.delta?.stop_reason) {\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(event.delta.stop_reason),\n usage: {\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n };\n }\n break;\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"end_turn\":\n case \"stop_sequence\":\n return \"stop\";\n case \"max_tokens\":\n return \"length\";\n case \"tool_use\":\n return \"tool-calls\";\n default:\n return \"unknown\";\n }\n}\n\nfunction formatMessagesForAnthropic(messages: CoreMessage[]): {\n system: string;\n messages: any[];\n} {\n let system = \"\";\n const formatted: any[] = [];\n const pendingToolResults: any[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system += (system ? \"\\n\" : \"\") + msg.content;\n continue;\n }\n\n // Flush pending tool results before adding assistant messages\n if (msg.role === \"assistant\" && pendingToolResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n if (msg.role === \"user\") {\n // Flush pending tool results first\n if (pendingToolResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n pendingToolResults.length = 0;\n }\n\n if (typeof msg.content === \"string\") {\n formatted.push({ role: \"user\", content: msg.content });\n } else {\n // Handle multimodal content\n const content: any[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") {\n content.push({ type: \"text\", text: part.text });\n } else if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n\n if (imageData.startsWith(\"http\")) {\n content.push({\n type: \"image\",\n source: { type: \"url\", url: imageData },\n });\n } else {\n const base64 = imageData.startsWith(\"data:\")\n ? imageData.split(\",\")[1]\n : imageData;\n content.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: part.mimeType ?? \"image/png\",\n data: base64,\n },\n });\n }\n }\n }\n formatted.push({ role: \"user\", content });\n }\n } else if (msg.role === \"assistant\") {\n const content: any[] = [];\n\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n for (const tc of msg.toolCalls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.args,\n });\n }\n }\n\n if (content.length > 0) {\n formatted.push({ role: \"assistant\", content });\n }\n } else if (msg.role === \"tool\") {\n pendingToolResults.push({\n toolCallId: msg.toolCallId,\n content: msg.content,\n });\n }\n }\n\n // Flush any remaining tool results\n if (pendingToolResults.length > 0) {\n formatted.push({\n role: \"user\",\n content: pendingToolResults.map((tr) => ({\n type: \"tool_result\",\n tool_use_id: tr.toolCallId,\n content: tr.content,\n })),\n });\n }\n\n return { system, messages: formatted };\n}\n\nexport { anthropic as createAnthropic };\n","/**\n * xAI Provider - Modern Pattern\n *\n * Returns a LanguageModel instance that can be used directly with\n * generateText() and streamText().\n *\n * @example\n * ```ts\n * import { xai } from '@yourgpt/llm-sdk/xai';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: xai('grok-3-fast-beta'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface XAIModelConfig {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n}\n\nconst XAI_MODELS: Record<string, XAIModelConfig> = {\n // Grok 4.1 Fast (Latest - December 2025)\n \"grok-4-1-fast-reasoning\": { vision: false, tools: true, maxTokens: 2000000 },\n \"grok-4-1-fast-non-reasoning\": {\n vision: false,\n tools: true,\n maxTokens: 2000000,\n },\n\n // Grok 4 Fast (September 2025)\n \"grok-4-fast-reasoning\": { vision: false, tools: true, maxTokens: 2000000 },\n \"grok-4-fast-non-reasoning\": {\n vision: false,\n tools: true,\n maxTokens: 2000000,\n },\n\n // Grok 4 (July 2025)\n \"grok-4\": { vision: true, tools: true, maxTokens: 256000 },\n \"grok-4-0709\": { vision: true, tools: true, maxTokens: 256000 },\n\n // Grok 3 (February 2025) - Stable\n \"grok-3-beta\": { vision: true, tools: true, maxTokens: 131072 },\n \"grok-3-fast-beta\": { vision: false, tools: true, maxTokens: 131072 },\n \"grok-3-mini-beta\": { vision: false, tools: true, maxTokens: 32768 },\n \"grok-3-mini-fast-beta\": { vision: false, tools: true, maxTokens: 32768 },\n\n // Grok Code Fast (August 2025)\n \"grok-code-fast-1\": { vision: false, tools: true, maxTokens: 256000 },\n\n // Grok 2 (Legacy)\n \"grok-2\": { vision: true, tools: true, maxTokens: 131072 },\n \"grok-2-latest\": { vision: true, tools: true, maxTokens: 131072 },\n \"grok-2-mini\": { vision: false, tools: true, maxTokens: 131072 },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface XAIProviderOptions {\n /** API key (defaults to XAI_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API (defaults to https://api.x.ai/v1) */\n baseURL?: string;\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an xAI language model\n *\n * @param modelId - Model ID (e.g., 'grok-3-fast-beta', 'grok-4')\n * @param options - Provider options\n * @returns LanguageModel instance\n *\n * @example\n * ```ts\n * // Basic usage\n * const model = xai('grok-3-fast-beta');\n *\n * // With custom options\n * const model = xai('grok-4', {\n * apiKey: 'xai-...',\n * });\n * ```\n */\nexport function xai(\n modelId: string,\n options: XAIProviderOptions = {},\n): LanguageModel {\n const apiKey = options.apiKey ?? process.env.XAI_API_KEY;\n const baseURL = options.baseURL ?? \"https://api.x.ai/v1\";\n\n // Lazy-load OpenAI client (xAI uses OpenAI-compatible API)\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: OpenAI } = await import(\"openai\");\n client = new OpenAI({\n apiKey,\n baseURL,\n });\n }\n return client;\n }\n\n // Get model config\n const modelConfig = XAI_MODELS[modelId] ?? XAI_MODELS[\"grok-3-fast-beta\"];\n\n return {\n provider: \"xai\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: false, // xAI doesn't support JSON mode yet\n supportsThinking: false,\n supportsPDF: false,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const messages = formatMessagesForXAI(params.messages);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice.message;\n\n // Parse tool calls\n const toolCalls: ToolCall[] = (message.tool_calls ?? []).map(\n (tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }),\n );\n\n return {\n text: message.content ?? \"\",\n toolCalls,\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage?.prompt_tokens ?? 0,\n completionTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const messages = formatMessagesForXAI(params.messages);\n\n const stream = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n stream: true,\n });\n\n // Track current tool call being built\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n let totalPromptTokens = 0;\n let totalCompletionTokens = 0;\n\n for await (const chunk of stream) {\n // Check abort\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n const choice = chunk.choices[0];\n const delta = choice?.delta;\n\n // Text content\n if (delta?.content) {\n yield { type: \"text-delta\", text: delta.content };\n }\n\n // Tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n // New tool call - emit previous if exists\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n }\n currentToolCall = {\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n };\n } else if (currentToolCall && tc.function?.arguments) {\n // Append arguments\n currentToolCall.arguments += tc.function.arguments;\n }\n }\n }\n\n // Finish reason\n if (choice?.finish_reason) {\n // Emit pending tool call\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n currentToolCall = null;\n }\n\n // Usage from final chunk (if available)\n if (chunk.usage) {\n totalPromptTokens = chunk.usage.prompt_tokens;\n totalCompletionTokens = chunk.usage.completion_tokens;\n }\n\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: totalPromptTokens,\n completionTokens: totalCompletionTokens,\n totalTokens: totalPromptTokens + totalCompletionTokens,\n },\n };\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Map xAI finish reason to our FinishReason type\n */\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Format CoreMessage[] for xAI API (OpenAI-compatible)\n */\nfunction formatMessagesForXAI(messages: CoreMessage[]): any[] {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"system\":\n return { role: \"system\", content: msg.content };\n\n case \"user\":\n if (typeof msg.content === \"string\") {\n return { role: \"user\", content: msg.content };\n }\n // Handle multimodal content\n return {\n role: \"user\",\n content: msg.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n const url = imageData.startsWith(\"data:\")\n ? imageData\n : `data:${part.mimeType ?? \"image/png\"};base64,${imageData}`;\n return { type: \"image_url\", image_url: { url, detail: \"auto\" } };\n }\n return { type: \"text\", text: \"\" };\n }),\n };\n\n case \"assistant\":\n const assistantMsg: any = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n assistantMsg.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n }));\n }\n return assistantMsg;\n\n case \"tool\":\n return {\n role: \"tool\",\n tool_call_id: msg.toolCallId,\n content: msg.content,\n };\n\n default:\n return msg;\n }\n });\n}\n\n// Also export as createXAI for backward compatibility\nexport { xai as createXAI };\n","/**\n * Google Provider - Modern Pattern\n *\n * Google Gemini models.\n *\n * @example\n * ```ts\n * import { google } from '@yourgpt/llm-sdk/google';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: google('gemini-2.0-flash'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface GoogleModelConfig {\n vision: boolean;\n tools: boolean;\n audio: boolean;\n video: boolean;\n maxTokens: number;\n}\n\nconst GOOGLE_MODELS: Record<string, GoogleModelConfig> = {\n // Gemini 2.0\n \"gemini-2.0-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-exp\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-thinking-exp\": {\n vision: true,\n tools: false,\n audio: false,\n video: false,\n maxTokens: 32767,\n },\n\n // Gemini 1.5\n \"gemini-1.5-pro\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 2097152,\n },\n \"gemini-1.5-pro-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 2097152,\n },\n \"gemini-1.5-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-1.5-flash-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-1.5-flash-8b\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n maxTokens: 1048576,\n },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface GoogleProviderOptions {\n /** API key (defaults to GOOGLE_API_KEY or GEMINI_API_KEY env var) */\n apiKey?: string;\n /** Safety settings */\n safetySettings?: Array<{\n category: string;\n threshold: string;\n }>;\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create a Google Gemini language model\n */\nexport function google(\n modelId: string,\n options: GoogleProviderOptions = {},\n): LanguageModel {\n const apiKey =\n options.apiKey ?? process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n\n // Lazy-load Google client\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { GoogleGenerativeAI } = await import(\"@google/generative-ai\");\n client = new GoogleGenerativeAI(apiKey!);\n }\n return client;\n }\n\n const modelConfig =\n GOOGLE_MODELS[modelId] ?? GOOGLE_MODELS[\"gemini-2.0-flash\"];\n\n return {\n provider: \"google\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: true,\n supportsThinking: modelId.includes(\"thinking\"),\n supportsPDF: true,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: options.safetySettings,\n });\n\n const { systemInstruction, contents } = formatMessagesForGemini(\n params.messages,\n );\n\n const chat = model.startChat({\n history: contents.slice(0, -1),\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: params.tools\n ? [{ functionDeclarations: formatToolsForGemini(params.tools) }]\n : undefined,\n generationConfig: {\n temperature: params.temperature,\n maxOutputTokens: params.maxTokens,\n },\n });\n\n const lastMessage = contents[contents.length - 1];\n const result = await chat.sendMessage(lastMessage.parts);\n const response = result.response;\n\n let text = \"\";\n const toolCalls: ToolCall[] = [];\n let toolCallIndex = 0;\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 text += part.text;\n }\n if (\"functionCall\" in part && part.functionCall) {\n toolCalls.push({\n id: `call_${toolCallIndex++}`,\n name: part.functionCall.name,\n args: part.functionCall.args || {},\n });\n }\n }\n }\n\n return {\n text,\n toolCalls,\n finishReason: mapFinishReason(candidate?.finishReason),\n usage: {\n promptTokens: response.usageMetadata?.promptTokenCount ?? 0,\n completionTokens: response.usageMetadata?.candidatesTokenCount ?? 0,\n totalTokens: response.usageMetadata?.totalTokenCount ?? 0,\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: options.safetySettings,\n });\n\n const { systemInstruction, contents } = formatMessagesForGemini(\n params.messages,\n );\n\n const chat = model.startChat({\n history: contents.slice(0, -1),\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: params.tools\n ? [{ functionDeclarations: formatToolsForGemini(params.tools) }]\n : undefined,\n generationConfig: {\n temperature: params.temperature,\n maxOutputTokens: params.maxTokens,\n },\n });\n\n const lastMessage = contents[contents.length - 1];\n const result = await chat.sendMessageStream(lastMessage.parts);\n\n let toolCallIndex = 0;\n let promptTokens = 0;\n let completionTokens = 0;\n\n try {\n for await (const chunk of result.stream) {\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate?.content?.parts) continue;\n\n for (const part of candidate.content.parts) {\n if (\"text\" in part && part.text) {\n yield { type: \"text-delta\", text: part.text };\n }\n if (\"functionCall\" in part && part.functionCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: `call_${toolCallIndex++}`,\n name: part.functionCall.name,\n args: part.functionCall.args || {},\n },\n };\n }\n }\n\n if (chunk.usageMetadata) {\n promptTokens = chunk.usageMetadata.promptTokenCount ?? 0;\n completionTokens = chunk.usageMetadata.candidatesTokenCount ?? 0;\n }\n\n if (candidate.finishReason) {\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(candidate.finishReason),\n usage: {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n },\n };\n }\n }\n } catch (error) {\n yield {\n type: \"error\",\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\nfunction mapFinishReason(reason: string | undefined): FinishReason {\n switch (reason) {\n case \"STOP\":\n return \"stop\";\n case \"MAX_TOKENS\":\n return \"length\";\n case \"SAFETY\":\n return \"content-filter\";\n default:\n return \"unknown\";\n }\n}\n\nfunction formatMessagesForGemini(messages: CoreMessage[]): {\n systemInstruction: string;\n contents: Array<{ role: \"user\" | \"model\"; parts: any[] }>;\n} {\n let systemInstruction = \"\";\n const contents: Array<{ role: \"user\" | \"model\"; parts: any[] }> = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemInstruction += (systemInstruction ? \"\\n\" : \"\") + msg.content;\n continue;\n }\n\n const parts: any[] = [];\n\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n parts.push({ text: msg.content });\n } else {\n for (const part of msg.content) {\n if (part.type === \"text\") {\n parts.push({ text: part.text });\n } else if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n\n const base64 = imageData.startsWith(\"data:\")\n ? imageData.split(\",\")[1]\n : imageData;\n\n parts.push({\n inlineData: {\n mimeType: part.mimeType ?? \"image/png\",\n data: base64,\n },\n });\n }\n }\n }\n contents.push({ role: \"user\", parts });\n } else if (msg.role === \"assistant\") {\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.toolCalls?.length) {\n for (const tc of msg.toolCalls) {\n parts.push({\n functionCall: {\n name: tc.name,\n args: tc.args,\n },\n });\n }\n }\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n // Tool results go as user message with functionResponse\n contents.push({\n role: \"user\",\n parts: [\n {\n functionResponse: {\n name: \"tool\", // Gemini doesn't track by ID\n response: JSON.parse(msg.content || \"{}\"),\n },\n },\n ],\n });\n }\n }\n\n // Ensure starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n contents.unshift({ role: \"user\", parts: [{ text: \"\" }] });\n }\n\n // Merge consecutive same-role messages\n const merged: typeof contents = [];\n for (const content of contents) {\n const last = merged[merged.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n merged.push({ ...content, parts: [...content.parts] });\n }\n }\n\n return { systemInstruction, contents: merged };\n}\n\nfunction formatToolsForGemini(tools: unknown[]): any[] {\n // Tools are already in OpenAI format from formatToolsForOpenAI\n return (tools as any[]).map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters,\n }));\n}\n\nexport { google as createGoogle };\n","import type {\n Message,\n MessageAttachment,\n ActionDefinition,\n StreamEvent,\n LLMConfig,\n} from \"@yourgpt/copilot-sdk/core\";\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?: Partial<LLMConfig>;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\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 /** Raw provider response for debugging */\n rawResponse: Record<string, unknown>;\n}\n\n/**\n * Base LLM adapter interface\n */\nexport interface LLMAdapter {\n /** Provider name */\n readonly provider: string;\n\n /** Model name */\n readonly model: string;\n\n /**\n * Stream a chat completion\n */\n stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent>;\n\n /**\n * Non-streaming chat completion (for debugging/comparison)\n */\n complete?(request: ChatCompletionRequest): Promise<CompletionResult>;\n}\n\n/**\n * Adapter factory function type\n */\nexport type AdapterFactory = (config: LLMConfig) => LLMAdapter;\n\n/**\n * Convert messages to provider format (simple text only)\n */\nexport function formatMessages(\n messages: Message[],\n systemPrompt?: string,\n): Array<{ role: string; content: string }> {\n const formatted: Array<{ role: string; content: string }> = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n // Add conversation messages\n for (const msg of messages) {\n formatted.push({\n role: msg.role,\n content: msg.content ?? \"\",\n });\n }\n\n return formatted;\n}\n\n/**\n * Convert ActionParameter to JSON Schema format recursively\n */\nfunction parameterToJsonSchema(param: {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n}): Record<string, unknown> {\n const schema: Record<string, unknown> = {\n type: param.type,\n };\n\n if (param.description) {\n schema.description = param.description;\n }\n\n if (param.enum) {\n schema.enum = param.enum;\n }\n\n // Handle array items\n if (param.type === \"array\" && param.items) {\n schema.items = parameterToJsonSchema(\n param.items as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n );\n }\n\n // Handle nested object properties\n if (param.type === \"object\" && param.properties) {\n schema.properties = Object.fromEntries(\n Object.entries(param.properties).map(([key, prop]) => [\n key,\n parameterToJsonSchema(\n prop as {\n type: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n },\n ),\n ]),\n );\n }\n\n return schema;\n}\n\n/**\n * Convert actions to OpenAI tool format\n */\nexport function formatTools(actions: ActionDefinition[]): Array<{\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: object;\n };\n}> {\n return actions.map((action) => ({\n type: \"function\" as const,\n function: {\n name: action.name,\n description: action.description,\n parameters: {\n type: \"object\",\n properties: action.parameters\n ? Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n parameterToJsonSchema(param),\n ]),\n )\n : {},\n required: action.parameters\n ? Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key)\n : [],\n },\n },\n }));\n}\n\n// ============================================\n// Vision/Multimodal Support\n// ============================================\n\n/**\n * Content block types for multimodal messages\n */\nexport type AnthropicContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n }\n | {\n type: \"document\";\n source:\n | {\n type: \"base64\";\n media_type: string;\n data: string;\n }\n | {\n type: \"url\";\n url: string;\n };\n };\n\nexport type OpenAIContentBlock =\n | { type: \"text\"; text: string }\n | {\n type: \"image_url\";\n image_url: {\n url: string;\n detail?: \"low\" | \"high\" | \"auto\";\n };\n };\n\n/**\n * Check if a message has image attachments\n * Supports both new format (metadata.attachments) and legacy (attachments)\n */\nexport function hasImageAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return attachments?.some((a) => a.type === \"image\") ?? false;\n}\n\n/**\n * Check if a message has media attachments (images or PDFs)\n */\nexport function hasMediaAttachments(message: Message): boolean {\n const attachments = message.metadata?.attachments;\n return (\n attachments?.some(\n (a) =>\n a.type === \"image\" ||\n (a.type === \"file\" && a.mimeType === \"application/pdf\"),\n ) ?? false\n );\n}\n\n/**\n * Convert MessageAttachment to Anthropic image content block\n *\n * Anthropic format:\n * {\n * type: \"image\",\n * source: {\n * type: \"base64\",\n * media_type: \"image/png\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicImage(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"image\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert MessageAttachment to OpenAI image_url content block\n *\n * OpenAI format:\n * {\n * type: \"image_url\",\n * image_url: {\n * url: \"data:image/png;base64,...\"\n * }\n * }\n */\nexport function attachmentToOpenAIImage(\n attachment: MessageAttachment,\n): OpenAIContentBlock | null {\n if (attachment.type !== \"image\") return null;\n\n let imageUrl: string;\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n imageUrl = attachment.url;\n } else if (attachment.data) {\n // Build data URI if not already one\n imageUrl = attachment.data.startsWith(\"data:\")\n ? attachment.data\n : `data:${attachment.mimeType || \"image/png\"};base64,${attachment.data}`;\n } else {\n return null;\n }\n\n return {\n type: \"image_url\",\n image_url: {\n url: imageUrl,\n detail: \"auto\",\n },\n };\n}\n\n/**\n * Convert MessageAttachment (PDF) to Anthropic document content block\n *\n * Anthropic format:\n * {\n * type: \"document\",\n * source: {\n * type: \"base64\",\n * media_type: \"application/pdf\",\n * data: \"base64data...\"\n * }\n * }\n */\nexport function attachmentToAnthropicDocument(\n attachment: MessageAttachment,\n): AnthropicContentBlock | null {\n // Only handle PDF files\n if (attachment.type !== \"file\" || attachment.mimeType !== \"application/pdf\") {\n return null;\n }\n\n // Use URL if available (cloud storage)\n if (attachment.url) {\n return {\n type: \"document\",\n source: {\n type: \"url\",\n url: attachment.url,\n },\n };\n }\n\n // Fall back to base64 data\n if (!attachment.data) return null;\n\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n type: \"document\",\n source: {\n type: \"base64\",\n media_type: \"application/pdf\",\n data: base64Data,\n },\n };\n}\n\n/**\n * Convert a Message to Anthropic multimodal content blocks\n */\nexport function messageToAnthropicContent(\n message: Message,\n): string | AnthropicContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no media attachments (images or PDFs), return simple string\n if (!hasMediaAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: AnthropicContentBlock[] = [];\n\n // Add media attachments first (Claude recommends media before text)\n if (attachments) {\n for (const attachment of attachments) {\n // Try image first\n const imageBlock = attachmentToAnthropicImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n continue;\n }\n // Try document (PDF)\n const docBlock = attachmentToAnthropicDocument(attachment);\n if (docBlock) {\n blocks.push(docBlock);\n }\n }\n }\n\n // Add text content\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n return blocks;\n}\n\n/**\n * Convert a Message to OpenAI multimodal content blocks\n */\nexport function messageToOpenAIContent(\n message: Message,\n): string | OpenAIContentBlock[] {\n const attachments = message.metadata?.attachments;\n const content = message.content ?? \"\";\n\n // If no image attachments, return simple string\n if (!hasImageAttachments(message)) {\n return content;\n }\n\n // Build content blocks array\n const blocks: OpenAIContentBlock[] = [];\n\n // Add text content first\n if (content) {\n blocks.push({ type: \"text\", text: content });\n }\n\n // Add image attachments\n if (attachments) {\n for (const attachment of attachments) {\n const imageBlock = attachmentToOpenAIImage(attachment);\n if (imageBlock) {\n blocks.push(imageBlock);\n }\n }\n }\n\n return blocks;\n}\n\n/**\n * Anthropic content block types (extended for tools)\n */\nexport type AnthropicToolUseBlock = {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n};\n\nexport type AnthropicToolResultBlock = {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n};\n\nexport type AnthropicMessageContent =\n | string\n | Array<\n AnthropicContentBlock | AnthropicToolUseBlock | AnthropicToolResultBlock\n >;\n\n/**\n * Format messages for Anthropic with full tool support\n * Handles: text, images, tool_use, and tool_result\n *\n * Key differences from OpenAI:\n * - tool_calls become tool_use blocks in assistant content\n * - tool results become tool_result blocks in user content\n */\nexport function formatMessagesForAnthropic(\n messages: Message[],\n systemPrompt?: string,\n): {\n system: string;\n messages: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }>;\n} {\n const formatted: Array<{\n role: \"user\" | \"assistant\";\n content: AnthropicMessageContent;\n }> = [];\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n\n if (msg.role === \"system\") continue; // System handled separately\n\n if (msg.role === \"assistant\") {\n // Build content array for assistant\n const content: Array<AnthropicContentBlock | AnthropicToolUseBlock> = [];\n\n // Add text content if present\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n\n // Convert tool_calls to tool_use blocks\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n\n formatted.push({\n role: \"assistant\",\n content:\n content.length === 1 && content[0].type === \"text\"\n ? (content[0] as { type: \"text\"; text: string }).text\n : content,\n });\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results go in user message as tool_result blocks\n // Group consecutive tool messages together\n const toolResults: AnthropicToolResultBlock[] = [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? \"\",\n },\n ];\n\n // Look ahead for more consecutive tool messages\n while (i + 1 < messages.length && messages[i + 1].role === \"tool\") {\n i++;\n const nextTool = messages[i];\n if (nextTool.tool_call_id) {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: nextTool.tool_call_id,\n content: nextTool.content ?? \"\",\n });\n }\n }\n\n formatted.push({\n role: \"user\",\n content: toolResults,\n });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToAnthropicContent(msg),\n });\n }\n }\n\n return {\n system: systemPrompt || \"\",\n messages: formatted,\n };\n}\n\n/**\n * OpenAI message format with tool support\n */\nexport type OpenAIMessage =\n | { role: \"system\"; content: string }\n | { role: \"user\"; content: string | OpenAIContentBlock[] }\n | {\n role: \"assistant\";\n content: string | null;\n tool_calls?: Array<{\n id: string;\n type: \"function\";\n function: { name: string; arguments: string };\n }>;\n }\n | { role: \"tool\"; content: string; tool_call_id: string };\n\n/**\n * Format messages for OpenAI with full tool support\n * Handles: text, images, tool_calls, and tool results\n */\nexport function formatMessagesForOpenAI(\n messages: Message[],\n systemPrompt?: string,\n): OpenAIMessage[] {\n const formatted: OpenAIMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n formatted.push({ role: \"system\", content: systemPrompt });\n }\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n formatted.push({ role: \"system\", content: msg.content ?? \"\" });\n } else if (msg.role === \"user\") {\n formatted.push({\n role: \"user\",\n content: messageToOpenAIContent(msg),\n });\n } else if (msg.role === \"assistant\") {\n const assistantMsg: OpenAIMessage = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n (assistantMsg as { tool_calls: typeof msg.tool_calls }).tool_calls =\n msg.tool_calls;\n }\n formatted.push(assistantMsg);\n } else if (msg.role === \"tool\" && msg.tool_call_id) {\n formatted.push({\n role: \"tool\",\n content: msg.content ?? \"\",\n tool_call_id: msg.tool_call_id,\n });\n }\n }\n\n return formatted;\n}\n","import type { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessagesForOpenAI, formatTools } from \"./base\";\n\n/**\n * OpenAI adapter configuration\n */\nexport interface OpenAIAdapterConfig extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n baseUrl?: string;\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 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: \"OPENAI_ERROR\",\n };\n }\n }\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 { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n /** Enable extended thinking (for Claude 3.7 Sonnet, Claude 4) */\n thinking?: ThinkingConfig;\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 = 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 // 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 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 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 \"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 yield {\n type: \"action:start\",\n id: currentToolUse.id,\n name: currentToolUse.name,\n };\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 === \"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 yield {\n type: \"action:args\",\n id: currentToolUse.id,\n args: currentToolUse.input,\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 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: \"ANTHROPIC_ERROR\",\n };\n }\n }\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 { LLMConfig, StreamEvent } from \"@yourgpt/copilot-sdk/core\";\nimport { generateMessageId } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"./base\";\nimport { formatMessages } from \"./base\";\n\n/**\n * Ollama adapter configuration\n */\nexport interface OllamaAdapterConfig extends Partial<LLMConfig> {\n model?: string;\n baseUrl?: string;\n}\n\n/**\n * Ollama LLM Adapter (Local models)\n *\n * Supports: Llama 3, Mistral, Phi, Gemma, CodeLlama, etc.\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 const messages = formatMessages(request.messages, request.systemPrompt);\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\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 stream: true,\n options: {\n temperature: request.config?.temperature ?? this.config.temperature,\n num_predict: request.config?.maxTokens ?? this.config.maxTokens,\n },\n }),\n signal: request.signal,\n });\n\n if (!response.ok) {\n throw new Error(`Ollama API error: ${response.status}`);\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\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 if (chunk.message?.content) {\n yield { type: \"message:delta\", content: chunk.message.content };\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 yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"OLLAMA_ERROR\",\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\n */\n\nimport type {\n LLMConfig,\n StreamEvent,\n Message,\n} from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n /** Safety settings */\n safetySettings?: Array<{\n category: string;\n threshold: string;\n }>;\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 // 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 tools = formatToolsForGemini(request.actions);\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: 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 // 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 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\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: \"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 * 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 \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\n apiKey: string;\n model?: string;\n baseUrl?: string;\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 \"@yourgpt/copilot-sdk/core\";\nimport {\n generateMessageId,\n generateToolCallId,\n} from \"@yourgpt/copilot-sdk/core\";\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 extends Partial<LLMConfig> {\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 /** 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","import type { StreamEvent } from \"@yourgpt/copilot-sdk/core\";\n\n/**\n * Create SSE response headers\n */\nexport function createSSEHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\",\n };\n}\n\n/**\n * Format event as SSE data\n */\nexport function formatSSEData(event: StreamEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n\n/**\n * Create a ReadableStream from an async generator of events\n */\nexport function createEventStream(\n generator: AsyncGenerator<StreamEvent>,\n): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n\n return new ReadableStream({\n async start(controller) {\n try {\n for await (const event of generator) {\n const data = formatSSEData(event);\n controller.enqueue(encoder.encode(data));\n }\n } catch (error) {\n // Send error event\n const errorEvent: StreamEvent = {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n };\n controller.enqueue(encoder.encode(formatSSEData(errorEvent)));\n } finally {\n // Send done event\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n }\n },\n });\n}\n\n/**\n * Create SSE Response object\n */\nexport function createSSEResponse(\n generator: AsyncGenerator<StreamEvent>,\n): Response {\n return new Response(createEventStream(generator), {\n headers: createSSEHeaders(),\n });\n}\n","import type {\n Message,\n ActionDefinition,\n ActionParameter,\n StreamEvent,\n ToolDefinition,\n ToolCallInfo,\n AssistantToolMessage,\n DoneEventMessage,\n ToolResponse,\n AIResponseMode,\n AIContent,\n ToolContext,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type { AIProvider } from \"../providers/types\";\nimport { createMessage } from \"@yourgpt/copilot-sdk/core\";\nimport type { LLMAdapter, ChatCompletionRequest } from \"../adapters\";\nimport {\n createOpenAIAdapter,\n createAnthropicAdapter,\n createOllamaAdapter,\n} from \"../adapters\";\nimport type { RuntimeConfig, ChatRequest } from \"./types\";\nimport { createSSEResponse } from \"./streaming\";\n\n// ============================================\n// AI Response Control\n// ============================================\n\n/**\n * Build the content string sent to AI for a tool result.\n *\n * This function transforms tool results based on the tool's aiResponseMode and aiContext settings,\n * controlling what information the AI receives to generate its response.\n *\n * @param tool - The tool definition (may include aiResponseMode, aiContext)\n * @param result - The tool result (may include _aiResponseMode, _aiContext, _aiContent overrides)\n * @param args - The arguments passed to the tool\n * @returns The content string to send to the AI, or multimodal content array\n */\nfunction buildToolResultForAI(\n tool: ToolDefinition | undefined,\n result: ToolResponse | unknown,\n args: Record<string, unknown>,\n): string | AIContent[] {\n // Type guard for ToolResponse with AI response fields\n const typedResult = result as ToolResponse | undefined;\n\n // Determine response mode (result override > tool config > default 'full')\n const responseMode: AIResponseMode =\n typedResult?._aiResponseMode ?? tool?.aiResponseMode ?? \"full\";\n\n // Check for multimodal content (images, etc.) - always include if present\n if (typedResult?._aiContent && typedResult._aiContent.length > 0) {\n return typedResult._aiContent;\n }\n\n // Get AI context (result override > tool config > undefined)\n let aiContext: string | undefined;\n\n if (typedResult?._aiContext) {\n aiContext = typedResult._aiContext;\n } else if (tool?.aiContext) {\n aiContext =\n typeof tool.aiContext === \"function\"\n ? tool.aiContext(typedResult as ToolResponse, args)\n : tool.aiContext;\n }\n\n // Apply response mode\n switch (responseMode) {\n case \"none\":\n // Minimal message so AI knows tool executed\n return aiContext ?? \"[Result displayed to user]\";\n\n case \"brief\":\n // Use context if available, otherwise minimal acknowledgment\n return (\n aiContext ?? `[Tool ${tool?.name ?? \"unknown\"} executed successfully]`\n );\n\n case \"full\":\n default:\n // Include context as prefix if available, then full data\n const fullData = JSON.stringify(result);\n return aiContext ? `${aiContext}\\n\\nFull data: ${fullData}` : fullData;\n }\n}\n\n/**\n * Serialize tool result content for API message.\n * Handles both string and multimodal (AIContent[]) results.\n */\nfunction serializeToolResultContent(\n content: string | AIContent[],\n): string | Array<{ type: string; [key: string]: unknown }> {\n if (typeof content === \"string\") {\n return content;\n }\n\n // Convert AIContent to API format (OpenAI multimodal format)\n return content.map((item) => {\n if (item.type === \"image\") {\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${item.mediaType};base64,${item.data}`,\n },\n };\n }\n // Text content\n return {\n type: \"text\",\n text: item.text,\n };\n });\n}\n\n/**\n * Extract headers from HTTP request as a plain object\n */\nfunction extractHeaders(request?: Request): Record<string, string> {\n if (!request) return {};\n const headers: Record<string, string> = {};\n request.headers.forEach((value, key) => {\n headers[key.toLowerCase()] = value;\n });\n return headers;\n}\n\n/**\n * Build ToolContext from runtime config and HTTP request\n */\nfunction buildToolContext(\n toolCallId: string,\n signal: AbortSignal | undefined,\n threadId: string | undefined,\n httpRequest: Request | undefined,\n toolContextData: Record<string, unknown> | undefined,\n): ToolContext {\n const headers = extractHeaders(httpRequest);\n return {\n signal,\n threadId,\n toolCallId,\n headers,\n request: httpRequest\n ? {\n method: httpRequest.method,\n url: httpRequest.url,\n headers,\n }\n : undefined,\n data: toolContextData,\n };\n}\n\n/**\n * Copilot SDK Runtime\n *\n * Handles chat requests and manages LLM interactions.\n */\nexport class Runtime {\n private adapter: LLMAdapter;\n private config: RuntimeConfig;\n private actions: Map<string, ActionDefinition> = new Map();\n private tools: Map<string, ToolDefinition> = new Map();\n\n constructor(config: RuntimeConfig) {\n this.config = config;\n\n // Create adapter based on configuration type\n if (\"provider\" in config && config.provider) {\n // NEW: Use AIProvider to get adapter\n this.adapter = config.provider.languageModel(config.model);\n } else if (\"adapter\" in config && config.adapter) {\n // EXISTING: Direct adapter\n this.adapter = config.adapter;\n } else {\n // EXISTING: Legacy LLM config\n this.adapter = this.createAdapter(config);\n }\n\n // Register actions (legacy)\n if (config.actions) {\n for (const action of config.actions) {\n this.actions.set(action.name, action);\n }\n }\n\n // Register tools (new)\n if (config.tools) {\n for (const tool of config.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n /**\n * Create LLM adapter based on config\n */\n private createAdapter(config: RuntimeConfig): LLMAdapter {\n if (!(\"llm\" in config) || !config.llm) {\n throw new Error(\n \"LLM configuration is required when adapter is not provided\",\n );\n }\n const { llm } = config;\n\n switch (llm.provider) {\n case \"openai\":\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"anthropic\":\n return createAnthropicAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n case \"ollama\":\n return createOllamaAdapter({\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n\n default:\n // Default to OpenAI-compatible\n return createOpenAIAdapter({\n apiKey: llm.apiKey,\n model: llm.model,\n baseUrl: llm.baseUrl,\n temperature: llm.temperature,\n maxTokens: llm.maxTokens,\n });\n }\n }\n\n /**\n * Process a chat request and return streaming response\n */\n async *processChat(\n request: ChatRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n // Convert request messages to Message type\n const messages: Message[] = request.messages.map((m, i) =>\n createMessage({\n id: `msg_${i}`,\n role: m.role as Message[\"role\"],\n content: m.content,\n }),\n );\n\n // Merge actions from config and request\n const allActions = [...this.actions.values()];\n if (request.actions) {\n for (const action of request.actions) {\n if (!this.actions.has(action.name)) {\n allActions.push({\n name: action.name,\n description: action.description,\n parameters: action.parameters as ActionDefinition[\"parameters\"],\n handler: async () => {\n // Client-side action - will be handled by frontend\n return { handled: false };\n },\n });\n }\n }\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages,\n actions: allActions.length > 0 ? allActions : undefined,\n systemPrompt: request.systemPrompt || this.config.systemPrompt,\n config: request.config,\n signal,\n };\n\n // Stream response from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process events and handle tool calls\n for await (const event of stream) {\n // Handle action execution\n if (event.type === \"action:args\") {\n const action = this.actions.get(event.id);\n if (action) {\n try {\n const args = JSON.parse(event.args);\n const result = await action.handler(args);\n yield {\n type: \"action:end\",\n id: event.id,\n result,\n };\n } catch (error) {\n yield {\n type: \"action:end\",\n id: event.id,\n error: error instanceof Error ? error.message : \"Action failed\",\n };\n }\n } else {\n // Forward to client for handling\n yield event;\n }\n } else {\n yield event;\n }\n }\n }\n\n /**\n * Handle HTTP request (for use with any framework)\n */\n async handleRequest(request: Request): Promise<Response> {\n try {\n const body = (await request.json()) as ChatRequest;\n\n if (this.config.debug) {\n console.log(\"[Copilot SDK] Request:\", JSON.stringify(body, null, 2));\n }\n\n // Create abort controller from request signal\n const signal = request.signal;\n\n // Use agent loop if tools are present or explicitly enabled\n const hasTools =\n (body.tools && body.tools.length > 0) || this.tools.size > 0;\n const useAgentLoop = hasTools || this.config.agentLoop?.enabled;\n\n // NON-STREAMING: Return JSON response instead of SSE\n if (body.streaming === false) {\n return this.handleNonStreamingRequest(\n body,\n signal,\n useAgentLoop || false,\n request,\n );\n }\n\n // STREAMING: Process chat and return SSE response\n const generator = useAgentLoop\n ? this.processChatWithLoop(body, signal, undefined, undefined, request)\n : this.processChat(body, signal);\n return createSSEResponse(generator);\n } catch (error) {\n console.error(\"[Copilot SDK] Error:\", error);\n\n return new Response(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"Unknown error\",\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Handle non-streaming request - returns JSON instead of SSE\n */\n private async handleNonStreamingRequest(\n body: ChatRequest,\n signal: AbortSignal | undefined,\n useAgentLoop: boolean,\n httpRequest: Request,\n ): Promise<Response> {\n try {\n const generator = useAgentLoop\n ? this.processChatWithLoop(\n body,\n signal,\n undefined,\n undefined,\n httpRequest,\n )\n : this.processChat(body, signal);\n\n // Collect all events\n const events: StreamEvent[] = [];\n let content = \"\";\n const toolCalls: ToolCallInfo[] = [];\n const toolResults: Array<{ id: string; result: unknown }> = [];\n let messages: DoneEventMessage[] | undefined;\n let requiresAction = false;\n let error: { message: string; code?: string } | undefined;\n\n for await (const event of generator) {\n events.push(event);\n\n switch (event.type) {\n case \"message:delta\":\n content += event.content;\n break;\n case \"action:start\":\n toolCalls.push({ id: event.id, name: event.name, args: {} });\n break;\n case \"action:args\":\n const tc = toolCalls.find((t) => t.id === event.id);\n if (tc) {\n try {\n tc.args = JSON.parse(event.args || \"{}\");\n } catch {\n tc.args = {};\n }\n }\n break;\n case \"action:end\":\n toolResults.push({\n id: event.id,\n result: event.result || event.error,\n });\n break;\n case \"tool_calls\":\n // Client-side tool calls\n break;\n case \"done\":\n messages = event.messages;\n requiresAction = event.requiresAction || false;\n break;\n case \"error\":\n error = { message: event.message, code: event.code };\n break;\n }\n }\n\n // Build JSON response\n const response = {\n success: !error,\n content,\n toolCalls: toolCalls.length > 0 ? toolCalls : undefined,\n toolResults: toolResults.length > 0 ? toolResults : undefined,\n messages,\n requiresAction,\n error,\n // Include raw events for debugging\n _events: this.config.debug ? events : undefined,\n };\n\n console.log(\"[Copilot SDK] Non-streaming response:\", {\n contentLength: content.length,\n toolCalls: toolCalls.length,\n toolResults: toolResults.length,\n messagesCount: messages?.length,\n requiresAction,\n hasError: !!error,\n });\n\n return new Response(JSON.stringify(response), {\n status: error ? 500 : 200,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n } catch (err) {\n console.error(\"[Copilot SDK] Non-streaming error:\", err);\n return new Response(\n JSON.stringify({\n success: false,\n error: {\n message: err instanceof Error ? err.message : \"Unknown error\",\n },\n }),\n {\n status: 500,\n headers: { \"Content-Type\": \"application/json\" },\n },\n );\n }\n }\n\n /**\n * Get registered actions\n */\n getActions(): ActionDefinition[] {\n return [...this.actions.values()];\n }\n\n /**\n * Register a new action\n */\n registerAction(action: ActionDefinition): void {\n this.actions.set(action.name, action);\n }\n\n /**\n * Unregister an action\n */\n unregisterAction(name: string): void {\n this.actions.delete(name);\n }\n\n /**\n * Register a new tool\n */\n registerTool(tool: ToolDefinition): void {\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Unregister a tool\n */\n unregisterTool(name: string): void {\n this.tools.delete(name);\n }\n\n /**\n * Get registered tools\n */\n getTools(): ToolDefinition[] {\n return [...this.tools.values()];\n }\n\n /**\n * Get the AI provider name from config\n */\n private getProviderName(): string {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.provider.name;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.provider;\n }\n // Default to openai if using custom adapter\n return \"openai\";\n }\n\n /**\n * Get the AI provider instance (if using provider config)\n */\n getProvider(): AIProvider | null {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.provider as AIProvider;\n }\n return null;\n }\n\n /**\n * Get the current model ID\n */\n getModel(): string {\n if (\"provider\" in this.config && this.config.provider) {\n return this.config.model;\n }\n if (\"llm\" in this.config && this.config.llm) {\n return this.config.llm.model || \"unknown\";\n }\n return this.adapter.model;\n }\n\n /**\n * Process a chat request with tool support (Vercel AI SDK pattern)\n *\n * This method:\n * 1. Streams response from adapter\n * 2. Detects tool calls from streaming events\n * 3. Server-side tools are executed immediately\n * 4. Client-side tool calls are yielded for client to execute\n * 5. Loop continues until no more tool calls or max iterations reached\n * 6. Returns all new messages in the done event for client to append\n */\n async *processChatWithLoop(\n request: ChatRequest,\n signal?: AbortSignal,\n // Internal: accumulated messages from recursive calls (for returning in done event)\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n // HTTP request for extracting headers (auth context)\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const debug = this.config.debug || this.config.agentLoop?.debug;\n\n // Check if non-streaming mode is requested\n // Use non-streaming for better comparison with original studio-ai behavior\n if (request.streaming === false) {\n if (debug) {\n console.log(\"[Copilot SDK] Using non-streaming mode\");\n }\n // Delegate to non-streaming implementation\n for await (const event of this.processChatWithLoopNonStreaming(\n request,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Track new messages created during this request\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Processing chat with ${allTools.length} tools`,\n );\n // Log messages with attachments for debugging vision support\n for (let i = 0; i < request.messages.length; i++) {\n const msg = request.messages[i];\n const hasAttachments = msg.attachments && msg.attachments.length > 0;\n if (hasAttachments) {\n console.log(\n `[Copilot SDK] Message ${i} (${msg.role}) has ${msg.attachments!.length} attachments:`,\n msg.attachments!.map((a) => ({\n type: a.type,\n mimeType: a.mimeType,\n dataLength: a.data?.length || 0,\n })),\n );\n }\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Accumulate data from stream\n let accumulatedText = \"\";\n const toolCalls: ToolCallInfo[] = [];\n let currentToolCall: { id: string; name: string; args: string } | null =\n null;\n\n // Create completion request\n // Use rawMessages if provided (when client sends tool results in messages)\n const completionRequest: ChatCompletionRequest = {\n messages: [], // Not used when rawMessages is provided\n rawMessages: request.messages as Array<Record<string, unknown>>,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n };\n\n // Stream from adapter\n const stream = this.adapter.stream(completionRequest);\n\n // Process stream events\n for await (const event of stream) {\n switch (event.type) {\n case \"message:start\":\n case \"message:end\":\n yield event; // Forward to client\n break;\n\n case \"message:delta\":\n accumulatedText += event.content;\n yield event; // Forward text to client\n break;\n\n case \"action:start\":\n currentToolCall = { id: event.id, name: event.name, args: \"\" };\n if (debug) {\n console.log(`[Copilot SDK] Tool call started: ${event.name}`);\n }\n yield event; // Forward to client\n break;\n\n case \"action:args\":\n if (currentToolCall) {\n try {\n const parsedArgs = JSON.parse(event.args || \"{}\");\n if (debug) {\n console.log(\n `[Copilot SDK] Tool args for ${currentToolCall.name}:`,\n parsedArgs,\n );\n }\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: parsedArgs,\n });\n } catch (e) {\n console.error(\n \"[Copilot SDK] Failed to parse tool args:\",\n event.args,\n e,\n );\n toolCalls.push({\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: {},\n });\n }\n currentToolCall = null;\n }\n yield event; // Forward to client\n break;\n\n case \"error\":\n yield event;\n return; // Exit on error\n\n case \"done\":\n // Don't yield done yet - we need to check for tool calls first\n break;\n\n default:\n yield event;\n }\n }\n\n // Check if we got tool calls\n if (toolCalls.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Detected ${toolCalls.length} tool calls:`,\n toolCalls.map((t) => t.name),\n );\n }\n\n // Separate server-side and client-side tool calls\n const serverToolCalls: ToolCallInfo[] = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push(tc);\n }\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing server-side tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const result = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n result,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If there are server-side tools executed, continue the loop by making another LLM call\n if (serverToolResults.length > 0) {\n if (debug) {\n console.log(\n `[Copilot SDK] Server tools executed, continuing conversation...`,\n );\n }\n\n // Create assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: serverToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Create tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] = serverToolResults.map(\n (tr) => {\n const aiContent = buildToolResultForAI(tr.tool, tr.result, tr.args);\n // Serialize content (handles both string and multimodal)\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n },\n );\n\n // Add to accumulated messages for client\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Build messages for next LLM call (cast DoneEventMessage to Record for request)\n const messagesWithResults: Array<Record<string, unknown>> = [\n ...(request.messages as Array<Record<string, unknown>>),\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<Record<string, unknown>>),\n ];\n\n // Make recursive call with updated messages\n const nextRequest: ChatRequest = {\n ...request,\n messages: messagesWithResults as ChatRequest[\"messages\"],\n };\n\n // Continue the agent loop - pass accumulated messages and HTTP request\n for await (const event of this.processChatWithLoop(\n nextRequest,\n signal,\n newMessages,\n true, // Mark as recursive\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // If there are client-side tools, send them to client\n if (clientToolCalls.length > 0) {\n // Build assistant message with tool_calls for client to include in next request\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: accumulatedText || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Add to accumulated messages (cast to DoneEventMessage since structure matches)\n newMessages.push(assistantMessage as DoneEventMessage);\n\n // Yield tool_calls event (Vercel AI SDK pattern)\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n // Signal that client needs to execute tools and send results\n // Include accumulated messages so client can update state\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - add final assistant message and we're done\n if (accumulatedText) {\n newMessages.push({\n role: \"assistant\" as const,\n content: accumulatedText,\n });\n }\n\n if (debug) {\n console.log(\n `[Copilot SDK] Stream complete, returning ${newMessages.length} new messages`,\n );\n }\n\n // Return all accumulated messages for client to append\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n } as StreamEvent;\n }\n\n /**\n * Non-streaming agent loop implementation\n *\n * Uses adapter.complete() instead of stream() for:\n * - Better comparison with original studio-ai behavior\n * - Easier debugging (full response at once)\n * - More predictable retry behavior\n */\n private async *processChatWithLoopNonStreaming(\n request: ChatRequest,\n signal?: AbortSignal,\n _accumulatedMessages?: DoneEventMessage[],\n _isRecursive?: boolean,\n _httpRequest?: Request,\n ): AsyncGenerator<StreamEvent> {\n const newMessages: DoneEventMessage[] = _accumulatedMessages || [];\n const debug = this.config.debug || this.config.agentLoop?.debug;\n const maxIterations = this.config.agentLoop?.maxIterations || 20;\n\n // Collect all tools (server + client from request)\n const allTools: ToolDefinition[] = [...this.tools.values()];\n\n // Add client tools from request\n if (request.tools) {\n for (const tool of request.tools) {\n allTools.push({\n name: tool.name,\n description: tool.description,\n location: \"client\",\n inputSchema: tool.inputSchema as ToolDefinition[\"inputSchema\"],\n });\n }\n }\n\n // Build system prompt\n const systemPrompt = request.systemPrompt || this.config.systemPrompt || \"\";\n\n // Main agent loop\n let iteration = 0;\n let conversationMessages = request.messages as Array<\n Record<string, unknown>\n >;\n\n while (iteration < maxIterations) {\n iteration++;\n\n if (debug) {\n console.log(`[Copilot SDK] Iteration ${iteration}/${maxIterations}`);\n }\n\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"error\",\n message: \"Aborted\",\n code: \"ABORTED\",\n } as StreamEvent;\n return;\n }\n\n // Check if adapter supports non-streaming\n if (!this.adapter.complete) {\n if (debug) {\n console.log(\n \"[Copilot SDK] Adapter does not support non-streaming, falling back to streaming\",\n );\n }\n // Fall back to streaming by delegating to the streaming implementation\n // But set streaming to true to avoid infinite loop\n const streamingRequest = { ...request, streaming: true };\n for await (const event of this.processChatWithLoop(\n streamingRequest,\n signal,\n _accumulatedMessages,\n _isRecursive,\n _httpRequest,\n )) {\n yield event;\n }\n return;\n }\n\n // Create completion request\n const completionRequest: ChatCompletionRequest = {\n messages: [],\n rawMessages: conversationMessages,\n actions: this.convertToolsToActions(allTools),\n systemPrompt: systemPrompt,\n config: request.config,\n signal,\n };\n\n try {\n // Call the non-streaming complete method\n const result = await this.adapter.complete(completionRequest);\n\n if (debug) {\n console.log(\n `[Copilot SDK] Got response: ${result.content.length} chars, ${result.toolCalls.length} tool calls`,\n );\n }\n\n // Emit message events (for SSE compatibility)\n yield { type: \"message:start\", id: `msg_${Date.now()}` } as StreamEvent;\n if (result.content) {\n yield {\n type: \"message:delta\",\n content: result.content,\n } as StreamEvent;\n }\n yield { type: \"message:end\" } as StreamEvent;\n\n // Check for tool calls\n if (result.toolCalls.length > 0) {\n // Separate server and client tools\n const serverToolCalls: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n }> = [];\n const clientToolCalls: ToolCallInfo[] = [];\n\n for (const tc of result.toolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.location === \"server\" && tool.handler) {\n serverToolCalls.push(tc);\n } else {\n clientToolCalls.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n }\n }\n\n // Emit tool call events\n for (const tc of result.toolCalls) {\n yield {\n type: \"action:start\",\n id: tc.id,\n name: tc.name,\n } as StreamEvent;\n yield {\n type: \"action:args\",\n id: tc.id,\n args: JSON.stringify(tc.args),\n } as StreamEvent;\n }\n\n // Execute server-side tools\n const serverToolResults: Array<{\n id: string;\n name: string;\n args: Record<string, unknown>;\n result: unknown;\n tool: ToolDefinition;\n }> = [];\n\n // Get toolContext from config (if available)\n const toolContextData =\n \"toolContext\" in this.config ? this.config.toolContext : undefined;\n\n for (const tc of serverToolCalls) {\n const tool = allTools.find((t) => t.name === tc.name);\n if (tool?.handler) {\n if (debug) {\n console.log(`[Copilot SDK] Executing tool: ${tc.name}`);\n }\n\n // Build rich context for the tool handler\n const toolContext = buildToolContext(\n tc.id,\n signal,\n request.threadId,\n _httpRequest,\n toolContextData,\n );\n\n try {\n const toolResult = await tool.handler(tc.args, toolContext);\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: toolResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n result: toolResult,\n } as StreamEvent;\n } catch (error) {\n const errorResult = {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n };\n serverToolResults.push({\n id: tc.id,\n name: tc.name,\n args: tc.args,\n result: errorResult,\n tool,\n });\n yield {\n type: \"action:end\",\n id: tc.id,\n error:\n error instanceof Error\n ? error.message\n : \"Tool execution failed\",\n } as StreamEvent;\n }\n }\n }\n\n // If server tools were executed, continue the loop\n if (serverToolResults.length > 0) {\n // Build assistant message with tool_calls\n const assistantWithToolCalls: DoneEventMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: result.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n // Build tool result messages (using buildToolResultForAI for AI response control)\n const toolResultMessages: DoneEventMessage[] =\n serverToolResults.map((tr) => {\n const aiContent = buildToolResultForAI(\n tr.tool,\n tr.result,\n tr.args,\n );\n const content =\n typeof aiContent === \"string\"\n ? aiContent\n : JSON.stringify(serializeToolResultContent(aiContent));\n return {\n role: \"tool\" as const,\n content,\n tool_call_id: tr.id,\n };\n });\n\n // Add to accumulated messages\n newMessages.push(assistantWithToolCalls);\n newMessages.push(...toolResultMessages);\n\n // Update conversation for next iteration\n conversationMessages = [\n ...conversationMessages,\n assistantWithToolCalls as unknown as Record<string, unknown>,\n ...(toolResultMessages as unknown as Array<\n Record<string, unknown>\n >),\n ];\n\n // Continue loop\n continue;\n }\n\n // Client tools - yield for client to execute and return\n if (clientToolCalls.length > 0) {\n const assistantMessage: AssistantToolMessage = {\n role: \"assistant\",\n content: result.content || null,\n tool_calls: clientToolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n })),\n };\n\n newMessages.push(assistantMessage as DoneEventMessage);\n\n yield {\n type: \"tool_calls\",\n toolCalls: clientToolCalls,\n assistantMessage,\n } as StreamEvent;\n\n yield {\n type: \"done\",\n requiresAction: true,\n messages: newMessages,\n } as StreamEvent;\n return;\n }\n }\n\n // No tool calls - we're done\n if (result.content) {\n newMessages.push({\n role: \"assistant\" as const,\n content: result.content,\n });\n }\n\n if (debug) {\n console.log(`[Copilot SDK] Complete after ${iteration} iterations`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n } as StreamEvent;\n return;\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"COMPLETION_ERROR\",\n } as StreamEvent;\n return;\n }\n }\n\n // Max iterations reached\n if (debug) {\n console.log(`[Copilot SDK] Max iterations (${maxIterations}) reached`);\n }\n\n yield {\n type: \"done\",\n messages: newMessages.length > 0 ? newMessages : undefined,\n } as StreamEvent;\n }\n\n /**\n * Convert tools to legacy action format (for adapter compatibility)\n */\n private convertToolsToActions(tools: ToolDefinition[]): ActionDefinition[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: this.convertInputSchemaToParameters(tool.inputSchema),\n handler: tool.handler || (async () => ({ handled: false })),\n }));\n }\n\n /**\n * Convert JSON Schema property to ActionParameter format recursively\n */\n private convertSchemaProperty(prop: unknown): ActionParameter {\n const p = prop as {\n type?: string;\n description?: string;\n enum?: string[];\n items?: unknown;\n properties?: Record<string, unknown>;\n };\n\n type ParamType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\n const typeMap: Record<string, ParamType> = {\n string: \"string\",\n number: \"number\",\n integer: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n };\n\n const result: ActionParameter = {\n type: typeMap[p.type || \"string\"] || \"string\",\n };\n\n if (p.description) {\n result.description = p.description;\n }\n\n if (p.enum) {\n result.enum = p.enum;\n }\n\n // Preserve items for array types\n if (p.type === \"array\" && p.items) {\n result.items = this.convertSchemaProperty(p.items);\n }\n\n // Preserve properties for object types\n if (p.type === \"object\" && p.properties) {\n result.properties = Object.fromEntries(\n Object.entries(p.properties).map(([key, val]) => [\n key,\n this.convertSchemaProperty(val),\n ]),\n );\n }\n\n return result;\n }\n\n /**\n * Convert JSON Schema to legacy parameters format\n */\n private convertInputSchemaToParameters(\n schema: ToolDefinition[\"inputSchema\"],\n ): Record<string, ActionParameter> {\n const parameters: Record<string, ActionParameter> = {};\n\n for (const [name, prop] of Object.entries(schema.properties)) {\n const converted = this.convertSchemaProperty(prop);\n parameters[name] = {\n ...converted,\n required: schema.required?.includes(name),\n };\n }\n\n return parameters;\n }\n}\n\n/**\n * Create runtime instance\n */\nexport function createRuntime(config: RuntimeConfig): Runtime {\n return new Runtime(config);\n}\n","import { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport type { Runtime } from \"./runtime\";\nimport type { RuntimeConfig } from \"./types\";\nimport { createRuntime } from \"./runtime\";\nimport { createSSEResponse } from \"./streaming\";\n\n/**\n * Create Hono app with chat endpoint\n */\nexport function createHonoApp(runtime: Runtime): Hono {\n const app = new Hono();\n\n // Enable CORS\n app.use(\"*\", cors());\n\n // Health check\n app.get(\"/\", (c) => {\n return c.json({ status: \"ok\", provider: \"yourgpt-copilot\" });\n });\n\n // Chat endpoint at root (for Next.js App Router mounting)\n // e.g., mounted at /api/chat/openai → POST /api/chat/openai works\n app.post(\"/\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint (standard - single turn)\n // Also available at /chat sub-path for flexibility\n app.post(\"/chat\", async (c) => {\n const request = c.req.raw;\n return runtime.handleRequest(request);\n });\n\n // Chat endpoint with agent loop (multi-turn with tools)\n // Note: With Vercel AI SDK pattern, this is the same as /chat\n // Client sends tool results in messages, server doesn't wait\n app.post(\"/chat/loop\", async (c) => {\n try {\n const body = await c.req.json();\n const signal = c.req.raw.signal;\n\n // Process with tool support\n const generator = runtime.processChatWithLoop(body, signal);\n return createSSEResponse(generator);\n } catch (error) {\n return c.json(\n { error: error instanceof Error ? error.message : \"Unknown error\" },\n 500,\n );\n }\n });\n\n // Get available actions (legacy)\n app.get(\"/actions\", (c) => {\n const actions = runtime.getActions().map((a) => ({\n name: a.name,\n description: a.description,\n parameters: a.parameters,\n }));\n return c.json({ actions });\n });\n\n // Get available tools (new)\n app.get(\"/tools\", (c) => {\n const tools = runtime.getTools().map((t) => ({\n name: t.name,\n description: t.description,\n location: t.location,\n inputSchema: t.inputSchema,\n }));\n return c.json({ tools });\n });\n\n // Get model capabilities (for UI feature flags)\n app.get(\"/capabilities\", (c) => {\n const provider = runtime.getProvider();\n const model = runtime.getModel();\n\n if (provider) {\n const capabilities = provider.getCapabilities(model);\n return c.json({\n provider: provider.name,\n model,\n capabilities,\n supportedModels: provider.supportedModels,\n });\n }\n\n // Fallback for legacy config (no provider instance)\n return c.json({\n provider: \"unknown\",\n model,\n capabilities: {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n },\n supportedModels: [],\n });\n });\n\n return app;\n}\n\n/**\n * Next.js App Router handler\n *\n * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { createNextHandler } from '@yourgpt/llm-sdk';\n *\n * const handler = createNextHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * });\n *\n * export const POST = handler;\n * ```\n */\nexport function createNextHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n\n return async function handler(request: Request): Promise<Response> {\n return runtime.handleRequest(request);\n };\n}\n\n/**\n * Express middleware\n *\n * @example\n * ```ts\n * import express from 'express';\n * import { createExpressMiddleware } from '@yourgpt/llm-sdk';\n *\n * const app = express();\n *\n * app.use('/api/chat', createExpressMiddleware({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * }));\n * ```\n */\nexport function createExpressMiddleware(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n const app = createHonoApp(runtime);\n\n // Return Hono's fetch handler wrapped for Express\n return async (\n req: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body: unknown;\n },\n res: {\n status: (code: number) => { json: (data: unknown) => void };\n setHeader: (name: string, value: string) => void;\n write: (data: string) => void;\n end: () => void;\n },\n ) => {\n try {\n // Convert Express request to Fetch Request\n const url = new URL(req.url, \"http://localhost\");\n const request = new Request(url, {\n method: req.method,\n headers: req.headers,\n body: req.method !== \"GET\" ? JSON.stringify(req.body) : undefined,\n });\n\n // Handle with runtime\n const response = await runtime.handleRequest(request);\n\n // Set response headers\n response.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n\n // Stream response body\n if (response.body) {\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n res.write(decoder.decode(value));\n }\n }\n\n res.end();\n } catch (error) {\n res.status(500).json({\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n };\n}\n\n/**\n * Node.js HTTP handler\n *\n * @example\n * ```ts\n * import http from 'http';\n * import { createNodeHandler } from '@yourgpt/llm-sdk';\n *\n * const handler = createNodeHandler({\n * llm: { provider: 'openai', apiKey: process.env.OPENAI_API_KEY! },\n * });\n *\n * const server = http.createServer(handler);\n * server.listen(3001);\n * ```\n */\nexport function createNodeHandler(config: RuntimeConfig) {\n const runtime = createRuntime(config);\n const app = createHonoApp(runtime);\n\n return app.fetch;\n}\n","/**\n * Provider Registry\n *\n * Central registry for AI providers.\n * Allows dynamic registration and lookup of providers.\n */\n\nimport type { AIProvider, ProviderCapabilities } from \"./types\";\n\n// ============================================\n// Registry\n// ============================================\n\n/**\n * Registry of provider factory functions\n * Key: provider name (e.g., 'openai')\n * Value: factory function that creates the provider\n */\nconst providerFactories = new Map<\n string,\n (config?: Record<string, unknown>) => AIProvider\n>();\n\n/**\n * Register a provider factory\n *\n * @param name Provider name (e.g., 'openai')\n * @param factory Factory function that creates the provider\n *\n * @example\n * ```typescript\n * registerProvider('openai', (config) => createOpenAI(config));\n * ```\n */\nexport function registerProvider(\n name: string,\n factory: (config?: Record<string, unknown>) => AIProvider,\n): void {\n providerFactories.set(name, factory);\n}\n\n/**\n * Get a provider by name\n *\n * @param name Provider name\n * @param config Optional configuration\n * @returns Provider instance or undefined if not found\n *\n * @example\n * ```typescript\n * const openai = getProvider('openai', { apiKey: '...' });\n * ```\n */\nexport function getProvider(\n name: string,\n config?: Record<string, unknown>,\n): AIProvider | undefined {\n const factory = providerFactories.get(name);\n if (!factory) {\n return undefined;\n }\n return factory(config);\n}\n\n/**\n * Check if a provider is registered\n */\nexport function hasProvider(name: string): boolean {\n return providerFactories.has(name);\n}\n\n/**\n * List all registered provider names\n */\nexport function listProviders(): string[] {\n return Array.from(providerFactories.keys());\n}\n\n/**\n * Unregister a provider (useful for testing)\n */\nexport function unregisterProvider(name: string): boolean {\n return providerFactories.delete(name);\n}\n\n/**\n * Clear all registered providers (useful for testing)\n */\nexport function clearProviders(): void {\n providerFactories.clear();\n}\n\n// ============================================\n// Provider Info\n// ============================================\n\n/**\n * Get all available providers with their models\n * Useful for building UI model selectors\n */\nexport function getAvailableProviders(): Array<{\n name: string;\n models: string[];\n}> {\n const result: Array<{ name: string; models: string[] }> = [];\n\n for (const [name, factory] of providerFactories) {\n try {\n const provider = factory();\n result.push({\n name,\n models: provider.supportedModels,\n });\n } catch {\n // Skip providers that fail to initialize (e.g., missing API key)\n result.push({\n name,\n models: [],\n });\n }\n }\n\n return result;\n}\n\n/**\n * Get capabilities for a specific provider and model\n */\nexport function getModelCapabilities(\n providerName: string,\n modelId: string,\n): ProviderCapabilities | undefined {\n const provider = getProvider(providerName);\n if (!provider) {\n return undefined;\n }\n return provider.getCapabilities(modelId);\n}\n","/**\n * OpenAI Provider\n *\n * Modern pattern: openai('gpt-4o') returns a LanguageModel\n * Legacy pattern: createOpenAI({ apiKey }) returns an AIProvider\n */\n\n// NEW: Modern pattern - openai() function\nexport { openai, createOpenAI as createOpenAIModel } from \"./provider\";\nexport type { OpenAIProviderOptions } from \"./provider\";\n\n// LEGACY: Keep existing createOpenAI for backward compatibility\nimport { createOpenAIAdapter } from \"../../adapters/openai\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n OpenAIProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n audio: boolean;\n jsonMode: boolean;\n maxTokens: number;\n}\n\nconst OPENAI_MODELS: Record<string, ModelCapabilities> = {\n // GPT-4o series\n \"gpt-4o\": {\n vision: true,\n tools: true,\n audio: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-mini\": {\n vision: true,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-2024-11-20\": {\n vision: true,\n tools: true,\n audio: true,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4o-2024-08-06\": {\n vision: true,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n\n // GPT-4 Turbo series\n \"gpt-4-turbo\": {\n vision: true,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n \"gpt-4-turbo-preview\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 128000,\n },\n\n // GPT-4 series\n \"gpt-4\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: false,\n maxTokens: 8192,\n },\n \"gpt-4-32k\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: false,\n maxTokens: 32768,\n },\n\n // GPT-3.5 series\n \"gpt-3.5-turbo\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 16385,\n },\n \"gpt-3.5-turbo-16k\": {\n vision: false,\n tools: true,\n audio: false,\n jsonMode: true,\n maxTokens: 16385,\n },\n\n // O1 reasoning series\n o1: {\n vision: true,\n tools: false, // O1 doesn't support tools yet\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n \"o1-mini\": {\n vision: true,\n tools: false,\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n \"o1-preview\": {\n vision: true,\n tools: false,\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n\n // O3 reasoning series\n \"o3-mini\": {\n vision: true,\n tools: false,\n audio: false,\n jsonMode: false,\n maxTokens: 128000,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an OpenAI provider (Legacy API)\n *\n * @deprecated Use `import { openai } from '@yourgpt/llm-sdk/openai'` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * const provider = createOpenAI({ apiKey: '...' });\n * const adapter = provider.languageModel('gpt-4o');\n *\n * // NEW (recommended):\n * import { openai } from '@yourgpt/llm-sdk/openai';\n * const model = openai('gpt-4o');\n * ```\n */\nexport function createOpenAI(config: OpenAIProviderConfig = {}): AIProvider {\n const apiKey = config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\";\n\n return {\n name: \"openai\",\n supportedModels: Object.keys(OPENAI_MODELS),\n\n languageModel(modelId: string) {\n return createOpenAIAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model = OPENAI_MODELS[modelId] ?? OPENAI_MODELS[\"gpt-4o\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false, // OpenAI doesn't have extended thinking\n supportsStreaming: true,\n supportsPDF: false, // OpenAI doesn't support PDFs directly\n supportsAudio: model.audio,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n supportedAudioTypes: model.audio\n ? [\"audio/mp3\", \"audio/wav\", \"audio/webm\"]\n : [],\n supportsJsonMode: model.jsonMode,\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createOpenAIProvider = createOpenAI;\n","/**\n * Anthropic Provider\n *\n * Modern pattern: anthropic('claude-3-5-sonnet') returns a LanguageModel\n * Legacy pattern: createAnthropic({ apiKey }) returns an AIProvider\n */\n\n// NEW: Modern pattern - anthropic() function\nexport { anthropic, createAnthropic as createAnthropicModel } from \"./provider\";\nexport type { AnthropicProviderOptions } from \"./provider\";\n\n// LEGACY: Keep existing createAnthropic for backward compatibility\nimport { createAnthropicAdapter } from \"../../adapters/anthropic\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n AnthropicProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n thinking: boolean;\n maxTokens: number;\n}\n\nconst ANTHROPIC_MODELS: Record<string, ModelCapabilities> = {\n // Claude 4 series (latest)\n \"claude-sonnet-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 64000,\n },\n \"claude-opus-4-20250514\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 32000,\n },\n\n // Claude 3.5 series\n \"claude-3-5-sonnet-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-sonnet-20241022\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-latest\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-5-haiku-20241022\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n\n // Claude 3 series\n \"claude-3-opus-latest\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-opus-20240229\": {\n vision: true,\n tools: true,\n thinking: true,\n maxTokens: 200000,\n },\n \"claude-3-sonnet-20240229\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n \"claude-3-haiku-20240307\": {\n vision: true,\n tools: true,\n thinking: false,\n maxTokens: 200000,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Anthropic provider\n *\n * @example\n * ```typescript\n * const anthropic = createAnthropic({\n * apiKey: '...',\n * thinkingBudget: 10000, // Enable extended thinking\n * });\n * const adapter = anthropic.languageModel('claude-sonnet-4-20250514');\n * const caps = anthropic.getCapabilities('claude-sonnet-4-20250514');\n * ```\n */\nexport function createAnthropic(\n config: AnthropicProviderConfig = {},\n): AIProvider {\n const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY ?? \"\";\n\n return {\n name: \"anthropic\",\n supportedModels: Object.keys(ANTHROPIC_MODELS),\n\n languageModel(modelId: string) {\n return createAnthropicAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n thinking: config.thinkingBudget\n ? { type: \"enabled\", budgetTokens: config.thinkingBudget }\n : undefined,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model =\n ANTHROPIC_MODELS[modelId] ??\n ANTHROPIC_MODELS[\"claude-3-5-sonnet-latest\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: model.thinking,\n supportsStreaming: true,\n supportsPDF: true, // Claude supports PDFs\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n ],\n supportsJsonMode: false, // Anthropic doesn't have JSON mode\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createAnthropicProvider = createAnthropic;\n","/**\n * Ollama Provider\n *\n * Wraps the existing OllamaAdapter with provider interface.\n * Ollama runs models locally on your machine.\n */\n\nimport { createOllamaAdapter } from \"../../adapters/ollama\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n OllamaProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n}\n\n// Common Ollama models - users can run any model\nconst OLLAMA_MODELS: Record<string, ModelCapabilities> = {\n // Llama series\n llama3: {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"llama3:70b\": {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"llama3.2\": {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"llama3.2-vision\": {\n vision: true,\n tools: true,\n maxTokens: 8192,\n },\n\n // Mistral series\n mistral: {\n vision: false,\n tools: true,\n maxTokens: 8192,\n },\n \"mistral-nemo\": {\n vision: false,\n tools: true,\n maxTokens: 128000,\n },\n mixtral: {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n\n // CodeLlama\n codellama: {\n vision: false,\n tools: false,\n maxTokens: 16384,\n },\n\n // Phi series\n phi3: {\n vision: false,\n tools: true,\n maxTokens: 4096,\n },\n \"phi3:medium\": {\n vision: false,\n tools: true,\n maxTokens: 4096,\n },\n\n // Gemma series\n gemma2: {\n vision: false,\n tools: false,\n maxTokens: 8192,\n },\n \"gemma2:27b\": {\n vision: false,\n tools: false,\n maxTokens: 8192,\n },\n\n // Qwen series\n qwen2: {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n \"qwen2.5-coder\": {\n vision: false,\n tools: true,\n maxTokens: 32768,\n },\n\n // LLaVA (vision)\n llava: {\n vision: true,\n tools: false,\n maxTokens: 4096,\n },\n\n // DeepSeek\n deepseek: {\n vision: false,\n tools: true,\n maxTokens: 16384,\n },\n \"deepseek-coder\": {\n vision: false,\n tools: false,\n maxTokens: 16384,\n },\n};\n\n// Default capabilities for unknown models\nconst DEFAULT_MODEL_CAPS: ModelCapabilities = {\n vision: false,\n tools: false,\n maxTokens: 4096,\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Ollama provider\n *\n * @example\n * ```typescript\n * const ollama = createOllama({ baseUrl: 'http://localhost:11434' });\n * const adapter = ollama.languageModel('llama3');\n * ```\n */\nexport function createOllama(config: OllamaProviderConfig = {}): AIProvider {\n const baseUrl = config.baseUrl ?? \"http://localhost:11434\";\n\n return {\n name: \"ollama\",\n supportedModels: Object.keys(OLLAMA_MODELS),\n\n languageModel(modelId: string) {\n return createOllamaAdapter({\n model: modelId,\n baseUrl,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n // Try exact match first, then try base model name\n const baseModelName = modelId.split(\":\")[0];\n const model =\n OLLAMA_MODELS[modelId] ??\n OLLAMA_MODELS[baseModelName] ??\n DEFAULT_MODEL_CAPS;\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\"]\n : [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createOllamaProvider = createOllama;\n","/**\n * Google Provider\n *\n * Modern pattern: google('gemini-2.0-flash') returns a LanguageModel\n * Legacy pattern: createGoogle({ apiKey }) returns an AIProvider\n *\n * Features:\n * - Vision (images)\n * - Audio input\n * - Video input\n * - PDF documents\n * - Tools/Function calling\n * - Massive context windows (up to 2M tokens)\n */\n\n// NEW: Modern pattern - google() function\nexport { google, createGoogle as createGoogleModel } from \"./provider\";\nexport type { GoogleProviderOptions } from \"./provider\";\n\n// LEGACY: Keep existing createGoogle for backward compatibility\nimport { createGoogleAdapter } from \"../../adapters/google\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n GoogleProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n audio: boolean;\n video: boolean;\n pdf: boolean;\n maxTokens: number;\n outputTokens: number;\n}\n\nconst GOOGLE_MODELS: Record<string, ModelCapabilities> = {\n // Gemini 2.0 series (latest)\n \"gemini-2.0-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n \"gemini-2.0-flash-lite\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n\n // Gemini 2.5 series (experimental)\n \"gemini-2.5-pro-preview-05-06\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 65536,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 65536,\n },\n\n // Gemini 1.5 series\n \"gemini-1.5-pro\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 2000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-pro-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 2000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-flash-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n \"gemini-1.5-flash-8b\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n pdf: true,\n maxTokens: 1000000,\n outputTokens: 8192,\n },\n\n // Gemini 1.0 series (legacy)\n \"gemini-1.0-pro\": {\n vision: false,\n tools: true,\n audio: false,\n video: false,\n pdf: false,\n maxTokens: 30720,\n outputTokens: 2048,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create a Google provider\n *\n * @example\n * ```typescript\n * const google = createGoogle({\n * apiKey: '...',\n * });\n * const adapter = google.languageModel('gemini-2.0-flash');\n * const caps = google.getCapabilities('gemini-2.0-flash');\n *\n * if (caps.supportsVideo) {\n * // Show video upload button\n * }\n * ```\n */\nexport function createGoogle(config: GoogleProviderConfig = {}): AIProvider {\n const apiKey = config.apiKey ?? process.env.GOOGLE_API_KEY ?? \"\";\n\n return {\n name: \"google\",\n supportedModels: Object.keys(GOOGLE_MODELS),\n\n languageModel(modelId: string) {\n return createGoogleAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n safetySettings: config.safetySettings,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model = GOOGLE_MODELS[modelId] ?? GOOGLE_MODELS[\"gemini-2.0-flash\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false, // Gemini doesn't have extended thinking like Claude\n supportsStreaming: true,\n supportsPDF: model.pdf,\n supportsAudio: model.audio,\n supportsVideo: model.video,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\n \"image/png\",\n \"image/jpeg\",\n \"image/gif\",\n \"image/webp\",\n \"image/heic\",\n \"image/heif\",\n ]\n : [],\n supportedAudioTypes: model.audio\n ? [\n \"audio/mp3\",\n \"audio/wav\",\n \"audio/aiff\",\n \"audio/aac\",\n \"audio/ogg\",\n \"audio/flac\",\n ]\n : [],\n supportedVideoTypes: model.video\n ? [\n \"video/mp4\",\n \"video/mpeg\",\n \"video/mov\",\n \"video/avi\",\n \"video/webm\",\n \"video/mkv\",\n ]\n : [],\n supportsJsonMode: true, // Gemini supports JSON mode\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createGoogleProvider = createGoogle;\n","/**\n * xAI Provider\n *\n * xAI's Grok models are cutting-edge AI models with vision and tool support.\n *\n * Features:\n * - Vision (images)\n * - Tools/Function calling\n * - Real-time information (trained on X/Twitter data)\n * - Ultra-fast inference\n */\n\n// NEW: Modern pattern - xai() function\nexport { xai, createXAI as createXAIModel } from \"./provider\";\nexport type { XAIProviderOptions } from \"./provider\";\n\n// LEGACY: Keep existing createXAI for backward compatibility\nimport { createXAIAdapter } from \"../../adapters/xai\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n XAIProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface ModelCapabilities {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n outputTokens: number;\n}\n\nconst XAI_MODELS: Record<string, ModelCapabilities> = {\n // Grok 4.1 Fast (Latest - December 2025)\n \"grok-4-1-fast-reasoning\": {\n vision: false,\n tools: true,\n maxTokens: 2000000,\n outputTokens: 16384,\n },\n \"grok-4-1-fast-non-reasoning\": {\n vision: false,\n tools: true,\n maxTokens: 2000000,\n outputTokens: 16384,\n },\n\n // Grok 4 Fast (September 2025)\n \"grok-4-fast-reasoning\": {\n vision: false,\n tools: true,\n maxTokens: 2000000,\n outputTokens: 16384,\n },\n \"grok-4-fast-non-reasoning\": {\n vision: false,\n tools: true,\n maxTokens: 2000000,\n outputTokens: 16384,\n },\n\n // Grok 4 (July 2025)\n \"grok-4\": {\n vision: true,\n tools: true,\n maxTokens: 256000,\n outputTokens: 16384,\n },\n \"grok-4-0709\": {\n vision: true,\n tools: true,\n maxTokens: 256000,\n outputTokens: 16384,\n },\n\n // Grok 3 (February 2025) - Stable\n \"grok-3-beta\": {\n vision: true,\n tools: true,\n maxTokens: 131072,\n outputTokens: 8192,\n },\n \"grok-3-fast-beta\": {\n vision: false,\n tools: true,\n maxTokens: 131072,\n outputTokens: 8192,\n },\n \"grok-3-mini-beta\": {\n vision: false,\n tools: true,\n maxTokens: 32768,\n outputTokens: 8192,\n },\n \"grok-3-mini-fast-beta\": {\n vision: false,\n tools: true,\n maxTokens: 32768,\n outputTokens: 8192,\n },\n\n // Grok Code Fast (August 2025)\n \"grok-code-fast-1\": {\n vision: false,\n tools: true,\n maxTokens: 256000,\n outputTokens: 16384,\n },\n\n // Grok 2 (Legacy - for backward compatibility)\n \"grok-2\": {\n vision: true,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n \"grok-2-latest\": {\n vision: true,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n \"grok-2-mini\": {\n vision: false,\n tools: true,\n maxTokens: 131072,\n outputTokens: 4096,\n },\n};\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an xAI provider\n *\n * @example\n * ```typescript\n * const xai = createXAI({\n * apiKey: '...',\n * });\n * const adapter = xai.languageModel('grok-2');\n * const caps = xai.getCapabilities('grok-2');\n * ```\n */\nexport function createXAI(config: XAIProviderConfig = {}): AIProvider {\n const apiKey = config.apiKey ?? process.env.XAI_API_KEY ?? \"\";\n\n return {\n name: \"xai\",\n supportedModels: Object.keys(XAI_MODELS),\n\n languageModel(modelId: string) {\n return createXAIAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n });\n },\n\n getCapabilities(modelId: string): ProviderCapabilities {\n const model = XAI_MODELS[modelId] ?? XAI_MODELS[\"grok-3-fast-beta\"];\n\n return {\n supportsVision: model.vision,\n supportsTools: model.tools,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: model.maxTokens,\n supportedImageTypes: model.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n supportsJsonMode: false, // xAI doesn't support JSON mode yet\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createXAIProvider = createXAI;\n","/**\n * Azure OpenAI Provider\n *\n * Wraps the AzureAdapter with provider interface.\n * Azure OpenAI provides enterprise-grade OpenAI models with Azure security.\n *\n * Features:\n * - Vision (for supported deployments)\n * - Tools/Function calling\n * - Enterprise security & compliance\n * - Private networking options\n *\n * Note: Capabilities depend on which model is deployed, not a model ID.\n * The provider attempts to detect capabilities from the deployment name.\n */\n\nimport { createAzureAdapter } from \"../../adapters/azure\";\nimport type {\n AIProvider,\n ProviderCapabilities,\n AzureProviderConfig,\n} from \"../types\";\n\n// ============================================\n// Model Capability Patterns\n// ============================================\n\n/**\n * Detect model capabilities from deployment name\n * Azure deployments are user-named, so we look for common patterns\n */\nfunction detectCapabilitiesFromDeployment(deploymentName: string): {\n vision: boolean;\n tools: boolean;\n maxTokens: number;\n} {\n const name = deploymentName.toLowerCase();\n\n // GPT-4o variants (vision, tools, 128k context)\n if (name.includes(\"gpt-4o\") || name.includes(\"gpt4o\")) {\n return { vision: true, tools: true, maxTokens: 128000 };\n }\n\n // GPT-4 Turbo with vision\n if (\n (name.includes(\"gpt-4\") || name.includes(\"gpt4\")) &&\n (name.includes(\"turbo\") || name.includes(\"vision\"))\n ) {\n return { vision: true, tools: true, maxTokens: 128000 };\n }\n\n // GPT-4 base\n if (name.includes(\"gpt-4\") || name.includes(\"gpt4\")) {\n return { vision: false, tools: true, maxTokens: 8192 };\n }\n\n // GPT-3.5 Turbo\n if (\n name.includes(\"gpt-35\") ||\n name.includes(\"gpt-3.5\") ||\n name.includes(\"gpt35\")\n ) {\n return { vision: false, tools: true, maxTokens: 16385 };\n }\n\n // o1 reasoning models\n if (name.includes(\"o1\")) {\n return { vision: true, tools: false, maxTokens: 128000 };\n }\n\n // Default fallback\n return { vision: false, tools: true, maxTokens: 8192 };\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create an Azure OpenAI provider\n *\n * @example\n * ```typescript\n * const azure = createAzure({\n * apiKey: '...',\n * resourceName: 'my-azure-resource',\n * deploymentName: 'gpt-4o-deployment',\n * });\n * const adapter = azure.languageModel('gpt-4o-deployment');\n * const caps = azure.getCapabilities('gpt-4o-deployment');\n * ```\n */\nexport function createAzure(config: AzureProviderConfig): AIProvider {\n const apiKey = config.apiKey ?? process.env.AZURE_OPENAI_API_KEY ?? \"\";\n const resourceName =\n config.resourceName ?? process.env.AZURE_OPENAI_RESOURCE ?? \"\";\n const defaultDeployment =\n config.deploymentName ?? process.env.AZURE_OPENAI_DEPLOYMENT ?? \"\";\n\n // For Azure, the \"supported models\" are actually deployment names\n // We include the default deployment as the main \"model\"\n const supportedModels = defaultDeployment ? [defaultDeployment] : [];\n\n return {\n name: \"azure\",\n supportedModels,\n\n languageModel(deploymentName: string) {\n return createAzureAdapter({\n apiKey,\n resourceName,\n deploymentName: deploymentName || defaultDeployment,\n apiVersion: config.apiVersion,\n baseUrl: config.baseUrl,\n });\n },\n\n getCapabilities(deploymentName: string): ProviderCapabilities {\n const detected = detectCapabilitiesFromDeployment(\n deploymentName || defaultDeployment,\n );\n\n return {\n supportsVision: detected.vision,\n supportsTools: detected.tools,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: detected.maxTokens,\n supportedImageTypes: detected.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n supportsJsonMode: true,\n supportsSystemMessages: true,\n };\n },\n };\n}\n\n// Alias for consistency\nexport const createAzureProvider = createAzure;\n","/**\n * OpenAI Provider Formatter\n *\n * Transformation functions for OpenAI API format\n * Also used by xAI/Grok (they use OpenAI-compatible format)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type {\n ProviderFormatter,\n OpenAITool,\n OpenAIToolCall,\n OpenAIToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to OpenAI format\n */\nexport function transformTools(tools: ToolDefinition[]): OpenAITool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from OpenAI response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n const toolCalls = (message?.tool_calls as OpenAIToolCall[]) || [];\n\n return toolCalls.map((tc) => {\n let input: Record<string, unknown> = {};\n try {\n input = JSON.parse(tc.function.arguments);\n } catch (e) {\n console.error(\n \"Failed to parse tool arguments:\",\n tc.function.arguments,\n e,\n );\n }\n return {\n id: tc.id,\n name: tc.function.name,\n input,\n };\n });\n}\n\n/**\n * Extract text content from OpenAI response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n const message = choices?.[0]?.message as Record<string, unknown> | undefined;\n return (message?.content as string) || \"\";\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for OpenAI\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): OpenAIToolResult[] {\n return results.map((r) => ({\n role: \"tool\" as const,\n tool_call_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"tool_calls\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return choices?.[0]?.finish_reason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const choices = resp?.choices as Array<Record<string, unknown>> | undefined;\n return (choices?.[0]?.finish_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for OpenAI format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n return {\n role: \"assistant\",\n content: textContent || null,\n tool_calls: toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.input),\n },\n })),\n };\n}\n\n/**\n * Build tool result messages for OpenAI\n * In OpenAI format, each tool result is a separate message\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n // OpenAI expects each tool result as a separate message\n // Return an array to be spread into the conversation\n return formatToolResults(results);\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * OpenAI provider formatter\n */\nexport const openaiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Anthropic/Claude Provider Formatter\n *\n * Transformation functions for Anthropic API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type {\n ProviderFormatter,\n AnthropicTool,\n AnthropicToolUse,\n AnthropicToolResult,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Anthropic format\n */\nexport function transformTools(tools: ToolDefinition[]): AnthropicTool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Anthropic response content\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return [];\n }\n\n return content\n .filter((block): block is AnthropicToolUse => block?.type === \"tool_use\")\n .map((block) => ({\n id: block.id,\n name: block.name,\n input: block.input || {},\n }));\n}\n\n/**\n * Extract text content from Anthropic response\n */\nexport function extractTextContent(response: unknown): string {\n // Handle both raw response and content array\n const content = Array.isArray(response)\n ? response\n : (response as Record<string, unknown>)?.content;\n\n if (!Array.isArray(content)) {\n return \"\";\n }\n\n return content\n .filter((block) => block?.type === \"text\")\n .map((block) => (block as { text?: string }).text || \"\")\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Anthropic\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): AnthropicToolResult[] {\n return results.map((r) => ({\n type: \"tool_result\" as const,\n tool_use_id: r.toolCallId,\n content: r.content,\n }));\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n return resp?.stop_reason === \"tool_use\";\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const stopReason = resp?.stop_reason;\n return stopReason === \"end_turn\" || stopReason === \"stop\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n return (resp?.stop_reason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Anthropic format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const content: unknown[] = [];\n\n if (textContent) {\n content.push({ type: \"text\", text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.name,\n input: tc.input,\n });\n });\n\n return { role: \"assistant\", content };\n}\n\n/**\n * Build user message with tool results for Anthropic\n * In Anthropic format, tool results are sent as a user message with tool_result blocks\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n return {\n role: \"user\",\n content: formatToolResults(results),\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Anthropic provider formatter\n */\nexport const anthropicFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Google Gemini Provider Formatter\n *\n * Transformation functions for Google Gemini API format\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"@yourgpt/copilot-sdk/core\";\nimport type {\n ProviderFormatter,\n GeminiFunctionDeclaration,\n GeminiFunctionCall,\n GeminiFunctionResponse,\n} from \"./types\";\n\n// ========================================\n// Tool Definition Transformation\n// ========================================\n\n/**\n * Transform unified tool definitions to Gemini format\n */\nexport function transformTools(\n tools: ToolDefinition[],\n): Array<{ functionDeclarations: GeminiFunctionDeclaration[] }> {\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n })),\n },\n ];\n}\n\n// ========================================\n// Response Parsing\n// ========================================\n\n/**\n * Parse tool calls from Gemini response\n */\nexport function parseToolCalls(response: unknown): UnifiedToolCall[] {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return [];\n\n const functionCalls: UnifiedToolCall[] = [];\n\n for (const part of parts) {\n const functionCall = part.functionCall as GeminiFunctionCall | undefined;\n if (functionCall) {\n functionCalls.push({\n id: `gemini_${Date.now()}_${functionCalls.length}`, // Gemini doesn't provide IDs\n name: functionCall.name,\n input: functionCall.args || {},\n });\n }\n }\n\n return functionCalls;\n}\n\n/**\n * Extract text content from Gemini response\n */\nexport function extractTextContent(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return \"\";\n\n return parts\n .filter((part) => typeof part.text === \"string\")\n .map((part) => part.text as string)\n .join(\"\\n\");\n}\n\n// ========================================\n// Tool Result Formatting\n// ========================================\n\n/**\n * Format tool results for Gemini\n */\nexport function formatToolResults(\n results: UnifiedToolResult[],\n): GeminiFunctionResponse[] {\n return results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n return {\n name: r.toolCallId.split(\"_\").slice(2).join(\"_\") || \"unknown\", // Extract name from ID\n response,\n };\n });\n}\n\n// ========================================\n// Stop Reason Detection\n// ========================================\n\n/**\n * Check if response indicates the AI wants to use tools\n */\nexport function isToolUseStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const content = candidates?.[0]?.content as\n | Record<string, unknown>\n | undefined;\n const parts = content?.parts as Array<Record<string, unknown>> | undefined;\n\n if (!parts) return false;\n\n return parts.some((part) => part.functionCall !== undefined);\n}\n\n/**\n * Check if response indicates conversation should end\n */\nexport function isEndTurnStop(response: unknown): boolean {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n const finishReason = candidates?.[0]?.finishReason as string | undefined;\n\n return finishReason === \"STOP\" || finishReason === \"END_TURN\";\n}\n\n/**\n * Get the stop reason string from response\n */\nexport function getStopReason(response: unknown): string {\n const resp = response as Record<string, unknown>;\n const candidates = resp?.candidates as\n | Array<Record<string, unknown>>\n | undefined;\n return (candidates?.[0]?.finishReason as string) || \"unknown\";\n}\n\n// ========================================\n// Message Building\n// ========================================\n\n/**\n * Build assistant message with tool calls for Gemini format\n */\nexport function buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n): unknown {\n const parts: unknown[] = [];\n\n if (textContent) {\n parts.push({ text: textContent });\n }\n\n toolCalls.forEach((tc) => {\n parts.push({\n functionCall: {\n name: tc.name,\n args: tc.input,\n },\n });\n });\n\n return {\n role: \"model\",\n parts,\n };\n}\n\n/**\n * Build user message with tool results for Gemini\n */\nexport function buildToolResultMessage(results: UnifiedToolResult[]): unknown {\n const parts = results.map((r) => {\n let response: Record<string, unknown>;\n try {\n response = JSON.parse(r.content);\n } catch {\n response = { result: r.content };\n }\n\n // Extract tool name from the result - we need to track this separately\n // For now, use a placeholder since Gemini doesn't use IDs\n return {\n functionResponse: {\n name: \"tool\", // This should be the actual tool name\n response,\n },\n };\n });\n\n return {\n role: \"user\",\n parts,\n };\n}\n\n// ========================================\n// Formatter Object\n// ========================================\n\n/**\n * Gemini provider formatter\n */\nexport const geminiFormatter: ProviderFormatter = {\n transformTools,\n parseToolCalls,\n formatToolResults,\n isToolUseStop,\n isEndTurnStop,\n getStopReason,\n extractTextContent,\n buildAssistantToolMessage,\n buildToolResultMessage,\n};\n","/**\n * Provider Formatter Registry\n *\n * Maps provider names to their formatters for the agent loop.\n * Formatters handle tool transformations between unified format and provider-specific formats.\n */\n\nimport type { ProviderFormatter } from \"./types\";\nimport { openaiFormatter } from \"./openai\";\nimport { anthropicFormatter } from \"./anthropic\";\nimport { geminiFormatter } from \"./gemini\";\n\n// ============================================\n// Formatter Registry\n// ============================================\n\n/**\n * Map of provider names to their formatters\n */\nconst formatters: Record<string, ProviderFormatter> = {\n openai: openaiFormatter,\n anthropic: anthropicFormatter,\n google: geminiFormatter,\n gemini: geminiFormatter, // Alias\n // OpenAI-compatible providers use openaiFormatter\n ollama: openaiFormatter,\n xai: openaiFormatter,\n azure: openaiFormatter,\n};\n\n/**\n * Get a formatter for a specific provider\n *\n * @param provider - Provider name (e.g., 'openai', 'anthropic', 'google')\n * @returns The provider's formatter\n * @throws Error if provider is not supported\n *\n * @example\n * ```typescript\n * const formatter = getFormatter('openai');\n * const tools = formatter.transformTools(unifiedTools);\n * ```\n */\nexport function getFormatter(provider: string): ProviderFormatter {\n const formatter = formatters[provider.toLowerCase()];\n if (!formatter) {\n throw new Error(\n `Unsupported provider: ${provider}. Supported providers: ${Object.keys(formatters).join(\", \")}`,\n );\n }\n return formatter;\n}\n\n/**\n * Check if a provider is supported\n *\n * @param provider - Provider name to check\n * @returns True if provider has a formatter\n *\n * @example\n * ```typescript\n * if (isProviderSupported('openai')) {\n * // Use the provider\n * }\n * ```\n */\nexport function isProviderSupported(provider: string): boolean {\n return provider.toLowerCase() in formatters;\n}\n\n/**\n * Get list of supported providers\n *\n * @returns Array of supported provider names\n *\n * @example\n * ```typescript\n * const providers = getSupportedProviders();\n * // ['openai', 'anthropic', 'google', ...]\n * ```\n */\nexport function getSupportedProviders(): string[] {\n return Object.keys(formatters);\n}\n\n/**\n * Register a custom formatter for a provider\n *\n * @param provider - Provider name\n * @param formatter - Formatter implementation\n *\n * @example\n * ```typescript\n * registerFormatter('custom-provider', myCustomFormatter);\n * ```\n */\nexport function registerFormatter(\n provider: string,\n formatter: ProviderFormatter,\n): void {\n formatters[provider.toLowerCase()] = formatter;\n}\n","/**\n * Providers\n *\n * Multi-provider architecture for Copilot SDK.\n * Each provider wraps existing adapters with capabilities metadata.\n *\n * @example\n * ```typescript\n * import { createOpenAI, createAnthropic } from '@yourgpt/llm-sdk';\n *\n * // Create a provider\n * const openai = createOpenAI({ apiKey: '...' });\n *\n * // Get a model adapter (returns existing LLMAdapter)\n * const adapter = openai.languageModel('gpt-4o');\n *\n * // Check capabilities (for UI feature flags)\n * const caps = openai.getCapabilities('gpt-4o');\n * if (caps.supportsVision) {\n * // Enable image upload\n * }\n * ```\n */\n\n// ============================================\n// Types\n// ============================================\n\nexport type {\n // Core types\n AIProvider,\n ProviderCapabilities,\n EmbeddingModel,\n ModelInfo,\n // Base config\n BaseProviderConfig,\n // Provider-specific configs\n OpenAIProviderConfig,\n AnthropicProviderConfig,\n GoogleProviderConfig,\n XAIProviderConfig,\n AzureProviderConfig,\n OllamaProviderConfig,\n // Google-specific\n GoogleSafetySetting,\n GoogleGroundingConfig,\n} from \"./types\";\n\nexport { DEFAULT_CAPABILITIES } from \"./types\";\n\n// ============================================\n// Registry\n// ============================================\n\nexport {\n registerProvider,\n getProvider,\n hasProvider,\n listProviders,\n unregisterProvider,\n clearProviders,\n getAvailableProviders,\n getModelCapabilities,\n} from \"./registry\";\n\n// ============================================\n// Provider Factories (from subdirectories)\n// ============================================\n\n// OpenAI\nexport { createOpenAI, createOpenAIProvider } from \"./openai/index\";\n\n// Anthropic\nexport { createAnthropic, createAnthropicProvider } from \"./anthropic/index\";\n\n// Ollama\nexport { createOllama, createOllamaProvider } from \"./ollama/index\";\n\n// Google\nexport { createGoogle, createGoogleProvider } from \"./google/index\";\n\n// xAI\nexport { createXAI, createXAIProvider } from \"./xai/index\";\n\n// Azure\nexport { createAzure, createAzureProvider } from \"./azure/index\";\n\n// ============================================\n// Provider Formatters (for agentic loop)\n// ============================================\n\nexport { openaiFormatter } from \"./openai\";\nexport { anthropicFormatter } from \"./anthropic\";\nexport { geminiFormatter } from \"./gemini\";\n\n// Formatter registry helpers\nexport {\n getFormatter,\n isProviderSupported,\n getSupportedProviders,\n} from \"./formatter-registry\";\n\n// Formatter types (from types.ts)\nexport type {\n ProviderFormatter,\n // OpenAI tool types\n OpenAITool,\n OpenAIToolCall,\n OpenAIToolResult,\n // Anthropic tool types\n AnthropicTool,\n AnthropicToolUse,\n AnthropicToolResult,\n // Gemini tool types\n GeminiFunctionDeclaration,\n GeminiFunctionCall,\n GeminiFunctionResponse,\n} from \"./types\";\n\n// ============================================\n// Auto-register built-in providers\n// ============================================\n\nimport { registerProvider } from \"./registry\";\nimport { createOpenAI } from \"./openai/index\";\nimport { createAnthropic } from \"./anthropic/index\";\nimport { createOllama } from \"./ollama/index\";\nimport { createGoogle } from \"./google/index\";\nimport { createXAI } from \"./xai/index\";\nimport { createAzure } from \"./azure/index\";\n\n// Register with default configs (API keys from env)\nregisterProvider(\"openai\", (config) => createOpenAI(config as any));\nregisterProvider(\"anthropic\", (config) => createAnthropic(config as any));\nregisterProvider(\"ollama\", (config) => createOllama(config as any));\nregisterProvider(\"google\", (config) => createGoogle(config as any));\nregisterProvider(\"xai\", (config) => createXAI(config as any));\nregisterProvider(\"azure\", (config) => createAzure(config as any));\n","/**\n * Agent Loop Implementation\n *\n * Server-side agentic loop that:\n * 1. Calls LLM with tools\n * 2. Parses tool calls from response\n * 3. Executes server-side tools or requests client execution\n * 4. Loops until LLM returns end_turn or max iterations reached\n *\n * Streams events to client via SSE for real-time updates\n */\n\nimport type {\n StreamEvent,\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n ToolResponse,\n AIProvider,\n AgentLoopConfig,\n Message,\n} from \"@yourgpt/copilot-sdk/core\";\nimport {\n generateToolCallId,\n generateMessageId,\n} from \"@yourgpt/copilot-sdk/core\";\nimport { getFormatter } from \"../providers\";\n\n// ========================================\n// Constants\n// ========================================\n\n/** Default maximum iterations */\nconst DEFAULT_MAX_ITERATIONS = 20;\n\n// ========================================\n// Types\n// ========================================\n\n/**\n * Agent loop options\n */\nexport interface AgentLoopOptions {\n /** Initial messages */\n messages: Message[];\n /** Available tools */\n tools: ToolDefinition[];\n /** System prompt */\n systemPrompt?: string;\n /** AI provider */\n provider: AIProvider;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Loop configuration */\n config?: AgentLoopConfig;\n /**\n * LLM call function\n * Should call the LLM and return the raw response\n */\n callLLM: (messages: unknown[], tools: unknown[]) => Promise<unknown>;\n /**\n * Server-side tool executor\n * Called when a server-side tool needs to be executed\n */\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n /**\n * Callback to wait for client tool result\n * Called when a client-side tool needs to be executed\n * Should return a Promise that resolves when client sends result\n */\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>;\n}\n\n/**\n * Internal conversation message format\n */\ninterface ConversationMessage {\n role: string;\n content: unknown;\n [key: string]: unknown;\n}\n\n// ========================================\n// Main Agent Loop\n// ========================================\n\n/**\n * Run the agentic loop\n *\n * @yields Stream events for each step of the loop\n */\nexport async function* runAgentLoop(\n options: AgentLoopOptions,\n): AsyncGenerator<StreamEvent> {\n const {\n messages,\n tools,\n systemPrompt,\n provider,\n signal,\n config,\n callLLM,\n executeServerTool,\n waitForClientToolResult,\n } = options;\n\n const maxIterations = config?.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n const debug = config?.debug ?? false;\n const formatter = getFormatter(provider);\n\n // Separate server and client tools\n const serverTools = tools.filter((t) => t.location === \"server\");\n const clientTools = tools.filter((t) => t.location === \"client\");\n const allTools = [...serverTools, ...clientTools];\n\n // Transform tools to provider format\n const providerTools = formatter.transformTools(allTools);\n\n // Build conversation\n const conversation: ConversationMessage[] = buildConversation(\n messages,\n systemPrompt,\n );\n\n let iteration = 0;\n\n if (debug) {\n console.log(\"[AgentLoop] Starting with\", {\n messageCount: messages.length,\n toolCount: allTools.length,\n serverToolCount: serverTools.length,\n clientToolCount: clientTools.length,\n maxIterations,\n });\n }\n\n // Main loop\n while (iteration < maxIterations) {\n // Check for abort\n if (signal?.aborted) {\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n aborted: true,\n };\n return;\n }\n\n iteration++;\n\n // Emit iteration progress\n yield {\n type: \"loop:iteration\",\n iteration,\n maxIterations,\n };\n\n if (debug) {\n console.log(`[AgentLoop] Iteration ${iteration}/${maxIterations}`);\n }\n\n try {\n // Call LLM\n const response = await callLLM(conversation, providerTools);\n\n // Parse tool calls and text from response\n const toolCalls = formatter.parseToolCalls(response);\n const textContent = formatter.extractTextContent(response);\n\n // Emit text content as message\n if (textContent) {\n const messageId = generateMessageId();\n yield { type: \"message:start\", id: messageId };\n yield { type: \"message:delta\", content: textContent };\n yield { type: \"message:end\" };\n }\n\n // Check if we should use tools\n if (formatter.isToolUseStop(response) && toolCalls.length > 0) {\n if (debug) {\n console.log(\n \"[AgentLoop] Tool calls:\",\n toolCalls.map((tc) => tc.name),\n );\n }\n\n // Execute tools\n const results = await executeToolCalls(\n toolCalls,\n tools,\n executeServerTool,\n waitForClientToolResult,\n function* (event: StreamEvent) {\n yield event;\n },\n debug,\n );\n\n // Emit tool results\n for (const result of results) {\n const toolCall = toolCalls.find((tc) => tc.id === result.toolCallId);\n if (toolCall) {\n yield {\n type: \"tool:result\",\n id: result.toolCallId,\n name: toolCall.name,\n result: JSON.parse(result.content) as ToolResponse,\n };\n }\n }\n\n // Add assistant message with tool calls to conversation\n const assistantMessage = formatter.buildAssistantToolMessage(\n toolCalls,\n textContent,\n );\n conversation.push(assistantMessage as ConversationMessage);\n\n // Add tool results to conversation\n const toolResultMessage = formatter.buildToolResultMessage(results);\n if (Array.isArray(toolResultMessage)) {\n // OpenAI format returns array of messages\n conversation.push(...(toolResultMessage as ConversationMessage[]));\n } else {\n conversation.push(toolResultMessage as ConversationMessage);\n }\n\n // Continue loop\n continue;\n }\n\n // Check for end turn\n if (formatter.isEndTurnStop(response)) {\n if (debug) {\n console.log(\"[AgentLoop] End turn detected\");\n }\n break;\n }\n\n // Unknown stop reason - break to be safe\n const stopReason = formatter.getStopReason(response);\n if (debug) {\n console.log(\"[AgentLoop] Unknown stop reason:\", stopReason);\n }\n break;\n } catch (error) {\n if (debug) {\n console.error(\"[AgentLoop] Error:\", error);\n }\n\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"AGENT_LOOP_ERROR\",\n };\n\n break;\n }\n }\n\n // Emit completion\n yield {\n type: \"loop:complete\",\n iterations: iteration,\n maxIterationsReached: iteration >= maxIterations,\n };\n\n yield { type: \"done\" };\n}\n\n// ========================================\n// Helper Functions\n// ========================================\n\n/**\n * Build conversation from messages\n */\nfunction buildConversation(\n messages: Message[],\n systemPrompt?: string,\n): ConversationMessage[] {\n const conversation: ConversationMessage[] = [];\n\n // Add system prompt if provided\n if (systemPrompt) {\n conversation.push({\n role: \"system\",\n content: systemPrompt,\n });\n }\n\n // Add messages\n for (const msg of messages) {\n conversation.push({\n role: msg.role,\n content: msg.content,\n });\n }\n\n return conversation;\n}\n\n/**\n * Execute tool calls\n */\nasync function executeToolCalls(\n toolCalls: UnifiedToolCall[],\n tools: ToolDefinition[],\n executeServerTool?: (\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n waitForClientToolResult?: (\n toolCallId: string,\n name: string,\n args: Record<string, unknown>,\n ) => Promise<ToolResponse>,\n emitEvent?: (event: StreamEvent) => void,\n debug?: boolean,\n): Promise<UnifiedToolResult[]> {\n const results: UnifiedToolResult[] = [];\n\n for (const toolCall of toolCalls) {\n const tool = tools.find((t) => t.name === toolCall.name);\n\n if (!tool) {\n // Unknown tool\n if (debug) {\n console.warn(`[AgentLoop] Unknown tool: ${toolCall.name}`);\n }\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n }),\n success: false,\n error: `Unknown tool: ${toolCall.name}`,\n });\n continue;\n }\n\n // Emit action start\n emitEvent?.({\n type: \"action:start\",\n id: toolCall.id,\n name: toolCall.name,\n });\n\n // Emit arguments\n emitEvent?.({\n type: \"action:args\",\n id: toolCall.id,\n args: JSON.stringify(toolCall.input),\n });\n\n try {\n let response: ToolResponse;\n\n if (tool.location === \"server\") {\n // Server-side tool\n if (tool.handler) {\n response = await tool.handler(toolCall.input);\n } else if (executeServerTool) {\n response = await executeServerTool(toolCall.name, toolCall.input);\n } else {\n response = {\n success: false,\n error: `No handler for server tool: ${toolCall.name}`,\n };\n }\n } else {\n // Client-side tool\n if (waitForClientToolResult) {\n // Wait for client result (client handles execution)\n response = await waitForClientToolResult(\n toolCall.id,\n toolCall.name,\n toolCall.input,\n );\n } else {\n response = {\n success: false,\n error: `No client tool handler for: ${toolCall.name}`,\n };\n }\n }\n\n // Emit action end\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n result: response,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify(response),\n success: response.success,\n error: response.error,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Tool execution failed\";\n\n // Emit action end with error\n emitEvent?.({\n type: \"action:end\",\n id: toolCall.id,\n name: toolCall.name,\n error: errorMessage,\n });\n\n results.push({\n toolCallId: toolCall.id,\n content: JSON.stringify({\n success: false,\n error: errorMessage,\n }),\n success: false,\n error: errorMessage,\n });\n }\n }\n\n return results;\n}\n\n// ========================================\n// Exports\n// ========================================\n\nexport { DEFAULT_MAX_ITERATIONS };\n"]}
|