1pub mod anthropic;
4pub mod azure_openai;
5pub mod deepseek;
6pub mod gemini;
7pub mod helpers;
8pub mod http_config;
9pub mod moonshot;
10pub mod ollama;
11pub mod openai;
12pub mod openrouter;
13pub mod resilient;
14
15pub use anthropic::AnthropicProvider;
16pub use azure_openai::AzureOpenAiProvider;
17pub use deepseek::DeepSeekProvider;
18pub use gemini::GeminiProvider;
19pub use moonshot::MoonshotProvider;
20pub use ollama::OllamaProvider;
21pub use openai::OpenAiProvider;
22pub use openrouter::OpenRouterProvider;
23pub use resilient::{CancelHandle, ResilientProvider, RetryConfig};
24
25pub(crate) fn preview(s: &str, max: usize) -> String {
27 if s.len() <= max {
28 s.to_string()
29 } else {
30 let truncated: String = s.char_indices().take(max).map(|(_, c)| c).collect();
31 format!("{}...<truncated:{}>", truncated, s.len())
32 }
33}