@yourgpt/llm-sdk 2.0.1 → 2.0.2-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/index.d.mts +27 -4
- package/dist/adapters/index.d.ts +27 -4
- package/dist/adapters/index.js +395 -25
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +395 -25
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/index.d.mts +24 -5
- package/dist/index.d.ts +24 -5
- package/dist/index.js +20 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +20 -4
- package/dist/index.mjs.map +1 -1
- package/dist/providers/anthropic/index.d.mts +1 -2
- package/dist/providers/anthropic/index.d.ts +1 -2
- package/dist/providers/anthropic/index.js +108 -12
- package/dist/providers/anthropic/index.js.map +1 -1
- package/dist/providers/anthropic/index.mjs +108 -12
- package/dist/providers/anthropic/index.mjs.map +1 -1
- package/dist/providers/azure/index.d.mts +1 -2
- package/dist/providers/azure/index.d.ts +1 -2
- package/dist/providers/azure/index.js.map +1 -1
- package/dist/providers/azure/index.mjs.map +1 -1
- package/dist/providers/google/index.d.mts +1 -2
- package/dist/providers/google/index.d.ts +1 -2
- package/dist/providers/google/index.js +61 -2
- package/dist/providers/google/index.js.map +1 -1
- package/dist/providers/google/index.mjs +61 -2
- package/dist/providers/google/index.mjs.map +1 -1
- package/dist/providers/ollama/index.d.mts +8 -3
- package/dist/providers/ollama/index.d.ts +8 -3
- package/dist/providers/ollama/index.js +227 -17
- package/dist/providers/ollama/index.js.map +1 -1
- package/dist/providers/ollama/index.mjs +227 -17
- package/dist/providers/ollama/index.mjs.map +1 -1
- package/dist/providers/openai/index.d.mts +1 -2
- package/dist/providers/openai/index.d.ts +1 -2
- package/dist/providers/openai/index.js +57 -3
- package/dist/providers/openai/index.js.map +1 -1
- package/dist/providers/openai/index.mjs +57 -3
- package/dist/providers/openai/index.mjs.map +1 -1
- package/dist/providers/openrouter/index.d.mts +56 -3
- package/dist/providers/openrouter/index.d.ts +56 -3
- package/dist/providers/openrouter/index.js +90 -276
- package/dist/providers/openrouter/index.js.map +1 -1
- package/dist/providers/openrouter/index.mjs +89 -277
- package/dist/providers/openrouter/index.mjs.map +1 -1
- package/dist/providers/xai/index.d.mts +1 -2
- package/dist/providers/xai/index.d.ts +1 -2
- package/dist/providers/xai/index.js.map +1 -1
- package/dist/providers/xai/index.mjs.map +1 -1
- package/dist/{base-DdxolpKP.d.mts → types-C_f95PKp.d.mts} +434 -3
- package/dist/{base-DdxolpKP.d.ts → types-C_f95PKp.d.ts} +434 -3
- package/package.json +1 -1
- package/dist/types-Ck25ZYma.d.mts +0 -323
- package/dist/types-Dsz8SpdB.d.ts +0 -323
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/google/provider.ts","../../../src/core/utils.ts","../../../src/adapters/google.ts","../../../src/providers/types.ts","../../../src/providers/google/index.ts"],"names":["client","GOOGLE_MODELS"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Google Provider - OpenAI-Compatible\n *\n * Uses OpenAI SDK with Google's OpenAI-compatible endpoint.\n * BaseURL: https://generativelanguage.googleapis.com/v1beta/openai/\n *\n * @example\n * ```ts\n * import { google } from '@yourgpt/llm-sdk/google';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: google('gemini-2.0-flash'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface GoogleModelConfig {\n vision: boolean;\n tools: boolean;\n audio: boolean;\n video: boolean;\n maxTokens: number;\n}\n\nconst GOOGLE_MODELS: Record<string, GoogleModelConfig> = {\n // Gemini 2.5 (Experimental)\n \"gemini-2.5-pro-preview-05-06\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n\n // Gemini 2.0\n \"gemini-2.0-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-exp\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-lite\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-thinking-exp\": {\n vision: true,\n tools: false,\n audio: false,\n video: false,\n maxTokens: 32767,\n },\n\n // Gemini 1.5\n \"gemini-1.5-pro\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 2097152,\n },\n \"gemini-1.5-pro-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 2097152,\n },\n \"gemini-1.5-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-1.5-flash-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-1.5-flash-8b\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n maxTokens: 1048576,\n },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface GoogleProviderOptions {\n /** API key (defaults to GOOGLE_API_KEY or GEMINI_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API (defaults to Google's OpenAI-compatible endpoint) */\n baseURL?: string;\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create a Google Gemini language model using OpenAI-compatible API\n *\n * @param modelId - Model ID (e.g., 'gemini-2.0-flash', 'gemini-1.5-pro')\n * @param options - Provider options\n * @returns LanguageModel instance\n *\n * @example\n * ```ts\n * // Basic usage\n * const model = google('gemini-2.0-flash');\n *\n * // With custom options\n * const model = google('gemini-1.5-pro', {\n * apiKey: 'your-api-key',\n * });\n * ```\n */\nexport function google(\n modelId: string,\n options: GoogleProviderOptions = {},\n): LanguageModel {\n const apiKey =\n options.apiKey ?? process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n const baseURL =\n options.baseURL ??\n \"https://generativelanguage.googleapis.com/v1beta/openai/\";\n\n // Lazy-load OpenAI client (Google uses OpenAI-compatible API)\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: OpenAI } = await import(\"openai\");\n client = new OpenAI({\n apiKey,\n baseURL,\n });\n }\n return client;\n }\n\n // Get model config\n const modelConfig =\n GOOGLE_MODELS[modelId] ?? GOOGLE_MODELS[\"gemini-2.0-flash\"];\n\n return {\n provider: \"google\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: true,\n supportsThinking: modelId.includes(\"thinking\"),\n supportsPDF: true,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const messages = formatMessagesForGoogle(params.messages);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice.message;\n\n // Parse tool calls\n const toolCalls: ToolCall[] = (message.tool_calls ?? []).map(\n (tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }),\n );\n\n return {\n text: message.content ?? \"\",\n toolCalls,\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage?.prompt_tokens ?? 0,\n completionTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const messages = formatMessagesForGoogle(params.messages);\n\n const stream = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n stream: true,\n });\n\n // Track current tool call being built\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n let totalPromptTokens = 0;\n let totalCompletionTokens = 0;\n\n for await (const chunk of stream) {\n // Check abort\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n const choice = chunk.choices[0];\n const delta = choice?.delta;\n\n // Text content\n if (delta?.content) {\n yield { type: \"text-delta\", text: delta.content };\n }\n\n // Tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n // New tool call - emit previous if exists\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n }\n currentToolCall = {\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n };\n } else if (currentToolCall && tc.function?.arguments) {\n // Append arguments\n currentToolCall.arguments += tc.function.arguments;\n }\n }\n }\n\n // Finish reason\n if (choice?.finish_reason) {\n // Emit pending tool call\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n currentToolCall = null;\n }\n\n // Usage from final chunk (if available)\n if (chunk.usage) {\n totalPromptTokens = chunk.usage.prompt_tokens;\n totalCompletionTokens = chunk.usage.completion_tokens;\n }\n\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: totalPromptTokens,\n completionTokens: totalCompletionTokens,\n totalTokens: totalPromptTokens + totalCompletionTokens,\n },\n };\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Map finish reason to our FinishReason type\n */\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Format CoreMessage[] for Google's OpenAI-compatible API\n */\nfunction formatMessagesForGoogle(messages: CoreMessage[]): any[] {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"system\":\n return { role: \"system\", content: msg.content };\n\n case \"user\":\n if (typeof msg.content === \"string\") {\n return { role: \"user\", content: msg.content };\n }\n // Handle multimodal content\n return {\n role: \"user\",\n content: msg.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n const url = imageData.startsWith(\"data:\")\n ? imageData\n : `data:${part.mimeType ?? \"image/png\"};base64,${imageData}`;\n return { type: \"image_url\", image_url: { url, detail: \"auto\" } };\n }\n return { type: \"text\", text: \"\" };\n }),\n };\n\n case \"assistant\":\n const assistantMsg: any = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n assistantMsg.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n }));\n }\n return assistantMsg;\n\n case \"tool\":\n return {\n role: \"tool\",\n tool_call_id: msg.toolCallId,\n content: msg.content,\n };\n\n default:\n return msg;\n }\n });\n}\n\n// Also export as createGoogle for backward compatibility\nexport { google as createGoogle };\n","/**\n * Utility functions for llm-sdk\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix = \"id\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Generate a message ID\n */\nexport function generateMessageId(): string {\n return generateId(\"msg\");\n}\n\n/**\n * Generate a conversation/thread ID\n */\nexport function generateThreadId(): string {\n return generateId(\"thread\");\n}\n\n/**\n * Generate a tool call ID\n */\nexport function generateToolCallId(): string {\n return generateId(\"call\");\n}\n","/**\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 { LLMConfig, StreamEvent, Message } from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Google adapter configuration\n */\nexport interface GoogleAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /** Safety settings */\n safetySettings?: Array<{\n category: string;\n threshold: string;\n }>;\n}\n\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 // Get usage from the final response\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n try {\n const response = await result.response;\n if (response.usageMetadata) {\n usage = {\n prompt_tokens: response.usageMetadata.promptTokenCount || 0,\n completion_tokens: response.usageMetadata.candidatesTokenCount || 0,\n total_tokens: response.usageMetadata.totalTokenCount || 0,\n };\n }\n } catch {\n // Ignore usage retrieval errors\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\", usage };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"GOOGLE_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const modelId = request.config?.model || this.model;\n\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: this.config.safetySettings,\n });\n\n // Build contents (same as stream)\n let contents: GeminiContent[] = [];\n let systemInstruction: string | undefined;\n\n for (const msg of request.messages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg);\n if (content) {\n contents.push(content);\n }\n }\n\n if (request.systemPrompt) {\n systemInstruction = request.systemPrompt;\n }\n\n // Ensure conversation starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n contents = [{ role: \"user\", parts: [{ text: \"\" }] }, ...contents];\n }\n\n // Merge consecutive same-role messages\n const mergedContents: GeminiContent[] = [];\n for (const content of contents) {\n const last = mergedContents[mergedContents.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n mergedContents.push({ ...content, parts: [...content.parts] });\n }\n }\n\n const tools = formatToolsForGemini(request.actions);\n\n const chat = model.startChat({\n history: mergedContents.slice(0, -1),\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: tools ? [tools] : undefined,\n generationConfig: {\n temperature: request.config?.temperature ?? this.config.temperature,\n maxOutputTokens: request.config?.maxTokens ?? this.config.maxTokens,\n },\n });\n\n const lastMessage = mergedContents[mergedContents.length - 1];\n const result = await chat.sendMessage(lastMessage.parts);\n const response = result.response;\n\n // Extract content and tool calls\n let textContent = \"\";\n const toolCalls: CompletionResult[\"toolCalls\"] = [];\n\n const candidate = response.candidates?.[0];\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n if (\"text\" in part && part.text) {\n textContent += part.text;\n }\n if (\"functionCall\" in part && part.functionCall) {\n toolCalls.push({\n id: generateToolCallId(),\n name: part.functionCall.name,\n args: part.functionCall.args || {},\n });\n }\n }\n }\n\n return {\n content: textContent,\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create Google Gemini adapter\n */\nexport function createGoogleAdapter(\n config: GoogleAdapterConfig,\n): GoogleAdapter {\n return new GoogleAdapter(config);\n}\n","/**\n * Provider Types\n *\n * Defines interfaces for:\n * 1. Provider Formatters (for tool transformations in agent loop)\n * 2. Multi-provider architecture (AIProvider, capabilities, configs)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type { LLMAdapter } from \"../adapters/base\";\n\n// ============================================\n// Provider Formatter Types (for agent loop)\n// ============================================\n\n/**\n * Provider formatter interface\n *\n * Each provider implements this interface to handle:\n * - Tool definition transformation\n * - Tool call parsing from responses\n * - Tool result formatting\n * - Stop reason detection\n */\nexport interface ProviderFormatter {\n /**\n * Transform unified tool definitions to provider format\n */\n transformTools(tools: ToolDefinition[]): unknown[];\n\n /**\n * Parse tool calls from provider response\n */\n parseToolCalls(response: unknown): UnifiedToolCall[];\n\n /**\n * Format tool results for provider\n */\n formatToolResults(results: UnifiedToolResult[]): unknown[];\n\n /**\n * Check if response indicates tool use is requested\n */\n isToolUseStop(response: unknown): boolean;\n\n /**\n * Check if response indicates end of turn\n */\n isEndTurnStop(response: unknown): boolean;\n\n /**\n * Get stop reason string from response\n */\n getStopReason(response: unknown): string;\n\n /**\n * Extract text content from response\n */\n extractTextContent(response: unknown): string;\n\n /**\n * Build assistant message with tool calls for conversation history\n */\n buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n ): unknown;\n\n /**\n * Build user message with tool results for conversation history\n */\n buildToolResultMessage(results: UnifiedToolResult[]): unknown;\n}\n\n// ============================================\n// Anthropic Tool Types\n// ============================================\n\n/**\n * Anthropic tool definition format\n */\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Anthropic tool_use block from response\n */\nexport interface AnthropicToolUse {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Anthropic tool_result block\n */\nexport interface AnthropicToolResult {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n}\n\n// ============================================\n// OpenAI Tool Types\n// ============================================\n\n/**\n * OpenAI tool definition format\n */\nexport interface OpenAITool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n };\n}\n\n/**\n * OpenAI tool call from response\n */\nexport interface OpenAIToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n}\n\n/**\n * OpenAI tool result message\n */\nexport interface OpenAIToolResult {\n role: \"tool\";\n tool_call_id: string;\n content: string;\n}\n\n// ============================================\n// Gemini Tool Types\n// ============================================\n\n/**\n * Google Gemini function declaration\n */\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Gemini function call from response\n */\nexport interface GeminiFunctionCall {\n name: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Gemini function response\n */\nexport interface GeminiFunctionResponse {\n name: string;\n response: Record<string, unknown>;\n}\n\n// ============================================\n// Provider Capabilities (for UI feature flags)\n// ============================================\n\n/**\n * Capabilities of a model for UI feature flags\n * UI components can use this to enable/disable features\n */\nexport interface ProviderCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports extended thinking (Claude, DeepSeek) */\n supportsThinking: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Supports audio inputs */\n supportsAudio: boolean;\n /** Supports video inputs */\n supportsVideo: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n /** Supported audio MIME types */\n supportedAudioTypes?: string[];\n /** Supported video MIME types */\n supportedVideoTypes?: string[];\n /** Supports JSON mode / structured output */\n supportsJsonMode?: boolean;\n /** Supports system messages */\n supportsSystemMessages?: boolean;\n}\n\n// ============================================\n// AI Provider Interface\n// ============================================\n\n/**\n * AI Provider interface (object form)\n *\n * Wraps existing LLMAdapter with additional metadata:\n * - Supported models list\n * - Per-model capabilities\n * - Provider name\n */\nexport interface AIProviderObject {\n /** Provider name (e.g., 'openai', 'anthropic') */\n readonly name: string;\n\n /** List of supported model IDs */\n readonly supportedModels: string[];\n\n /**\n * Get a language model adapter for the given model ID\n * Returns the existing LLMAdapter interface - no breaking changes\n */\n languageModel(modelId: string): LLMAdapter;\n\n /**\n * Get capabilities for a specific model\n * UI components use this to enable/disable features\n */\n getCapabilities(modelId: string): ProviderCapabilities;\n\n /**\n * Optional: Get an embedding model (future expansion)\n */\n embeddingModel?(modelId: string): EmbeddingModel;\n}\n\n/**\n * Callable AI Provider (Vercel AI SDK style)\n *\n * A function that returns a LanguageModel when called with a model ID,\n * but also has properties for provider metadata and methods.\n *\n * @example\n * ```typescript\n * const openai = createOpenAI({ apiKey: '...' });\n *\n * // Callable - returns LanguageModel directly (Vercel AI SDK style)\n * const model = openai('gpt-4o');\n *\n * // Also supports method calls (backward compatible)\n * const model2 = openai.languageModel('gpt-4o');\n *\n * // Check capabilities\n * const caps = openai.getCapabilities('gpt-4o');\n * if (caps.supportsVision) {\n * // Show image upload button\n * }\n * ```\n */\nexport interface AIProvider extends AIProviderObject {\n /**\n * Call the provider directly with a model ID to get a LanguageModel\n * This is the Vercel AI SDK style pattern\n */\n (modelId: string): LLMAdapter;\n}\n\n/**\n * Helper to create a callable AIProvider\n * Combines a callable function with AIProvider properties\n */\nexport function createCallableProvider(\n providerFn: (modelId: string) => LLMAdapter,\n properties: Omit<AIProviderObject, \"languageModel\">,\n): AIProvider {\n // Define 'name' property using defineProperty since it's read-only on functions\n Object.defineProperty(providerFn, \"name\", {\n value: properties.name,\n writable: false,\n configurable: true,\n });\n\n // Assign other properties\n Object.assign(providerFn, {\n supportedModels: properties.supportedModels,\n languageModel: providerFn,\n getCapabilities: properties.getCapabilities,\n embeddingModel: properties.embeddingModel,\n });\n\n return providerFn as AIProvider;\n}\n\n/**\n * Embedding model interface (for future expansion)\n */\nexport interface EmbeddingModel {\n readonly provider: string;\n readonly modelId: string;\n embed(texts: string[]): Promise<number[][]>;\n}\n\n// ============================================\n// Provider-Specific Configurations\n// ============================================\n\n/**\n * Base provider configuration\n */\nexport interface BaseProviderConfig {\n /** API key (falls back to environment variable) */\n apiKey?: string;\n /** Custom base URL */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Custom headers to include */\n headers?: Record<string, string>;\n}\n\n/**\n * OpenAI provider configuration\n */\nexport interface OpenAIProviderConfig extends BaseProviderConfig {\n /** OpenAI organization ID */\n organization?: string;\n /** OpenAI project ID */\n project?: string;\n /** Vision detail level for images */\n imageDetail?: \"auto\" | \"low\" | \"high\";\n}\n\n/**\n * Anthropic provider configuration\n */\nexport interface AnthropicProviderConfig extends BaseProviderConfig {\n /** Extended thinking budget in tokens (minimum 1024) */\n thinkingBudget?: number;\n /** Enable prompt caching */\n cacheControl?: boolean;\n}\n\n/**\n * Google provider configuration\n */\nexport interface GoogleProviderConfig extends BaseProviderConfig {\n /** Safety settings */\n safetySettings?: GoogleSafetySetting[];\n /** Grounding configuration (for web search) */\n groundingConfig?: GoogleGroundingConfig;\n}\n\n/**\n * Google safety setting\n */\nexport interface GoogleSafetySetting {\n category:\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\";\n threshold:\n | \"BLOCK_NONE\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_HIGH_AND_ABOVE\";\n}\n\n/**\n * Google grounding configuration\n */\nexport interface GoogleGroundingConfig {\n /** Enable Google Search grounding */\n googleSearchRetrieval?: boolean;\n}\n\n/**\n * xAI provider configuration\n */\nexport interface XAIProviderConfig extends BaseProviderConfig {\n // xAI uses OpenAI-compatible API, no extra config needed\n}\n\n/**\n * Azure OpenAI provider configuration\n */\nexport interface AzureProviderConfig extends BaseProviderConfig {\n /** Azure resource name */\n resourceName: string;\n /** Deployment name */\n deploymentName: string;\n /** API version (default: 2024-02-15-preview) */\n apiVersion?: string;\n}\n\n/**\n * Ollama provider configuration\n */\nexport interface OllamaProviderConfig extends BaseProviderConfig {\n // baseUrl defaults to http://localhost:11434\n}\n\n// ============================================\n// Model Information\n// ============================================\n\n/**\n * Model information for a provider\n */\nexport interface ModelInfo {\n /** Model ID */\n id: string;\n /** Display name */\n name: string;\n /** Description */\n description?: string;\n /** Capabilities */\n capabilities: ProviderCapabilities;\n /** Context window size */\n contextWindow: number;\n /** Pricing info (optional) */\n pricing?: {\n inputPerMillion?: number;\n outputPerMillion?: number;\n };\n}\n\n// ============================================\n// Default Capabilities\n// ============================================\n\n/**\n * Default capabilities for unknown models\n */\nexport const DEFAULT_CAPABILITIES: ProviderCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n};\n","/**\n * Google Provider\n *\n * Modern pattern: google('gemini-2.0-flash') returns a LanguageModel\n * Legacy pattern: createGoogle({ apiKey }) returns an AIProvider\n *\n * Features:\n * - Vision (images)\n * - Audio input\n * - Video input\n * - PDF documents\n * - Tools/Function calling\n * - Massive context windows (up to 2M tokens)\n */\n\n// NEW: Modern pattern - google() function\nexport { google, createGoogle as createGoogleModel } from \"./provider\";\nexport type { GoogleProviderOptions } from \"./provider\";\n\nimport { createGoogleAdapter } from \"../../adapters/google\";\nimport {\n createCallableProvider,\n type AIProvider,\n type ProviderCapabilities,\n type 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 (callable, Vercel AI SDK style)\n *\n * @example\n * ```typescript\n * const google = createGoogle({ apiKey: '...' });\n *\n * // Callable - Vercel AI SDK style\n * const model = google('gemini-2.0-flash');\n *\n * // Also supports method call (backward compatible)\n * const model2 = google.languageModel('gemini-2.0-flash');\n *\n * // Check capabilities\n * const caps = google.getCapabilities('gemini-2.0-flash');\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 // Create the callable function\n const providerFn = (modelId: string) => {\n return createGoogleAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n safetySettings: config.safetySettings,\n });\n };\n\n // Get capabilities helper\n const 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,\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,\n supportsSystemMessages: true,\n };\n };\n\n return createCallableProvider(providerFn, {\n name: \"google\",\n supportedModels: Object.keys(GOOGLE_MODELS),\n getCapabilities,\n });\n}\n\n// Alias for consistency\nexport const createGoogleProvider = createGoogle;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/google/provider.ts","../../../src/core/utils.ts","../../../src/adapters/google.ts","../../../src/providers/types.ts","../../../src/providers/google/index.ts"],"names":["client","chunk","GOOGLE_MODELS"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Google Provider - OpenAI-Compatible\n *\n * Uses OpenAI SDK with Google's OpenAI-compatible endpoint.\n * BaseURL: https://generativelanguage.googleapis.com/v1beta/openai/\n *\n * @example\n * ```ts\n * import { google } from '@yourgpt/llm-sdk/google';\n * import { generateText } from '@yourgpt/llm-sdk';\n *\n * const result = await generateText({\n * model: google('gemini-2.0-flash'),\n * prompt: 'Hello!',\n * });\n * ```\n */\n\nimport type {\n LanguageModel,\n DoGenerateParams,\n DoGenerateResult,\n StreamChunk,\n ToolCall,\n FinishReason,\n CoreMessage,\n} from \"../../core/types\";\n\n// ============================================\n// Model Definitions\n// ============================================\n\ninterface GoogleModelConfig {\n vision: boolean;\n tools: boolean;\n audio: boolean;\n video: boolean;\n maxTokens: number;\n}\n\nconst GOOGLE_MODELS: Record<string, GoogleModelConfig> = {\n // Gemini 2.5 (Experimental)\n \"gemini-2.5-pro-preview-05-06\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.5-flash-preview-05-20\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n\n // Gemini 2.0\n \"gemini-2.0-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-exp\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-lite\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n maxTokens: 1048576,\n },\n \"gemini-2.0-flash-thinking-exp\": {\n vision: true,\n tools: false,\n audio: false,\n video: false,\n maxTokens: 32767,\n },\n\n // Gemini 1.5\n \"gemini-1.5-pro\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 2097152,\n },\n \"gemini-1.5-pro-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 2097152,\n },\n \"gemini-1.5-flash\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-1.5-flash-latest\": {\n vision: true,\n tools: true,\n audio: true,\n video: true,\n maxTokens: 1048576,\n },\n \"gemini-1.5-flash-8b\": {\n vision: true,\n tools: true,\n audio: false,\n video: false,\n maxTokens: 1048576,\n },\n};\n\n// ============================================\n// Provider Options\n// ============================================\n\nexport interface GoogleProviderOptions {\n /** API key (defaults to GOOGLE_API_KEY or GEMINI_API_KEY env var) */\n apiKey?: string;\n /** Base URL for API (defaults to Google's OpenAI-compatible endpoint) */\n baseURL?: string;\n}\n\n// ============================================\n// Provider Implementation\n// ============================================\n\n/**\n * Create a Google Gemini language model using OpenAI-compatible API\n *\n * @param modelId - Model ID (e.g., 'gemini-2.0-flash', 'gemini-1.5-pro')\n * @param options - Provider options\n * @returns LanguageModel instance\n *\n * @example\n * ```ts\n * // Basic usage\n * const model = google('gemini-2.0-flash');\n *\n * // With custom options\n * const model = google('gemini-1.5-pro', {\n * apiKey: 'your-api-key',\n * });\n * ```\n */\nexport function google(\n modelId: string,\n options: GoogleProviderOptions = {},\n): LanguageModel {\n const apiKey =\n options.apiKey ?? process.env.GOOGLE_API_KEY ?? process.env.GEMINI_API_KEY;\n const baseURL =\n options.baseURL ??\n \"https://generativelanguage.googleapis.com/v1beta/openai/\";\n\n // Lazy-load OpenAI client (Google uses OpenAI-compatible API)\n let client: any = null;\n async function getClient(): Promise<any> {\n if (!client) {\n const { default: OpenAI } = await import(\"openai\");\n client = new OpenAI({\n apiKey,\n baseURL,\n });\n }\n return client;\n }\n\n // Get model config\n const modelConfig =\n GOOGLE_MODELS[modelId] ?? GOOGLE_MODELS[\"gemini-2.0-flash\"];\n\n return {\n provider: \"google\",\n modelId,\n\n capabilities: {\n supportsVision: modelConfig.vision,\n supportsTools: modelConfig.tools,\n supportsStreaming: true,\n supportsJsonMode: true,\n supportsThinking: modelId.includes(\"thinking\"),\n supportsPDF: true,\n maxTokens: modelConfig.maxTokens,\n supportedImageTypes: modelConfig.vision\n ? [\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\"]\n : [],\n },\n\n async doGenerate(params: DoGenerateParams): Promise<DoGenerateResult> {\n const client = await getClient();\n\n const messages = formatMessagesForGoogle(params.messages);\n\n const response = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n });\n\n const choice = response.choices[0];\n const message = choice.message;\n\n // Parse tool calls\n const toolCalls: ToolCall[] = (message.tool_calls ?? []).map(\n (tc: any) => ({\n id: tc.id,\n name: tc.function.name,\n args: JSON.parse(tc.function.arguments || \"{}\"),\n }),\n );\n\n return {\n text: message.content ?? \"\",\n toolCalls,\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: response.usage?.prompt_tokens ?? 0,\n completionTokens: response.usage?.completion_tokens ?? 0,\n totalTokens: response.usage?.total_tokens ?? 0,\n },\n rawResponse: response,\n };\n },\n\n async *doStream(params: DoGenerateParams): AsyncGenerator<StreamChunk> {\n const client = await getClient();\n\n const messages = formatMessagesForGoogle(params.messages);\n\n const stream = await client.chat.completions.create({\n model: modelId,\n messages,\n tools: params.tools as any,\n temperature: params.temperature,\n max_tokens: params.maxTokens,\n stream: true,\n });\n\n // Track current tool call being built\n let currentToolCall: {\n id: string;\n name: string;\n arguments: string;\n } | null = null;\n\n let totalPromptTokens = 0;\n let totalCompletionTokens = 0;\n\n for await (const chunk of stream) {\n // Check abort\n if (params.signal?.aborted) {\n yield { type: \"error\", error: new Error(\"Aborted\") };\n return;\n }\n\n const choice = chunk.choices[0];\n const delta = choice?.delta;\n\n // Text content\n if (delta?.content) {\n yield { type: \"text-delta\", text: delta.content };\n }\n\n // Tool calls\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n if (tc.id) {\n // New tool call - emit previous if exists\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n }\n currentToolCall = {\n id: tc.id,\n name: tc.function?.name ?? \"\",\n arguments: tc.function?.arguments ?? \"\",\n };\n } else if (currentToolCall && tc.function?.arguments) {\n // Append arguments\n currentToolCall.arguments += tc.function.arguments;\n }\n }\n }\n\n // Finish reason\n if (choice?.finish_reason) {\n // Emit pending tool call\n if (currentToolCall) {\n yield {\n type: \"tool-call\",\n toolCall: {\n id: currentToolCall.id,\n name: currentToolCall.name,\n args: JSON.parse(currentToolCall.arguments || \"{}\"),\n },\n };\n currentToolCall = null;\n }\n\n // Usage from final chunk (if available)\n if (chunk.usage) {\n totalPromptTokens = chunk.usage.prompt_tokens;\n totalCompletionTokens = chunk.usage.completion_tokens;\n }\n\n yield {\n type: \"finish\",\n finishReason: mapFinishReason(choice.finish_reason),\n usage: {\n promptTokens: totalPromptTokens,\n completionTokens: totalCompletionTokens,\n totalTokens: totalPromptTokens + totalCompletionTokens,\n },\n };\n }\n }\n },\n };\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Map finish reason to our FinishReason type\n */\nfunction mapFinishReason(reason: string | null): FinishReason {\n switch (reason) {\n case \"stop\":\n return \"stop\";\n case \"length\":\n return \"length\";\n case \"tool_calls\":\n case \"function_call\":\n return \"tool-calls\";\n case \"content_filter\":\n return \"content-filter\";\n default:\n return \"unknown\";\n }\n}\n\n/**\n * Format CoreMessage[] for Google's OpenAI-compatible API\n */\nfunction formatMessagesForGoogle(messages: CoreMessage[]): any[] {\n return messages.map((msg) => {\n switch (msg.role) {\n case \"system\":\n return { role: \"system\", content: msg.content };\n\n case \"user\":\n if (typeof msg.content === \"string\") {\n return { role: \"user\", content: msg.content };\n }\n // Handle multimodal content\n return {\n role: \"user\",\n content: msg.content.map((part) => {\n if (part.type === \"text\") {\n return { type: \"text\", text: part.text };\n }\n if (part.type === \"image\") {\n const imageData =\n typeof part.image === \"string\"\n ? part.image\n : Buffer.from(part.image).toString(\"base64\");\n const url = imageData.startsWith(\"data:\")\n ? imageData\n : `data:${part.mimeType ?? \"image/png\"};base64,${imageData}`;\n return { type: \"image_url\", image_url: { url, detail: \"auto\" } };\n }\n return { type: \"text\", text: \"\" };\n }),\n };\n\n case \"assistant\":\n const assistantMsg: any = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.toolCalls && msg.toolCalls.length > 0) {\n assistantMsg.tool_calls = msg.toolCalls.map((tc) => ({\n id: tc.id,\n type: \"function\",\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args),\n },\n }));\n }\n return assistantMsg;\n\n case \"tool\":\n return {\n role: \"tool\",\n tool_call_id: msg.toolCallId,\n content: msg.content,\n };\n\n default:\n return msg;\n }\n });\n}\n\n// Also export as createGoogle for backward compatibility\nexport { google as createGoogle };\n","/**\n * Utility functions for llm-sdk\n */\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix = \"id\"): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Generate a message ID\n */\nexport function generateMessageId(): string {\n return generateId(\"msg\");\n}\n\n/**\n * Generate a conversation/thread ID\n */\nexport function generateThreadId(): string {\n return generateId(\"thread\");\n}\n\n/**\n * Generate a tool call ID\n */\nexport function generateToolCallId(): string {\n return generateId(\"call\");\n}\n","/**\n * Google Gemini LLM Adapter\n *\n * Supports: Gemini 2.0, 1.5 Pro, 1.5 Flash, etc.\n * Features: Vision, Audio, Video, PDF, Tools/Function Calling, Google Search Grounding\n */\n\nimport type {\n LLMConfig,\n StreamEvent,\n Message,\n WebSearchConfig,\n Citation,\n} from \"../core/stream-events\";\nimport { generateMessageId, generateToolCallId } from \"../core/utils\";\nimport type {\n LLMAdapter,\n ChatCompletionRequest,\n CompletionResult,\n} from \"./base\";\nimport { formatTools } from \"./base\";\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Google adapter configuration\n */\nexport interface GoogleAdapterConfig {\n apiKey: string;\n model?: string;\n baseUrl?: string;\n temperature?: number;\n maxTokens?: number;\n /** Safety settings */\n safetySettings?: Array<{\n category: string;\n threshold: string;\n }>;\n /**\n * Enable native Google Search grounding for Gemini.\n * When true, Gemini can search Google to answer questions.\n */\n webSearch?: boolean | WebSearchConfig;\n}\n\n/**\n * Gemini content part types\n */\ntype GeminiPart =\n | { text: string }\n | { inlineData: { mimeType: string; data: string } }\n | { functionCall: { name: string; args: Record<string, unknown> } }\n | { functionResponse: { name: string; response: Record<string, unknown> } };\n\n/**\n * Gemini message format\n */\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\n/**\n * Gemini tool format\n */\ninterface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: {\n type: string;\n properties?: Record<string, unknown>;\n required?: string[];\n };\n}\n\n// ============================================\n// Content Conversion\n// ============================================\n\n/**\n * Convert attachment to Gemini inline data part\n * Note: Gemini requires base64 data for inline images. URL-based attachments\n * are not directly supported and will be skipped.\n */\nfunction attachmentToGeminiPart(attachment: {\n type: string;\n data?: string;\n url?: string;\n mimeType?: string;\n}): GeminiPart | null {\n // Gemini requires base64 data - URL-based attachments not supported\n if (!attachment.data) {\n // TODO: Could fetch URL and convert to base64, but that adds latency\n console.warn(\n \"Gemini adapter: URL-based attachments not supported, skipping\",\n );\n return null;\n }\n\n if (attachment.type === \"image\") {\n // Extract base64 data (remove data URI prefix if present)\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n inlineData: {\n mimeType: attachment.mimeType || \"image/png\",\n data: base64Data,\n },\n };\n }\n\n // Support for audio/video if present\n if (attachment.type === \"audio\" || attachment.type === \"video\") {\n let base64Data = attachment.data;\n if (base64Data.startsWith(\"data:\")) {\n const commaIndex = base64Data.indexOf(\",\");\n if (commaIndex !== -1) {\n base64Data = base64Data.slice(commaIndex + 1);\n }\n }\n\n return {\n inlineData: {\n mimeType:\n attachment.mimeType ||\n (attachment.type === \"audio\" ? \"audio/mp3\" : \"video/mp4\"),\n data: base64Data,\n },\n };\n }\n\n return null;\n}\n\n/**\n * Convert Message to Gemini content format\n */\nfunction messageToGeminiContent(msg: Message): GeminiContent | null {\n // Skip system messages (handled separately)\n if (msg.role === \"system\") return null;\n\n const parts: GeminiPart[] = [];\n\n // Handle tool messages - convert to function response\n if (msg.role === \"tool\" && msg.tool_call_id) {\n // Tool results need to be sent as functionResponse\n let responseData: Record<string, unknown>;\n try {\n responseData = JSON.parse(msg.content || \"{}\");\n } catch {\n responseData = { result: msg.content || \"\" };\n }\n\n // Need to get the tool name from somewhere - use tool_call_id as fallback\n // In practice, we'd need to track the mapping\n const toolName =\n (msg.metadata as { toolName?: string })?.toolName || \"tool\";\n\n parts.push({\n functionResponse: {\n name: toolName,\n response: responseData,\n },\n });\n\n return { role: \"user\", parts };\n }\n\n // Add text content\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n\n // Add attachments (images, audio, video)\n const attachments = msg.metadata?.attachments;\n if (attachments && Array.isArray(attachments)) {\n for (const attachment of attachments) {\n const part = attachmentToGeminiPart(attachment);\n if (part) {\n parts.push(part);\n }\n }\n }\n\n // Handle assistant messages with tool_calls\n if (msg.role === \"assistant\" && msg.tool_calls && msg.tool_calls.length > 0) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // Keep empty args\n }\n parts.push({\n functionCall: {\n name: tc.function.name,\n args,\n },\n });\n }\n }\n\n if (parts.length === 0) return null;\n\n return {\n role: msg.role === \"assistant\" ? \"model\" : \"user\",\n parts,\n };\n}\n\n/**\n * Convert tools to Gemini function declarations\n */\nfunction formatToolsForGemini(\n actions: ChatCompletionRequest[\"actions\"],\n): { functionDeclarations: GeminiFunctionDeclaration[] } | undefined {\n if (!actions || actions.length === 0) return undefined;\n\n return {\n functionDeclarations: actions.map((action) => ({\n name: action.name,\n description: action.description,\n parameters: action.parameters\n ? {\n type: \"object\",\n properties: Object.fromEntries(\n Object.entries(action.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n enum: param.enum,\n },\n ]),\n ),\n required: Object.entries(action.parameters)\n .filter(([, param]) => param.required)\n .map(([key]) => key),\n }\n : undefined,\n })),\n };\n}\n\n// ============================================\n// Adapter Implementation\n// ============================================\n\n/**\n * Google Gemini LLM Adapter\n */\nexport class GoogleAdapter implements LLMAdapter {\n readonly provider = \"google\";\n readonly model: string;\n\n private client: any; // GoogleGenerativeAI client (lazy loaded)\n private config: GoogleAdapterConfig;\n\n constructor(config: GoogleAdapterConfig) {\n this.config = config;\n this.model = config.model || \"gemini-2.0-flash\";\n }\n\n private async getClient() {\n if (!this.client) {\n // Dynamic import to make @google/generative-ai optional\n const { GoogleGenerativeAI } = await import(\"@google/generative-ai\");\n this.client = new GoogleGenerativeAI(this.config.apiKey);\n }\n return this.client;\n }\n\n async *stream(request: ChatCompletionRequest): AsyncGenerator<StreamEvent> {\n const client = await this.getClient();\n const modelId = request.config?.model || this.model;\n\n // Check for web search configuration (from request or adapter config)\n const webSearchConfig = request.webSearch ?? this.config.webSearch;\n\n // Get the generative model\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: this.config.safetySettings,\n });\n\n // Build contents array\n let contents: GeminiContent[] = [];\n let systemInstruction: string | undefined;\n\n // Handle raw messages (for agent loop)\n if (request.rawMessages && request.rawMessages.length > 0) {\n // Process raw messages\n for (const msg of request.rawMessages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg as unknown as Message);\n if (content) {\n contents.push(content);\n }\n }\n\n // Add system prompt if provided\n if (request.systemPrompt && !systemInstruction) {\n systemInstruction = request.systemPrompt;\n }\n } else {\n // Format from Message[]\n for (const msg of request.messages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg);\n if (content) {\n contents.push(content);\n }\n }\n\n if (request.systemPrompt) {\n systemInstruction = request.systemPrompt;\n }\n }\n\n // Ensure conversation starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n // Add an empty user message if needed\n contents = [{ role: \"user\", parts: [{ text: \"\" }] }, ...contents];\n }\n\n // Merge consecutive same-role messages (Gemini requires alternating roles)\n const mergedContents: GeminiContent[] = [];\n for (const content of contents) {\n const last = mergedContents[mergedContents.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n mergedContents.push({ ...content, parts: [...content.parts] });\n }\n }\n\n // Prepare tools\n const functionTools = formatToolsForGemini(request.actions);\n\n // Build tools array - combine function declarations with google search if enabled\n const toolsArray: Array<Record<string, unknown>> = [];\n\n if (functionTools) {\n toolsArray.push(functionTools);\n }\n\n // Add Google Search grounding if enabled\n if (webSearchConfig) {\n toolsArray.push({\n google_search: {},\n });\n }\n\n const messageId = generateMessageId();\n\n // Emit message start\n yield { type: \"message:start\", id: messageId };\n\n try {\n // Start chat session with system instruction\n const chat = model.startChat({\n history: mergedContents.slice(0, -1), // All but the last message\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: toolsArray.length > 0 ? toolsArray : undefined,\n generationConfig: {\n temperature: request.config?.temperature ?? this.config.temperature,\n maxOutputTokens: request.config?.maxTokens ?? this.config.maxTokens,\n },\n });\n\n // Get the last message content\n const lastMessage = mergedContents[mergedContents.length - 1];\n\n // Stream response\n const result = await chat.sendMessageStream(lastMessage.parts);\n\n let currentToolCall: {\n id: string;\n name: string;\n args: Record<string, unknown>;\n } | null = null;\n\n // Track citations from grounding metadata\n const collectedCitations: Citation[] = [];\n\n for await (const chunk of result.stream) {\n // Check for abort\n if (request.signal?.aborted) {\n break;\n }\n\n const candidate = chunk.candidates?.[0];\n if (!candidate?.content?.parts) continue;\n\n for (const part of candidate.content.parts) {\n // Handle text content\n if (\"text\" in part && part.text) {\n yield { type: \"message:delta\", content: part.text };\n }\n\n // Handle function calls\n if (\"functionCall\" in part && part.functionCall) {\n const fc = part.functionCall;\n const toolId = generateToolCallId();\n\n // Complete previous tool call if any\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: JSON.stringify(currentToolCall.args),\n };\n }\n\n currentToolCall = {\n id: toolId,\n name: fc.name,\n args: fc.args || {},\n };\n\n yield {\n type: \"action:start\",\n id: toolId,\n name: fc.name,\n };\n }\n }\n\n // Check for finish reason\n if (candidate.finishReason) {\n // Complete any pending tool call\n if (currentToolCall) {\n yield {\n type: \"action:args\",\n id: currentToolCall.id,\n args: JSON.stringify(currentToolCall.args),\n };\n }\n }\n\n // Extract grounding metadata (citations) from candidate\n const groundingMetadata = (\n candidate as {\n groundingMetadata?: {\n groundingChunks?: Array<{\n web?: { uri: string; title?: string };\n }>;\n searchEntryPoint?: { renderedContent?: string };\n };\n }\n )?.groundingMetadata;\n\n if (groundingMetadata?.groundingChunks) {\n for (const chunk of groundingMetadata.groundingChunks) {\n if (chunk.web?.uri) {\n const url = chunk.web.uri;\n const domain = extractDomain(url);\n // Check if we already have this citation\n if (!collectedCitations.some((c) => c.url === url)) {\n collectedCitations.push({\n index: collectedCitations.length + 1,\n url,\n title: chunk.web.title || domain,\n domain,\n favicon: domain\n ? `https://www.google.com/s2/favicons?domain=${domain}&sz=32`\n : undefined,\n });\n }\n }\n }\n }\n }\n\n // Get usage from the final response\n let usage:\n | {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n }\n | undefined;\n\n try {\n const response = await result.response;\n if (response.usageMetadata) {\n usage = {\n prompt_tokens: response.usageMetadata.promptTokenCount || 0,\n completion_tokens: response.usageMetadata.candidatesTokenCount || 0,\n total_tokens: response.usageMetadata.totalTokenCount || 0,\n };\n }\n\n // Also check final response for grounding metadata\n const finalCandidate = response.candidates?.[0];\n const finalGrounding = (\n finalCandidate as {\n groundingMetadata?: {\n groundingChunks?: Array<{\n web?: { uri: string; title?: string };\n }>;\n };\n }\n )?.groundingMetadata;\n\n if (finalGrounding?.groundingChunks) {\n for (const chunk of finalGrounding.groundingChunks) {\n if (chunk.web?.uri) {\n const url = chunk.web.uri;\n const domain = extractDomain(url);\n if (!collectedCitations.some((c) => c.url === url)) {\n collectedCitations.push({\n index: collectedCitations.length + 1,\n url,\n title: chunk.web.title || domain,\n domain,\n favicon: domain\n ? `https://www.google.com/s2/favicons?domain=${domain}&sz=32`\n : undefined,\n });\n }\n }\n }\n }\n } catch {\n // Ignore usage retrieval errors\n }\n\n // Emit citations if we collected any\n if (collectedCitations.length > 0) {\n yield { type: \"citation\", citations: collectedCitations };\n }\n\n // Emit message end\n yield { type: \"message:end\" };\n yield { type: \"done\", usage };\n } catch (error) {\n yield {\n type: \"error\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n code: \"GOOGLE_ERROR\",\n };\n }\n }\n\n /**\n * Non-streaming completion (optional, for debugging)\n */\n async complete(request: ChatCompletionRequest): Promise<CompletionResult> {\n const client = await this.getClient();\n const modelId = request.config?.model || this.model;\n\n const model = client.getGenerativeModel({\n model: modelId,\n safetySettings: this.config.safetySettings,\n });\n\n // Build contents (same as stream)\n let contents: GeminiContent[] = [];\n let systemInstruction: string | undefined;\n\n for (const msg of request.messages) {\n if (msg.role === \"system\") {\n systemInstruction = (systemInstruction || \"\") + (msg.content || \"\");\n continue;\n }\n\n const content = messageToGeminiContent(msg);\n if (content) {\n contents.push(content);\n }\n }\n\n if (request.systemPrompt) {\n systemInstruction = request.systemPrompt;\n }\n\n // Ensure conversation starts with user\n if (contents.length === 0 || contents[0].role !== \"user\") {\n contents = [{ role: \"user\", parts: [{ text: \"\" }] }, ...contents];\n }\n\n // Merge consecutive same-role messages\n const mergedContents: GeminiContent[] = [];\n for (const content of contents) {\n const last = mergedContents[mergedContents.length - 1];\n if (last && last.role === content.role) {\n last.parts.push(...content.parts);\n } else {\n mergedContents.push({ ...content, parts: [...content.parts] });\n }\n }\n\n const tools = formatToolsForGemini(request.actions);\n\n const chat = model.startChat({\n history: mergedContents.slice(0, -1),\n systemInstruction: systemInstruction\n ? { parts: [{ text: systemInstruction }] }\n : undefined,\n tools: tools ? [tools] : undefined,\n generationConfig: {\n temperature: request.config?.temperature ?? this.config.temperature,\n maxOutputTokens: request.config?.maxTokens ?? this.config.maxTokens,\n },\n });\n\n const lastMessage = mergedContents[mergedContents.length - 1];\n const result = await chat.sendMessage(lastMessage.parts);\n const response = result.response;\n\n // Extract content and tool calls\n let textContent = \"\";\n const toolCalls: CompletionResult[\"toolCalls\"] = [];\n\n const candidate = response.candidates?.[0];\n if (candidate?.content?.parts) {\n for (const part of candidate.content.parts) {\n if (\"text\" in part && part.text) {\n textContent += part.text;\n }\n if (\"functionCall\" in part && part.functionCall) {\n toolCalls.push({\n id: generateToolCallId(),\n name: part.functionCall.name,\n args: part.functionCall.args || {},\n });\n }\n }\n }\n\n return {\n content: textContent,\n toolCalls,\n rawResponse: response as Record<string, unknown>,\n };\n }\n}\n\n/**\n * Create Google Gemini adapter\n */\nexport function createGoogleAdapter(\n config: GoogleAdapterConfig,\n): GoogleAdapter {\n return new GoogleAdapter(config);\n}\n\n/**\n * Extract domain from URL\n */\nfunction extractDomain(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.hostname;\n } catch {\n return \"\";\n }\n}\n","/**\n * Provider Types\n *\n * Defines interfaces for:\n * 1. Provider Formatters (for tool transformations in agent loop)\n * 2. Multi-provider architecture (AIProvider, capabilities, configs)\n */\n\nimport type {\n ToolDefinition,\n UnifiedToolCall,\n UnifiedToolResult,\n} from \"../core/stream-events\";\nimport type { LLMAdapter } from \"../adapters/base\";\n\n// ============================================\n// Provider Formatter Types (for agent loop)\n// ============================================\n\n/**\n * Provider formatter interface\n *\n * Each provider implements this interface to handle:\n * - Tool definition transformation\n * - Tool call parsing from responses\n * - Tool result formatting\n * - Stop reason detection\n */\nexport interface ProviderFormatter {\n /**\n * Transform unified tool definitions to provider format\n */\n transformTools(tools: ToolDefinition[]): unknown[];\n\n /**\n * Parse tool calls from provider response\n */\n parseToolCalls(response: unknown): UnifiedToolCall[];\n\n /**\n * Format tool results for provider\n */\n formatToolResults(results: UnifiedToolResult[]): unknown[];\n\n /**\n * Check if response indicates tool use is requested\n */\n isToolUseStop(response: unknown): boolean;\n\n /**\n * Check if response indicates end of turn\n */\n isEndTurnStop(response: unknown): boolean;\n\n /**\n * Get stop reason string from response\n */\n getStopReason(response: unknown): string;\n\n /**\n * Extract text content from response\n */\n extractTextContent(response: unknown): string;\n\n /**\n * Build assistant message with tool calls for conversation history\n */\n buildAssistantToolMessage(\n toolCalls: UnifiedToolCall[],\n textContent?: string,\n ): unknown;\n\n /**\n * Build user message with tool results for conversation history\n */\n buildToolResultMessage(results: UnifiedToolResult[]): unknown;\n}\n\n// ============================================\n// Anthropic Tool Types\n// ============================================\n\n/**\n * Anthropic tool definition format\n */\nexport interface AnthropicTool {\n name: string;\n description: string;\n input_schema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Anthropic tool_use block from response\n */\nexport interface AnthropicToolUse {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n/**\n * Anthropic tool_result block\n */\nexport interface AnthropicToolResult {\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n}\n\n// ============================================\n// OpenAI Tool Types\n// ============================================\n\n/**\n * OpenAI tool definition format\n */\nexport interface OpenAITool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n };\n}\n\n/**\n * OpenAI tool call from response\n */\nexport interface OpenAIToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n}\n\n/**\n * OpenAI tool result message\n */\nexport interface OpenAIToolResult {\n role: \"tool\";\n tool_call_id: string;\n content: string;\n}\n\n// ============================================\n// Gemini Tool Types\n// ============================================\n\n/**\n * Google Gemini function declaration\n */\nexport interface GeminiFunctionDeclaration {\n name: string;\n description: string;\n parameters?: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/**\n * Gemini function call from response\n */\nexport interface GeminiFunctionCall {\n name: string;\n args: Record<string, unknown>;\n}\n\n/**\n * Gemini function response\n */\nexport interface GeminiFunctionResponse {\n name: string;\n response: Record<string, unknown>;\n}\n\n// ============================================\n// Provider Capabilities (for UI feature flags)\n// ============================================\n\n/**\n * Capabilities of a model for UI feature flags\n * UI components can use this to enable/disable features\n */\nexport interface ProviderCapabilities {\n /** Supports image inputs */\n supportsVision: boolean;\n /** Supports tool/function calling */\n supportsTools: boolean;\n /** Supports extended thinking (Claude, DeepSeek) */\n supportsThinking: boolean;\n /** Supports streaming responses */\n supportsStreaming: boolean;\n /** Supports PDF document inputs */\n supportsPDF: boolean;\n /** Supports audio inputs */\n supportsAudio: boolean;\n /** Supports video inputs */\n supportsVideo: boolean;\n /** Maximum context tokens */\n maxTokens: number;\n /** Supported image MIME types */\n supportedImageTypes: string[];\n /** Supported audio MIME types */\n supportedAudioTypes?: string[];\n /** Supported video MIME types */\n supportedVideoTypes?: string[];\n /** Supports JSON mode / structured output */\n supportsJsonMode?: boolean;\n /** Supports system messages */\n supportsSystemMessages?: boolean;\n}\n\n// ============================================\n// AI Provider Interface\n// ============================================\n\n/**\n * AI Provider interface (object form)\n *\n * Wraps existing LLMAdapter with additional metadata:\n * - Supported models list\n * - Per-model capabilities\n * - Provider name\n */\nexport interface AIProviderObject {\n /** Provider name (e.g., 'openai', 'anthropic') */\n readonly name: string;\n\n /** List of supported model IDs */\n readonly supportedModels: string[];\n\n /**\n * Get a language model adapter for the given model ID\n * Returns the existing LLMAdapter interface - no breaking changes\n */\n languageModel(modelId: string): LLMAdapter;\n\n /**\n * Get capabilities for a specific model\n * UI components use this to enable/disable features\n */\n getCapabilities(modelId: string): ProviderCapabilities;\n\n /**\n * Optional: Get an embedding model (future expansion)\n */\n embeddingModel?(modelId: string): EmbeddingModel;\n}\n\n/**\n * Callable AI Provider (Vercel AI SDK style)\n *\n * A function that returns a LanguageModel when called with a model ID,\n * but also has properties for provider metadata and methods.\n *\n * @example\n * ```typescript\n * const openai = createOpenAI({ apiKey: '...' });\n *\n * // Callable - returns LanguageModel directly (Vercel AI SDK style)\n * const model = openai('gpt-4o');\n *\n * // Also supports method calls (backward compatible)\n * const model2 = openai.languageModel('gpt-4o');\n *\n * // Check capabilities\n * const caps = openai.getCapabilities('gpt-4o');\n * if (caps.supportsVision) {\n * // Show image upload button\n * }\n * ```\n */\nexport interface AIProvider extends AIProviderObject {\n /**\n * Call the provider directly with a model ID to get a LanguageModel\n * This is the Vercel AI SDK style pattern\n */\n (modelId: string): LLMAdapter;\n}\n\n/**\n * Helper to create a callable AIProvider\n * Combines a callable function with AIProvider properties\n */\nexport function createCallableProvider(\n providerFn: (modelId: string) => LLMAdapter,\n properties: Omit<AIProviderObject, \"languageModel\">,\n): AIProvider {\n // Define 'name' property using defineProperty since it's read-only on functions\n Object.defineProperty(providerFn, \"name\", {\n value: properties.name,\n writable: false,\n configurable: true,\n });\n\n // Assign other properties\n Object.assign(providerFn, {\n supportedModels: properties.supportedModels,\n languageModel: providerFn,\n getCapabilities: properties.getCapabilities,\n embeddingModel: properties.embeddingModel,\n });\n\n return providerFn as AIProvider;\n}\n\n/**\n * Embedding model interface (for future expansion)\n */\nexport interface EmbeddingModel {\n readonly provider: string;\n readonly modelId: string;\n embed(texts: string[]): Promise<number[][]>;\n}\n\n// ============================================\n// Provider-Specific Configurations\n// ============================================\n\n/**\n * Base provider configuration\n */\nexport interface BaseProviderConfig {\n /** API key (falls back to environment variable) */\n apiKey?: string;\n /** Custom base URL */\n baseUrl?: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n /** Custom headers to include */\n headers?: Record<string, string>;\n}\n\n/**\n * OpenAI provider configuration\n */\nexport interface OpenAIProviderConfig extends BaseProviderConfig {\n /** OpenAI organization ID */\n organization?: string;\n /** OpenAI project ID */\n project?: string;\n /** Vision detail level for images */\n imageDetail?: \"auto\" | \"low\" | \"high\";\n}\n\n/**\n * Anthropic provider configuration\n */\nexport interface AnthropicProviderConfig extends BaseProviderConfig {\n /** Extended thinking budget in tokens (minimum 1024) */\n thinkingBudget?: number;\n /** Enable prompt caching */\n cacheControl?: boolean;\n}\n\n/**\n * Google provider configuration\n */\nexport interface GoogleProviderConfig extends BaseProviderConfig {\n /** Safety settings */\n safetySettings?: GoogleSafetySetting[];\n /** Grounding configuration (for web search) */\n groundingConfig?: GoogleGroundingConfig;\n}\n\n/**\n * Google safety setting\n */\nexport interface GoogleSafetySetting {\n category:\n | \"HARM_CATEGORY_HARASSMENT\"\n | \"HARM_CATEGORY_HATE_SPEECH\"\n | \"HARM_CATEGORY_SEXUALLY_EXPLICIT\"\n | \"HARM_CATEGORY_DANGEROUS_CONTENT\";\n threshold:\n | \"BLOCK_NONE\"\n | \"BLOCK_LOW_AND_ABOVE\"\n | \"BLOCK_MEDIUM_AND_ABOVE\"\n | \"BLOCK_HIGH_AND_ABOVE\";\n}\n\n/**\n * Google grounding configuration\n */\nexport interface GoogleGroundingConfig {\n /** Enable Google Search grounding */\n googleSearchRetrieval?: boolean;\n}\n\n/**\n * xAI provider configuration\n */\nexport interface XAIProviderConfig extends BaseProviderConfig {\n // xAI uses OpenAI-compatible API, no extra config needed\n}\n\n/**\n * Azure OpenAI provider configuration\n */\nexport interface AzureProviderConfig extends BaseProviderConfig {\n /** Azure resource name */\n resourceName: string;\n /** Deployment name */\n deploymentName: string;\n /** API version (default: 2024-02-15-preview) */\n apiVersion?: string;\n}\n\n/**\n * Ollama model-specific options\n * These map to Ollama's native API options\n */\nexport interface OllamaModelOptions {\n /** Context window size (default varies by model) */\n num_ctx?: number;\n /** Max tokens to predict (-1 = infinite, -2 = fill context) */\n num_predict?: number;\n /** Mirostat sampling (0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0) */\n mirostat?: 0 | 1 | 2;\n /** Mirostat learning rate (default: 0.1) */\n mirostat_eta?: number;\n /** Mirostat target entropy (default: 5.0) */\n mirostat_tau?: number;\n /** Repeat penalty (default: 1.1) */\n repeat_penalty?: number;\n /** Random seed for reproducibility (-1 = random) */\n seed?: number;\n /** Top-k sampling (default: 40) */\n top_k?: number;\n /** Top-p (nucleus) sampling (default: 0.9) */\n top_p?: number;\n /** Min-p sampling (default: 0.0) */\n min_p?: number;\n /** Stop sequences */\n stop?: string[];\n /** Temperature override (also available in config) */\n temperature?: number;\n}\n\n/**\n * Ollama provider configuration\n */\nexport interface OllamaProviderConfig extends BaseProviderConfig {\n /** Default Ollama-specific model options */\n options?: OllamaModelOptions;\n}\n\n// ============================================\n// Model Information\n// ============================================\n\n/**\n * Model information for a provider\n */\nexport interface ModelInfo {\n /** Model ID */\n id: string;\n /** Display name */\n name: string;\n /** Description */\n description?: string;\n /** Capabilities */\n capabilities: ProviderCapabilities;\n /** Context window size */\n contextWindow: number;\n /** Pricing info (optional) */\n pricing?: {\n inputPerMillion?: number;\n outputPerMillion?: number;\n };\n}\n\n// ============================================\n// Default Capabilities\n// ============================================\n\n/**\n * Default capabilities for unknown models\n */\nexport const DEFAULT_CAPABILITIES: ProviderCapabilities = {\n supportsVision: false,\n supportsTools: true,\n supportsThinking: false,\n supportsStreaming: true,\n supportsPDF: false,\n supportsAudio: false,\n supportsVideo: false,\n maxTokens: 8192,\n supportedImageTypes: [],\n supportsJsonMode: false,\n supportsSystemMessages: true,\n};\n","/**\n * Google Provider\n *\n * Modern pattern: google('gemini-2.0-flash') returns a LanguageModel\n * Legacy pattern: createGoogle({ apiKey }) returns an AIProvider\n *\n * Features:\n * - Vision (images)\n * - Audio input\n * - Video input\n * - PDF documents\n * - Tools/Function calling\n * - Massive context windows (up to 2M tokens)\n */\n\n// NEW: Modern pattern - google() function\nexport { google, createGoogle as createGoogleModel } from \"./provider\";\nexport type { GoogleProviderOptions } from \"./provider\";\n\nimport { createGoogleAdapter } from \"../../adapters/google\";\nimport {\n createCallableProvider,\n type AIProvider,\n type ProviderCapabilities,\n type 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 (callable, Vercel AI SDK style)\n *\n * @example\n * ```typescript\n * const google = createGoogle({ apiKey: '...' });\n *\n * // Callable - Vercel AI SDK style\n * const model = google('gemini-2.0-flash');\n *\n * // Also supports method call (backward compatible)\n * const model2 = google.languageModel('gemini-2.0-flash');\n *\n * // Check capabilities\n * const caps = google.getCapabilities('gemini-2.0-flash');\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 // Create the callable function\n const providerFn = (modelId: string) => {\n return createGoogleAdapter({\n apiKey,\n model: modelId,\n baseUrl: config.baseUrl,\n safetySettings: config.safetySettings,\n });\n };\n\n // Get capabilities helper\n const 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,\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,\n supportsSystemMessages: true,\n };\n };\n\n return createCallableProvider(providerFn, {\n name: \"google\",\n supportedModels: Object.keys(GOOGLE_MODELS),\n getCapabilities,\n });\n}\n\n// Alias for consistency\nexport const createGoogleProvider = createGoogle;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { a1 as OllamaProviderConfig, A as AIProvider } from '../../types-C_f95PKp.mjs';
|
|
2
|
+
export { a2 as OllamaModelOptions } from '../../types-C_f95PKp.mjs';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -7,6 +7,11 @@ import 'zod';
|
|
|
7
7
|
*
|
|
8
8
|
* Wraps the existing OllamaAdapter with provider interface.
|
|
9
9
|
* Ollama runs models locally on your machine.
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Tool/function calling support
|
|
13
|
+
* - Vision support (with LLaVA and other vision models)
|
|
14
|
+
* - Ollama-specific options (num_ctx, mirostat, etc.)
|
|
10
15
|
*/
|
|
11
16
|
|
|
12
17
|
/**
|
|
@@ -26,4 +31,4 @@ import 'zod';
|
|
|
26
31
|
declare function createOllama(config?: OllamaProviderConfig): AIProvider;
|
|
27
32
|
declare const createOllamaProvider: typeof createOllama;
|
|
28
33
|
|
|
29
|
-
export { createOllama, createOllamaProvider };
|
|
34
|
+
export { OllamaProviderConfig, createOllama, createOllamaProvider };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { a1 as OllamaProviderConfig, A as AIProvider } from '../../types-C_f95PKp.js';
|
|
2
|
+
export { a2 as OllamaModelOptions } from '../../types-C_f95PKp.js';
|
|
3
3
|
import 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -7,6 +7,11 @@ import 'zod';
|
|
|
7
7
|
*
|
|
8
8
|
* Wraps the existing OllamaAdapter with provider interface.
|
|
9
9
|
* Ollama runs models locally on your machine.
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Tool/function calling support
|
|
13
|
+
* - Vision support (with LLaVA and other vision models)
|
|
14
|
+
* - Ollama-specific options (num_ctx, mirostat, etc.)
|
|
10
15
|
*/
|
|
11
16
|
|
|
12
17
|
/**
|
|
@@ -26,4 +31,4 @@ import 'zod';
|
|
|
26
31
|
declare function createOllama(config?: OllamaProviderConfig): AIProvider;
|
|
27
32
|
declare const createOllamaProvider: typeof createOllama;
|
|
28
33
|
|
|
29
|
-
export { createOllama, createOllamaProvider };
|
|
34
|
+
export { OllamaProviderConfig, createOllama, createOllamaProvider };
|