From 42bf542ba6693ccd279f6500b9076a7909627a7a Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Tue, 1 Aug 2023 13:03:03 -0700 Subject: [PATCH] updating helper functions with a try-except --- litellm.egg-info/PKG-INFO | 2 +- litellm.egg-info/SOURCES.txt | 2 + litellm.egg-info/requires.txt | 5 + litellm/__pycache__/main.cpython-311.pyc | Bin 11550 -> 11408 bytes litellm/main.py | 2 - ...st_bad_params.cpython-311-pytest-7.4.0.pyc | Bin 1580 -> 1580 bytes .../test_client.cpython-311-pytest-7.4.0.pyc | Bin 3738 -> 3738 bytes ...st_exceptions.cpython-311-pytest-7.4.0.pyc | Bin 6040 -> 6042 bytes .../test_timeout.cpython-311-pytest-7.4.0.pyc | Bin 0 -> 1289 bytes litellm/utils.py | 221 +++++++++--------- 10 files changed, 123 insertions(+), 109 deletions(-) create mode 100644 litellm/tests/__pycache__/test_timeout.cpython-311-pytest-7.4.0.pyc diff --git a/litellm.egg-info/PKG-INFO b/litellm.egg-info/PKG-INFO index e8f0962bc..021d53b6a 100644 --- a/litellm.egg-info/PKG-INFO +++ b/litellm.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: litellm -Version: 0.1.2 +Version: 0.1.207 Summary: Library to easily interface with LLM API providers Author: BerriAI License-File: LICENSE diff --git a/litellm.egg-info/SOURCES.txt b/litellm.egg-info/SOURCES.txt index 2e2bbebec..d7e653597 100644 --- a/litellm.egg-info/SOURCES.txt +++ b/litellm.egg-info/SOURCES.txt @@ -3,6 +3,8 @@ README.md setup.py litellm/__init__.py litellm/main.py +litellm/timeout.py +litellm/utils.py litellm.egg-info/PKG-INFO litellm.egg-info/SOURCES.txt litellm.egg-info/dependency_links.txt diff --git a/litellm.egg-info/requires.txt b/litellm.egg-info/requires.txt index a61c01b50..4efb352ed 100644 --- a/litellm.egg-info/requires.txt +++ b/litellm.egg-info/requires.txt @@ -1,2 +1,7 @@ openai cohere +pytest +anthropic +replicate +python-dotenv +openai[datalib] diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index 1bd325e761362f7fa0603b21102ef10ec3946f89..21e92f305d6ec264afe298062ef6f2741ef4105e 100644 GIT binary patch delta 1498 zcmb7@O>7%Q6o7Z^^}pAye_}gve%5K6W*e85poX@j5lDqrm4MQw6z>6R&(I8GxaVm%2>I0Q35ZtIZKyPRdhyxPhQa}ihP$hV8T!jP)RgATt-@Nx` z-h1fV>x+6ZB$?^ghWNKLr8kMRD$xjyieHQpFqLTh29czj z@C^oRD_P*RlBS6s(aUBAymB{+%`s&l&r{9=@IUd zv5{e#=}GzsB^M+u`y=M~f<}VyGwxO`zf_{#|MR&=nLH5V($=L}dAU zLu#`Eq84Ey-XTxOh5G*E*_-MGv$RxFZf~Cf_KYL9N1eP zJB4N}DM*-aw9PJ7Dh~60xuW1XYEw)_pCi0bd78xeQsr`V3>Ay~UZt9fpcqBS{Ey0& zasotca!?XBjqS93esMp}2c1P}8ZizC;>`5A9oI8OJAwi;ySCLfe6wYAt(MlPDlLE(``2Y-;)JjpY#reNycj?o3~`U4Q9JwNWq#2AetL_L8sC`t zi!}L$c6@LY7*@m{=bvaRE%8dKgZxD~6zz)u$ZgXLqW)$VQx2oLi;xjJ{S6X6Guq~| z(OwUtwBwuZ>#T_$m>-Mtt%H>puYwq)?2bWO4?V<9QPD$mMm#=|n0TU?lc?#>_=3}+ z8@9Q~u7Qrg=lw=FnZ3ljv)gd%LXA5!@wdwFB)@(cNAX_Vyu!7pJc Or1Yx%exo7d)_()@o<7h3 delta 1753 zcmb7EO>7%Q6yAv)|HO9uZ^vnpItg*Ij!8*^pbeo3e*r{kr6#5A2FYx8*2y+ruQgsL zq*924!i5Wo=8CGE+5;SbT#)z?5+_as3DmGB!~v;X2uCGod8Rq>?mKO3F+tX)~i_j{UPrwoTHb*SdIgD6>VRWr_Nz zU;F};fGJ0VH;E*D0FOIhS;+uZB}_ZEiPEjdL6xGR2UY)Toe+h+;PHpw_tMC=hwqWz z;S*xv01eU352H8RAOv{a0gEF~Dqb4nH^|A^9va`4lwL~aB{^{iMdxMWc%G?k$Zbxn z(yVFahHjT_!_=*&?ZoDQu??%X00h0zwD)h51Cow{pA$hf+RB<*t+E*Z+#{1X|HX5e zU(8MTdO^ebc+=Z#AAo6W|2MC<6D?ua0^9;C@bToFuYl5FzL|X0H-^)3evn)u{d_WY zidbAr6#|1m%WZ6o@21v!ou$K7CtcV*Z^qYZtH&Th0kKa%1zEv#A2JDx8OsLd+A@jLlpkSOC^o@=%+8Vy-rcocI*G(AdU;s0=ET&Ry~3=zp_NUG z>eUAGqac9b<6m@LkAz?<54ib{^YghUwp!I@Lnw1=jk6JiJb)8mdZTXD8oDTzlVp0m zYG|shm({vawyjmYCTijMpeO6lmR`fwO($H_*UK$etcDY81<20f@|wi|$UPSoy`i~; zBu($X(mmx*EI{K&pmVMD3u`)K2G#f9>HpR85_|CxI^9Mx!j>z8=`S3*V-lb0yU)e`e V4@vw3zk8&%BG~yGrIHt8`Wv}!me>FQ diff --git a/litellm/main.py b/litellm/main.py index 4635f2381..c17c5d402 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -10,8 +10,6 @@ import random ####### ENVIRONMENT VARIABLES ################### dotenv.load_dotenv() # Loading env variables using dotenv - - def get_optional_params( # 12 optional params functions = [], diff --git a/litellm/tests/__pycache__/test_bad_params.cpython-311-pytest-7.4.0.pyc b/litellm/tests/__pycache__/test_bad_params.cpython-311-pytest-7.4.0.pyc index 1e3c4bc7d3d387c68bbcb6854c9a849c55a2484a..753da9901bc8abb3ad5368f2f8aabf45399e4671 100644 GIT binary patch delta 22 ccmZ3(vxbLvIWI340}!zIpG^6>kyoA#06w_|p#T5? delta 22 ccmZ3(vxbLvIWI340}xdDo=o|+kyoA#07A(IWI340}#X}oZQIW&j$cB9R(x+ delta 20 acmbOwJ4=>(IWI340}xE@Jh73xpAP^wmIZ_W diff --git a/litellm/tests/__pycache__/test_exceptions.cpython-311-pytest-7.4.0.pyc b/litellm/tests/__pycache__/test_exceptions.cpython-311-pytest-7.4.0.pyc index 0e69bc88def2d177373ee2eae9815c36eba79242..50f8b39d3c60bac5b33fedca161559847a772703 100644 GIT binary patch delta 94 zcmV-k0HObwFPbk6rwt7X00000`B}+i3b76K1_2kd0|&4H0V080f3W%6c>}46q*49vo#fC0_P(c Aga7~l delta 87 zcmbQGKSQ5)IWI340}#l2oJ`@|$orLzQEW3a`vyiv&BO)>>hk(l>8D-g`6e{oZf) z*J3dbDBn4MdSe3cS{bQiCx>$nBS+wYM*?t2vTJR}n#;STyY?qu80S#!$Gp@e# z@?N$}PVm{Q^f5SPylHRQspDF7CZ{r$J@Yr~YAynyc?$@vL#ThNuftRFzjXh)nW_RiLDX-#=RL!Zp^FY#~$ z;!?~b*AWYKdm>v?{;spD_(UXnWAEle5p_C#_)W!qA}Fh@-mY-kib9Vw1JhJ>ndvY; z6w**2Wrhcoc3u)$d=jx1ZBCGLg{ku9v-%@W8Lw|M=JQQ&GYZ^o->rWdwRYMx6uchz zf(Ai*x(mwDtJXAAt+Ol395FQ$Jk8bHP0os#U2(&2;S$5&My{8Cw{I*BjHRBj^p|0E zzu0Hb8r??R7#jKb^K-lgX9^Qj&-QE)2{))Hupd{dgk{iKotM_ejvoj=dM2y@VNNV*DkrlDejT7@7LdQHrmOASnxEouikcl(B?E8mb h|FqSA`#n6N_F;Jd%e_>&BI@@w`#}!=$Y~FX`oF*~GtB@1 literal 0 HcmV?d00001 diff --git a/litellm/utils.py b/litellm/utils.py index c7eaa96d2..d59031875 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -101,130 +101,139 @@ def client(original_function): ####### HELPER FUNCTIONS ################ def set_callbacks(callback_list): global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel - for callback in callback_list: - if callback == "sentry": - try: - import sentry_sdk - except ImportError: - print_verbose("Package 'sentry_sdk' is missing. Installing it...") - subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'sentry_sdk']) - import sentry_sdk - sentry_sdk_instance = sentry_sdk - sentry_sdk_instance.init(dsn=os.environ.get("SENTRY_API_URL"), traces_sample_rate=float(os.environ.get("SENTRY_API_TRACE_RATE"))) - capture_exception = sentry_sdk_instance.capture_exception - add_breadcrumb = sentry_sdk_instance.add_breadcrumb - elif callback == "posthog": - try: - from posthog import Posthog - except ImportError: - print_verbose("Package 'posthog' is missing. Installing it...") - subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'posthog']) - from posthog import Posthog - posthog = Posthog( - project_api_key=os.environ.get("POSTHOG_API_KEY"), - host=os.environ.get("POSTHOG_API_URL")) - elif callback == "slack": - try: - from slack_bolt import App - except ImportError: - print_verbose("Package 'slack_bolt' is missing. Installing it...") - subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'slack_bolt']) - from slack_bolt import App - slack_app = App( - token=os.environ.get("SLACK_API_TOKEN"), - signing_secret=os.environ.get("SLACK_API_SECRET") - ) - alerts_channel = os.environ["SLACK_API_CHANNEL"] - print_verbose(f"Initialized Slack App: {slack_app}") + try: + for callback in callback_list: + if callback == "sentry": + try: + import sentry_sdk + except ImportError: + print_verbose("Package 'sentry_sdk' is missing. Installing it...") + subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'sentry_sdk']) + import sentry_sdk + sentry_sdk_instance = sentry_sdk + sentry_sdk_instance.init(dsn=os.environ.get("SENTRY_API_URL"), traces_sample_rate=float(os.environ.get("SENTRY_API_TRACE_RATE"))) + capture_exception = sentry_sdk_instance.capture_exception + add_breadcrumb = sentry_sdk_instance.add_breadcrumb + elif callback == "posthog": + try: + from posthog import Posthog + except ImportError: + print_verbose("Package 'posthog' is missing. Installing it...") + subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'posthog']) + from posthog import Posthog + posthog = Posthog( + project_api_key=os.environ.get("POSTHOG_API_KEY"), + host=os.environ.get("POSTHOG_API_URL")) + elif callback == "slack": + try: + from slack_bolt import App + except ImportError: + print_verbose("Package 'slack_bolt' is missing. Installing it...") + subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'slack_bolt']) + from slack_bolt import App + slack_app = App( + token=os.environ.get("SLACK_API_TOKEN"), + signing_secret=os.environ.get("SLACK_API_SECRET") + ) + alerts_channel = os.environ["SLACK_API_CHANNEL"] + print_verbose(f"Initialized Slack App: {slack_app}") + except: + pass def handle_failure(exception, traceback_exception, args, kwargs): global sentry_sdk_instance, capture_exception, add_breadcrumb, posthog, slack_app, alerts_channel - print_verbose(f"handle_failure args: {args}") - print_verbose(f"handle_failure kwargs: {kwargs}") - + try: + print_verbose(f"handle_failure args: {args}") + print_verbose(f"handle_failure kwargs: {kwargs}") + + success_handler = additional_details.pop("success_handler", None) + failure_handler = additional_details.pop("failure_handler", None) + + additional_details["Event_Name"] = additional_details.pop("failed_event_name", "litellm.failed_query") + print_verbose(f"self.failure_callback: {litellm.failure_callback}") + + print_verbose(f"additional_details: {additional_details}") + for callback in litellm.failure_callback: + try: + if callback == "slack": + slack_msg = "" + if len(kwargs) > 0: + for key in kwargs: + slack_msg += f"{key}: {kwargs[key]}\n" + if len(args) > 0: + for i, arg in enumerate(args): + slack_msg += f"LiteLLM_Args_{str(i)}: {arg}" + for detail in additional_details: + slack_msg += f"{detail}: {additional_details[detail]}\n" + slack_msg += f"Traceback: {traceback_exception}" + slack_app.client.chat_postMessage(channel=alerts_channel, text=slack_msg) + elif callback == "sentry": + capture_exception(exception) + elif callback == "posthog": + print_verbose(f"inside posthog, additional_details: {len(additional_details.keys())}") + ph_obj = {} + if len(kwargs) > 0: + ph_obj = kwargs + if len(args) > 0: + for i, arg in enumerate(args): + ph_obj["litellm_args_" + str(i)] = arg + for detail in additional_details: + ph_obj[detail] = additional_details[detail] + event_name = additional_details["Event_Name"] + print_verbose(f"ph_obj: {ph_obj}") + print_verbose(f"PostHog Event Name: {event_name}") + if "user_id" in additional_details: + posthog.capture(additional_details["user_id"], event_name, ph_obj) + else: # PostHog calls require a unique id to identify a user - https://posthog.com/docs/libraries/python + unique_id = str(uuid.uuid4()) + posthog.capture(unique_id, event_name) + print_verbose(f"successfully logged to PostHog!") + except: + print_verbose(f"Error Occurred while logging failure: {traceback.format_exc()}") + pass + + if failure_handler and callable(failure_handler): + call_details = { + "exception": exception, + "additional_details": additional_details + } + failure_handler(call_details) + pass + except: + pass + +def handle_success(*args, **kwargs): + try: success_handler = additional_details.pop("success_handler", None) failure_handler = additional_details.pop("failure_handler", None) - - additional_details["Event_Name"] = additional_details.pop("failed_event_name", "litellm.failed_query") - print_verbose(f"self.failure_callback: {litellm.failure_callback}") - - print_verbose(f"additional_details: {additional_details}") - for callback in litellm.failure_callback: + additional_details["Event_Name"] = additional_details.pop("successful_event_name", "litellm.succes_query") + for callback in litellm.success_callback: try: - if callback == "slack": - slack_msg = "" - if len(kwargs) > 0: - for key in kwargs: - slack_msg += f"{key}: {kwargs[key]}\n" - if len(args) > 0: - for i, arg in enumerate(args): - slack_msg += f"LiteLLM_Args_{str(i)}: {arg}" - for detail in additional_details: - slack_msg += f"{detail}: {additional_details[detail]}\n" - slack_msg += f"Traceback: {traceback_exception}" - slack_app.client.chat_postMessage(channel=alerts_channel, text=slack_msg) - elif callback == "sentry": - capture_exception(exception) - elif callback == "posthog": - print_verbose(f"inside posthog, additional_details: {len(additional_details.keys())}") + if callback == "posthog": ph_obj = {} - if len(kwargs) > 0: - ph_obj = kwargs - if len(args) > 0: - for i, arg in enumerate(args): - ph_obj["litellm_args_" + str(i)] = arg for detail in additional_details: ph_obj[detail] = additional_details[detail] event_name = additional_details["Event_Name"] - print_verbose(f"ph_obj: {ph_obj}") - print_verbose(f"PostHog Event Name: {event_name}") if "user_id" in additional_details: posthog.capture(additional_details["user_id"], event_name, ph_obj) else: # PostHog calls require a unique id to identify a user - https://posthog.com/docs/libraries/python unique_id = str(uuid.uuid4()) - posthog.capture(unique_id, event_name) - print_verbose(f"successfully logged to PostHog!") + posthog.capture(unique_id, event_name, ph_obj) + pass + elif callback == "slack": + slack_msg = "" + for detail in additional_details: + slack_msg += f"{detail}: {additional_details[detail]}\n" + slack_app.client.chat_postMessage(channel=alerts_channel, text=slack_msg) except: - print_verbose(f"Error Occurred while logging failure: {traceback.format_exc()}") pass - - if failure_handler and callable(failure_handler): - call_details = { - "exception": exception, - "additional_details": additional_details - } - failure_handler(call_details) - pass -def handle_success(*args, **kwargs): - success_handler = additional_details.pop("success_handler", None) - failure_handler = additional_details.pop("failure_handler", None) - additional_details["Event_Name"] = additional_details.pop("successful_event_name", "litellm.succes_query") - for callback in litellm.success_callback: - try: - if callback == "posthog": - ph_obj = {} - for detail in additional_details: - ph_obj[detail] = additional_details[detail] - event_name = additional_details["Event_Name"] - if "user_id" in additional_details: - posthog.capture(additional_details["user_id"], event_name, ph_obj) - else: # PostHog calls require a unique id to identify a user - https://posthog.com/docs/libraries/python - unique_id = str(uuid.uuid4()) - posthog.capture(unique_id, event_name, ph_obj) - pass - elif callback == "slack": - slack_msg = "" - for detail in additional_details: - slack_msg += f"{detail}: {additional_details[detail]}\n" - slack_app.client.chat_postMessage(channel=alerts_channel, text=slack_msg) - except: - pass - - if success_handler and callable(success_handler): - success_handler(args, kwargs) - pass + if success_handler and callable(success_handler): + success_handler(args, kwargs) + pass + except: + pass def exception_type(model, original_exception):