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}