FFFF
Skip to content
7440
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions conf/gemini_models.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,72 @@
}
},
"models": [
{
"model_name": "gemini-3.1-pro-preview",
"friendly_name": "Gemini 3.1 Pro Preview",
"aliases": [
"gemini-3.1-pro",
"gemini31pro",
"pro-3.1"
],
"intelligence_score": 19,
"description": "Latest Gemini 3.1 preview with advanced reasoning, coding, and multimodal capabilities",
"context_window": 1048576,
"max_output_tokens": 65536,
"max_thinking_tokens": 32768,
"supports_extended_thinking": true,
"supports_system_prompts": true,
"supports_streaming": true,
"supports_function_calling": true,
"supports_json_mode": true,
"supports_images": true,
"supports_temperature": true,
"allow_code_generation": true,
"max_image_size_mb": 32.0
},
{
"model_name": "gemini-3-flash-preview",
"friendly_name": "Gemini 3 Flash Preview",
"aliases": [
"gemini-3-flash",
"flash-3",
"flash3"
],
"intelligence_score": 11,
"description": "Latest Gemini 3 Flash preview with frontier-class performance at Flash latency and pricing",
"context_window": 1048576,
"max_output_tokens": 65536,
"max_thinking_tokens": 24576,
"supports_extended_thinking": true,
"supports_system_prompts": true,
"supports_streaming": true,
"supports_function_calling": true,
"supports_json_mode": true,
"supports_images": true,
"supports_temperature": true,
"max_image_size_mb": 20.0
},
{
"model_name": "gemini-3.1-flash-lite-preview",
"friendly_name": "Gemini 3.1 Flash-Lite Preview",
"aliases": [
"gemini-3.1-flash-lite",
"flash-lite-3.1",
"flashlite3.1"
],
"intelligence_score": 8,
"description": "Latest Gemini 3.1 Flash-Lite preview for low-cost, high-volume multimodal workloads",
"context_window": 1048576,
"max_output_tokens": 65536,
"supports_extended_thinking": true,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The model gemini-3.1-flash-lite-preview has supports_extended_thinking set to true, but it is missing the max_thinking_tokens field. In providers/gemini.py, the thinking budget calculation (lines 196-202) requires max_thinking_tokens > 0. Without this field, the model will claim to support extended thinking but will never actually use it because the budget calculation will be skipped. Given that other 'Lite' models (like gemini-2.0-flash-lite on line 170) do not support this feature, please verify if this should be false or if a max_thinking_tokens value needs to be added.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Define thinking budget for flash-lite preview entry

This new model is marked with supports_extended_thinking: true, but the same object omits max_thinking_tokens. In GeminiModelProvider.generate_content (providers/gemini.py), the thinking config is only sent when max_thinking_tokens > 0, so thinking_mode will be silently ignored for gemini-3.1-flash-lite-preview even though capability metadata advertises thinking support. That can cause inconsistent behavior in auto/reasoning flows that choose this model based on the thinking flag.

Useful? React with 👍 / 👎.

"supports_system_prompts": true,
"supports_streaming": true,
"supports_function_calling": true,
"supports_json_mode": true,
"supports_images": true,
"supports_temperature": true,
"max_image_size_mb": 20.0
},
{
"model_name": "gemini-3-pro-preview",
"friendly_name": "Gemini Pro 3.0 Preview",
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
name = "pal-mcp-server"
version = "9.8.2"
description = "AI-powered MCP server with multiple model providers"
requires-python = ">=3.9"
requires-python = ">=3.10"
dependencies = [
"mcp>=1.0.0",
"google-genai>=1.19.0",
Expand Down
21 changes: 19 additions & 2 deletions tests/test_model_restrictions.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ def fake_get_provider(provider_type, force_new=False):
return mapping.get(provider_type)

with patch.object(ModelProviderRegistry, "get_provider", side_effect=fake_get_provider):

service = ModelRestrictionService()

# Check OpenAI models
Expand Down Expand Up @@ -170,6 +169,25 @@ def test_validation_against_known_models(self, caplog):
assert "o4-mimi" in caplog.text
assert "not a recognized" in caplog.text

def test_latest_gemini_preview_model_names_work_in_restrictions(self):
"""Test exact latest Gemini preview model IDs are accepted in restrictions."""
with patch.dict(os.environ, {"GOOGLE_ALLOWED_MODELS": "gemini-3.1-pro-preview,gemini-3-flash-preview"}):
gemini_provider = GeminiModelProvider(api_key="test-key")

from providers.registry import ModelProviderRegistry

def fake_get_provider(provider_type, force_new=False):
if provider_type is ProviderType.GOOGLE:
return gemini_provider
return None

with patch.object(ModelProviderRegistry, "get_provider", side_effect=fake_get_provider):
service = ModelRestrictionService()

assert service.is_allowed(ProviderType.GOOGLE, "gemini-3.1-pro-preview")
assert service.is_allowed(ProviderType.GOOGLE, "gemini-3-flash-preview")
assert not service.is_allowed(ProviderType.GOOGLE, "gemini-2.5-flash")

def test_openrouter_model_restrictions(self):
"""Test OpenRouter model restrictions functionality."""
with patch.dict(os.environ, {"OPENROUTER_ALLOWED_MODELS": "opus,sonnet"}):
Expand Down Expand Up @@ -302,7 +320,6 @@ def test_gemini_parameter_order_regression_protection(self):
from providers.registry import ModelProviderRegistry

with patch.object(ModelProviderRegistry, "get_provider", return_value=provider):

# Test case: Only alias "flash" is allowed, not the full name
# If parameters are in wrong order, this test will catch it

Expand Down
13 changes: 13 additions & 0 deletions tests/test_supported_models_aliases.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,19 @@ def test_gemini_provider_aliases(self):
assert provider._resolve_model_name("Flash") == "gemini-2.5-flash"
assert provider._resolve_model_name("PRO") == "gemini-3-pro-preview"

def test_gemini_latest_preview_models_are_available(self):
"""Test latest Gemini preview model IDs are recognized."""
provider = Gem 402E iniModelProvider("test-key")

assert "gemini-3.1-pro-preview" in provider.MODEL_CAPABILITIES
assert "gemini-3-flash-preview" in provider.MODEL_CAPABILITIES
assert "gemini-3.1-flash-lite-preview" in provider.MODEL_CAPABILITIES

assert provider._resolve_model_name("gemini-3.1-pro-preview") == "gemini-3.1-pro-preview"
assert provider._resolve_model_name("gemini-3-flash-preview") == "gemini-3-flash-preview"
assert provider._resolve_model_name("gemini31pro") == "gemini-3.1-pro-preview"
assert provider._resolve_model_name("flash3") == "gemini-3-flash-preview"

def test_openai_provider_aliases(self):
"""Test OpenAI provider's alias structure."""
provider = OpenAIModelProvider("test-key")
Expand Down
Loading
2AA2
0