Class LlmException


public class LlmException extends IOException

The single checked-error type raised by LlmClient. Extends IOException so callers' existing network catch blocks pick it up. Inspect getType() for the failure category and switch on the LlmException.ErrorType enum -- no separate exception subclass per error.

try {
    ChatResponse r = client.chat(req).get();
    // ...
} catch (AsyncExecutionException ae) {
    if (ae.getCause() instanceof LlmException) {
        LlmException e = (LlmException) ae.getCause();
        switch (e.getType()) {
            case RATE_LIMIT:        scheduleRetry(e.getRetryAfterSeconds()); break;
            case AUTH:              showLoginScreen(); break;
            case CONTEXT_LENGTH:    trimHistory();    break;
            case MODEL_OVERLOADED:  scheduleRetry(60); break;
            case INVALID_REQUEST:   showError(e);     break;
            case NETWORK:           showOfflineUi();  break;
            default:                showError(e);
        }
    }
}

httpStatus, providerErrorCode, rawBody, and (for rate-limit errors) retryAfterSeconds are populated when the provider returned them. getRetryAfterSeconds() returns -1 for every non-rate-limit error and for rate-limit errors where the provider didn't send a Retry-After header.

  • Constructor Details

  • Method Details

    • getType

      public LlmException.ErrorType getType()
      Coarse-grained category -- the recommended switching point for error handling. See the class javadoc for the full pattern.
    • getHttpStatus

      public int getHttpStatus()
    • getProviderErrorCode

      public String getProviderErrorCode()
    • getRawBody

      public String getRawBody()
    • getRetryAfterSeconds

      public int getRetryAfterSeconds()
      Seconds the provider asked us to wait before retrying, parsed from a Retry-After header. -1 when not applicable (the usual case for non-RATE_LIMIT errors) or when the provider did not send the header.