diff --git a/providers/gemini.py b/providers/gemini.py index 90831ab..fc142c6 100644 --- a/providers/gemini.py +++ b/providers/gemini.py @@ -173,6 +173,15 @@ class GeminiModelProvider(RegistryBackedProviderMixin, ModelProvider): # Create contents structure contents = [{"parts": parts}] + # Gemini 3 Pro Preview currently rejects medium thinking budgets; bump to high. + effective_thinking_mode = thinking_mode + if resolved_model_name == "gemini-3-pro-preview" and thinking_mode == "medium": + logger.debug( + "Overriding thinking mode 'medium' with 'high' for %s due to launch limitation", + resolved_model_name, + ) + effective_thinking_mode = "high" + # Prepare generation config generation_config = types.GenerateContentConfig( temperature=temperature, @@ -184,12 +193,12 @@ class GeminiModelProvider(RegistryBackedProviderMixin, ModelProvider): generation_config.max_output_tokens = max_output_tokens # Add thinking configuration for models that support it - if capabilities.supports_extended_thinking and thinking_mode in self.THINKING_BUDGETS: + if capabilities.supports_extended_thinking and effective_thinking_mode in self.THINKING_BUDGETS: # Get model's max thinking tokens and calculate actual budget model_config = capability_map.get(resolved_model_name) if model_config and model_config.max_thinking_tokens > 0: max_thinking_tokens = model_config.max_thinking_tokens - actual_thinking_budget = int(max_thinking_tokens * self.THINKING_BUDGETS[thinking_mode]) + actual_thinking_budget = int(max_thinking_tokens * self.THINKING_BUDGETS[effective_thinking_mode]) generation_config.thinking_config = types.ThinkingConfig(thinking_budget=actual_thinking_budget) # Retry logic with progressive delays @@ -279,7 +288,7 @@ class GeminiModelProvider(RegistryBackedProviderMixin, ModelProvider): friendly_name="Gemini", provider=ProviderType.GOOGLE, metadata={ - "thinking_mode": thinking_mode if capabilities.supports_extended_thinking else None, + "thinking_mode": effective_thinking_mode if capabilities.supports_extended_thinking else None, "finish_reason": finish_reason_str, "is_blocked_by_safety": is_blocked_by_safety, "safety_feedback": safety_feedback_details,