Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/celeste/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,13 @@ def _handle_error_response(self, response: httpx.Response) -> None:
if not response.is_success:
try:
error_msg = response.json()["error"]["message"]
except (JSONDecodeError, KeyError, TypeError, IndexError):
except (
JSONDecodeError,
KeyError,
TypeError,
IndexError,
UnicodeDecodeError,
):
error_msg = response.text or f"HTTP {response.status_code}"

raise httpx.HTTPStatusError(
Expand Down
31 changes: 31 additions & 0 deletions tests/unit_tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from enum import StrEnum
from typing import Any, Unpack

import httpx
import pytest
from pydantic import SecretStr

Expand Down Expand Up @@ -261,6 +262,36 @@ def parameter_mappers(cls) -> list[ParameterMapper]:
assert transformed == expected_output


class TestHandleErrorResponse:
"""Test ModalityClient._handle_error_response edge cases."""

@pytest.mark.parametrize(
"content",
[
b"\xff random binary",
b"\xff\xfe\x00\x00 utf-32-le bom",
b"\x80\x81\x82\x83",
],
ids=["0xff-byte", "utf-32-le-bom", "high-bytes"],
)
def test_binary_error_body_raises_http_status_error(
self, text_model: Model, api_key: str, content: bytes
) -> None:
"""Binary error bodies produce HTTPStatusError, not UnicodeDecodeError (GH-170)."""
client = ConcreteModalityClient(
modality=Modality.TEXT,
model=text_model,
provider=text_model.provider,
auth=APIKey(secret=SecretStr(api_key)),
)
response = httpx.Response(
500, content=content, request=httpx.Request("POST", "https://api.test.com")
)

with pytest.raises(httpx.HTTPStatusError):
client._handle_error_response(response)


class TestModalityClientStreaming:
"""Test ModalityClient._stream default behavior."""

Expand Down
Loading