Skip to content

Commit 60652c3

Browse files
committed
beta() apis
1 parent 4d3dc52 commit 60652c3

3 files changed

Lines changed: 59 additions & 4 deletions

File tree

async-openai/src/beta.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use std::cell::OnceCell;
2+
3+
use crate::{
4+
chatkit::Chatkit,
5+
config::{Config, OpenAIConfig},
6+
Client,
7+
};
8+
9+
/// Beta API accessor for beta features like ChatKit.
10+
///
11+
/// Use `client.beta().chatkit()` to access ChatKit APIs with the required beta header.
12+
pub struct Beta<'c, C: Config> {
13+
client: &'c Client<C>,
14+
beta_client: OnceCell<Client<OpenAIConfig>>,
15+
}
16+
17+
impl<'c> Beta<'c, OpenAIConfig> {
18+
/// Access ChatKit APIs.
19+
///
20+
/// This automatically includes the `OpenAI-Beta: chatkit_beta=v1` header in all requests.
21+
pub fn chatkit(&self) -> Chatkit<'_, OpenAIConfig> {
22+
let beta_client = self.beta_client.get_or_init(|| {
23+
let mut beta_config = self.client.config().clone();
24+
beta_config = beta_config
25+
.with_header("OpenAI-Beta", "chatkit_beta=v1")
26+
.unwrap();
27+
Client::with_config(beta_config)
28+
.with_http_client(self.client.http_client().clone())
29+
.with_backoff(self.client.backoff().clone())
30+
});
31+
Chatkit::new(beta_client)
32+
}
33+
}
34+
35+
impl<'c, C: Config> Beta<'c, C> {
36+
pub(crate) fn new_generic(client: &'c Client<C>) -> Self {
37+
Self {
38+
client,
39+
beta_client: OnceCell::new(),
40+
}
41+
}
42+
}

async-openai/src/client.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use reqwest_eventsource::{Error as EventSourceError, Event, EventSource, Request
77
use serde::{de::DeserializeOwned, Serialize};
88

99
use crate::{
10-
chatkit::Chatkit,
10+
beta::Beta,
1111
config::{Config, OpenAIConfig},
1212
error::{map_deserialization_error, ApiError, OpenAIError, StreamError, WrappedError},
1313
file::Files,
@@ -189,15 +189,26 @@ impl<C: Config> Client<C> {
189189
Evals::new(self)
190190
}
191191

192-
/// To call [Chatkit] group related APIs using this client.
193-
pub fn chatkit(&self) -> Chatkit<'_, C> {
194-
Chatkit::new(self)
192+
/// Access beta APIs like ChatKit.
193+
///
194+
/// Beta APIs require special headers that are automatically added.
195+
/// Use `client.beta().chatkit()` to access ChatKit APIs.
196+
pub fn beta(&self) -> Beta<'_, C> {
197+
Beta::new_generic(self)
195198
}
196199

197200
pub fn config(&self) -> &C {
198201
&self.config
199202
}
200203

204+
pub(crate) fn http_client(&self) -> &reqwest::Client {
205+
&self.http_client
206+
}
207+
208+
pub(crate) fn backoff(&self) -> &backoff::ExponentialBackoff {
209+
&self.backoff
210+
}
211+
201212
/// Make a GET request to {path} and deserialize the response body
202213
pub(crate) async fn get<O>(&self, path: &str) -> Result<O, OpenAIError>
203214
where

async-openai/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ mod assistants;
144144
mod audio;
145145
mod audit_logs;
146146
mod batches;
147+
mod beta;
147148
mod chat;
148149
mod chatkit;
149150
mod client;
@@ -193,6 +194,7 @@ pub use assistants::Assistants;
193194
pub use audio::Audio;
194195
pub use audit_logs::AuditLogs;
195196
pub use batches::Batches;
197+
pub use beta::Beta;
196198
pub use chat::Chat;
197199
pub use chatkit::Chatkit;
198200
pub use client::Client;

0 commit comments

Comments
 (0)