From e16531d3c7a801e5b1f7267cc62f950122b03be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=90=8D=E9=94=90?= <1565842059@qq.com> Date: Fri, 28 Aug 2026 20:36:31 +0800 Subject: [PATCH 1/2] fix(gemini): place longest model prefix first in context_windows (fix #7129) --- .../src/crewai/llms/providers/gemini/completion.py | 12 +++++++----- lib/crewai/tests/test_llm.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/crewai/src/crewai/llms/providers/gemini/completion.py b/lib/crewai/src/crewai/llms/providers/gemini/completion.py index b099fe2373..8f079d2ddd 100644 --- a/lib/crewai/src/crewai/llms/providers/gemini/completion.py +++ b/lib/crewai/src/crewai/llms/providers/gemini/completion.py @@ -1353,21 +1353,23 @@ 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(): diff --git a/lib/crewai/tests/test_llm.py b/lib/crewai/tests/test_llm.py index 51c87cd0ea..bef7d44b92 100644 --- a/lib/crewai/tests/test_llm.py +++ b/lib/crewai/tests/test_llm.py @@ -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 { From 80ca7fd368ec0810f4933ee26fee579f148a1799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=90=8D=E9=94=90?= <1565842059@qq.com> Date: Mon, 31 Aug 2026 00:00:00 +0800 Subject: [PATCH 2/2] fix(gemini): match specific context windows first --- lib/crewai/src/crewai/llms/providers/gemini/completion.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/crewai/src/crewai/llms/providers/gemini/completion.py b/lib/crewai/src/crewai/llms/providers/gemini/completion.py index 8f079d2ddd..2d01be700c 100644 --- a/lib/crewai/src/crewai/llms/providers/gemini/completion.py +++ b/lib/crewai/src/crewai/llms/providers/gemini/completion.py @@ -1372,7 +1372,9 @@ def get_context_window_size(self) -> int: "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)