use std::borrow::Cow;
use thiserror::Error;
pub type ErrorStr = Cow<'static, str>;
#[derive(Error, Debug)]
pub enum OtariError {
#[error("Rate limit exceeded for {provider}: {message}")]
RateLimit {
message: ErrorStr,
provider: ErrorStr,
},
#[error("Authentication failed for {provider}: {message}")]
Authentication {
message: ErrorStr,
provider: ErrorStr,
},
#[error("Invalid request for {provider}: {message}")]
InvalidRequest {
message: ErrorStr,
provider: ErrorStr,
},
#[error("Provider error from {provider}: {message}")]
Provider {
message: ErrorStr,
provider: ErrorStr,
},
#[error("Model '{model}' not found for {provider}")]
ModelNotFound { model: ErrorStr, provider: ErrorStr },
#[error("Context length exceeded for {provider}: {message}")]
ContextLengthExceeded {
message: ErrorStr,
provider: ErrorStr,
},
#[error("Content filtered by {provider}: {message}")]
ContentFilter {
message: ErrorStr,
provider: ErrorStr,
},
#[error("Missing API key for {provider}. Set the {env_var} environment variable or pass api_key in config.")]
MissingApiKey {
provider: ErrorStr,
env_var: ErrorStr,
},
#[error("Unsupported provider: '{provider}'.")]
UnsupportedProvider { provider: ErrorStr },
#[error("Operation '{operation}' is not supported by {provider}")]
Unsupported {
provider: ErrorStr,
operation: ErrorStr,
},
#[error("Parameter '{param}' is not supported by {provider}. {hint}")]
UnsupportedParameter {
param: ErrorStr,
provider: ErrorStr,
hint: ErrorStr,
},
#[error("Batch '{batch_id}' is not yet complete (status: {status}). Check status with retrieve_batch().")]
BatchNotComplete {
batch_id: ErrorStr,
status: ErrorStr,
provider: ErrorStr,
},
#[error("Streaming error from {provider}: {message}")]
Streaming {
message: ErrorStr,
provider: ErrorStr,
},
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("HTTP error: {0}")]
Http(#[from] reqwest::Error),
}
pub type Result<T> = std::result::Result<T, OtariError>;
const PROVIDER_NAME: &str = "otari";
impl OtariError {
pub fn rate_limit(message: impl Into<ErrorStr>) -> Self {
Self::RateLimit {
provider: PROVIDER_NAME.into(),
message: message.into(),
}
}
pub fn authentication(message: impl Into<ErrorStr>) -> Self {
Self::Authentication {
provider: PROVIDER_NAME.into(),
message: message.into(),
}
}
pub fn invalid_request(message: impl Into<ErrorStr>) -> Self {
Self::InvalidRequest {
provider: PROVIDER_NAME.into(),
message: message.into(),
}
}
pub fn provider_error(message: impl Into<ErrorStr>) -> Self {
Self::Provider {
provider: PROVIDER_NAME.into(),
message: message.into(),
}
}
pub fn model_not_found(model: impl Into<ErrorStr>) -> Self {
Self::ModelNotFound {
provider: PROVIDER_NAME.into(),
model: model.into(),
}
}
pub fn unsupported_parameter(param: impl Into<ErrorStr>, hint: impl Into<ErrorStr>) -> Self {
Self::UnsupportedParameter {
provider: PROVIDER_NAME.into(),
param: param.into(),
hint: hint.into(),
}
}
pub fn unsupported(operation: impl Into<ErrorStr>) -> Self {
Self::Unsupported {
provider: PROVIDER_NAME.into(),
operation: operation.into(),
}
}
pub fn unsupported_dynamic(
provider: impl Into<ErrorStr>,
operation: impl Into<ErrorStr>,
) -> Self {
Self::Unsupported {
provider: provider.into(),
operation: operation.into(),
}
}
}