1use std::sync::Arc;
2
3use serde::de::DeserializeOwned;
4
5use crate::{
6 config::{ClientConfig, ResolvedClientConfig},
7 core::{
8 request::{PreparedRequest, RequestOptions, ResolvedRequestOptions},
9 runtime::ClientRuntime,
10 },
11 realtime::Realtime,
12 resources::ResourceFamilies,
13};
14
15#[derive(Clone, Debug)]
17pub struct OpenAI {
18 runtime: Arc<ClientRuntime>,
19 resources: ResourceFamilies,
20 realtime: Realtime,
21}
22
23impl OpenAI {
24 pub fn new() -> Self {
26 Self::builder().build()
27 }
28
29 pub fn builder() -> OpenAIBuilder {
31 OpenAIBuilder::default()
32 }
33
34 pub fn config(&self) -> &ClientConfig {
36 self.runtime.config()
37 }
38
39 pub fn resolved_config(&self) -> Result<ResolvedClientConfig, crate::OpenAIError> {
41 self.runtime.resolved_config()
42 }
43
44 pub fn prepare_request(
46 &self,
47 method: impl AsRef<str>,
48 path: impl AsRef<str>,
49 ) -> Result<PreparedRequest, crate::OpenAIError> {
50 self.runtime.prepare_request(method, path)
51 }
52
53 pub fn resolve_request_options(
55 &self,
56 options: &RequestOptions,
57 ) -> Result<ResolvedRequestOptions, crate::OpenAIError> {
58 self.runtime.resolve_request_options(options)
59 }
60
61 pub fn execute_json<T>(
63 &self,
64 method: impl AsRef<str>,
65 path: impl AsRef<str>,
66 options: RequestOptions,
67 ) -> Result<crate::core::response::ApiResponse<T>, crate::OpenAIError>
68 where
69 T: DeserializeOwned,
70 {
71 self.runtime.execute_json(method, path, options)
72 }
73
74 pub fn responses(&self) -> &crate::resources::responses::Responses {
76 &self.resources.responses
77 }
78
79 pub fn conversations(&self) -> &crate::resources::conversations::Conversations {
81 &self.resources.conversations
82 }
83
84 pub fn chat(&self) -> &crate::resources::chat::Chat {
86 &self.resources.chat
87 }
88
89 pub fn completions(&self) -> &crate::resources::completions::Completions {
91 &self.resources.completions
92 }
93
94 pub fn embeddings(&self) -> &crate::resources::embeddings::Embeddings {
96 &self.resources.embeddings
97 }
98
99 pub fn models(&self) -> &crate::resources::models::Models {
101 &self.resources.models
102 }
103
104 pub fn moderations(&self) -> &crate::resources::moderations::Moderations {
106 &self.resources.moderations
107 }
108
109 pub fn images(&self) -> &crate::resources::images::Images {
111 &self.resources.images
112 }
113
114 pub fn audio(&self) -> &crate::resources::audio::Audio {
116 &self.resources.audio
117 }
118
119 pub fn files(&self) -> &crate::resources::files::Files {
121 &self.resources.files
122 }
123
124 pub fn uploads(&self) -> &crate::resources::uploads::Uploads {
126 &self.resources.uploads
127 }
128
129 pub fn vector_stores(&self) -> &crate::resources::vector_stores::VectorStores {
131 &self.resources.vector_stores
132 }
133
134 pub fn batches(&self) -> &crate::resources::batches::Batches {
136 &self.resources.batches
137 }
138
139 pub fn webhooks(&self) -> &crate::resources::webhooks::Webhooks {
141 &self.resources.webhooks
142 }
143
144 pub fn fine_tuning(&self) -> &crate::resources::fine_tuning::FineTuning {
146 &self.resources.fine_tuning
147 }
148
149 pub fn evals(&self) -> &crate::resources::evals::Evals {
151 &self.resources.evals
152 }
153
154 pub fn containers(&self) -> &crate::resources::containers::Containers {
156 &self.resources.containers
157 }
158
159 pub fn skills(&self) -> &crate::resources::skills::Skills {
161 &self.resources.skills
162 }
163
164 pub fn videos(&self) -> &crate::resources::videos::Videos {
166 &self.resources.videos
167 }
168
169 pub fn realtime(&self) -> &Realtime {
171 &self.realtime
172 }
173}
174
175#[derive(Clone, Debug, Default)]
177pub struct OpenAIBuilder {
178 config: ClientConfig,
179}
180
181impl OpenAIBuilder {
182 pub fn config(mut self, config: ClientConfig) -> Self {
184 self.config = config;
185 self
186 }
187
188 pub fn api_key(mut self, api_key: impl Into<String>) -> Self {
190 self.config.api_key = Some(api_key.into());
191 self
192 }
193
194 pub fn base_url(mut self, base_url: impl Into<String>) -> Self {
196 self.config.base_url = Some(base_url.into());
197 self
198 }
199
200 pub fn organization(mut self, organization: impl Into<String>) -> Self {
202 self.config.organization = Some(organization.into());
203 self
204 }
205
206 pub fn project(mut self, project: impl Into<String>) -> Self {
208 self.config.project = Some(project.into());
209 self
210 }
211
212 pub fn user_agent(mut self, user_agent: impl Into<String>) -> Self {
214 self.config.user_agent = Some(user_agent.into());
215 self
216 }
217
218 pub fn webhook_secret(mut self, webhook_secret: impl Into<String>) -> Self {
220 self.config.webhook_secret = Some(webhook_secret.into());
221 self
222 }
223
224 pub fn timeout(mut self, timeout: std::time::Duration) -> Self {
226 self.config.timeout = Some(timeout);
227 self
228 }
229
230 pub fn max_retries(mut self, max_retries: u32) -> Self {
232 self.config.max_retries = Some(max_retries);
233 self
234 }
235
236 pub fn build(self) -> OpenAI {
238 let runtime = Arc::new(ClientRuntime::new(self.config.with_env_defaults()));
239 OpenAI {
240 runtime: runtime.clone(),
241 resources: ResourceFamilies::new(runtime.clone()),
242 realtime: Realtime::new(runtime.clone()),
243 }
244 }
245}
246
247impl Default for OpenAI {
248 fn default() -> Self {
249 Self::new()
250 }
251}