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
10 changes: 10 additions & 0 deletions src/celeste/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,15 @@ def __init__(self, provider: str) -> None:
)


class InvalidToolError(ValidationError):
"""Raised when a tool item is not a Tool instance or dict."""

def __init__(self, item: object) -> None:
"""Initialize with the invalid item."""
self.item = item
super().__init__(f"Expected Tool instance or dict, got {type(item).__name__}")


class UnsupportedParameterError(ValidationError):
"""Raised when a parameter is not supported by a model."""

Expand All @@ -253,6 +262,7 @@ class UnsupportedParameterWarning(UserWarning):
"ClientNotFoundError",
"ConstraintViolationError",
"Error",
"InvalidToolError",
"MissingCredentialsError",
"MissingDependencyError",
"ModalityNotFoundError",
Expand Down
3 changes: 3 additions & 0 deletions src/celeste/protocols/chatcompletions/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from pydantic import BaseModel, TypeAdapter

from celeste.exceptions import InvalidToolError
from celeste.models import Model
from celeste.parameters import FieldMapper, ParameterMapper
from celeste.structured_outputs import StrictJsonSchemaGenerator
Expand Down Expand Up @@ -105,6 +106,8 @@ def map(
tools.append(self._map_user_tool(item))
elif isinstance(item, dict):
tools.append(item)
else:
raise InvalidToolError(item)

return request

Expand Down
3 changes: 3 additions & 0 deletions src/celeste/protocols/openresponses/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from pydantic import BaseModel, TypeAdapter

from celeste.exceptions import InvalidToolError
from celeste.models import Model
from celeste.parameters import FieldMapper, ParameterMapper
from celeste.structured_outputs import StrictJsonSchemaGenerator
Expand Down Expand Up @@ -159,6 +160,8 @@ def map(
tools.append(self._map_user_tool(item))
elif isinstance(item, dict):
tools.append(item)
else:
raise InvalidToolError(item)

return request

Expand Down
3 changes: 3 additions & 0 deletions src/celeste/providers/anthropic/messages/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from pydantic import BaseModel, TypeAdapter

from celeste.exceptions import InvalidToolError
from celeste.models import Model
from celeste.parameters import FieldMapper, ParameterMapper
from celeste.structured_outputs import StrictJsonSchemaGenerator
Expand Down Expand Up @@ -98,6 +99,8 @@ def map(
tools.append(self._map_user_tool(item))
elif isinstance(item, dict):
tools.append(item)
else:
raise InvalidToolError(item)

return request

Expand Down
3 changes: 3 additions & 0 deletions src/celeste/providers/google/generate_content/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from pydantic import BaseModel, TypeAdapter

from celeste.artifacts import ImageArtifact
from celeste.exceptions import InvalidToolError
from celeste.mime_types import ApplicationMimeType
from celeste.models import Model
from celeste.parameters import ParameterMapper
Expand Down Expand Up @@ -213,6 +214,8 @@ def map(
fn_declarations.append(self._map_user_tool(item))
elif isinstance(item, dict):
tools.append(item)
else:
raise InvalidToolError(item)

if fn_declarations:
tools.append({"functionDeclarations": fn_declarations})
Expand Down
23 changes: 23 additions & 0 deletions tests/unit_tests/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
ClientNotFoundError,
ConstraintViolationError,
Error,
InvalidToolError,
MissingCredentialsError,
ModalityNotFoundError,
ModelNotFoundError,
Expand All @@ -16,6 +17,7 @@
UnsupportedCapabilityError,
UnsupportedParameterError,
UnsupportedProviderError,
ValidationError,
)
from celeste.models import Model

Expand Down Expand Up @@ -368,3 +370,24 @@ def test_inherits_from_credentials_error(self) -> None:
exc = UnsupportedProviderError("test_provider")
assert isinstance(exc, CredentialsError)
assert isinstance(exc, Error)


class TestInvalidToolError:
"""Test InvalidToolError exception."""

def test_creates_with_item(self) -> None:
"""Test exception stores the invalid item."""
exc = InvalidToolError(42)
assert exc.item == 42
assert "int" in str(exc)

def test_message_includes_type_name(self) -> None:
"""Test exception message shows the actual type passed."""
exc = InvalidToolError("web_search")
assert str(exc) == "Expected Tool instance or dict, got str"

def test_inherits_from_validation_error(self) -> None:
"""Test InvalidToolError inherits from ValidationError."""
exc = InvalidToolError(42)
assert isinstance(exc, ValidationError)
assert isinstance(exc, Error)
Loading