Add RateLimitError and handle rate limiting in GitLab and GitHub services (#8003)

Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: Engel Nyst <enyst@users.noreply.github.com>
This commit is contained in:
Rohit Malhotra
2025-04-22 12:30:41 -04:00
committed by GitHub
parent 8f3ff1210e
commit 039fe295a4
3 changed files with 57 additions and 39 deletions

View File

@@ -5,9 +5,7 @@ from typing import Any
import httpx
from pydantic import SecretStr
from openhands.core.logger import openhands_logger as logger
from openhands.integrations.service_types import (
AuthenticationError,
BaseGitService,
GitService,
ProviderType,
@@ -45,6 +43,10 @@ class GitHubService(BaseGitService, GitService):
if base_domain:
self.BASE_URL = f'https://{base_domain}/api/v3'
@property
def provider(self) -> str:
return ProviderType.GITHUB.value
async def _get_github_headers(self) -> dict:
"""Retrieve the GH Token from settings store to construct the headers."""
if not self.token:
@@ -100,15 +102,9 @@ class GitHubService(BaseGitService, GitService):
return response.json(), headers
except httpx.HTTPStatusError as e:
if e.response.status_code == 401:
raise AuthenticationError('Invalid Github token')
logger.warning(f'Status error on GH API: {e}')
raise UnknownException('Unknown error')
raise self.handle_http_status_error(e)
except httpx.HTTPError as e:
logger.warning(f'HTTP error on GH API: {e}')
raise UnknownException('Unknown error')
raise self.handle_http_error(e)
async def get_user(self) -> User:
url = f'{self.BASE_URL}/user'
@@ -264,15 +260,9 @@ class GitHubService(BaseGitService, GitService):
return dict(result)
except httpx.HTTPStatusError as e:
if e.response.status_code == 401:
raise AuthenticationError('Invalid Github token')
logger.warning(f'Status error on GH API: {e}')
raise UnknownException('Unknown error')
raise self.handle_http_status_error(e)
except httpx.HTTPError as e:
logger.warning(f'HTTP error on GH API: {e}')
raise UnknownException('Unknown error')
raise self.handle_http_error(e)
async def get_suggested_tasks(self) -> list[SuggestedTask]:
"""Get suggested tasks for the authenticated user across all repositories.