iflytek/astron-agent · error · HTTPClientException

HTTPClientError

HTTPClientError

Error message

status={resp.status}, body={body}

What it means

request() treats any HTTP status >= 400 as an error: it reads the response body, stores an ErrorResponse, and raises HTTPClientException(HTTPClientError) embedding status and body. This centralizes upstream HTTP failure reporting.

Solutions

  1. Read the body in the exception message to identify the upstream cause and fix the request accordingly
  2. Handle 429 with backoff/retry, 401/403 by refreshing credentials
  3. Validate the request payload against the API schema before sending

Example fix

// before
resp = await client.request(payload)  # raises on 500
// after
try:
    resp = await client.request(payload)
except HTTPClientException as e:
    if 'status=429' in str(e): await asyncio.sleep(backoff); retry()
    else: raise
Defensive patterns

Strategy: try-catch

Validate before calling

# pre-check payload schema and expected endpoint
validate_payload_schema(payload)
assert endpoint_url_is_current(api_base)

Try / catch

try:
    resp = await client.request(...)
except HTTPClientException as e:
    msg = str(e)  # 'status=..., body=...'
    status = int(msg.split('status=')[1].split(',')[0])
    if status == 429: schedule_retry_with_backoff()
    elif status in (401, 403): refresh_credentials()
    else: alert_upstream(status, msg)

Prevention

When it happens

Trigger: Any downstream/ASE service returning 4xx/5xx — bad request payload, 401/403 after auth, 404 wrong path, 429 rate limit, 5xx server errors.

Common situations: Malformed request body/schema mismatch, exhausted quotas, upstream outage or deploy breaking the API contract.

Understand the failure class

Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.

Related errors


AI-assisted analysis of iflytek/astron-agent@5e758547a8 (2026-09-12). Data as JSON: /api/errors/0a88eed9fc33f154. Report an issue: GitHub.

Appendix: source

Thrown at core/plugin/aitools/common/clients/aiohttp_client.py:180

        """Start aiohttp client"""
        yield self

    @asynccontextmanager
    async def request(self) -> AsyncIterator[BaseResponse]:
        """Send async request and return standardized response"""
        try:
            self._auth()
            session = await get_aiohttp_session()

            async with session.request(self.method, self.url, **self.kwargs) as resp:

                if resp.status >= 400:
                    body = await resp.text()
                    self.response = ErrorResponse.from_enum(
                        CodeEnums.HTTPClientError,
                        extra_message=f"status={resp.status}, body={body}",
                    )
                    raise HTTPClientException.from_error_code(
                        CodeEnums.HTTPClientError,
                        extra_message=f"status={resp.status}, body={body}",
                    )

                resp.raise_for_status()
                self.response = await self._build_response(resp)
                yield self.response

        except HTTPClientException as e:
            raise e

        except Exception as e:
            self.response = ErrorResponse.from_enum(
                CodeEnums.HTTPClientError, extra_message=str(e)
            )
            raise HTTPClientException.from_error_code(
                CodeEnums.HTTPClientError, extra_message=str(e)
            )

View on GitHub (pinned to 5e758547a8)