diff --git a/litellm/integrations/s3.py b/litellm/integrations/s3.py index 1f82406e1..b9e1ffc92 100644 --- a/litellm/integrations/s3.py +++ b/litellm/integrations/s3.py @@ -13,8 +13,10 @@ import litellm from litellm._logging import print_verbose, verbose_logger from litellm.types.utils import StandardLoggingPayload +from .custom_logger import CustomLogger -class S3Logger: + +class S3Logger(CustomLogger): # Class variables or attributes def __init__( self, @@ -84,12 +86,7 @@ class S3Logger: print_verbose(f"Got exception on init s3 client {str(e)}") raise e - async def _async_log_event( - self, kwargs, response_obj, start_time, end_time, print_verbose - ): - self.log_event(kwargs, response_obj, start_time, end_time, print_verbose) - - def log_event(self, kwargs, response_obj, start_time, end_time, print_verbose): + async def async_log_success_event(self, kwargs, response_obj, start_time, end_time): try: verbose_logger.debug( f"s3 Logging - Enters logging function for model {kwargs}" diff --git a/litellm/litellm_core_utils/litellm_logging.py b/litellm/litellm_core_utils/litellm_logging.py index 2d70975c9..03c46457f 100644 --- a/litellm/litellm_core_utils/litellm_logging.py +++ b/litellm/litellm_core_utils/litellm_logging.py @@ -116,7 +116,6 @@ lagoLogger = None dataDogLogger = None prometheusLogger = None dynamoLogger = None -s3Logger = None genericAPILogger = None clickHouseLogger = None greenscaleLogger = None @@ -1346,36 +1345,6 @@ class Logging: user_id=kwargs.get("user", None), print_verbose=print_verbose, ) - if callback == "s3": - global s3Logger - if s3Logger is None: - s3Logger = S3Logger() - if self.stream: - if "complete_streaming_response" in self.model_call_details: - print_verbose( - "S3Logger Logger: Got Stream Event - Completed Stream Response" - ) - s3Logger.log_event( - kwargs=self.model_call_details, - response_obj=self.model_call_details[ - "complete_streaming_response" - ], - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) - else: - print_verbose( - "S3Logger Logger: Got Stream Event - No complete stream response as yet" - ) - else: - s3Logger.log_event( - kwargs=self.model_call_details, - response_obj=result, - start_time=start_time, - end_time=end_time, - print_verbose=print_verbose, - ) if ( callback == "openmeter" and self.model_call_details.get("litellm_params", {}).get( @@ -2245,7 +2214,7 @@ def set_callbacks(callback_list, function_id=None): """ Globally sets the callback client """ - global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel, traceloopLogger, athinaLogger, heliconeLogger, aispendLogger, berrispendLogger, supabaseClient, liteDebuggerClient, lunaryLogger, promptLayerLogger, langFuseLogger, customLogger, weightsBiasesLogger, logfireLogger, dynamoLogger, s3Logger, dataDogLogger, prometheusLogger, greenscaleLogger, openMeterLogger + global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel, traceloopLogger, athinaLogger, heliconeLogger, aispendLogger, berrispendLogger, supabaseClient, liteDebuggerClient, lunaryLogger, promptLayerLogger, langFuseLogger, customLogger, weightsBiasesLogger, logfireLogger, dynamoLogger, dataDogLogger, prometheusLogger, greenscaleLogger, openMeterLogger try: for callback in callback_list: @@ -2319,8 +2288,6 @@ def set_callbacks(callback_list, function_id=None): dataDogLogger = DataDogLogger() elif callback == "dynamodb": dynamoLogger = DyanmoDBLogger() - elif callback == "s3": - s3Logger = S3Logger() elif callback == "wandb": weightsBiasesLogger = WeightsBiasesLogger() elif callback == "logfire": @@ -2423,6 +2390,14 @@ def _init_custom_logger_compatible_class( _datadog_logger = DataDogLogger() _in_memory_loggers.append(_datadog_logger) return _datadog_logger # type: ignore + elif logging_integration == "s3": + for callback in _in_memory_loggers: + if isinstance(callback, S3Logger): + return callback # type: ignore + + _s3_logger = S3Logger() + _in_memory_loggers.append(_s3_logger) + return _s3_logger # type: ignore elif logging_integration == "gcs_bucket": for callback in _in_memory_loggers: if isinstance(callback, GCSBucketLogger): @@ -2564,6 +2539,10 @@ def get_custom_logger_compatible_class( for callback in _in_memory_loggers: if isinstance(callback, PrometheusLogger): return callback + elif logging_integration == "s3": + for callback in _in_memory_loggers: + if isinstance(callback, S3Logger): + return callback elif logging_integration == "datadog": for callback in _in_memory_loggers: if isinstance(callback, DataDogLogger): diff --git a/litellm/utils.py b/litellm/utils.py index 5afeab58e..d08cf7138 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -197,7 +197,6 @@ lagoLogger = None dataDogLogger = None prometheusLogger = None dynamoLogger = None -s3Logger = None genericAPILogger = None clickHouseLogger = None greenscaleLogger = None @@ -1799,8 +1798,9 @@ def calculate_tiles_needed( total_tiles = tiles_across * tiles_down return total_tiles + def get_image_type(image_data: bytes) -> Union[str, None]: - """ take an image (really only the first ~100 bytes max are needed) + """take an image (really only the first ~100 bytes max are needed) and return 'png' 'gif' 'jpeg' 'heic' or None. method added to allow deprecation of imghdr in 3.13"""