use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorContext {
pub provider: String,
pub endpoint: String,
pub request_id: Option<String>,
pub timestamp: DateTime<Utc>,
pub retry_count: u32,
pub suggested_action: SuggestedAction,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SuggestedAction {
Retry { delay_ms: u64, max_attempts: u32 },
SwitchProvider { alternative_providers: Vec<String> },
ReduceRequestSize { max_tokens: Option<u32> },
CheckCredentials,
ContactSupport { reason: String },
NoAction,
}
impl ErrorContext {
pub fn new(provider: String, endpoint: String) -> Self {
Self {
provider,
endpoint,
request_id: None,
timestamp: Utc::now(),
retry_count: 0,
suggested_action: SuggestedAction::NoAction,
}
}
pub fn with_retry(mut self, retry_count: u32) -> Self {
self.retry_count = retry_count;
self
}
pub fn with_request_id(mut self, request_id: String) -> Self {
self.request_id = Some(request_id);
self
}
}