|
""" |
|
This file contains the LangFuseHandler class |
|
|
|
Used to get the LangFuseLogger for a given request |
|
|
|
Handles Key/Team Based Langfuse Logging |
|
""" |
|
|
|
from typing import TYPE_CHECKING, Any, Dict, Optional |
|
|
|
from litellm.litellm_core_utils.litellm_logging import StandardCallbackDynamicParams |
|
|
|
from .langfuse import LangFuseLogger, LangfuseLoggingConfig |
|
|
|
if TYPE_CHECKING: |
|
from litellm.litellm_core_utils.litellm_logging import DynamicLoggingCache |
|
else: |
|
DynamicLoggingCache = Any |
|
|
|
|
|
class LangFuseHandler: |
|
|
|
@staticmethod |
|
def get_langfuse_logger_for_request( |
|
standard_callback_dynamic_params: StandardCallbackDynamicParams, |
|
in_memory_dynamic_logger_cache: DynamicLoggingCache, |
|
globalLangfuseLogger: Optional[LangFuseLogger] = None, |
|
) -> LangFuseLogger: |
|
""" |
|
This function is used to get the LangFuseLogger for a given request |
|
|
|
1. If dynamic credentials are passed |
|
- check if a LangFuseLogger is cached for the dynamic credentials |
|
- if cached LangFuseLogger is not found, create a new LangFuseLogger and cache it |
|
|
|
2. If dynamic credentials are not passed return the globalLangfuseLogger |
|
|
|
""" |
|
temp_langfuse_logger: Optional[LangFuseLogger] = globalLangfuseLogger |
|
if ( |
|
LangFuseHandler._dynamic_langfuse_credentials_are_passed( |
|
standard_callback_dynamic_params |
|
) |
|
is False |
|
): |
|
return LangFuseHandler._return_global_langfuse_logger( |
|
globalLangfuseLogger=globalLangfuseLogger, |
|
in_memory_dynamic_logger_cache=in_memory_dynamic_logger_cache, |
|
) |
|
|
|
|
|
_credentials = LangFuseHandler.get_dynamic_langfuse_logging_config( |
|
globalLangfuseLogger=globalLangfuseLogger, |
|
standard_callback_dynamic_params=standard_callback_dynamic_params, |
|
) |
|
credentials_dict = dict(_credentials) |
|
|
|
|
|
temp_langfuse_logger = in_memory_dynamic_logger_cache.get_cache( |
|
credentials=credentials_dict, service_name="langfuse" |
|
) |
|
|
|
|
|
if temp_langfuse_logger is None: |
|
temp_langfuse_logger = ( |
|
LangFuseHandler._create_langfuse_logger_from_credentials( |
|
credentials=credentials_dict, |
|
in_memory_dynamic_logger_cache=in_memory_dynamic_logger_cache, |
|
) |
|
) |
|
|
|
return temp_langfuse_logger |
|
|
|
@staticmethod |
|
def _return_global_langfuse_logger( |
|
globalLangfuseLogger: Optional[LangFuseLogger], |
|
in_memory_dynamic_logger_cache: DynamicLoggingCache, |
|
) -> LangFuseLogger: |
|
""" |
|
Returns the Global LangfuseLogger set on litellm |
|
|
|
(this is the default langfuse logger - used when no dynamic credentials are passed) |
|
|
|
If no Global LangfuseLogger is set, it will check in_memory_dynamic_logger_cache for a cached LangFuseLogger |
|
This function is used to return the globalLangfuseLogger if it exists, otherwise it will check in_memory_dynamic_logger_cache for a cached LangFuseLogger |
|
""" |
|
if globalLangfuseLogger is not None: |
|
return globalLangfuseLogger |
|
|
|
credentials_dict: Dict[str, Any] = ( |
|
{} |
|
) |
|
globalLangfuseLogger = in_memory_dynamic_logger_cache.get_cache( |
|
credentials=credentials_dict, |
|
service_name="langfuse", |
|
) |
|
if globalLangfuseLogger is None: |
|
globalLangfuseLogger = ( |
|
LangFuseHandler._create_langfuse_logger_from_credentials( |
|
credentials=credentials_dict, |
|
in_memory_dynamic_logger_cache=in_memory_dynamic_logger_cache, |
|
) |
|
) |
|
return globalLangfuseLogger |
|
|
|
@staticmethod |
|
def _create_langfuse_logger_from_credentials( |
|
credentials: Dict, |
|
in_memory_dynamic_logger_cache: DynamicLoggingCache, |
|
) -> LangFuseLogger: |
|
""" |
|
This function is used to |
|
1. create a LangFuseLogger from the credentials |
|
2. cache the LangFuseLogger to prevent re-creating it for the same credentials |
|
""" |
|
|
|
langfuse_logger = LangFuseLogger( |
|
langfuse_public_key=credentials.get("langfuse_public_key"), |
|
langfuse_secret=credentials.get("langfuse_secret"), |
|
langfuse_host=credentials.get("langfuse_host"), |
|
) |
|
in_memory_dynamic_logger_cache.set_cache( |
|
credentials=credentials, |
|
service_name="langfuse", |
|
logging_obj=langfuse_logger, |
|
) |
|
return langfuse_logger |
|
|
|
@staticmethod |
|
def get_dynamic_langfuse_logging_config( |
|
standard_callback_dynamic_params: StandardCallbackDynamicParams, |
|
globalLangfuseLogger: Optional[LangFuseLogger] = None, |
|
) -> LangfuseLoggingConfig: |
|
""" |
|
This function is used to get the Langfuse logging config to use for a given request. |
|
|
|
It checks if the dynamic parameters are provided in the standard_callback_dynamic_params and uses them to get the Langfuse logging config. |
|
|
|
If no dynamic parameters are provided, it uses the `globalLangfuseLogger` values |
|
""" |
|
|
|
return LangfuseLoggingConfig( |
|
langfuse_secret=standard_callback_dynamic_params.get("langfuse_secret") |
|
or standard_callback_dynamic_params.get("langfuse_secret_key"), |
|
langfuse_public_key=standard_callback_dynamic_params.get( |
|
"langfuse_public_key" |
|
), |
|
langfuse_host=standard_callback_dynamic_params.get("langfuse_host"), |
|
) |
|
|
|
@staticmethod |
|
def _dynamic_langfuse_credentials_are_passed( |
|
standard_callback_dynamic_params: StandardCallbackDynamicParams, |
|
) -> bool: |
|
""" |
|
This function is used to check if the dynamic langfuse credentials are passed in standard_callback_dynamic_params |
|
|
|
Returns: |
|
bool: True if the dynamic langfuse credentials are passed, False otherwise |
|
""" |
|
|
|
if ( |
|
standard_callback_dynamic_params.get("langfuse_host") is not None |
|
or standard_callback_dynamic_params.get("langfuse_public_key") is not None |
|
or standard_callback_dynamic_params.get("langfuse_secret") is not None |
|
or standard_callback_dynamic_params.get("langfuse_secret_key") is not None |
|
): |
|
return True |
|
return False |
|
|