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}