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 fn model_id(&self) -> &str {
31 "default"
32 }
33}
34
35pub type SharedModel = Arc<dyn ErasedModel>;
37
38pub trait ErasedModel: Send + Sync {
40 fn generate_erased<'a>(
42 &'a self,
43 request: &'a ChatRequest,
44 ) -> Pin<Box<dyn Future<Output = Result<ChatResponse>> + Send + 'a>>;
45
46 fn generate_stream_erased<'a>(
48 &'a self,
49 request: &'a ChatRequest,
50 ) -> Pin<Box<dyn Future<Output = Result<ResponseStream>> + Send + 'a>>;
51
52 fn model_id_erased(&self) -> &str;
54}
55
56impl<T: Model> ErasedModel for T {
57 fn generate_erased<'a>(
58 &'a self,
59 request: &'a ChatRequest,
60 ) -> Pin<Box<dyn Future<Output = Result<ChatResponse>> + Send + 'a>> {
61 Box::pin(self.generate(request))
62 }
63
64 fn generate_stream_erased<'a>(
65 &'a self,
66 request: &'a ChatRequest,
67 ) -> Pin<Box<dyn Future<Output = Result<ResponseStream>> + Send + 'a>> {
68 Box::pin(self.generate_stream(request))
69 }
70
71 fn model_id_erased(&self) -> &str {
72 self.model_id()
73 }
74}