Skip to main content

openai_rust/
client.rs

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/// Root async-first SDK client scaffold.
16#[derive(Clone, Debug)]
17pub struct OpenAI {
18    runtime: Arc<ClientRuntime>,
19    resources: ResourceFamilies,
20    realtime: Realtime,
21}
22
23impl OpenAI {
24    /// Creates a client with default scaffold configuration.
25    pub fn new() -> Self {
26        Self::builder().build()
27    }
28
29    /// Starts building a client configuration.
30    pub fn builder() -> OpenAIBuilder {
31        OpenAIBuilder::default()
32    }
33
34    /// Returns the current client configuration scaffold.
35    pub fn config(&self) -> &ClientConfig {
36        self.runtime.config()
37    }
38
39    /// Resolves the current configuration against environment defaults.
40    pub fn resolved_config(&self) -> Result<ResolvedClientConfig, crate::OpenAIError> {
41        self.runtime.resolved_config()
42    }
43
44    /// Prepares an authenticated REST request before any transport is attempted.
45    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    /// Resolves per-request execution options against client defaults.
54    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    /// Executes a JSON request through the shared transport path.
62    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    /// Accesses the responses family handle.
75    pub fn responses(&self) -> &crate::resources::responses::Responses {
76        &self.resources.responses
77    }
78
79    /// Accesses the conversations family handle.
80    pub fn conversations(&self) -> &crate::resources::conversations::Conversations {
81        &self.resources.conversations
82    }
83
84    /// Accesses the chat completions compatibility handle.
85    pub fn chat(&self) -> &crate::resources::chat::Chat {
86        &self.resources.chat
87    }
88
89    /// Accesses the legacy completions compatibility handle.
90    pub fn completions(&self) -> &crate::resources::completions::Completions {
91        &self.resources.completions
92    }
93
94    /// Accesses the embeddings family handle.
95    pub fn embeddings(&self) -> &crate::resources::embeddings::Embeddings {
96        &self.resources.embeddings
97    }
98
99    /// Accesses the models family handle.
100    pub fn models(&self) -> &crate::resources::models::Models {
101        &self.resources.models
102    }
103
104    /// Accesses the moderations family handle.
105    pub fn moderations(&self) -> &crate::resources::moderations::Moderations {
106        &self.resources.moderations
107    }
108
109    /// Accesses the images family handle.
110    pub fn images(&self) -> &crate::resources::images::Images {
111        &self.resources.images
112    }
113
114    /// Accesses the audio family handle.
115    pub fn audio(&self) -> &crate::resources::audio::Audio {
116        &self.resources.audio
117    }
118
119    /// Accesses the files family handle.
120    pub fn files(&self) -> &crate::resources::files::Files {
121        &self.resources.files
122    }
123
124    /// Accesses the uploads family handle.
125    pub fn uploads(&self) -> &crate::resources::uploads::Uploads {
126        &self.resources.uploads
127    }
128
129    /// Accesses the vector stores family handle.
130    pub fn vector_stores(&self) -> &crate::resources::vector_stores::VectorStores {
131        &self.resources.vector_stores
132    }
133
134    /// Accesses the batches family handle.
135    pub fn batches(&self) -> &crate::resources::batches::Batches {
136        &self.resources.batches
137    }
138
139    /// Accesses the webhook helpers handle.
140    pub fn webhooks(&self) -> &crate::resources::webhooks::Webhooks {
141        &self.resources.webhooks
142    }
143
144    /// Accesses the fine-tuning family handle.
145    pub fn fine_tuning(&self) -> &crate::resources::fine_tuning::FineTuning {
146        &self.resources.fine_tuning
147    }
148
149    /// Accesses the evals family handle.
150    pub fn evals(&self) -> &crate::resources::evals::Evals {
151        &self.resources.evals
152    }
153
154    /// Accesses the containers family handle.
155    pub fn containers(&self) -> &crate::resources::containers::Containers {
156        &self.resources.containers
157    }
158
159    /// Accesses the skills family handle.
160    pub fn skills(&self) -> &crate::resources::skills::Skills {
161        &self.resources.skills
162    }
163
164    /// Accesses the videos family handle.
165    pub fn videos(&self) -> &crate::resources::videos::Videos {
166        &self.resources.videos
167    }
168
169    /// Accesses realtime support scaffolding.
170    pub fn realtime(&self) -> &Realtime {
171        &self.realtime
172    }
173}
174
175/// Builder for the root SDK client scaffold.
176#[derive(Clone, Debug, Default)]
177pub struct OpenAIBuilder {
178    config: ClientConfig,
179}
180
181impl OpenAIBuilder {
182    /// Replaces the scaffold configuration.
183    pub fn config(mut self, config: ClientConfig) -> Self {
184        self.config = config;
185        self
186    }
187
188    /// Sets an explicit API key.
189    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    /// Sets an explicit base URL.
195    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    /// Sets an explicit organization identifier.
201    pub fn organization(mut self, organization: impl Into<String>) -> Self {
202        self.config.organization = Some(organization.into());
203        self
204    }
205
206    /// Sets an explicit project identifier.
207    pub fn project(mut self, project: impl Into<String>) -> Self {
208        self.config.project = Some(project.into());
209        self
210    }
211
212    /// Sets a custom user-agent token or prefix.
213    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    /// Sets a default webhook secret for signature verification helpers.
219    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    /// Sets a client-level timeout budget.
225    pub fn timeout(mut self, timeout: std::time::Duration) -> Self {
226        self.config.timeout = Some(timeout);
227        self
228    }
229
230    /// Sets a client-level retry budget.
231    pub fn max_retries(mut self, max_retries: u32) -> Self {
232        self.config.max_retries = Some(max_retries);
233        self
234    }
235
236    /// Builds the scaffold client.
237    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}