mod anthropic;
pub mod environment;
pub mod model;
mod openai;
pub mod retry;
pub(crate) mod stream;
mod r#trait;
pub mod types;
pub use anthropic::AnthropicProvider;
pub use openai::{LiteLlmProvider, MistralProvider, OpenAiProvider};
pub use model::ModelSpec;
pub use r#trait::LlmProvider;
pub(crate) use r#trait::{CompletionRequest, ToolChoice};
pub use types::{ContentBlock, Message, TokenUsage};
fn parse_retry_after_header(resp: &reqwest::Response) -> Option<u64> {
let value = resp.headers().get("retry-after")?.to_str().ok()?;
value.parse::<u64>().ok().map(|secs| secs * 1000)
}
pub(crate) async fn check_http_error(
resp: reqwest::Response,
) -> crate::error::Result<reqwest::Response> {
let status = resp.status().as_u16();
if status >= 400 {
let retry_after_ms = parse_retry_after_header(&resp);
let retryable = matches!(status, 429 | 529 | 500 | 502 | 503 | 504);
let body_text = resp.text().await.unwrap_or_default();
return Err(crate::error::AgenticError::Api {
message: body_text,
status: Some(status),
retryable,
retry_after_ms,
});
}
Ok(resp)
}