From 6d8aae7362ad22d745a5d7a8126a42491f09d46c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moura?= Date: Sun, 8 Jun 2025 21:10:47 -0700 Subject: [PATCH] fixing tests --- src/crewai/llm.py | 7 ++++++- tests/conftest.py | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/crewai/llm.py b/src/crewai/llm.py index f30ed080f..bfd148d8f 100644 --- a/src/crewai/llm.py +++ b/src/crewai/llm.py @@ -405,12 +405,17 @@ class LLM(BaseLLM): "base_url": self.base_url, "api_version": self.api_version, "api_key": self.api_key, - "stream": self.stream, "tools": tools, "reasoning_effort": self.reasoning_effort, **self.additional_params, } + # Only include stream parameter if we're actually streaming + # This maintains backward compatibility with VCR cassettes + # that were recorded without the stream parameter + if self.stream: + params["stream"] = True + # Remove None values from params return {k: v for k, v in params.items() if v is not None} diff --git a/tests/conftest.py b/tests/conftest.py index 2a6f3b481..025f07cc6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -42,10 +42,58 @@ def setup_test_environment(): # Cleanup is handled automatically when tempfile context exits +def filter_stream_parameter(request): + """Filter out stream parameter from request body to maintain VCR compatibility.""" + if hasattr(request, 'body') and request.body: + try: + import json + # Check if it's likely JSON content + if hasattr(request, 'headers') and request.headers: + content_type = request.headers.get('content-type', '').lower() + if 'application/json' not in content_type: + return request + + # Try to decode and parse the body + if isinstance(request.body, bytes): + try: + body_str = request.body.decode('utf-8') + except UnicodeDecodeError: + # If we can't decode it, it's probably binary data, leave it as is + return request + else: + body_str = request.body + + body = json.loads(body_str) + # Remove stream parameter to match original recordings + if 'stream' in body: + body.pop('stream') + request.body = json.dumps(body).encode() if isinstance(request.body, bytes) else json.dumps(body) + except (json.JSONDecodeError, AttributeError, TypeError): + # If we can't parse the body, leave it as is + pass + return request + + +@pytest.fixture(autouse=True) +def configure_litellm_for_testing(): + """Configure litellm to work better with VCR cassettes.""" + import litellm + + # Disable litellm's internal streaming optimizations that might conflict with VCR + original_drop_params = litellm.drop_params + litellm.drop_params = True + + yield + + # Restore original setting + litellm.drop_params = original_drop_params + + @pytest.fixture(scope="module") def vcr_config(request) -> dict: return { "cassette_library_dir": "tests/cassettes", "record_mode": "new_episodes", "filter_headers": [("authorization", "AUTHORIZATION-XXX")], + "before_record_request": filter_stream_parameter, }