Fix Python 3.11 validation test failures: Remove global logger state and improve error handling

- Remove global _litellm_logger variable that could interfere with exception propagation
- Add proper error handling around logger.setLevel() operations
- Update tests to reflect removal of global caching
- Ensure context manager is fully isolated and doesn't affect validation methods

Co-Authored-By: João <joao@crewai.com>
This commit is contained in:
Devin AI
2025-06-12 00:37:20 +00:00
parent 8538646f47
commit 0938968a20
2 changed files with 21 additions and 28 deletions

View File

@@ -201,16 +201,11 @@ def suppress_warnings():
yield
_litellm_logger = None
@contextmanager
def suppress_litellm_output():
"""Contextually suppress litellm-related logging output during LLM calls."""
global _litellm_logger
if _litellm_logger is None:
_litellm_logger = logging.getLogger("litellm")
original_level = _litellm_logger.level
litellm_logger = logging.getLogger("litellm")
original_level = litellm_logger.level
warning_patterns = [
".*give feedback.*",
@@ -224,14 +219,18 @@ def suppress_litellm_output():
for pattern in warning_patterns:
warnings.filterwarnings("ignore", message=pattern)
_litellm_logger.setLevel(logging.WARNING)
try:
litellm_logger.setLevel(logging.WARNING)
except Exception as e:
logging.debug(f"Error setting logger level: {e}")
yield
except Exception as e:
logging.debug(f"Error in litellm output suppression: {e}")
raise
finally:
try:
_litellm_logger.setLevel(original_level)
litellm_logger.setLevel(original_level)
except Exception as e:
logging.debug(f"Error restoring logger level: {e}")

View File

@@ -136,28 +136,22 @@ def test_concurrent_llm_calls():
assert all("test response" in result for result in results)
def test_logger_caching_performance():
"""Test that logger instance is cached for performance."""
def test_logger_performance():
"""Test that logger operations work correctly without global caching."""
from crewai.llm import suppress_litellm_output
import crewai.llm
original_logger = crewai.llm._litellm_logger
crewai.llm._litellm_logger = None
try:
with patch('logging.getLogger') as mock_get_logger:
mock_logger = MagicMock()
mock_get_logger.return_value = mock_logger
with patch('logging.getLogger') as mock_get_logger:
mock_logger = MagicMock()
mock_get_logger.return_value = mock_logger
with suppress_litellm_output():
pass
with suppress_litellm_output():
pass
with suppress_litellm_output():
pass
with suppress_litellm_output():
pass
mock_get_logger.assert_called_once_with("litellm")
finally:
crewai.llm._litellm_logger = original_logger
assert mock_get_logger.call_count == 2
mock_get_logger.assert_called_with("litellm")
def test_suppression_error_handling():