use std::pin::Pin;
use async_trait::async_trait;
use futures_core::Stream;
use lellm_core::{ChatRequest, ChatResponse, LlmError, TokenUsage, ToolCall};
pub mod providers;
pub mod router;
#[cfg(feature = "mock")]
pub use providers::mock::*;
pub use providers::{anthropic::*, base::*, openai_compat::*};
pub use router::{ModelRouter, ProviderRegistry, ResolvedModel, RouteEntry, TaskLevel};
pub type ProviderStream = Pin<Box<dyn Stream<Item = Result<ProviderEvent, LlmError>> + Send>>;
#[derive(Debug, Clone)]
pub enum ProviderEvent {
Start { model: String },
Token { token: String },
Done {
tool_calls: Vec<ToolCall>,
usage: Option<TokenUsage>,
},
}
#[async_trait]
pub trait LlmProvider: Send + Sync {
async fn call(&self, request: &ChatRequest) -> Result<ChatResponse, LlmError>;
async fn stream(&self, request: &ChatRequest) -> Result<ProviderStream, LlmError>;
fn provider_id(&self) -> &str;
}