use crate::error::Result;
use crate::types::{GenerateRequest, GenerateResponse, GenerateStream, Headers, Model};
use async_trait::async_trait;
#[async_trait]
pub trait Provider: Send + Sync {
fn provider_id(&self) -> &str;
fn build_headers(&self, custom_headers: Option<&Headers>) -> Headers;
async fn generate(&self, request: GenerateRequest) -> Result<GenerateResponse>;
async fn stream(&self, request: GenerateRequest) -> Result<GenerateStream>;
async fn list_models(&self) -> Result<Vec<Model>> {
Ok(vec![])
}
async fn get_model(&self, id: &str) -> Result<Option<Model>> {
Ok(self.list_models().await?.into_iter().find(|m| m.id == id))
}
}