diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc index 27a856762..5ef3ac7b1 100644 Binary files a/litellm/__pycache__/utils.cpython-311.pyc and b/litellm/__pycache__/utils.cpython-311.pyc differ diff --git a/litellm/llms/anthropic.py b/litellm/llms/anthropic.py index c4e2ece7c..904c81819 100644 --- a/litellm/llms/anthropic.py +++ b/litellm/llms/anthropic.py @@ -113,10 +113,13 @@ class AnthropicLLM: ) print_verbose(f"raw model_response: {response.text}") ## RESPONSE OBJECT - completion_response = response.json() + try: + completion_response = response.json() + except: + raise AnthropicError(message=response.text, status_code=response.status_code) if "error" in completion_response: raise AnthropicError( - message=completion_response["error"], + message=str(completion_response["error"]), status_code=response.status_code, ) else: diff --git a/litellm/tests/test_exceptions.py b/litellm/tests/test_exceptions.py index 819aade14..80376ed3d 100644 --- a/litellm/tests/test_exceptions.py +++ b/litellm/tests/test_exceptions.py @@ -23,7 +23,6 @@ litellm.vertex_project = "pathrise-convert-1606954137718" litellm.vertex_location = "us-central1" litellm.failure_callback = ["sentry"] -# litellm.set_verbose = True #### What this tests #### # This tests exception mapping -> trigger an exception from an llm provider -> assert if output is of the expected type @@ -35,8 +34,8 @@ litellm.failure_callback = ["sentry"] # Approach: Run each model through the test -> assert if the correct error (always the same one) is triggered # models = ["gpt-3.5-turbo", "chatgpt-test", "claude-instant-1", "command-nightly"] -test_model = "gpt-3.5-turbo" -models = ["gpt-3.5-turbo"] +test_model = "claude-instant-1" +models = ["claude-instant-1"] def logging_fn(model_call_dict): @@ -50,7 +49,7 @@ def logging_fn(model_call_dict): # Test 1: Context Window Errors @pytest.mark.parametrize("model", models) def test_context_window(model): - sample_text = "how does a court case get to the Supreme Court?" * 1000000 + sample_text = "how does a court case get to the Supreme Court?" * 50000 messages = [{"content": sample_text, "role": "user"}] try: print(f"model: {model}") @@ -64,6 +63,7 @@ def test_context_window(model): return except InvalidRequestError as e: print(f"InvalidRequestError: {e.llm_provider}") + print(f"InvalidRequestError message: {e.message}") return except OpenAIError as e: print(f"OpenAIError: {e.llm_provider}") diff --git a/litellm/utils.py b/litellm/utils.py index a43da00c8..f802e7f69 100644 --- a/litellm/utils.py +++ b/litellm/utils.py @@ -1357,6 +1357,14 @@ def exception_type(model, original_exception, custom_llm_provider): else: exception_type = "" if "claude" in model: # one of the anthropics + if hasattr(original_exception, "message"): + if "prompt is too long" in original_exception.message: + exception_mapping_worked = True + raise ContextWindowExceededError( + message=original_exception.message, + model=model, + llm_provider="anthropic" + ) if hasattr(original_exception, "status_code"): print_verbose(f"status_code: {original_exception.status_code}") if original_exception.status_code == 401: @@ -1372,6 +1380,12 @@ def exception_type(model, original_exception, custom_llm_provider): model=model, llm_provider="anthropic", ) + elif original_exception.status_code == 413: + exception_mapping_worked = True + raise ContextWindowExceededError( + message=f"AnthropicException - {original_exception.message}", + llm_provider="anthropic", + ) elif original_exception.status_code == 429: exception_mapping_worked = True raise RateLimitError(