Spaces:
Build error
Build error
| import json | |
| from typing import Any | |
| import httpx | |
| from tenacity import retry, retry_if_exception, stop_after_attempt, wait_exponential | |
| from openhands.utils.http_session import HttpSession | |
| from openhands.utils.tenacity_stop import stop_if_should_exit | |
| class RequestHTTPError(httpx.HTTPStatusError): | |
| """Exception raised when an error occurs in a request with details.""" | |
| def __init__(self, *args: Any, detail: Any = None, **kwargs: Any) -> None: | |
| super().__init__(*args, **kwargs) | |
| self.detail = detail | |
| def __str__(self) -> str: | |
| s = super().__str__() | |
| if self.detail is not None: | |
| s += f'\nDetails: {self.detail}' | |
| return str(s) | |
| def is_retryable_error(exception: Any) -> bool: | |
| return ( | |
| isinstance(exception, httpx.HTTPStatusError) | |
| and exception.response.status_code == 429 | |
| ) | |
| def send_request( | |
| session: HttpSession, | |
| method: str, | |
| url: str, | |
| timeout: int = 10, | |
| **kwargs: Any, | |
| ) -> httpx.Response: | |
| response = session.request(method, url, timeout=timeout, **kwargs) | |
| try: | |
| response.raise_for_status() | |
| except httpx.HTTPError as e: | |
| try: | |
| _json = response.json() | |
| except json.decoder.JSONDecodeError: | |
| _json = None | |
| finally: | |
| response.close() | |
| raise RequestHTTPError( | |
| e, | |
| request=e.request, | |
| response=e.response, | |
| detail=_json.get('detail') if _json is not None else None, | |
| ) from e | |
| return response | |