mirror of
https://github.com/Alishahryar1/free-claude-code.git
synced 2026-04-26 10:31:07 +00:00
- Add local web_search/web_fetch SSE handling and optional tool schemas - Extend HeuristicToolParser for JSON-style WebFetch/WebSearch text - Consolidate provider defaults, ids, and exception typing; stream contracts - Messaging: typed options, voice config injection, platform contract cleanup - Tests for web server tools, converters, parsers, contracts; ignore debug-*.log
97 lines
2.5 KiB
Python
97 lines
2.5 KiB
Python
"""Unified exception hierarchy for providers."""
|
|
|
|
from typing import Any
|
|
|
|
|
|
class ProviderError(Exception):
|
|
"""Base exception for all provider errors."""
|
|
|
|
def __init__(
|
|
self,
|
|
message: str,
|
|
status_code: int = 500,
|
|
error_type: str = "api_error",
|
|
raw_error: Any = None,
|
|
):
|
|
super().__init__(message)
|
|
self.message = message
|
|
self.status_code = status_code
|
|
self.error_type = error_type
|
|
self.raw_error = raw_error
|
|
|
|
def to_anthropic_format(self) -> dict:
|
|
"""Convert to Anthropic-compatible error response."""
|
|
return {
|
|
"type": "error",
|
|
"error": {
|
|
"type": self.error_type,
|
|
"message": self.message,
|
|
},
|
|
}
|
|
|
|
|
|
class AuthenticationError(ProviderError):
|
|
"""Raised when API key is invalid or missing."""
|
|
|
|
def __init__(self, message: str, raw_error: Any = None):
|
|
super().__init__(
|
|
message,
|
|
status_code=401,
|
|
error_type="authentication_error",
|
|
raw_error=raw_error,
|
|
)
|
|
|
|
|
|
class InvalidRequestError(ProviderError):
|
|
"""Raised when the request parameters are invalid."""
|
|
|
|
def __init__(self, message: str, raw_error: Any = None):
|
|
super().__init__(
|
|
message,
|
|
status_code=400,
|
|
error_type="invalid_request_error",
|
|
raw_error=raw_error,
|
|
)
|
|
|
|
|
|
class RateLimitError(ProviderError):
|
|
"""Raised when rate limit is exceeded."""
|
|
|
|
def __init__(self, message: str, raw_error: Any = None):
|
|
super().__init__(
|
|
message,
|
|
status_code=429,
|
|
error_type="rate_limit_error",
|
|
raw_error=raw_error,
|
|
)
|
|
|
|
|
|
class OverloadedError(ProviderError):
|
|
"""Raised when the provider is overloaded."""
|
|
|
|
def __init__(self, message: str, raw_error: Any = None):
|
|
super().__init__(
|
|
message,
|
|
status_code=529,
|
|
error_type="overloaded_error",
|
|
raw_error=raw_error,
|
|
)
|
|
|
|
|
|
class APIError(ProviderError):
|
|
"""Raised when the provider returns a generic API error."""
|
|
|
|
def __init__(self, message: str, status_code: int = 500, raw_error: Any = None):
|
|
super().__init__(
|
|
message,
|
|
status_code=status_code,
|
|
error_type="api_error",
|
|
raw_error=raw_error,
|
|
)
|
|
|
|
|
|
class UnknownProviderTypeError(ValueError):
|
|
"""Raised when ``provider_id`` is not registered in the provider map."""
|
|
|
|
def __init__(self, message: str) -> None:
|
|
super().__init__(message)
|