fix(litellm_logging.py): initialize global variables

Fixes https://github.com/BerriAI/litellm/issues/4281
This commit is contained in:
Krrish Dholakia 2024-06-19 18:39:45 -07:00
parent 05a4b6188e
commit 682ec33aa0
5 changed files with 99 additions and 3 deletions

View file

@ -13,7 +13,11 @@ from litellm._logging import verbose_logger
class LangFuseLogger: class LangFuseLogger:
# Class variables or attributes # Class variables or attributes
def __init__( def __init__(
self, langfuse_public_key=None, langfuse_secret=None, flush_interval=1 self,
langfuse_public_key=None,
langfuse_secret=None,
langfuse_host=None,
flush_interval=1,
): ):
try: try:
import langfuse import langfuse
@ -25,7 +29,9 @@ class LangFuseLogger:
# Instance variables # Instance variables
self.secret_key = langfuse_secret or os.getenv("LANGFUSE_SECRET_KEY") self.secret_key = langfuse_secret or os.getenv("LANGFUSE_SECRET_KEY")
self.public_key = langfuse_public_key or os.getenv("LANGFUSE_PUBLIC_KEY") self.public_key = langfuse_public_key or os.getenv("LANGFUSE_PUBLIC_KEY")
self.langfuse_host = os.getenv("LANGFUSE_HOST", "https://cloud.langfuse.com") self.langfuse_host = langfuse_host or os.getenv(
"LANGFUSE_HOST", "https://cloud.langfuse.com"
)
self.langfuse_release = os.getenv("LANGFUSE_RELEASE") self.langfuse_release = os.getenv("LANGFUSE_RELEASE")
self.langfuse_debug = os.getenv("LANGFUSE_DEBUG") self.langfuse_debug = os.getenv("LANGFUSE_DEBUG")

View file

