diff --git a/openagent_eval/exceptions/provider.py b/openagent_eval/exceptions/provider.py index 0d47e3a..a6ed894 100644 --- a/openagent_eval/exceptions/provider.py +++ b/openagent_eval/exceptions/provider.py @@ -12,8 +12,11 @@ class ProviderError(OpenAgentEvalError): message: Human-readable error message. provider_name: Name of the provider that caused the error. details: Additional context about the error. + error_type: Human-readable error type label for standardized formatting. """ + error_type: str = "Provider Error" + def __init__( self, message: str, @@ -34,10 +37,23 @@ def __init__( super().__init__(message=message, details=error_details) self.provider_name = provider_name + def __str__(self) -> str: + """Return standardized string: [provider] error_type: message (details).""" + provider_prefix = f"[{self.provider_name}] " if self.provider_name else "" + base = f"{provider_prefix}{self.error_type}: {self.message}" + if self.details: + details_items = {k: v for k, v in self.details.items() if k != "provider_name"} + if details_items: + details_str = ", ".join(f"{k}={v}" for k, v in details_items.items()) + return f"{base} ({details_str})" + return base + class ProviderNotFoundError(ProviderError): """Raised when a requested provider cannot be found.""" + error_type: str = "Provider Not Found" + def __init__( self, provider_name: str, @@ -70,6 +86,8 @@ class ProviderConnectionError(ProviderError): original_error: The original exception that caused the connection failure. """ + error_type: str = "Connection Error" + def __init__( self, message: str, @@ -100,6 +118,8 @@ class ProviderExecutionError(ProviderError): original_error: The original exception that caused the failure. """ + error_type: str = "Execution Error" + def __init__( self, message: str, diff --git a/tests/unit/test_exceptions.py b/tests/unit/test_exceptions.py index 448a096..387a625 100644 --- a/tests/unit/test_exceptions.py +++ b/tests/unit/test_exceptions.py @@ -134,27 +134,55 @@ class TestProviderError: """Tests for provider errors.""" def test_basic_error(self) -> None: - """Test basic provider error.""" + """Test basic provider error with standardized format.""" error = ProviderError("Invalid provider") - assert str(error) == "Invalid provider" + assert str(error) == "Provider Error: Invalid provider" + assert error.error_type == "Provider Error" + + def test_error_with_provider_name(self) -> None: + """Test provider error with provider name in standardized format.""" + error = ProviderError( + "API key not found", + provider_name="openai", + ) + assert str(error) == "[openai] Provider Error: API key not found" def test_not_found_error(self) -> None: """Test provider not found error.""" error = ProviderNotFoundError("my_provider", available_providers=["openai", "gemini"]) assert error.provider_name == "my_provider" assert error.available_providers == ["openai", "gemini"] + assert error.error_type == "Provider Not Found" + expected = ( + "[my_provider] Provider Not Found: " + "Provider not found: my_provider. Available providers: openai, gemini " + "(available_providers=['openai', 'gemini'])" + ) + assert str(error) == expected def test_connection_error(self) -> None: """Test provider connection error.""" original = ConnectionError("Connection failed") - error = ProviderConnectionError("Failed to connect", original_error=original) + error = ProviderConnectionError( + "Failed to connect", + provider_name="gemini", + original_error=original, + ) assert error.original_error is original + assert error.error_type == "Connection Error" + assert str(error) == "[gemini] Connection Error: Failed to connect (original_error=Connection failed)" def test_execution_error(self) -> None: """Test provider execution error.""" original = RuntimeError("Execution failed") - error = ProviderExecutionError("Failed", original_error=original) + error = ProviderExecutionError( + "API call failed", + provider_name="anthropic", + original_error=original, + ) assert error.original_error is original + assert error.error_type == "Execution Error" + assert str(error) == "[anthropic] Execution Error: API call failed (original_error=Execution failed)" class TestPluginError: