use thiserror::Error;
use crate::provider::Provider;
#[derive(Debug, Error)]
pub enum AiError {
#[error("No API key configured for any available provider")]
NoApiKey,
#[error("API key not found for provider {0}")]
ApiKeyNotFound(Provider),
#[error("HTTP request failed: {0}")]
HttpError(String),
#[error("Failed to parse response: {0}")]
ParseError(String),
#[error("API error from {provider}: {message}")]
ApiError {
provider: Provider,
message: String,
status_code: Option<u16>,
},
#[error("All providers failed: {0:?}")]
AllProvidersFailed(Vec<(Provider, String)>),
#[error("Model {0} not available on any configured provider")]
ModelNotAvailable(String),
#[error("Verification failed after {retries} retries: {message}")]
VerificationFailed {
retries: usize,
message: String,
},
#[error("Request timed out after {0} seconds")]
Timeout(u64),
#[error("Rate limit exceeded for provider {0}")]
RateLimitExceeded(Provider),
#[error("Empty response from {0} - no content returned (check API key and model availability)")]
EmptyResponse(Provider),
#[error("Invalid request: {0}")]
InvalidRequest(String),
}
pub type AiResult<T> = Result<T, AiError>;