Skip to main content

codex_api/
error.rs

1use crate::rate_limits::RateLimitError;
2use codex_client::TransportError;
3use http::StatusCode;
4use std::time::Duration;
5use thiserror::Error;
6
7#[derive(Debug, Error)]
8pub enum ApiError {
9    #[error(transparent)]
10    Transport(#[from] TransportError),
11    #[error("api error {status}: {message}")]
12    Api { status: StatusCode, message: String },
13    #[error("stream error: {0}")]
14    Stream(String),
15    #[error("context window exceeded")]
16    ContextWindowExceeded,
17    #[error("quota exceeded")]
18    QuotaExceeded,
19    #[error("usage not included")]
20    UsageNotIncluded,
21    #[error("retryable error: {message}")]
22    Retryable {
23        message: String,
24        delay: Option<Duration>,
25    },
26    #[error("rate limit: {0}")]
27    RateLimit(String),
28    #[error("invalid request: {message}")]
29    InvalidRequest { message: String },
30    #[error("cyber policy: {message}")]
31    CyberPolicy { message: String },
32    #[error("server overloaded")]
33    ServerOverloaded,
34}
35
36impl From<RateLimitError> for ApiError {
37    fn from(err: RateLimitError) -> Self {
38        Self::RateLimit(err.to_string())
39    }
40}