async_llm/
client.rs

1use secrecy::SecretString;
2
3use crate::{
4    chat::Chat,
5    completions::Completions,
6    http::{HttpClient, SimpleHttpClient},
7    providers::{openai::OpenAIProvider, OpenAIConfig, Provider},
8    RawProvider,
9};
10
11pub type DefaultHttpClient<C> = SimpleHttpClient<C>;
12
13#[derive(Debug, Clone)]
14pub struct Client<P: Provider, H: HttpClient> {
15    pub(crate) provider: P,
16    pub(crate) http_client: H,
17}
18
19impl<P: Provider> Client<P, DefaultHttpClient<P::Config>> {
20    pub fn with_provider(provider: P) -> Self {
21        let config = provider.config().clone();
22        Self {
23            provider,
24            http_client: DefaultHttpClient::new(config),
25        }
26    }
27}
28
29impl<P: Provider, H: HttpClient> Client<P, H> {
30    pub fn with_args(provider: P, http_client: H) -> Self {
31        Client {
32            provider,
33            http_client,
34        }
35    }
36
37    pub fn provider(&self) -> &P {
38        &self.provider
39    }
40
41    pub fn http_client(&self) -> &H {
42        &self.http_client
43    }
44}
45
46impl Default for Client<OpenAIProvider, DefaultHttpClient<OpenAIConfig>> {
47    fn default() -> Self {
48        Self::new()
49    }
50}
51
52impl Client<OpenAIProvider, DefaultHttpClient<OpenAIConfig>> {
53    pub fn new() -> Self {
54        let provider = OpenAIProvider::default();
55        let config = provider.config().clone();
56        Self {
57            provider,
58            http_client: DefaultHttpClient::new(config),
59        }
60    }
61
62    pub fn with_auth(base_url: impl Into<String>, api_key: Option<SecretString>) -> Self {
63        let config = OpenAIConfig::new(base_url, api_key);
64        let provider = OpenAIProvider::new(config.clone());
65        Self {
66            provider,
67            http_client: DefaultHttpClient::new(config),
68        }
69    }
70}
71
72impl Client<RawProvider, DefaultHttpClient<OpenAIConfig>> {
73    pub fn raw() -> Self {
74        let provider = RawProvider::default();
75        let config = provider.config().clone();
76        Self {
77            provider,
78            http_client: DefaultHttpClient::new(config),
79        }
80    }
81
82    pub fn with_auth_raw(base_url: impl Into<String>, api_key: Option<SecretString>) -> Self {
83        let config = OpenAIConfig::new(base_url, api_key);
84        let provider = RawProvider::new(config.clone());
85        Self {
86            provider,
87            http_client: DefaultHttpClient::new(config),
88        }
89    }
90}
91
92impl<P: Provider, H: HttpClient> Client<P, H> {
93    pub fn completions(&self) -> Completions<P, H> {
94        Completions::new(self)
95    }
96    pub fn chat(&self) -> Chat<P, H> {
97        Chat::new(self)
98    }
99}