Initial commit: OpenRouter Python SDK

Auto-generated Python SDK for OpenRouter API, providing comprehensive client library with:
- Chat completions and streaming support
- Embeddings API
- Model and provider information
- API key management
- Analytics and usage tracking
- OAuth authentication flows
- Full type hints and error handling
This commit is contained in:
Matt Apperson
2025-11-13 10:56:25 -05:00
commit 5fc522c72f
721 changed files with 45654 additions and 0 deletions
+177
View File
@@ -0,0 +1,177 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from .openroutererror import OpenRouterError
from typing import TYPE_CHECKING
from importlib import import_module
import builtins
import sys
if TYPE_CHECKING:
from .badgatewayresponse_error import (
BadGatewayResponseError,
BadGatewayResponseErrorData,
)
from .badrequestresponse_error import (
BadRequestResponseError,
BadRequestResponseErrorData,
)
from .chaterror import ChatError, ChatErrorData
from .edgenetworktimeoutresponse_error import (
EdgeNetworkTimeoutResponseError,
EdgeNetworkTimeoutResponseErrorData,
)
from .forbiddenresponse_error import (
ForbiddenResponseError,
ForbiddenResponseErrorData,
)
from .internalserverresponse_error import (
InternalServerResponseError,
InternalServerResponseErrorData,
)
from .no_response_error import NoResponseError
from .notfoundresponse_error import NotFoundResponseError, NotFoundResponseErrorData
from .openrouterdefaulterror import OpenRouterDefaultError
from .payloadtoolargeresponse_error import (
PayloadTooLargeResponseError,
PayloadTooLargeResponseErrorData,
)
from .paymentrequiredresponse_error import (
PaymentRequiredResponseError,
PaymentRequiredResponseErrorData,
)
from .provideroverloadedresponse_error import (
ProviderOverloadedResponseError,
ProviderOverloadedResponseErrorData,
)
from .requesttimeoutresponse_error import (
RequestTimeoutResponseError,
RequestTimeoutResponseErrorData,
)
from .responsevalidationerror import ResponseValidationError
from .serviceunavailableresponse_error import (
ServiceUnavailableResponseError,
ServiceUnavailableResponseErrorData,
)
from .toomanyrequestsresponse_error import (
TooManyRequestsResponseError,
TooManyRequestsResponseErrorData,
)
from .unauthorizedresponse_error import (
UnauthorizedResponseError,
UnauthorizedResponseErrorData,
)
from .unprocessableentityresponse_error import (
UnprocessableEntityResponseError,
UnprocessableEntityResponseErrorData,
)
__all__ = [
"BadGatewayResponseError",
"BadGatewayResponseErrorData",
"BadRequestResponseError",
"BadRequestResponseErrorData",
"ChatError",
"ChatErrorData",
"EdgeNetworkTimeoutResponseError",
"EdgeNetworkTimeoutResponseErrorData",
"ForbiddenResponseError",
"ForbiddenResponseErrorData",
"InternalServerResponseError",
"InternalServerResponseErrorData",
"NoResponseError",
"NotFoundResponseError",
"NotFoundResponseErrorData",
"OpenRouterDefaultError",
"OpenRouterError",
"PayloadTooLargeResponseError",
"PayloadTooLargeResponseErrorData",
"PaymentRequiredResponseError",
"PaymentRequiredResponseErrorData",
"ProviderOverloadedResponseError",
"ProviderOverloadedResponseErrorData",
"RequestTimeoutResponseError",
"RequestTimeoutResponseErrorData",
"ResponseValidationError",
"ServiceUnavailableResponseError",
"ServiceUnavailableResponseErrorData",
"TooManyRequestsResponseError",
"TooManyRequestsResponseErrorData",
"UnauthorizedResponseError",
"UnauthorizedResponseErrorData",
"UnprocessableEntityResponseError",
"UnprocessableEntityResponseErrorData",
]
_dynamic_imports: dict[str, str] = {
"BadGatewayResponseError": ".badgatewayresponse_error",
"BadGatewayResponseErrorData": ".badgatewayresponse_error",
"BadRequestResponseError": ".badrequestresponse_error",
"BadRequestResponseErrorData": ".badrequestresponse_error",
"ChatError": ".chaterror",
"ChatErrorData": ".chaterror",
"EdgeNetworkTimeoutResponseError": ".edgenetworktimeoutresponse_error",
"EdgeNetworkTimeoutResponseErrorData": ".edgenetworktimeoutresponse_error",
"ForbiddenResponseError": ".forbiddenresponse_error",
"ForbiddenResponseErrorData": ".forbiddenresponse_error",
"InternalServerResponseError": ".internalserverresponse_error",
"InternalServerResponseErrorData": ".internalserverresponse_error",
"NoResponseError": ".no_response_error",
"NotFoundResponseError": ".notfoundresponse_error",
"NotFoundResponseErrorData": ".notfoundresponse_error",
"OpenRouterDefaultError": ".openrouterdefaulterror",
"PayloadTooLargeResponseError": ".payloadtoolargeresponse_error",
"PayloadTooLargeResponseErrorData": ".payloadtoolargeresponse_error",
"PaymentRequiredResponseError": ".paymentrequiredresponse_error",
"PaymentRequiredResponseErrorData": ".paymentrequiredresponse_error",
"ProviderOverloadedResponseError": ".provideroverloadedresponse_error",
"ProviderOverloadedResponseErrorData": ".provideroverloadedresponse_error",
"RequestTimeoutResponseError": ".requesttimeoutresponse_error",
"RequestTimeoutResponseErrorData": ".requesttimeoutresponse_error",
"ResponseValidationError": ".responsevalidationerror",
"ServiceUnavailableResponseError": ".serviceunavailableresponse_error",
"ServiceUnavailableResponseErrorData": ".serviceunavailableresponse_error",
"TooManyRequestsResponseError": ".toomanyrequestsresponse_error",
"TooManyRequestsResponseErrorData": ".toomanyrequestsresponse_error",
"UnauthorizedResponseError": ".unauthorizedresponse_error",
"UnauthorizedResponseErrorData": ".unauthorizedresponse_error",
"UnprocessableEntityResponseError": ".unprocessableentityresponse_error",
"UnprocessableEntityResponseErrorData": ".unprocessableentityresponse_error",
}
def dynamic_import(modname, retries=3):
for attempt in range(retries):
try:
return import_module(modname, __package__)
except KeyError:
# Clear any half-initialized module and retry
sys.modules.pop(modname, None)
if attempt == retries - 1:
break
raise KeyError(f"Failed to import module '{modname}' after {retries} attempts")
def __getattr__(attr_name: str) -> object:
module_name = _dynamic_imports.get(attr_name)
if module_name is None:
raise AttributeError(
f"No {attr_name} found in _dynamic_imports for module name -> {__name__} "
)
try:
module = dynamic_import(module_name)
result = getattr(module, attr_name)
return result
except ImportError as e:
raise ImportError(
f"Failed to import {attr_name} from {module_name}: {e}"
) from e
except AttributeError as e:
raise AttributeError(
f"Failed to get {attr_name} from {module_name}: {e}"
) from e
def __dir__():
lazy_attrs = builtins.list(_dynamic_imports.keys())
return builtins.sorted(lazy_attrs)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
badgatewayresponseerrordata as models_badgatewayresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class BadGatewayResponseErrorData(BaseModel):
error: models_badgatewayresponseerrordata.BadGatewayResponseErrorData
r"""Error data for BadGatewayResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class BadGatewayResponseError(OpenRouterError):
r"""Bad Gateway - Provider/upstream API failure"""
data: BadGatewayResponseErrorData = field(hash=False)
def __init__(
self,
data: BadGatewayResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
badrequestresponseerrordata as models_badrequestresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class BadRequestResponseErrorData(BaseModel):
error: models_badrequestresponseerrordata.BadRequestResponseErrorData
r"""Error data for BadRequestResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class BadRequestResponseError(OpenRouterError):
r"""Bad Request - Invalid request parameters or malformed input"""
data: BadRequestResponseErrorData = field(hash=False)
def __init__(
self,
data: BadRequestResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
+29
View File
@@ -0,0 +1,29 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import chaterror as models_chaterror
from openrouter.types import BaseModel
from typing import Optional
class ChatErrorData(BaseModel):
error: models_chaterror.ChatErrorError
@dataclass(unsafe_hash=True)
class ChatError(OpenRouterError):
data: ChatErrorData = field(hash=False)
def __init__(
self,
data: ChatErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,38 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
edgenetworktimeoutresponseerrordata as models_edgenetworktimeoutresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class EdgeNetworkTimeoutResponseErrorData(BaseModel):
error: (
models_edgenetworktimeoutresponseerrordata.EdgeNetworkTimeoutResponseErrorData
)
r"""Error data for EdgeNetworkTimeoutResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class EdgeNetworkTimeoutResponseError(OpenRouterError):
r"""Infrastructure Timeout - Provider request timed out at edge network"""
data: EdgeNetworkTimeoutResponseErrorData = field(hash=False)
def __init__(
self,
data: EdgeNetworkTimeoutResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
forbiddenresponseerrordata as models_forbiddenresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class ForbiddenResponseErrorData(BaseModel):
error: models_forbiddenresponseerrordata.ForbiddenResponseErrorData
r"""Error data for ForbiddenResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class ForbiddenResponseError(OpenRouterError):
r"""Forbidden - Authentication successful but insufficient permissions"""
data: ForbiddenResponseErrorData = field(hash=False)
def __init__(
self,
data: ForbiddenResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
internalserverresponseerrordata as models_internalserverresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class InternalServerResponseErrorData(BaseModel):
error: models_internalserverresponseerrordata.InternalServerResponseErrorData
r"""Error data for InternalServerResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class InternalServerResponseError(OpenRouterError):
r"""Internal Server Error - Unexpected server error"""
data: InternalServerResponseErrorData = field(hash=False)
def __init__(
self,
data: InternalServerResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,17 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from dataclasses import dataclass
@dataclass(unsafe_hash=True)
class NoResponseError(Exception):
"""Error raised when no HTTP response is received from the server."""
message: str
def __init__(self, message: str = "No response received"):
object.__setattr__(self, "message", message)
super().__init__(message)
def __str__(self):
return self.message
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
notfoundresponseerrordata as models_notfoundresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class NotFoundResponseErrorData(BaseModel):
error: models_notfoundresponseerrordata.NotFoundResponseErrorData
r"""Error data for NotFoundResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class NotFoundResponseError(OpenRouterError):
r"""Not Found - Resource does not exist"""
data: NotFoundResponseErrorData = field(hash=False)
def __init__(
self,
data: NotFoundResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,40 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
import httpx
from typing import Optional
from dataclasses import dataclass
from openrouter.errors import OpenRouterError
MAX_MESSAGE_LEN = 10_000
@dataclass(unsafe_hash=True)
class OpenRouterDefaultError(OpenRouterError):
"""The fallback error class if no more specific error class is matched."""
def __init__(
self, message: str, raw_response: httpx.Response, body: Optional[str] = None
):
body_display = body or raw_response.text or '""'
if message:
message += ": "
message += f"Status {raw_response.status_code}"
headers = raw_response.headers
content_type = headers.get("content-type", '""')
if content_type != "application/json":
if " " in content_type:
content_type = f'"{content_type}"'
message += f" Content-Type {content_type}"
if len(body_display) > MAX_MESSAGE_LEN:
truncated = body_display[:MAX_MESSAGE_LEN]
remaining = len(body_display) - MAX_MESSAGE_LEN
body_display = f"{truncated}...and {remaining} more chars"
message += f". Body: {body_display}"
message = message.strip()
super().__init__(message, raw_response, body)
+30
View File
@@ -0,0 +1,30 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
import httpx
from typing import Optional
from dataclasses import dataclass, field
@dataclass(unsafe_hash=True)
class OpenRouterError(Exception):
"""The base class for all HTTP error responses."""
message: str
status_code: int
body: str
headers: httpx.Headers = field(hash=False)
raw_response: httpx.Response = field(hash=False)
def __init__(
self, message: str, raw_response: httpx.Response, body: Optional[str] = None
):
object.__setattr__(self, "message", message)
object.__setattr__(self, "status_code", raw_response.status_code)
object.__setattr__(
self, "body", body if body is not None else raw_response.text
)
object.__setattr__(self, "headers", raw_response.headers)
object.__setattr__(self, "raw_response", raw_response)
def __str__(self):
return self.message
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
payloadtoolargeresponseerrordata as models_payloadtoolargeresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class PayloadTooLargeResponseErrorData(BaseModel):
error: models_payloadtoolargeresponseerrordata.PayloadTooLargeResponseErrorData
r"""Error data for PayloadTooLargeResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class PayloadTooLargeResponseError(OpenRouterError):
r"""Payload Too Large - Request payload exceeds size limits"""
data: PayloadTooLargeResponseErrorData = field(hash=False)
def __init__(
self,
data: PayloadTooLargeResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
paymentrequiredresponseerrordata as models_paymentrequiredresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class PaymentRequiredResponseErrorData(BaseModel):
error: models_paymentrequiredresponseerrordata.PaymentRequiredResponseErrorData
r"""Error data for PaymentRequiredResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class PaymentRequiredResponseError(OpenRouterError):
r"""Payment Required - Insufficient credits or quota to complete request"""
data: PaymentRequiredResponseErrorData = field(hash=False)
def __init__(
self,
data: PaymentRequiredResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,38 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
provideroverloadedresponseerrordata as models_provideroverloadedresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class ProviderOverloadedResponseErrorData(BaseModel):
error: (
models_provideroverloadedresponseerrordata.ProviderOverloadedResponseErrorData
)
r"""Error data for ProviderOverloadedResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class ProviderOverloadedResponseError(OpenRouterError):
r"""Provider Overloaded - Provider is temporarily overloaded"""
data: ProviderOverloadedResponseErrorData = field(hash=False)
def __init__(
self,
data: ProviderOverloadedResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
requesttimeoutresponseerrordata as models_requesttimeoutresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class RequestTimeoutResponseErrorData(BaseModel):
error: models_requesttimeoutresponseerrordata.RequestTimeoutResponseErrorData
r"""Error data for RequestTimeoutResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class RequestTimeoutResponseError(OpenRouterError):
r"""Request Timeout - Operation exceeded time limit"""
data: RequestTimeoutResponseErrorData = field(hash=False)
def __init__(
self,
data: RequestTimeoutResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,27 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
import httpx
from typing import Optional
from dataclasses import dataclass
from openrouter.errors import OpenRouterError
@dataclass(unsafe_hash=True)
class ResponseValidationError(OpenRouterError):
"""Error raised when there is a type mismatch between the response data and the expected Pydantic model."""
def __init__(
self,
message: str,
raw_response: httpx.Response,
cause: Exception,
body: Optional[str] = None,
):
message = f"{message}: {cause}"
super().__init__(message, raw_response, body)
@property
def cause(self):
"""Normally the Pydantic ValidationError"""
return self.__cause__
@@ -0,0 +1,38 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
serviceunavailableresponseerrordata as models_serviceunavailableresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class ServiceUnavailableResponseErrorData(BaseModel):
error: (
models_serviceunavailableresponseerrordata.ServiceUnavailableResponseErrorData
)
r"""Error data for ServiceUnavailableResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class ServiceUnavailableResponseError(OpenRouterError):
r"""Service Unavailable - Service temporarily unavailable"""
data: ServiceUnavailableResponseErrorData = field(hash=False)
def __init__(
self,
data: ServiceUnavailableResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
toomanyrequestsresponseerrordata as models_toomanyrequestsresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class TooManyRequestsResponseErrorData(BaseModel):
error: models_toomanyrequestsresponseerrordata.TooManyRequestsResponseErrorData
r"""Error data for TooManyRequestsResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class TooManyRequestsResponseError(OpenRouterError):
r"""Too Many Requests - Rate limit exceeded"""
data: TooManyRequestsResponseErrorData = field(hash=False)
def __init__(
self,
data: TooManyRequestsResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,36 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
unauthorizedresponseerrordata as models_unauthorizedresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class UnauthorizedResponseErrorData(BaseModel):
error: models_unauthorizedresponseerrordata.UnauthorizedResponseErrorData
r"""Error data for UnauthorizedResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class UnauthorizedResponseError(OpenRouterError):
r"""Unauthorized - Authentication required or invalid credentials"""
data: UnauthorizedResponseErrorData = field(hash=False)
def __init__(
self,
data: UnauthorizedResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)
@@ -0,0 +1,38 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from dataclasses import dataclass, field
import httpx
from openrouter.errors import OpenRouterError
from openrouter.models import (
unprocessableentityresponseerrordata as models_unprocessableentityresponseerrordata,
)
from openrouter.types import BaseModel, OptionalNullable, UNSET
from typing import Optional
class UnprocessableEntityResponseErrorData(BaseModel):
error: (
models_unprocessableentityresponseerrordata.UnprocessableEntityResponseErrorData
)
r"""Error data for UnprocessableEntityResponse"""
user_id: OptionalNullable[str] = UNSET
@dataclass(unsafe_hash=True)
class UnprocessableEntityResponseError(OpenRouterError):
r"""Unprocessable Entity - Semantic validation failure"""
data: UnprocessableEntityResponseErrorData = field(hash=False)
def __init__(
self,
data: UnprocessableEntityResponseErrorData,
raw_response: httpx.Response,
body: Optional[str] = None,
):
fallback = body or raw_response.text
message = str(data.error.message) or fallback
super().__init__(message, raw_response, body)
object.__setattr__(self, "data", data)