From 03ac0277d15efb9f11b1c7f800c1df22f91a8054 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Wed, 2 Aug 2023 12:34:47 -0700 Subject: [PATCH] adding telemetry to litellm --- litellm/__init__.py | 2 +- litellm/__pycache__/__init__.cpython-311.pyc | Bin 767 -> 788 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 11408 -> 11671 bytes litellm/__pycache__/timeout.cpython-311.pyc | Bin 4905 -> 4905 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 14845 -> 17752 bytes litellm/main.py | 63 +++++++++-------- litellm/tests/litellm_uuid.txt | 1 + litellm/utils.py | 67 +++++++++++++++---- 8 files changed, 90 insertions(+), 43 deletions(-) create mode 100644 litellm/tests/litellm_uuid.txt diff --git a/litellm/__init__.py b/litellm/__init__.py index 933a6ca8a..73257a8bc 100644 --- a/litellm/__init__.py +++ b/litellm/__init__.py @@ -1,7 +1,7 @@ success_callback = [] failure_callback = [] set_verbose=False - +telemetry=True ####### COMPLETION MODELS ################### open_ai_chat_completion_models = [ 'gpt-3.5-turbo', diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index 6dd968755a8e42d6602ea098bc7df7701dae8373..e487c18c978291d436faf790e33d2c9f263eb8bf 100644 GIT binary patch delta 225 zcmey*I)#mQIWI340}yOqbSkA`BClk90+2JEA)O%#gc(y9qL@+`qnJ~eQkc`3qF7Q` z(ix*zQ&@o{TMAnWJ5Y>0g#*arNa0N3%HhoAjN)Wu0J6DrxN^CpxN~`;cyf88c)?;k zIeZ}uDZIf9ntW~{RlMm1CA!9Xrn)7iMM?QptRSvQ)x-r882Kj~G8%DlmZavS=BAbu zRZdP~e61x0bQdEK7cT`8AD9^#8E*)SUSJS_l01S9+&8%R8aO|&O)g^UWDx5Ne< zDJ(#eHH9^W4JgKz!VcuIr*Ncj=5XY4L~$@O0NGqQoVi?4T)Es)+_^kaJYX^I9NrLy z6rNxPOE6g4;+)* KnL1g7feHXUl_*01 diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index 21e92f305d6ec264afe298062ef6f2741ef4105e..153207bb972fd989fc242adba61fa0d2d7cd78ee 100644 GIT binary patch delta 798 zcmbObIX#+hIWI340}$+5bt*+%dn4Z>amJOKH;TJ4F(ys^A?eAM1e7aE+Uzdn%`U(J zWHSTtX9X4phUpBPn-?gqXVy_>C{Y3mLV*fHkyb5xi6D&6z)-_b!&t*q!&1Y(hJW&F zZW#@r0Q(w&WlRhVtAQ8-nix|UYT4`9%NffVDwrb~${95UCkLvwDYF*o096#}f(R85 zp$a1WK!iV#&=f8*n0#MVNi`fK0&?IjPS@O|)RdIWy!4_-kYF-Mkh!>|s3>Z(qMDp& zCP**~L}Y^qP9UMlG1*H^$|DEFF98vyK%y9AngSFQ$pbmJI8)(9R|ENfK&q}WGB7kS zd|*>#wzYuXlPHYnCz*jD()`kF3E6Q zlFNga`M9#G2M6;B4ptz0va-e>#;C~(ns!{ECsj`-mdOcA17I#j5VoH2Ueo1OxS&=MAp#q2ir(IA)6(vv3(UN6s+uWsfh*3$2 f(dGjKjQGgRz{J}k4Wc+GZq#Jwix=_mmJF^uM9 delta 780 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 XhJ1|75f5Q$4e5q;SwlVusxJQzuE6a; delta 3905 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 ```litellm.set_verbose = True``` def print_verbose(print_statement): diff --git a/litellm/tests/litellm_uuid.txt b/litellm/tests/litellm_uuid.txt new file mode 100644 index 000000000..e4252e46d --- /dev/null +++ b/litellm/tests/litellm_uuid.txt @@ -0,0 +1 @@ +80888ede-4881-4876-ab3f-765d47282e66 \ No newline at end of file diff --git a/litellm/utils.py b/litellm/utils.py index d59031875..e2b4f5655 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1,14 +1,7 @@ -import dotenv -import json -import traceback -import threading -import traceback -import subprocess -import uuid -import litellm -import os -import openai -import random +import dotenv, json, traceback, threading +import subprocess, os +import litellm, openai +import random, uuid, requests from openai.error import AuthenticationError, InvalidRequestError, RateLimitError, ServiceUnavailableError, OpenAIError ####### ENVIRONMENT VARIABLES ################### dotenv.load_dotenv() # Loading env variables using dotenv @@ -34,11 +27,15 @@ def logging(model, input, azure=False, additional_args={}, logger_fn=None, excep try: model_call_details = {} model_call_details["model"] = model - model_call_details["input"] = input model_call_details["azure"] = azure # log exception details if exception: model_call_details["original_exception"] = exception + + if litellm.telemetry: + safe_crash_reporting(model=model, exception=exception, azure=azure) # log usage-crash details. Do not log any user details. If you want to turn this off, set `litellm.telemetry=False`. + + model_call_details["input"] = input # log additional call details -> api key, etc. if azure == True or model in litellm.open_ai_chat_completion_models or model in litellm.open_ai_chat_completion_models or model in litellm.open_ai_embedding_models: model_call_details["api_type"] = openai.api_type @@ -273,4 +270,48 @@ def exception_type(model, original_exception): raise original_exception # base case - return the original exception else: raise original_exception - \ No newline at end of file + +def safe_crash_reporting(model=None, exception=None, azure=None): + data = { + "model": model, + "exception": str(exception), + "azure": azure + } + print(f"data in crash reporting: {data}") + threading.Thread(target=litellm_telemetry, args=(data,), daemon=True).start() + +def litellm_telemetry(data): + print(f"data in in litellm telemetry: {data}") + # Load or generate the UUID + uuid_file = 'litellm_uuid.txt' + try: + # Try to open the file and load the UUID + with open(uuid_file, 'r') as file: + uuid_value = file.read() + if uuid_value: + uuid_value = uuid_value.strip() + print(f"Loaded UUID: {uuid_value}") + else: + raise FileNotFoundError + except FileNotFoundError: + # Generate a new UUID if the file doesn't exist or is empty + new_uuid = uuid.uuid4() + uuid_value = str(new_uuid) + with open(uuid_file, 'w') as file: + file.write(uuid_value) + print(f"Generated and stored UUID: {uuid_value}") + + # Prepare the data to send to localhost:3000 + payload = { + 'uuid': uuid_value, + 'data': data + } + print_verbose(f"payload: {payload}") + try: + # Make the POST request to localhost:3000 + response = requests.post('https://litellm.berri.ai/logging', json=payload) + response.raise_for_status() # Raise an exception for HTTP errors + print('Request successfully sent!') + except requests.exceptions.RequestException as e: + # Handle any errors in the request + print(f'Error: {e}') \ No newline at end of file