Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions aider/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ class ExInfo:
ExInfo("JSONSchemaValidationError", True, None),
ExInfo("NotFoundError", False, None),
ExInfo("OpenAIError", True, None),
ExInfo(
"PermissionDeniedError",
False,
"The API provider denied access. Check your API key permissions.",
),
ExInfo(
"RateLimitError",
True,
Expand Down
21 changes: 21 additions & 0 deletions tests/basic/test_exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,27 @@ def test_context_window_error():
assert ex_info.retry is False


def test_permission_denied_error():
"""Test specific handling of PermissionDeniedError"""
ex = LiteLLMExceptions()
from litellm import PermissionDeniedError

import httpx

mock_request = httpx.Request("GET", "https://api.openai.com/v1/chat/completions")
mock_response = httpx.Response(status_code=403, request=mock_request)
perm_error = PermissionDeniedError(
message="Permission denied",
llm_provider="openai",
model="gpt-4",
response=mock_response,
)
ex_info = ex.get_ex_info(perm_error)
assert ex_info.name == "PermissionDeniedError"
assert ex_info.retry is False
assert "denied" in ex_info.description.lower()


def test_openrouter_error():
"""Test specific handling of OpenRouter API errors"""
ex = LiteLLMExceptions()
Expand Down