From 56bec1074934a0886c745dfc6253cf1fff09adf0 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 27 Mar 2025 05:02:43 -0700 Subject: [PATCH] feat(providers): added gemini-2.5-pro-exp model --- sim/lib/logs/execution-logger.ts | 2 +- sim/providers/google/index.ts | 85 ++++++++++++++++++++++++++--- sim/providers/model-capabilities.ts | 1 + sim/providers/pricing.ts | 6 ++ sim/providers/utils.ts | 2 +- 5 files changed, 87 insertions(+), 9 deletions(-) diff --git a/sim/lib/logs/execution-logger.ts b/sim/lib/logs/execution-logger.ts index 3f8ec9a35f..b5da468cdd 100644 --- a/sim/lib/logs/execution-logger.ts +++ b/sim/lib/logs/execution-logger.ts @@ -99,7 +99,7 @@ export async function persistExecutionLogs( // Check for agent block and tool calls let metadata: ToolCallMetadata | undefined = undefined - logger.debug('block type', log.blockType) + logger.debug('Block type:', log.blockType) // If this is an agent block if (log.blockType === 'agent' && log.output) { logger.debug('Processing agent block output for tool calls', { diff --git a/sim/providers/google/index.ts b/sim/providers/google/index.ts index 552ba6d430..858b92f14b 100644 --- a/sim/providers/google/index.ts +++ b/sim/providers/google/index.ts @@ -10,8 +10,8 @@ export const googleProvider: ProviderConfig = { name: 'Google', description: "Google's Gemini models", version: '1.0.0', - models: ['gemini-2.0-flash'], - defaultModel: 'gemini-2.0-flash', + models: ['gemini-2.0-flash', 'gemini-2.5-pro-exp-03-25'], + defaultModel: 'gemini-2.5-pro-exp-03-25', executeRequest: async (request: ProviderRequest): Promise => { if (!request.apiKey) { @@ -23,6 +23,7 @@ export const googleProvider: ProviderConfig = { const providerStartTimeISO = new Date(providerStartTime).toISOString() try { + // First try the OpenAI compatibility approach const openai = new OpenAI({ apiKey: request.apiKey, baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', @@ -65,10 +66,13 @@ export const googleProvider: ProviderConfig = { })) : undefined - // Build the request payload - const payload: any = { - model: request.model || 'gemini-2.0-flash', + const requestedModel = request.model || 'gemini-2.0-flash' + + let payload: any = { + model: requestedModel, messages: allMessages, + stream: false, + n: 1, } // Add optional parameters @@ -91,8 +95,75 @@ export const googleProvider: ProviderConfig = { // Make the initial API request const initialCallTime = Date.now() - let currentResponse = await openai.chat.completions.create(payload) - const firstResponseTime = Date.now() - initialCallTime + let currentResponse + let firstResponseTime = 0 + + try { + currentResponse = await openai.chat.completions.create(payload) + firstResponseTime = Date.now() - initialCallTime + } catch (error) { + logger.warn('OpenAI compatibility mode failed, falling back to direct Gemini API', { + error: error instanceof Error ? error.message : String(error), + }) + + // Fall back to direct Gemini API using the native format + const nativeCallStartTime = Date.now() + // Convert OpenAI message format to Gemini format + const geminiContent = allMessages + .map((msg) => { + if (msg.role === 'user') { + return { parts: [{ text: msg.content }] } + } + return null + }) + .filter(Boolean) + + // Build the Gemini native payload + const nativePayload: any = { + contents: geminiContent, + } + + if (request.temperature !== undefined) { + nativePayload.generationConfig = { + temperature: request.temperature, + } + } + + // Make direct call to Gemini API + const response = await fetch( + `https://generativelanguage.googleapis.com/v1beta/models/${requestedModel}:generateContent?key=${request.apiKey}`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(nativePayload), + } + ) + + if (!response.ok) { + throw new Error(`Gemini API error: ${response.status} ${response.statusText}`) + } + + const geminiResponse = await response.json() + + currentResponse = { + choices: [ + { + message: { + content: geminiResponse.candidates[0]?.content?.parts[0]?.text || '', + }, + finish_reason: 'stop', + }, + ], + usage: { + prompt_tokens: 0, + completion_tokens: 0, + total_tokens: 0, + }, + } + firstResponseTime = Date.now() - nativeCallStartTime + } let content = currentResponse.choices[0]?.message?.content || '' let tokens = { diff --git a/sim/providers/model-capabilities.ts b/sim/providers/model-capabilities.ts index 75ef2f7367..0dea66fc90 100644 --- a/sim/providers/model-capabilities.ts +++ b/sim/providers/model-capabilities.ts @@ -9,6 +9,7 @@ export const MODELS_TEMP_RANGE_0_2 = [ 'gpt-4o', // Google models 'gemini-2.0-flash', + 'gemini-2.5-pro-exp-03-25', // Deepseek models 'deepseek-v3', ] diff --git a/sim/providers/pricing.ts b/sim/providers/pricing.ts index 7cdd7f8850..3589fc4cc0 100644 --- a/sim/providers/pricing.ts +++ b/sim/providers/pricing.ts @@ -42,6 +42,12 @@ const modelPricing: ModelPricingMap = { output: 0.4, updatedAt: '2025-03-21', }, + 'gemini-2.5-pro-exp-03-25': { + input: 0.15, + cachedInput: 0.075, + output: 0.6, + updatedAt: '2025-03-25', + }, // Deepseek Models 'deepseek-v3': { diff --git a/sim/providers/utils.ts b/sim/providers/utils.ts index 303d9c8b5b..69975cf364 100644 --- a/sim/providers/utils.ts +++ b/sim/providers/utils.ts @@ -34,7 +34,7 @@ export const providers: Record< }, google: { ...googleProvider, - models: ['gemini-2.0-flash'], + models: ['gemini-2.0-flash', 'gemini-2.5-pro-exp-03-25'], modelPatterns: [/^gemini/], }, deepseek: {