@yourgpt/llm-sdk 0.1.0
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 +74 -0
- package/dist/adapters/index.d.mts +497 -0
- package/dist/adapters/index.d.ts +497 -0
- package/dist/adapters/index.js +1642 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +1616 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/index.d.mts +1048 -0
- package/dist/index.d.ts +1048 -0
- package/dist/index.js +4216 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4170 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +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"]}
|