Skip to content
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
16 changes: 10 additions & 6 deletions lib/crewai/src/crewai/llms/providers/gemini/completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -1361,24 +1361,28 @@ def get_context_window_size(self) -> int:
f"Context window for {key} must be between {min_context} and {max_context}"
)

# Longest prefix first. Always insert new keys in that order so
# startswith prefers gemini-2.0-flash-thinking over gemini-2.0-flash, etc.
context_windows = {
"gemini-3-pro-preview": 1048576, # 1M tokens
"gemini-2.0-flash": 1048576, # 1M tokens
"gemini-2.0-flash-thinking": 32768,
"gemini-2.0-flash-lite": 1048576,
"gemini-2.0-flash": 1048576, # 1M tokens
"gemini-2.5-flash": 1048576,
"gemini-2.5-pro": 1048576,
"gemini-1.5-pro": 2097152, # 2M tokens
"gemini-1.5-flash": 1048576,
"gemini-1.5-flash-8b": 1048576,
"gemini-1.5-flash": 1048576,
"gemini-1.0-pro": 32768,
"gemma-3-1b": 32000,
"gemma-3-4b": 128000,
"gemma-3-12b": 128000,
"gemma-3-27b": 128000,
"gemma-3-12b": 128000,
"gemma-3-4b": 128000,
"gemma-3-1b": 32000,
}

for model_prefix, size in context_windows.items():
for model_prefix, size in sorted(
context_windows.items(), key=lambda item: len(item[0]), reverse=True
):
if self.model.startswith(model_prefix):
return int(size * CONTEXT_WINDOW_USAGE_RATIO)

Expand Down
12 changes: 12 additions & 0 deletions lib/crewai/tests/test_llm.py
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,18 @@ def test_unrecognized_provider_prefix_is_not_stripped() -> None:
)


def test_gemini_thinking_context_window() -> None:
"""Gemini thinking models must not be shadowed by gemini-2.0-flash prefix."""
from crewai.llms.providers.gemini.completion import GeminiCompletion

gemini_thinking = GeminiCompletion(model="gemini-2.0-flash-thinking-exp-01-21")
assert gemini_thinking.get_context_window_size() == int(32768 * CONTEXT_WINDOW_USAGE_RATIO)

gemini_flash = GeminiCompletion(model="gemini-2.0-flash-001")
assert gemini_flash.get_context_window_size() == int(1048576 * CONTEXT_WINDOW_USAGE_RATIO)



@pytest.fixture
def get_weather_tool_schema():
return {
Expand Down