From aae54e0305a9cc2b73c65a41b88a7fea85e034f1 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 2 Feb 2024 10:14:26 -0800 Subject: [PATCH 1/7] (feat) improve exceptions for OpenAI compatible - --- litellm/utils.py | 51 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/litellm/utils.py b/litellm/utils.py index b6b5d5a35fb..e1caf5aef87 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -5907,6 +5907,11 @@ def exception_type( or custom_llm_provider in litellm.openai_compatible_providers ): # custom_llm_provider is openai, make it OpenAI + message = original_exception.message + if message is not None and isinstance(message, str): + message = message.replace("OPENAI", custom_llm_provider.upper()) + message = message.replace("openai", custom_llm_provider) + message = message.replace("OpenAI", custom_llm_provider) if custom_llm_provider == "openai": exception_provider = "OpenAI" + "Exception" else: @@ -5922,7 +5927,7 @@ def exception_type( ): exception_mapping_worked = True raise ContextWindowExceededError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, response=original_exception.response, @@ -5933,7 +5938,7 @@ def exception_type( ): exception_mapping_worked = True raise NotFoundError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, response=original_exception.response, @@ -5944,7 +5949,7 @@ def exception_type( ): exception_mapping_worked = True raise ContentPolicyViolationError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, response=original_exception.response, @@ -5955,7 +5960,18 @@ def exception_type( ): exception_mapping_worked = True raise BadRequestError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", + llm_provider=custom_llm_provider, + model=model, + response=original_exception.response, + ) + elif ( + "The api_key client option must be set either by passing api_key to the client or by setting the OPENAI_API_KEY environment variable" + in error_str + ): + exception_mapping_worked = True + raise AuthenticationError( + message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, response=original_exception.response, @@ -5965,7 +5981,7 @@ def exception_type( if original_exception.status_code == 401: exception_mapping_worked = True raise AuthenticationError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, response=original_exception.response, @@ -5973,7 +5989,7 @@ def exception_type( elif original_exception.status_code == 404: exception_mapping_worked = True raise NotFoundError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", model=model, llm_provider=custom_llm_provider, response=original_exception.response, @@ -5981,14 +5997,14 @@ def exception_type( elif original_exception.status_code == 408: exception_mapping_worked = True raise Timeout( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", model=model, llm_provider=custom_llm_provider, ) elif original_exception.status_code == 422: exception_mapping_worked = True raise BadRequestError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", model=model, llm_provider=custom_llm_provider, response=original_exception.response, @@ -5996,7 +6012,7 @@ def exception_type( elif original_exception.status_code == 429: exception_mapping_worked = True raise RateLimitError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", model=model, llm_provider=custom_llm_provider, response=original_exception.response, @@ -6004,7 +6020,7 @@ def exception_type( elif original_exception.status_code == 503: exception_mapping_worked = True raise ServiceUnavailableError( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", model=model, llm_provider=custom_llm_provider, response=original_exception.response, @@ -6012,7 +6028,7 @@ def exception_type( elif original_exception.status_code == 504: # gateway timeout error exception_mapping_worked = True raise Timeout( - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", model=model, llm_provider=custom_llm_provider, ) @@ -6020,7 +6036,7 @@ def exception_type( exception_mapping_worked = True raise APIError( status_code=original_exception.status_code, - message=f"{exception_provider} - {original_exception.message}", + message=f"{exception_provider} - {message}", llm_provider=custom_llm_provider, model=model, request=original_exception.request, @@ -6953,6 +6969,17 @@ def exception_type( model=model, response=original_exception.response, ) + elif ( + "The api_key client option must be set either by passing api_key to the client or by setting" + in error_str + ): + exception_mapping_worked = True + raise AuthenticationError( + message=f"{exception_provider} - {original_exception.message}", + llm_provider=custom_llm_provider, + model=model, + response=original_exception.response, + ) elif hasattr(original_exception, "status_code"): exception_mapping_worked = True if original_exception.status_code == 401: From 544789930214fbac075dc34a72cd4c54c4171856 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 2 Feb 2024 10:37:59 -0800 Subject: [PATCH 2/7] (openai) api_key --- litellm/main.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/litellm/main.py b/litellm/main.py index bf4132863d3..eb7b198fdca 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -805,13 +805,18 @@ def completion( or None # default - https://github.com/openai/openai-python/blob/284c1799070c723c6a553337134148a7ab088dd8/openai/util.py#L105 ) # set API KEY - api_key = ( - api_key - or litellm.api_key # for deepinfra/perplexity/anyscale we check in get_llm_provider and pass in the api key from there - or litellm.openai_key - or get_secret("OPENAI_API_KEY") - ) + api_key = ( + api_key or litellm.api_key + ) # for deepinfra/perplexity/anyscale we check in get_llm_provider and pass in the api key from there + # only for OpenAI we check env OPENAI_API_KEY, and litellm.openai_key + if ( + custom_llm_provider == "openai" + or custom_llm_provider == "custom_openai" + or model in litellm.open_ai_chat_completion_models + or "ft:gpt-3.5-turbo" in model + ): + api_key = api_key or litellm.openai_key or get_secret("OPENAI_API_KEY") headers = headers or litellm.headers ## LOAD CONFIG - if set From b17fe8d6f596e70339e3d3372de49dfce9170abf Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 2 Feb 2024 10:38:28 -0800 Subject: [PATCH 3/7] (test) exceptions --- litellm/tests/test_exceptions.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/litellm/tests/test_exceptions.py b/litellm/tests/test_exceptions.py index dfa571f00c5..16a3a9f4713 100644 --- a/litellm/tests/test_exceptions.py +++ b/litellm/tests/test_exceptions.py @@ -444,6 +444,38 @@ def test_content_policy_violation_error_streaming(): asyncio.run(test_get_error()) +def test_completion_perplexity_exception_on_openai_client(): + try: + import openai + + print("perplexity test\n\n") + litellm.set_verbose = False + ## Test azure call + old_azure_key = os.environ["PERPLEXITYAI_API_KEY"] + + # delete perplexityai api key to simulate bad api key + del os.environ["PERPLEXITYAI_API_KEY"] + # del os.environ["OPENAI_API_KEY"] + response = completion( + model="perplexity/mistral-7b-instruct", + messages=[{"role": "user", "content": "hello"}], + ) + os.environ["PERPLEXITYAI_API_KEY"] = old_azure_key + pytest.fail("Request should have failed - bad api key") + except openai.AuthenticationError as e: + os.environ["PERPLEXITYAI_API_KEY"] = old_azure_key + print("exception: ", e) + assert ( + "perplexity.perplexityError: The api_key client option must be set either by passing api_key to the client or by setting the PERPLEXITY_API_KEY environment variable" + in str(e) + ) + except Exception as e: + pytest.fail(f"Error occurred: {e}") + + +# test_completion_perplexity_exception_on_openai_client() + + def test_completion_perplexity_exception(): try: import openai From 4473c48e2bd9f3a106f9c3665cc5afe0ea7a9f89 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 2 Feb 2024 12:32:10 -0800 Subject: [PATCH 4/7] (fix) test exception mapping --- litellm/tests/test_exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litellm/tests/test_exceptions.py b/litellm/tests/test_exceptions.py index 16a3a9f4713..1800cbc5ee7 100644 --- a/litellm/tests/test_exceptions.py +++ b/litellm/tests/test_exceptions.py @@ -455,7 +455,7 @@ def test_completion_perplexity_exception_on_openai_client(): # delete perplexityai api key to simulate bad api key del os.environ["PERPLEXITYAI_API_KEY"] - # del os.environ["OPENAI_API_KEY"] + del os.environ["OPENAI_API_KEY"] response = completion( model="perplexity/mistral-7b-instruct", messages=[{"role": "user", "content": "hello"}], From e37294c921e554f16c8861570b157c8be8286b16 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 2 Feb 2024 12:37:21 -0800 Subject: [PATCH 5/7] (test) improve exceptions for pplx AI --- litellm/tests/test_exceptions.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/litellm/tests/test_exceptions.py b/litellm/tests/test_exceptions.py index 1800cbc5ee7..d4a73c86707 100644 --- a/litellm/tests/test_exceptions.py +++ b/litellm/tests/test_exceptions.py @@ -455,15 +455,21 @@ def test_completion_perplexity_exception_on_openai_client(): # delete perplexityai api key to simulate bad api key del os.environ["PERPLEXITYAI_API_KEY"] + + # temporaily delete openai api key + original_openai_key = os.environ["OPENAI_API_KEY"] del os.environ["OPENAI_API_KEY"] + response = completion( model="perplexity/mistral-7b-instruct", messages=[{"role": "user", "content": "hello"}], ) os.environ["PERPLEXITYAI_API_KEY"] = old_azure_key + os.environ["OPENAI_API_KEY"] = original_openai_key pytest.fail("Request should have failed - bad api key") except openai.AuthenticationError as e: os.environ["PERPLEXITYAI_API_KEY"] = old_azure_key + os.environ["OPENAI_API_KEY"] = original_openai_key print("exception: ", e) assert ( "perplexity.perplexityError: The api_key client option must be set either by passing api_key to the client or by setting the PERPLEXITY_API_KEY environment variable" From 556ca484483e63e1d620ea69a7b3441bad1d1149 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 2 Feb 2024 12:38:29 -0800 Subject: [PATCH 6/7] (fix) undo change --- litellm/main.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/litellm/main.py b/litellm/main.py index eb7b198fdca..eaad2226178 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -807,16 +807,12 @@ def completion( # set API KEY api_key = ( - api_key or litellm.api_key - ) # for deepinfra/perplexity/anyscale we check in get_llm_provider and pass in the api key from there - # only for OpenAI we check env OPENAI_API_KEY, and litellm.openai_key - if ( - custom_llm_provider == "openai" - or custom_llm_provider == "custom_openai" - or model in litellm.open_ai_chat_completion_models - or "ft:gpt-3.5-turbo" in model - ): - api_key = api_key or litellm.openai_key or get_secret("OPENAI_API_KEY") + api_key + or litellm.api_key # for deepinfra/perplexity/anyscale we check in get_llm_provider and pass in the api key from there + or litellm.openai_key + or get_secret("OPENAI_API_KEY") + ) + headers = headers or litellm.headers ## LOAD CONFIG - if set From aa92ad5791b443978bea43a121fa45ef67931641 Mon Sep 17 00:00:00 2001 From: ishaan-jaff Date: Fri, 2 Feb 2024 12:39:49 -0800 Subject: [PATCH 7/7] (chore) fix space --- litellm/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/litellm/main.py b/litellm/main.py index eaad2226178..bf4132863d3 100644 --- a/litellm/main.py +++ b/litellm/main.py @@ -805,7 +805,6 @@ def completion( or None # default - https://github.com/openai/openai-python/blob/284c1799070c723c6a553337134148a7ab088dd8/openai/util.py#L105 ) # set API KEY - api_key = ( api_key or litellm.api_key # for deepinfra/perplexity/anyscale we check in get_llm_provider and pass in the api key from there