From 7d16df98aca3469e2f9405cc0d3fe0de0b10fba3 Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Thu, 24 Aug 2023 18:54:34 -0700 Subject: [PATCH] updates to logging --- litellm/__pycache__/main.cpython-311.pyc | Bin 28703 -> 28770 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 65499 -> 66507 bytes litellm/integrations/litedebugger.py | 21 ++++++++++++++ litellm/utils.py | 32 +++++++++++++++++++--- 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index 02f2cbf12a9d2333488dd69b30c57a6f0c2998d0..ed8a5a2b1956d6d26c3378021d0cc45ddc56add9 100644 GIT binary patch delta 1489 zcmY*YeN0nV6o2QH7TVH6=?9~hQeXuO0tzS}Lps!o%OnhCA1YX(x0GUO@llu`4?)Ga z>9PrD%VJ>jBiS?)qVCO@ESrwSVB!)tH>*fxE z@EPt%vqLT(O-sciXm9~YNX5tx^ ziPld*EEyrV$5!ya6E9w{br!UU<=r48g?m}WnMHhJIm`MfaNJ4y%&grYmXj8#DV@%) z6@ST?2Y#H+sDn0i+a0i(7OlifcB3?&ng2`>K%Kp2R?yA_(j|KuV0?B0PGu!S2sPP7 z&_Nv^!WJAzN(KQZv&WR3Gwlm4Se0NxXM!0Y%uj_dOAtpm(j}Jq0d+b(Haq4+Hy&`L zso$Ipd6#tKS;xz;6(Q%Ua@*`2%`8!jaD!}TMA6L&-;o`t%gqFFHmO)mddN;3Fc|S* zu0`1+a-?@yHqwWebUAo4S0|@l`nKzm45(aShh12(U=Qp@X~7oQgZ8|1*eg}%1!7hD z`r2w&{VLZQH=Zay4=IvwaXUag{=8(EwkVVwf_)fYdIXM2qop!{D|n`CF&viemwm~@ z03NHz1jO-*EXDhD=E4W~XGOo|5Tz5b9fFtmJ>dy;lfQ70yFEm_flgsa8eD1s^#vwg z%U}@CR2pC$$17chmsuR|2?RZGV+Tc7^~Klp#Su9@h$uM2 zyhto%Q*o4C)8|FhoW>f_N^5H`D`eL-HYxM9bFkjR9cxIaT5aKeEp(+Ydnf)S1G5j( zT}8}J8kaekedMewV|L6{w#*hKtIR7PN>*D`RW(N0*y^mDs+vUESWTjw?y>ldDR_c8 z>xvcs(mwysX`93hUx-xvTje|h-3u1xzsO=^JfV(lf}HI~v3~R4MXYs!btSNxGgoFg1UGYJF?gQB zKXDcGgX{`;D+Pzt7Z~LEE)^O=dCR+0po(yFa0PG*eZ&QGj-u|#Sf1w}a}*}!93R(j Oim0NJpb`5+L;nH0;lZK+ delta 1435 zcmY*YYfKbZ6uxJM9blJT9?LGe;69|tV+9nnAVm<7T2qM{Vl7srurt8&*u`N%k)fd2 zrj1P%PLrxY)iz41#Ma&>P1>j-#+cf)DN+9r4FsE-rZrtc3Bjgm?_EklCzbLGv;GzId5RvO1$C(@;6rz6F8D)Z4X0K@EB41Fz#)uI8v_-` z)Am9eSelH$4s7@w0S?p=0qZ)DPr#yr2Fm97adRI2^&53>S1_Nwih! zAnNz>QOtHHLszJdwq4fbZtRb@;5Bzrq^1%1ts!x=2k*va;NR|8k+ZRDUxHrji7UWU zX$3L9xWLt=wF!}r;rQA^a2!iBU2uXbna$z&%LWQ7=(&w802LUKH^jEMly?^1!Q%W2 zaDh(civYjl&zm;F$JAEvjR2?dVPP`6atnoPBxJSK4>4u)2{?mSHrwDFy|XzUoHx0@ zffw{f_G3q@r)-*HOt_|+e{64%gPU+?wR*VTBGYEQFQ@deZ$dGJXN zyEt6L*5VZ#2e`V}m}wJwPeVtE^b+3I5`;Fw21JNZrjpR{I*-9>_ zqjtn|`J1aOm&+N;RvVYI>-KEoa;z+4t23m$V%P>DWv5YJQZ9*OI}b$}Rjua7R_Cq-X!YN|6p! zy(__GOqBP*6>O8UoY(ouM3%MGDzePJfl7J)Q4Y5_jN+JVkKq?do#HUg;Vb+@PLFxQ z)oBh+4zrl1BeiY-gBs0~>>Q@> z)5bjA3YOW6lZ^-ATP$iSN;ETDP2&7*o*U-zw|1&JZja(eO$)hvb(L?W@}7$$^BQV3 zC)RLyfx+{LLUu#io0TFpjoxk^5QGW??(=7sRv17ZB+GCc5Xl@YgJrG|Jrgbn!k>h} UjE)EqC#*qzD5TMfcm0F^0-Hg$xc~qF diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index 6fbfd8e4dc14c89345798174045d0efb59a4a222..43dafb9b0e48e1f7720be12e03a9c73368ec1287 100644 GIT binary patch delta 6362 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 AF#rGn delta 5752 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 diff --git a/litellm/integrations/litedebugger.py b/litellm/integrations/litedebugger.py index 8b4c6d751..76b0ddba7 100644 --- a/litellm/integrations/litedebugger.py +++ b/litellm/integrations/litedebugger.py @@ -56,6 +56,27 @@ class LiteDebugger: f"[Non-Blocking Error] LiteDebugger: Logging Error - {traceback.format_exc()}" ) pass + + def post_call_log_event( + self, original_response, litellm_call_id, print_verbose + ): + try: + litellm_data_obj = { + "status": "succeeded", + "additional_details": {"original_response": original_response}, + "litellm_call_id": litellm_call_id, + "user_email": self.user_email, + } + response = requests.post( + url=self.api_url, + headers={"content-type": "application/json"}, + data=json.dumps(litellm_data_obj), + ) + print_verbose(f"LiteDebugger: api response - {response.text}") + except: + print_verbose( + f"[Non-Blocking Error] LiteDebugger: Logging Error - {traceback.format_exc()}" + ) def log_event( self, diff --git a/litellm/utils.py b/litellm/utils.py index d76245bf2..12840549b 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -260,6 +260,30 @@ class Logging: print_verbose( f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {traceback.format_exc()}" ) + + # Input Integration Logging -> If you want to log the fact that an attempt to call the model was made + for callback in litellm.input_callback: + try: + if callback == "lite_debugger": + print_verbose("reaches litedebugger for post-call logging!") + model = self.model_call_details["model"] + messages = self.model_call_details["input"] + print_verbose(f"liteDebuggerClient: {liteDebuggerClient}") + liteDebuggerClient.post_call_log_event( + original_response=original_response, + litellm_call_id=self. + litellm_params["litellm_call_id"], + print_verbose=print_verbose, + ) + except: + print_verbose( + f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while post-call logging with integrations {traceback.format_exc()}" + ) + print_verbose( + f"LiteLLM.Logging: is sentry capture exception initialized {capture_exception}" + ) + if capture_exception: # log this error to sentry for debugging + capture_exception(e) except: print_verbose( f"LiteLLM.LoggingError: [Non-Blocking] Exception occurred while logging {traceback.format_exc()}" @@ -788,8 +812,6 @@ def handle_failure(exception, traceback_exception, start_time, end_time, args, 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": @@ -1143,8 +1165,8 @@ def get_all_keys(llm_provider=None): time_delta = current_time - last_fetched_at_keys if time_delta > 300 or last_fetched_at_keys == None or llm_provider: # if the llm provider is passed in , assume this happening due to an AuthError for that provider # make the api call - last_fetched_at_keys = time.time() - print_verbose(f"last_fetched_at_keys: {last_fetched_at_keys}") + last_fetched_at = time.time() + print_verbose(f"last_fetched_at: {last_fetched_at}") response = requests.post(url="http://api.litellm.ai/get_all_keys", headers={"content-type": "application/json"}, data=json.dumps({"user_email": user_email})) print_verbose(f"get model key response: {response.text}") data = response.json() @@ -1175,6 +1197,8 @@ def get_model_list(): data = response.json() # update model list model_list = data["model_list"] + # update environment - if required + threading.Thread(target=get_all_keys, args=()).start() return model_list return [] # return empty list by default except: