1use anyhow::Result;
2use futures::{future::BoxFuture, stream::BoxStream};
3
4use crate::{auth::CredentialProvider, models::LanguageModel};
5
6pub trait CompletionRequest: Send + Sync {
7 fn data(&self) -> serde_json::Result<String>;
8}
9
10pub trait CompletionProvider: CredentialProvider {
11 fn base_model(&self) -> Box<dyn LanguageModel>;
12 fn complete(
13 &self,
14 prompt: Box<dyn CompletionRequest>,
15 ) -> BoxFuture<'static, Result<BoxStream<'static, Result<String>>>>;
16 fn box_clone(&self) -> Box<dyn CompletionProvider>;
17}
18
19impl Clone for Box<dyn CompletionProvider> {
20 fn clone(&self) -> Box<dyn CompletionProvider> {
21 self.box_clone()
22 }
23}