From e3c5c174eeabd637637687b3b9dbb57605ff2d09 Mon Sep 17 00:00:00 2001 From: "devin-ai-integration[bot]" <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:32:14 -0500 Subject: [PATCH] feat: add context window size for o3-mini model (#2192) * feat: add context window size for o3-mini model Fixes #2191 Co-Authored-By: Joe Moura * feat: add context window validation and tests - Add validation for context window size bounds (1024-2097152) - Add test for context window validation - Fix test import error Co-Authored-By: Joe Moura * style: fix import sorting in llm_test.py Co-Authored-By: Joe Moura --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Joe Moura Co-authored-by: Brandon Hancock (bhancock_ai) <109994880+bhancockio@users.noreply.github.com> --- src/crewai/llm.py | 14 ++++++++++++++ tests/llm_test.py | 19 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/crewai/llm.py b/src/crewai/llm.py index 2eefa8934..0c8a46214 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -64,6 +64,7 @@ LLM_CONTEXT_WINDOW_SIZES = { "gpt-4-turbo": 128000, "o1-preview": 128000, "o1-mini": 128000, + "o3-mini": 200000, # Based on official o3-mini specifications # gemini "gemini-2.0-flash": 1048576, "gemini-1.5-pro": 2097152, @@ -485,10 +486,23 @@ class LLM: """ Returns the context window size, using 75% of the maximum to avoid cutting off messages mid-thread. + + Raises: + ValueError: If a model's context window size is outside valid bounds (1024-2097152) """ if self.context_window_size != 0: return self.context_window_size + MIN_CONTEXT = 1024 + MAX_CONTEXT = 2097152 # Current max from gemini-1.5-pro + + # Validate all context window sizes + for key, value in LLM_CONTEXT_WINDOW_SIZES.items(): + if value < MIN_CONTEXT or value > MAX_CONTEXT: + raise ValueError( + f"Context window for {key} must be between {MIN_CONTEXT} and {MAX_CONTEXT}" + ) + self.context_window_size = int( DEFAULT_CONTEXT_WINDOW_SIZE * CONTEXT_WINDOW_USAGE_RATIO ) diff --git a/tests/llm_test.py b/tests/llm_test.py index 00bb69aa5..61aa1aced 100644 --- a/tests/llm_test.py +++ b/tests/llm_test.py @@ -6,7 +6,7 @@ import pytest from pydantic import BaseModel from crewai.agents.agent_builder.utilities.base_token_process import TokenProcess -from crewai.llm import LLM +from crewai.llm import CONTEXT_WINDOW_USAGE_RATIO, LLM from crewai.utilities.events import crewai_event_bus from crewai.utilities.events.tool_usage_events import ToolExecutionErrorEvent from crewai.utilities.token_counter_callback import TokenCalcHandler @@ -285,6 +285,23 @@ def test_o3_mini_reasoning_effort_medium(): assert isinstance(result, str) assert "Paris" in result +def test_context_window_validation(): + """Test that context window validation works correctly.""" + # Test valid window size + llm = LLM(model="o3-mini") + assert llm.get_context_window_size() == int(200000 * CONTEXT_WINDOW_USAGE_RATIO) + + # Test invalid window size + with pytest.raises(ValueError) as excinfo: + with patch.dict( + "crewai.llm.LLM_CONTEXT_WINDOW_SIZES", + {"test-model": 500}, # Below minimum + clear=True, + ): + llm = LLM(model="test-model") + llm.get_context_window_size() + assert "must be between 1024 and 2097152" in str(excinfo.value) + @pytest.mark.vcr(filter_headers=["authorization"]) @pytest.fixture