| use crate::rate_limits::RateLimitError; |
| use codex_client::TransportError; |
| use codex_protocol::protocol::MisalignmentErrorDetails; |
| use http::StatusCode; |
| use std::time::Duration; |
| use thiserror::Error; |
|
|
| #[derive(Debug, Error)] |
| pub enum ApiError { |
| #[error(transparent)] |
| Transport(#[from] TransportError), |
| #[error("api error {status}: {message}")] |
| Api { status: StatusCode, message: String }, |
| #[error("stream error: {0}")] |
| Stream(String), |
| #[error("context window exceeded")] |
| ContextWindowExceeded, |
| #[error("quota exceeded")] |
| QuotaExceeded, |
| #[error("usage not included")] |
| UsageNotIncluded, |
| #[error("retryable error: {message}")] |
| Retryable { |
| message: String, |
| delay: Option<Duration>, |
| }, |
| #[error("rate limit exceeded: {message}")] |
| RateLimitExceeded { |
| message: String, |
| delay: Option<Duration>, |
| }, |
| #[error("rate limit: {0}")] |
| RateLimit(String), |
| #[error("invalid request: {message}")] |
| InvalidRequest { message: String }, |
| #[error("cyber policy: {message}")] |
| CyberPolicy { message: String }, |
| #[error("misalignment policy violation: {message}")] |
| MisalignmentPolicyViolation { |
| message: String, |
| misalignment: Option<MisalignmentErrorDetails>, |
| }, |
| #[error("server overloaded")] |
| ServerOverloaded, |
| } |
|
|
| impl From<RateLimitError> for ApiError { |
| fn from(err: RateLimitError) -> Self { |
| Self::RateLimit(err.to_string()) |
| } |
| } |
|
|