diff --git a/litellm/integrations/opentelemetry.py b/litellm/integrations/opentelemetry.py index b847180174a..d75a5501013 100644 --- a/litellm/integrations/opentelemetry.py +++ b/litellm/integrations/opentelemetry.py @@ -1051,23 +1051,15 @@ class OpenTelemetry(CustomLogger): # See: https://github.com/open-telemetry/opentelemetry-python/pull/4676 # TODO: Refactor to use the proper OTEL Logs API instead of directly creating SDK LogRecords - from opentelemetry._logs import ( - SeverityNumber, - get_logger, - ) - - # MyPy evaluates both branches of try/except imports and can fail when - # newer OTEL stubs remove/relocate symbols. Gate the typing import so - # only the canonical location is type-checked. - if TYPE_CHECKING: - from opentelemetry.sdk._logs._internal import LogRecord as SdkLogRecord - else: - try: - from opentelemetry.sdk._logs import ( - LogRecord as SdkLogRecord, # type: ignore[attr-defined] - ) - except ImportError: - from opentelemetry.sdk._logs._internal import LogRecord as SdkLogRecord + from opentelemetry._logs import SeverityNumber, get_logger, get_logger_provider + try: + from opentelemetry.sdk._logs import ( # type: ignore[attr-defined] # OTEL < 1.39.0 + LogRecord as SdkLogRecord, + ) + except ImportError: + from opentelemetry.sdk._logs._internal import ( + LogRecord as SdkLogRecord, # type: ignore[attr-defined] # OTEL >= 1.39.0 + ) otel_logger = get_logger(LITELLM_LOGGER_NAME) diff --git a/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_anthropic_experimental_pass_through_messages_handler.py b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_anthropic_experimental_pass_through_messages_handler.py index 80fd3ab698a..381a719747f 100644 --- a/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_anthropic_experimental_pass_through_messages_handler.py +++ b/tests/test_litellm/llms/anthropic/experimental_pass_through/messages/test_anthropic_experimental_pass_through_messages_handler.py @@ -102,13 +102,17 @@ async def test_bedrock_converse_budget_tokens_preserved(): and losing the original budget_tokens value, causing it to use the default (128) instead. """ client = AsyncHTTPHandler() - - with patch.object(client, "post") as mock_post: - mock_response = AsyncMock() + + with patch.object(client, "post", new=AsyncMock()) as mock_post: + # Use MagicMock for response to avoid unawaited coroutine warnings + # AsyncMock auto-creates async child methods which causes issues + mock_response = MagicMock() mock_response.status_code = 200 mock_response.headers = {} mock_response.text = "mock response" - mock_response.json.return_value = { + # Explicitly set raise_for_status as a no-op to prevent auto-async behavior + mock_response.raise_for_status = MagicMock(return_value=None) + mock_response.json = MagicMock(return_value={ "output": { "message": { "role": "assistant", @@ -121,8 +125,10 @@ async def test_bedrock_converse_budget_tokens_preserved(): "outputTokens": 5, "totalTokens": 15 } - } + }) + # Use AsyncMock for the post method itself since it's async mock_post.return_value = mock_response + mock_post.side_effect = None # Clear any default side_effect from patch.object try: await messages.acreate(