1use std::future::Future;
4use std::pin::Pin;
5use std::sync::Arc;
6
7use crate::error::Result;
8use crate::stream::ResponseStream;
9use crate::types::{ChatRequest, ChatResponse};
10
11pub trait Model: Send + Sync {
17 fn generate(&self, request: &ChatRequest) -> impl Future<Output = Result<ChatResponse>> + Send;
19
20 fn generate_stream(
22 &self,
23 request: &ChatRequest,
24 ) -> impl Future<Output = Result<ResponseStream>> + Send;
25}
26
27pub type SharedModel = Arc<dyn ErasedModel>;
29
30pub trait ErasedModel: Send + Sync {
32 fn generate_erased<'a>(
34 &'a self,
35 request: &'a ChatRequest,
36 ) -> Pin<Box<dyn Future<Output = Result<ChatResponse>> + Send + 'a>>;
37
38 fn generate_stream_erased<'a>(
40 &'a self,
41 request: &'a ChatRequest,
42 ) -> Pin<Box<dyn Future<Output = Result<ResponseStream>> + Send + 'a>>;
43}
44
45impl<T: Model> ErasedModel for T {
46 fn generate_erased<'a>(
47 &'a self,
48 request: &'a ChatRequest,
49 ) -> Pin<Box<dyn Future<Output = Result<ChatResponse>> + Send + 'a>> {
50 Box::pin(self.generate(request))
51 }
52
53 fn generate_stream_erased<'a>(
54 &'a self,
55 request: &'a ChatRequest,
56 ) -> Pin<Box<dyn Future<Output = Result<ResponseStream>> + Send + 'a>> {
57 Box::pin(self.generate_stream(request))
58 }
59}