@ -75,6 +75,44 @@ from ..integrations.weights_biases import WeightsBiasesLogger
_in_memory_loggers: List[Any] = [] _in_memory_loggers: List[Any] = []
### GLOBAL VARIABLES ###
sentry_sdk_instance = None
capture_exception = None
add_breadcrumb = None
posthog = None
slack_app = None
alerts_channel = None
heliconeLogger = None
athinaLogger = None
promptLayerLogger = None
langsmithLogger = None
logfireLogger = None
weightsBiasesLogger = None
customLogger = None
langFuseLogger = None
openMeterLogger = None
lagoLogger = None
dataDogLogger = None
prometheusLogger = None
dynamoLogger = None
s3Logger = None
genericAPILogger = None
clickHouseLogger = None
greenscaleLogger = None
lunaryLogger = None
aispendLogger = None
berrispendLogger = None
supabaseClient = None
liteDebuggerClient = None
callback_list: Optional[List[str]] = []
user_logger_fn = None
additional_details: Optional[Dict[str, str]] = {}
local_cache: Optional[Dict[str, str]] = {}
last_fetched_at = None
last_fetched_at_keys = None
####
class Logging: class Logging:
global supabaseClient, liteDebuggerClient, promptLayerLogger, weightsBiasesLogger, langsmithLogger, logfireLogger, capture_exception, add_breadcrumb, lunaryLogger, logfireLogger, prometheusLogger, slack_app global supabaseClient, liteDebuggerClient, promptLayerLogger, weightsBiasesLogger, langsmithLogger, logfireLogger, capture_exception, add_breadcrumb, lunaryLogger, logfireLogger, prometheusLogger, slack_app
@ -95,6 +133,7 @@ class Logging:
dynamic_async_success_callbacks=None, dynamic_async_success_callbacks=None,
langfuse_public_key=None, langfuse_public_key=None,
langfuse_secret=None, langfuse_secret=None,
langfuse_host=None,
): ):
if call_type not in [item.value for item in CallTypes]: if call_type not in [item.value for item in CallTypes]:
allowed_values = ", ".join([item.value for item in CallTypes]) allowed_values = ", ".join([item.value for item in CallTypes])
@ -136,6 +175,7 @@ class Logging:
## DYNAMIC LANGFUSE KEYS ## ## DYNAMIC LANGFUSE KEYS ##
self.langfuse_public_key = langfuse_public_key self.langfuse_public_key = langfuse_public_key
self.langfuse_secret = langfuse_secret self.langfuse_secret = langfuse_secret
self.langfuse_host = langfuse_host
## TIME TO FIRST TOKEN LOGGING ## ## TIME TO FIRST TOKEN LOGGING ##
self.completion_start_time: Optional[datetime.datetime] = None self.completion_start_time: Optional[datetime.datetime] = None
@ -743,7 +783,7 @@ class Logging:
) )
if callback == "langfuse": if callback == "langfuse":
global langFuseLogger global langFuseLogger
verbose_logger.debug("reaches langfuse for success logging!") print_verbose("reaches langfuse for success logging!")
kwargs = {} kwargs = {}
for k, v in self.model_call_details.items(): for k, v in self.model_call_details.items():
if ( if (
@ -775,6 +815,7 @@ class Logging:
langFuseLogger = LangFuseLogger( langFuseLogger = LangFuseLogger(
langfuse_public_key=self.langfuse_public_key, langfuse_public_key=self.langfuse_public_key,
langfuse_secret=self.langfuse_secret, langfuse_secret=self.langfuse_secret,
langfuse_host=self.langfuse_host,
) )
langFuseLogger.log_event( langFuseLogger.log_event(
kwargs=kwargs, kwargs=kwargs,
@ -1556,6 +1597,7 @@ class Logging:
langFuseLogger = LangFuseLogger( langFuseLogger = LangFuseLogger(
langfuse_public_key=self.langfuse_public_key, langfuse_public_key=self.langfuse_public_key,
langfuse_secret=self.langfuse_secret, langfuse_secret=self.langfuse_secret,
langfuse_host=self.langfuse_host,
) )
langFuseLogger.log_event( langFuseLogger.log_event(
start_time=start_time, start_time=start_time,

View file

@ -66,6 +66,18 @@ model_list:
model_info: model_info:
max_input_tokens: 80920 max_input_tokens: 80920
litellm_settings:
default_team_settings:
- team_id: proj1
success_callback: ["langfuse"]
langfuse_public_key: pk-lf-a65841e9-5192-4397-a679-cfff029fd5b0
langfuse_secret: sk-lf-d58c2891-3717-4f98-89dd-df44826215fd
langfuse_host: https://us.cloud.langfuse.com
- team_id: proj2
success_callback: ["langfuse"]
langfuse_public_key: pk-lf-3d789fd1-f49f-4e73-a7d9-1b4e11acbf9a
langfuse_secret: sk-lf-11b13aca-b0d4-4cde-9d54-721479dace6d
langfuse_host: https://us.cloud.langfuse.com
assistant_settings: assistant_settings:
custom_llm_provider: openai custom_llm_provider: openai

View file

@ -866,3 +866,38 @@ async def test_make_request():
} }
}, },
) )
def test_langfuse_dynamic_logging():
"""
pass in langfuse credentials via completion call
assert call is logged.
Covers the team-logging scenario.
"""
import uuid
import langfuse
trace_id = str(uuid.uuid4())
_ = litellm.completion(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hey"}],
mock_response="Hey! how's it going?",
langfuse_public_key=os.getenv("LANGFUSE_PROJECT2_PUBLIC"),
langfuse_secret_key=os.getenv("LANGFUSE_PROJECT2_SECRET"),
langfuse_host="https://us.cloud.langfuse.com",
metadata={"trace_id": trace_id},
success_callback=["langfuse"],
)
time.sleep(1)
langfuse_client = langfuse.Langfuse(
public_key=os.getenv("LANGFUSE_PROJECT2_PUBLIC"),
secret_key=os.getenv("LANGFUSE_PROJECT2_SECRET"),
host="https://us.cloud.langfuse.com",
)
langfuse_client.get_trace(id=trace_id)

View file

@ -542,6 +542,7 @@ def function_setup(
langfuse_public_key=kwargs.pop("langfuse_public_key", None), langfuse_public_key=kwargs.pop("langfuse_public_key", None),
langfuse_secret=kwargs.pop("langfuse_secret", None) langfuse_secret=kwargs.pop("langfuse_secret", None)
or kwargs.pop("langfuse_secret_key", None), or kwargs.pop("langfuse_secret_key", None),
langfuse_host=kwargs.pop("langfuse_host", None),
) )
## check if metadata is passed in ## check if metadata is passed in
litellm_params = {"api_base": ""} litellm_params = {"api_base": ""}