use std::fmt::Debug;
use std::pin::Pin;
use async_trait::async_trait;
use futures::Stream;
use crate::error::ProviderError;
use crate::types::{CompletionRequest, CompletionResponse, ModelInfo, RequestOptions, StreamEvent};
#[async_trait]
pub trait LlmProvider: Debug + Send + Sync {
async fn complete(
&self,
request: CompletionRequest,
options: RequestOptions,
) -> Result<CompletionResponse, ProviderError>;
async fn complete_stream(
&self,
request: CompletionRequest,
options: RequestOptions,
) -> Result<Pin<Box<dyn Stream<Item = Result<StreamEvent, ProviderError>> + Send>>, ProviderError>;
fn models(&self) -> &[ModelInfo];
fn name(&self) -> &str;
fn default_model(&self) -> Option<&str> {
self.models().first().map(|m| m.name.as_str())
}
}