1use anyhow::Result;
2use futures::{future::BoxFuture, stream::BoxStream};
3use gpui::AppContext;
4
5use crate::{
6 auth::{CredentialProvider, ProviderCredential},
7 models::LanguageModel,
8};
9
10pub trait CompletionRequest: Send + Sync {
11 fn data(&self) -> serde_json::Result<String>;
12}
13
14pub trait CompletionProvider {
15 fn base_model(&self) -> Box<dyn LanguageModel>;
16 fn credential_provider(&self) -> Box<dyn CredentialProvider>;
17 fn retrieve_credentials(&self, cx: &AppContext) -> ProviderCredential {
18 self.credential_provider().retrieve_credentials(cx)
19 }
20 fn save_credentials(&self, cx: &AppContext, credential: ProviderCredential) {
21 self.credential_provider().save_credentials(cx, credential);
22 }
23 fn delete_credentials(&self, cx: &AppContext) {
24 self.credential_provider().delete_credentials(cx);
25 }
26 fn complete(
27 &self,
28 prompt: Box<dyn CompletionRequest>,
29 ) -> BoxFuture<'static, Result<BoxStream<'static, Result<String>>>>;
30}