diff --git a/litellm/llms/base_llm/decisions/transformation.py b/litellm/llms/base_llm/decisions/transformation.py index b3df4654a6b..e8e4b77e757 100644 --- a/litellm/llms/base_llm/decisions/transformation.py +++ b/litellm/llms/base_llm/decisions/transformation.py @@ -657,8 +657,8 @@ class BaseDecisionsConfig(ABC): raw_response: httpx.Response, request: DecisionsIRRequest, ) -> DecisionsIRResponse: - payload: Final[object] = _PAYLOAD_ADAPTER.validate_json(raw_response.content) try: + payload: Final[object] = _PAYLOAD_ADAPTER.validate_json(raw_response.content) return self.parse_response(payload, request) except ValidationError as error: raise DecisionsResponseValidationError( diff --git a/tests/unit/llms/base_llm/decisions/test_transform_decisions_response_non_json.py b/tests/unit/llms/base_llm/decisions/test_transform_decisions_response_non_json.py new file mode 100644 index 00000000000..e80d15f57d7 --- /dev/null +++ b/tests/unit/llms/base_llm/decisions/test_transform_decisions_response_non_json.py @@ -0,0 +1,26 @@ +from typing import cast + +import httpx +import pytest + +from litellm.llms.base_llm.decisions.transformation import ( + BaseDecisionsConfig, + DecisionsResponseValidationError, +) +from litellm.types.decisions import DecisionsIRRequest + + +def test_transform_decisions_response_wraps_non_json_body(): + """Regression for #48660: a non-JSON response body raised an unhandled + pydantic ValidationError because `validate_json` ran outside the + try/except. It must surface as DecisionsResponseValidationError instead.""" + config = BaseDecisionsConfig() + raw_response = httpx.Response(status_code=502, content=b"Bad Gateway") + + with pytest.raises(DecisionsResponseValidationError): + config.transform_decisions_response( + model="jev-latest", + custom_llm_provider="systemone", + raw_response=raw_response, + request=cast(DecisionsIRRequest, None), + )