use std::pin::Pin;
use futures::{Stream, future::BoxFuture};
use tokio_util::sync::CancellationToken;
use super::capability::{Capabilities, HostedCapabilities};
use super::chunk::ProviderChunk;
use super::error::ProviderError;
use super::model::{ModelInfo, ProviderInfo};
use super::request::CompletionRequest;
pub type ProviderStream = Pin<Box<dyn Stream<Item = Result<ProviderChunk, ProviderError>> + Send>>;
pub trait LlmProvider: Send + Sync {
fn info(&self) -> ProviderInfo;
fn capabilities(&self) -> Capabilities;
fn hosted_capabilities(&self) -> HostedCapabilities {
HostedCapabilities::default()
}
fn list_models(&self) -> BoxFuture<'_, Result<Vec<ModelInfo>, ProviderError>>;
fn model_info(&self, model_id: &str) -> Option<ModelInfo>;
fn complete(
&self,
req: CompletionRequest,
cancel: CancellationToken,
) -> BoxFuture<'_, Result<ProviderStream, ProviderError>>;
}