use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use crate::error::Result;
use crate::stream::ResponseStream;
use crate::types::{ChatRequest, ChatResponse};
pub trait Model: Send + Sync {
fn generate(&self, request: &ChatRequest) -> impl Future<Output = Result<ChatResponse>> + Send;
fn generate_stream(
&self,
request: &ChatRequest,
) -> impl Future<Output = Result<ResponseStream>> + Send;
fn model_id(&self) -> &str {
"default"
}
}
pub type SharedModel = Arc<dyn ErasedModel>;
pub trait ErasedModel: Send + Sync {
fn generate_erased<'a>(
&'a self,
request: &'a ChatRequest,
) -> Pin<Box<dyn Future<Output = Result<ChatResponse>> + Send + 'a>>;
fn generate_stream_erased<'a>(
&'a self,
request: &'a ChatRequest,
) -> Pin<Box<dyn Future<Output = Result<ResponseStream>> + Send + 'a>>;
fn model_id_erased(&self) -> &str;
}
impl<T: Model> ErasedModel for T {
fn generate_erased<'a>(
&'a self,
request: &'a ChatRequest,
) -> Pin<Box<dyn Future<Output = Result<ChatResponse>> + Send + 'a>> {
Box::pin(self.generate(request))
}
fn generate_stream_erased<'a>(
&'a self,
request: &'a ChatRequest,
) -> Pin<Box<dyn Future<Output = Result<ResponseStream>> + Send + 'a>> {
Box::pin(self.generate_stream(request))
}
fn model_id_erased(&self) -> &str {
self.model_id()
}
}