From 272c0ee7f2af937011c068a5c68dadbda792897b Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 31 Jul 2023 18:26:16 -0700 Subject: [PATCH 1/2] clean up code files --- .DS_Store | Bin 8196 -> 6148 bytes build/lib/litellm/__init__.py | 1 + litellm/__init__.py | 31 +- litellm/__pycache__/__init__.cpython-311.pyc | Bin 199 -> 690 bytes litellm/__pycache__/config.cpython-311.pyc | Bin 0 -> 189 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 20758 -> 8872 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 0 -> 12674 bytes litellm/main.py | 304 ++++--------------- litellm/tests/test_bad_params.py | 8 +- litellm/tests/test_client.py | 16 +- litellm/tests/test_logging.py | 11 +- litellm/tests/test_model_fallback.py | 25 +- litellm/utils.py | 224 ++++++++++++++ 13 files changed, 349 insertions(+), 271 deletions(-) create mode 100644 litellm/__pycache__/config.cpython-311.pyc create mode 100644 litellm/__pycache__/utils.cpython-311.pyc create mode 100644 litellm/utils.py diff --git a/.DS_Store b/.DS_Store index 639e40acb9a4e4059e7fc62399755feea3a8a4a0..4c38913f15dda6dd8c084022410890129d2b0c4a 100644 GIT binary patch delta 131 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5r;6q~50D9Qtp2aDw}q%xE+WHRJ4@QQ MEM?dn&ohS^0Il2>0{{R3 delta 264 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8E20o2aKKEC`YZ@);OXJah7slXCKtHVbly zv20f0=x1Kc&cQLUfkhjnh?OCUp_Cz$AqSxlWDXEJ0mN01q)00<hr9M*+gm-PVkSf34KKOKaF)D2yX0K0Pd5wYP1G#$OE zyf`<(>Cv;ml*K%&oEAQpDaCIjoLVZV9a7Ne9XP-1L^lVWSLMJTA zBv}YDdzH~Lh0*m)3d5yLw=s%@5+;g{^7HHd3(!+a{<4@rulCdQCAh}M7_TPxmdIcG z(fDH6^pU-@vIdP~A6iRv(74FC-`Lg`>;V{C7akC{x3YGja2E>w<_>Zm0`~yGK6Js4 Rmgw-`wL+8S->Vpdm_Jy>){g)H delta 150 zcmdnQdYqAOIWI340}wnfJDg(0Fp*CpkPpb4&XB^8!kEJl!jQrg%%I8qk`XAV$#{!V z%MVDh^MASKfoQW&BbQW%37G@0D|G#PJk7pIoQm!%dZ zSUtB_ls4F*`F+-z7h}G&eP`q*y;Evm`YqCl^ka zq!t53_4M?U^YhX&)Ab4}e{tC4=BJeAq}mm+0gVK?p_mUyd|+l|WPHFQ*uV{fMJzxe E07ly~E&u=k literal 0 HcmV?d00001 diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index f652890678cf18cd9a6bf1782e5afa70b117a4ad..eefa5f283275bb85e59ca8f7f526232bc65524d0 100644 GIT binary patch delta 2424 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 Q`MW2uJV3ApATss;0bnfhzW@LL diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d27746f834a9a7694060fc12149bdb91e55c455 GIT binary patch literal 12674 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 mFDEC+?WAXu(8& ```litellm.verbose = True``` -def print_verbose(print_statement): - if set_verbose: - print(f"LiteLLM: {print_statement}") - print("Get help - https://discord.com/invite/wuPM9dRgDw") - -####### COMPLETION MODELS ################### -open_ai_chat_completion_models = [ - 'gpt-3.5-turbo', - 'gpt-4' -] -open_ai_text_completion_models = [ - 'text-davinci-003' -] - -cohere_models = [ - 'command-nightly', -] - -anthropic_models = [ - "claude-2", - "claude-instant-1" -] - -####### EMBEDDING MODELS ################### -open_ai_embedding_models = [ - 'text-embedding-ada-002' -] - -####### CLIENT ################### make it easy to log completion/embedding runs -def client(original_function): - def function_setup(): #just run once to check if user wants to send their data anywhere - try: - if len(success_callback) > 0 or len(failure_callback) > 0 and len(callback_list) == 0: - callback_list = list(set(success_callback + failure_callback)) - set_callbacks(callback_list=callback_list) - except: # DO NOT BLOCK running the function because of this - print_verbose(f"[Non-Blocking] {traceback.format_exc()}") - pass - - def wrapper(*args, **kwargs): - # Code to be executed before the embedding function - try: - function_setup() - ## EMBEDDING CALL - result = original_function(*args, **kwargs) - ## LOG SUCCESS - my_thread = threading.Thread(target=handle_success, args=(args, kwargs)) # don't interrupt execution of main thread - my_thread.start() - return result - except Exception as e: - traceback_exception = traceback.format_exc() - my_thread = threading.Thread(target=handle_failure, args=(e, traceback.format_exc(), args, kwargs)) # don't interrupt execution of main thread - my_thread.start() - raise e - return wrapper def get_optional_params( @@ -128,6 +59,7 @@ def get_optional_params( ####### COMPLETION ENDPOINTS ################ ############################################# @client +<<<<<<< HEAD @func_set_timeout(180, allowOverride=True) ## https://pypi.org/project/func-timeout/ - timeouts, in case calls hang (e.g. Azure) def completion( model, messages, # required params @@ -145,6 +77,12 @@ def completion( temperature=temperature, top_p=top_p, n=n, stream=stream, stop=stop, max_tokens=max_tokens, presence_penalty=presence_penalty, frequency_penalty=frequency_penalty, logit_bias=logit_bias, user=user ) +======= +@func_set_timeout(60, allowOverride=True) ## https://pypi.org/project/func-timeout/ - timeouts, in case calls hang (e.g. Azure) +def completion(model, messages, max_tokens=None, *, forceTimeout=60, azure=False, logger_fn=None): # ,*,.. if optional params like forceTimeout, azure and logger_fn are passed then they're keyword arguments + try: + response = None +>>>>>>> bd42ec8 (clean up code files) if azure == True: # azure configs openai.api_type = "azure" @@ -219,7 +157,7 @@ def completion( ] } response = new_response - elif model in anthropic_models: + elif model in litellm.anthropic_models: #anthropic defaults to os.environ.get("ANTHROPIC_API_KEY") prompt = f"{HUMAN_PROMPT}" for message in messages: @@ -259,7 +197,7 @@ def completion( } print_verbose(f"new response: {new_response}") response = new_response - elif model in cohere_models: + elif model in litellm.cohere_models: cohere_key = os.environ.get("COHERE_API_KEY") co = cohere.Client(cohere_key) prompt = " ".join([message["content"] for message in messages]) @@ -283,8 +221,41 @@ def completion( ], } response = new_response +<<<<<<< HEAD else: raise Exception(f"Model '{model}' not found. Please check your model name and try again.") +======= + + elif model in litellm.open_ai_chat_completion_models: + openai.api_type = "openai" + openai.api_base = "https://api.openai.com/v1" + openai.api_version = None + openai.api_key = os.environ.get("OPENAI_API_KEY") + ## LOGGING + logging(model=model, input=messages, azure=azure, logger_fn=logger_fn) + ## COMPLETION CALL + response = openai.ChatCompletion.create( + model=model, + messages = messages + ) + elif model in litellm.open_ai_text_completion_models: + openai.api_type = "openai" + openai.api_base = "https://api.openai.com/v1" + openai.api_version = None + openai.api_key = os.environ.get("OPENAI_API_KEY") + prompt = " ".join([message["content"] for message in messages]) + ## LOGGING + logging(model=model, input=prompt, azure=azure, logger_fn=logger_fn) + ## COMPLETION CALL + response = openai.Completion.create( + model=model, + prompt = prompt + ) + else: + logging(model=model, input=messages, azure=azure, logger_fn=logger_fn) + args = locals() + raise ValueError(f"No valid completion model args passed in - {args}") +>>>>>>> bd42ec8 (clean up code files) return response except Exception as e: logging(model=model, input=messages, azure=azure, additional_args={"max_tokens": max_tokens}, logger_fn=logger_fn) @@ -307,7 +278,7 @@ def embedding(model, input=[], azure=False, forceTimeout=60, logger_fn=None): ## EMBEDDING CALL response = openai.Embedding.create(input=input, engine=model) print_verbose(f"response_value: {str(response)[:50]}") - elif model in open_ai_embedding_models: + elif model in litellm.open_ai_embedding_models: openai.api_type = "openai" openai.api_base = "https://api.openai.com/v1" openai.api_version = None @@ -324,180 +295,11 @@ def embedding(model, input=[], azure=False, forceTimeout=60, logger_fn=None): return response - ####### HELPER FUNCTIONS ################ +## Set verbose to true -> ```litellm.set_verbose = True``` +def print_verbose(print_statement): + if litellm.set_verbose: + print(f"LiteLLM: {print_statement}") + if random.random() <= 0.3: + print("Get help - https://discord.com/invite/wuPM9dRgDw") -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}") - - -def handle_failure(exception, traceback_exception, args, kwargs): - 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: {failure_callback}") - - print_verbose(f"additional_details: {additional_details}") - for callback in 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}" - print_verbose(f"This is the slack message: {slack_msg}") - 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 - print_verbose(f"ph_obj: {ph_obj}") - for detail in additional_details: - ph_obj[detail] = additional_details[detail] - event_name = additional_details["Event_Name"] - 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 - print(f"ph_obj: {ph_obj})") - 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 - - -def handle_input(model_call_details={}): - if len(model_call_details.keys()) > 0: - model = model_call_details["model"] if "model" in model_call_details else None - if model: - for callback in callback_list: - if callback == "sentry": # add a sentry breadcrumb if user passed in sentry integration - add_breadcrumb( - category=f'{model}', - message='Trying request model {} input {}'.format(model, json.dumps(model_call_details)), - level='info', - ) - if user_logger_fn and callable(user_logger_fn): - user_logger_fn(model_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 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 - -#Logging function -> log the exact model details + what's being sent | Non-Blocking -def logging(model, input, azure=False, additional_args={}, logger_fn=None): - try: - model_call_details = {} - model_call_details["model"] = model - model_call_details["input"] = input - model_call_details["azure"] = azure - # log additional call details -> api key, etc. - if azure == True or model in open_ai_chat_completion_models or model in open_ai_chat_completion_models or model in open_ai_embedding_models: - model_call_details["api_type"] = openai.api_type - model_call_details["api_base"] = openai.api_base - model_call_details["api_version"] = openai.api_version - model_call_details["api_key"] = openai.api_key - elif "replicate" in model: - model_call_details["api_key"] = os.environ.get("REPLICATE_API_TOKEN") - elif model in anthropic_models: - model_call_details["api_key"] = os.environ.get("ANTHROPIC_API_KEY") - elif model in cohere_models: - model_call_details["api_key"] = os.environ.get("COHERE_API_KEY") - model_call_details["additional_args"] = additional_args - ## Logging - print_verbose(f"Basic model call details: {model_call_details}") - if logger_fn and callable(logger_fn): - try: - logger_fn(model_call_details) # Expectation: any logger function passed in by the user should accept a dict object - except: - print_verbose(f"[Non-Blocking] Exception occurred while logging {traceback.format_exc()}") - pass - except: - pass diff --git a/litellm/tests/test_bad_params.py b/litellm/tests/test_bad_params.py index 20123b1350..b42c16d589 100644 --- a/litellm/tests/test_bad_params.py +++ b/litellm/tests/test_bad_params.py @@ -1,3 +1,7 @@ +#### What this tests #### +# This tests chaos monkeys - if random parts of the system are broken / things aren't sent correctly - what happens. +# Expect to add more edge cases to this over time. + import sys, os import traceback @@ -11,11 +15,11 @@ parent_dir = os.path.join(current_dir, '..') sys.path.append(parent_dir) import main -from main import embedding, completion +from main import embedding, completion, set_verbose main.success_callback = ["posthog"] main.failure_callback = ["slack", "sentry", "posthog"] -main.set_verbose = True +set_verbose(True) user_message = "Hello, how are you?" messages = [{ "content": user_message,"role": "user"}] diff --git a/litellm/tests/test_client.py b/litellm/tests/test_client.py index f9399d42cf..2f5906ad0e 100644 --- a/litellm/tests/test_client.py +++ b/litellm/tests/test_client.py @@ -1,12 +1,16 @@ +#### What this tests #### +# This tests error logging (with custom user functions) for the `completion` + `embedding` endpoints w/ callbacks + import sys, os import traceback -sys.path.append('..') # Adds the parent directory to the system path -import main -from main import embedding, completion -main.success_callback = ["posthog"] -main.failure_callback = ["slack", "sentry", "posthog"] +sys.path.insert(0, os.path.abspath('../..')) # Adds the parent directory to the system path +import litellm +from litellm import embedding, completion -# main.set_verbose = True +litellm.success_callback = ["posthog"] +litellm.failure_callback = ["slack", "sentry", "posthog"] + +# litellm.set_verbose = True def logger_fn(model_call_object: dict): # print(f"model call details: {model_call_object}") diff --git a/litellm/tests/test_logging.py b/litellm/tests/test_logging.py index 95a75de472..21e4a879c6 100644 --- a/litellm/tests/test_logging.py +++ b/litellm/tests/test_logging.py @@ -1,10 +1,13 @@ +#### What this tests #### +# This tests error logging (with custom user functions) for the raw `completion` + `embedding` endpoints + import sys, os import traceback -sys.path.append('..') # Adds the parent directory to the system path -import main -from main import completion, embedding +sys.path.insert(0, os.path.abspath('../..')) # Adds the parent directory to the system path +import litellm +from litellm import embedding, completion -main.verbose = True ## Replace to: ```litellm.verbose = True``` when using pypi package +litellm.set_verbose = True def logger_fn(model_call_object: dict): print(f"model call details: {model_call_object}") diff --git a/litellm/tests/test_model_fallback.py b/litellm/tests/test_model_fallback.py index 8710465eb4..8e031a9806 100644 --- a/litellm/tests/test_model_fallback.py +++ b/litellm/tests/test_model_fallback.py @@ -1,14 +1,18 @@ +#### What this tests #### +# This tests error handling + logging (esp. for sentry breadcrumbs) + import sys, os import traceback -sys.path.append('..') # Adds the parent directory to the system path -import main -from main import embedding, completion -main.success_callback = ["posthog"] -main.failure_callback = ["slack", "sentry", "posthog"] +sys.path.insert(0, os.path.abspath('../..')) # Adds the parent directory to the system path +import litellm +from litellm import embedding, completion -main.set_verbose = True +litellm.success_callback = ["posthog"] +litellm.failure_callback = ["slack", "sentry", "posthog"] -model_fallback_list = ["replicate/llama-2-70b-chat:2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1", "claude-instant-1", "gpt-3.5-turbo"] +litellm.set_verbose = True + +model_fallback_list = ["replicate/llama-2-70b-chat:2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1", "replicate/llama-2-70b-chat:2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1", "chatgpt-test"] user_message = "Hello, how are you?" messages = [{ "content": user_message,"role": "user"}] @@ -16,10 +20,17 @@ messages = [{ "content": user_message,"role": "user"}] # for _ in range(10): for model in model_fallback_list: try: + response = embedding(model="text-embedding-ada-002", input=[user_message]) response = completion(model=model, messages=messages) print(response) +<<<<<<< HEAD if response != None: break except Exception as e: +======= + # if response != None: + # break + except: +>>>>>>> bd42ec8 (clean up code files) print(f"error occurred: {traceback.format_exc()}") raise e diff --git a/litellm/utils.py b/litellm/utils.py new file mode 100644 index 0000000000..593b754f03 --- /dev/null +++ b/litellm/utils.py @@ -0,0 +1,224 @@ +import dotenv +import json +import traceback +import threading +import traceback +import subprocess +import uuid +import litellm +import os +import openai +import random +####### ENVIRONMENT VARIABLES ################### +dotenv.load_dotenv() # Loading env variables using dotenv +sentry_sdk_instance = None +capture_exception = None +add_breadcrumb = None +posthog = None +slack_app = None +alerts_channel = None +callback_list = [] +user_logger_fn = None +additional_details = {} + +def print_verbose(print_statement): + if litellm.set_verbose: + print(f"LiteLLM: {print_statement}") + if random.random() <= 0.3: + print("Get help - https://discord.com/invite/wuPM9dRgDw") + +####### LOGGING ################### +#Logging function -> log the exact model details + what's being sent | Non-Blocking +def logging(model, input, azure=False, additional_args={}, logger_fn=None): + try: + model_call_details = {} + model_call_details["model"] = model + model_call_details["input"] = input + model_call_details["azure"] = azure + # 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 + model_call_details["api_base"] = openai.api_base + model_call_details["api_version"] = openai.api_version + model_call_details["api_key"] = openai.api_key + elif "replicate" in model: + model_call_details["api_key"] = os.environ.get("REPLICATE_API_TOKEN") + elif model in litellm.anthropic_models: + model_call_details["api_key"] = os.environ.get("ANTHROPIC_API_KEY") + elif model in litellm.cohere_models: + model_call_details["api_key"] = os.environ.get("COHERE_API_KEY") + model_call_details["additional_args"] = additional_args + ## User Logging -> if you pass in a custom logging function or want to use sentry breadcrumbs + print_verbose(f"Basic model call details: {model_call_details}") + if logger_fn and callable(logger_fn): + try: + logger_fn(model_call_details) # Expectation: any logger function passed in by the user should accept a dict object + except: + print_verbose(f"[Non-Blocking] Exception occurred while logging {traceback.format_exc()}") + except: + traceback.print_exc() + pass + +####### CLIENT ################### +# make it easy to log if completion/embedding runs succeeded or failed + see what happened | Non-Blocking +def client(original_function): + def function_setup(*args, **kwargs): #just run once to check if user wants to send their data anywhere - PostHog/Sentry/Slack/etc. + try: + global callback_list, add_breadcrumb + if (len(litellm.success_callback) > 0 or len(litellm.failure_callback) > 0) and len(callback_list) == 0: + callback_list = list(set(litellm.success_callback + litellm.failure_callback)) + set_callbacks(callback_list=callback_list) + if add_breadcrumb: + add_breadcrumb( + category="litellm.llm_call", + message=f"Positional Args: {args}, Keyword Args: {kwargs}", + level="info", + ) + except: # DO NOT BLOCK running the function because of this + print_verbose(f"[Non-Blocking] {traceback.format_exc()}") + pass + + def wrapper(*args, **kwargs): + try: + function_setup(args, kwargs) + ## MODEL CALL + result = original_function(*args, **kwargs) + ## LOG SUCCESS + my_thread = threading.Thread(target=handle_success, args=(args, kwargs)) # don't interrupt execution of main thread + my_thread.start() + return result + except Exception as e: + traceback_exception = traceback.format_exc() + my_thread = threading.Thread(target=handle_failure, args=(e, traceback_exception, args, kwargs)) # don't interrupt execution of main thread + my_thread.start() + raise e + return wrapper + +####### 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}") + + +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}") + + 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 + +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 + From f753aac5aae4acf33eaba294919698ccbb2ee98a Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Mon, 31 Jul 2023 18:33:29 -0700 Subject: [PATCH 2/2] handled merge conflicts --- litellm/__pycache__/__init__.cpython-311.pyc | Bin 690 -> 690 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 8872 -> 11380 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 12674 -> 12674 bytes litellm/main.py | 16 ++-------------- litellm/tests/test_completion.py | 8 ++++---- litellm/tests/test_model_fallback.py | 10 ---------- 6 files changed, 6 insertions(+), 28 deletions(-) diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc index ab63061a31852414278c10cac48252df6aa50a01..73352d569b34079e00484ef045a889fb1748fcec 100644 GIT binary patch delta 19 ZcmdnQx`~x*IWI340}u$tZ{%9R1OO|g1Q`GT delta 19 ZcmdnQx`~x*IWI340}$Nw+Q_wn2>>tb1k3;c diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc index eefa5f283275bb85e59ca8f7f526232bc65524d0..11eb85d841f7d983653af7afa7b2b1cf73f994e8 100644 GIT binary patch literal 11380 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 XMz2u=e*>>>>>> bd42ec8 (clean up code files) if azure == True: # azure configs openai.api_type = "azure" @@ -97,7 +90,7 @@ def completion(model, messages, max_tokens=None, *, forceTimeout=60, azure=False messages = messages, **optional_params ) - elif model in open_ai_chat_completion_models: + elif model in litellm.open_ai_chat_completion_models: openai.api_type = "openai" openai.api_base = "https://api.openai.com/v1" openai.api_version = None @@ -111,7 +104,7 @@ def completion(model, messages, max_tokens=None, *, forceTimeout=60, azure=False messages = messages, **optional_params ) - elif model in open_ai_text_completion_models: + elif model in litellm.open_ai_text_completion_models: openai.api_type = "openai" openai.api_base = "https://api.openai.com/v1" openai.api_version = None @@ -221,10 +214,6 @@ def completion(model, messages, max_tokens=None, *, forceTimeout=60, azure=False ], } response = new_response -<<<<<<< HEAD - else: - raise Exception(f"Model '{model}' not found. Please check your model name and try again.") -======= elif model in litellm.open_ai_chat_completion_models: openai.api_type = "openai" @@ -255,7 +244,6 @@ def completion(model, messages, max_tokens=None, *, forceTimeout=60, azure=False logging(model=model, input=messages, azure=azure, logger_fn=logger_fn) args = locals() raise ValueError(f"No valid completion model args passed in - {args}") ->>>>>>> bd42ec8 (clean up code files) return response except Exception as e: logging(model=model, input=messages, azure=azure, additional_args={"max_tokens": max_tokens}, logger_fn=logger_fn) diff --git a/litellm/tests/test_completion.py b/litellm/tests/test_completion.py index ee64099ce7..88574ff2ee 100644 --- a/litellm/tests/test_completion.py +++ b/litellm/tests/test_completion.py @@ -1,10 +1,10 @@ import sys, os import traceback -sys.path.append('..') # Adds the parent directory to the system path -import main -from main import completion +sys.path.insert(0, os.path.abspath('../..')) # Adds the parent directory to the system path +import litellm +from litellm import embedding, completion -main.set_verbose = True +litellm.set_verbose = True user_message = "Hello, whats the weather in San Francisco??" messages = [{ "content": user_message,"role": "user"}] diff --git a/litellm/tests/test_model_fallback.py b/litellm/tests/test_model_fallback.py index 8e031a9806..b389e9f6ac 100644 --- a/litellm/tests/test_model_fallback.py +++ b/litellm/tests/test_model_fallback.py @@ -17,20 +17,10 @@ model_fallback_list = ["replicate/llama-2-70b-chat:2c1608e18606fad2812020dc54193 user_message = "Hello, how are you?" messages = [{ "content": user_message,"role": "user"}] -# for _ in range(10): for model in model_fallback_list: try: response = embedding(model="text-embedding-ada-002", input=[user_message]) response = completion(model=model, messages=messages) print(response) -<<<<<<< HEAD - if response != None: - break except Exception as e: -======= - # if response != None: - # break - except: ->>>>>>> bd42ec8 (clean up code files) print(f"error occurred: {traceback.format_exc()}") - raise e