feat: add new RateLimitExceededError (#2277)
Co-authored-by: Caren Thomas <caren@caren-mac.local>
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import json
|
||||
from enum import Enum
|
||||
from typing import TYPE_CHECKING, List, Optional, Union
|
||||
|
||||
# Avoid circular imports
|
||||
@@ -6,9 +7,31 @@ if TYPE_CHECKING:
|
||||
from letta.schemas.message import Message
|
||||
|
||||
|
||||
class ErrorCode(Enum):
|
||||
"""Enum for error codes used by client."""
|
||||
|
||||
INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR"
|
||||
CONTEXT_WINDOW_EXCEEDED = "CONTEXT_WINDOW_EXCEEDED"
|
||||
RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED"
|
||||
|
||||
|
||||
class LettaError(Exception):
|
||||
"""Base class for all Letta related errors."""
|
||||
|
||||
def __init__(self, message: str, code: Optional[ErrorCode] = None, details: dict = {}):
|
||||
self.message = message
|
||||
self.code = code
|
||||
self.details = details
|
||||
super().__init__(message)
|
||||
|
||||
def __str__(self) -> str:
|
||||
if self.code:
|
||||
return f"{self.code.value}: {self.message}"
|
||||
return self.message
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return f"{self.__class__.__name__}(message='{self.message}', code='{self.code}', details={self.details})"
|
||||
|
||||
|
||||
class LettaToolCreateError(LettaError):
|
||||
"""Error raised when a tool cannot be created."""
|
||||
@@ -16,10 +39,7 @@ class LettaToolCreateError(LettaError):
|
||||
default_error_message = "Error creating tool."
|
||||
|
||||
def __init__(self, message=None):
|
||||
if message is None:
|
||||
message = self.default_error_message
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
super().__init__(message=message or self.default_error_message)
|
||||
|
||||
|
||||
class LettaConfigurationError(LettaError):
|
||||
@@ -27,23 +47,17 @@ class LettaConfigurationError(LettaError):
|
||||
|
||||
def __init__(self, message: str, missing_fields: Optional[List[str]] = None):
|
||||
self.missing_fields = missing_fields or []
|
||||
super().__init__(message)
|
||||
super().__init__(message=message, details={"missing_fields": self.missing_fields})
|
||||
|
||||
|
||||
class LettaAgentNotFoundError(LettaError):
|
||||
"""Error raised when an agent is not found."""
|
||||
|
||||
def __init__(self, message: str):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
pass
|
||||
|
||||
|
||||
class LettaUserNotFoundError(LettaError):
|
||||
"""Error raised when a user is not found."""
|
||||
|
||||
def __init__(self, message: str):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
pass
|
||||
|
||||
|
||||
class LLMError(LettaError):
|
||||
@@ -54,24 +68,45 @@ class LLMJSONParsingError(LettaError):
|
||||
"""Exception raised for errors in the JSON parsing process."""
|
||||
|
||||
def __init__(self, message="Error parsing JSON generated by LLM"):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
super().__init__(message=message)
|
||||
|
||||
|
||||
class LocalLLMError(LettaError):
|
||||
"""Generic catch-all error for local LLM problems"""
|
||||
|
||||
def __init__(self, message="Encountered an error while running local LLM"):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
super().__init__(message=message)
|
||||
|
||||
|
||||
class LocalLLMConnectionError(LettaError):
|
||||
"""Error for when local LLM cannot be reached with provided IP/port"""
|
||||
|
||||
def __init__(self, message="Could not connect to local LLM"):
|
||||
self.message = message
|
||||
super().__init__(self.message)
|
||||
super().__init__(message=message)
|
||||
|
||||
|
||||
class ContextWindowExceededError(LettaError):
|
||||
"""Error raised when the context window is exceeded but further summarization fails."""
|
||||
|
||||
def __init__(self, message: str, details: dict = {}):
|
||||
error_message = f"{message} ({details})"
|
||||
super().__init__(
|
||||
message=error_message,
|
||||
code=ErrorCode.CONTEXT_WINDOW_EXCEEDED,
|
||||
details=details,
|
||||
)
|
||||
|
||||
|
||||
class RateLimitExceededError(LettaError):
|
||||
"""Error raised when the llm rate limiter throttles api requests."""
|
||||
|
||||
def __init__(self, message: str, max_retries: int):
|
||||
error_message = f"{message} ({max_retries})"
|
||||
super().__init__(
|
||||
message=error_message,
|
||||
code=ErrorCode.RATE_LIMIT_EXCEEDED,
|
||||
details={"max_retries": max_retries},
|
||||
)
|
||||
|
||||
|
||||
class LettaMessageError(LettaError):
|
||||
|
||||
Reference in New Issue
Block a user