openai_realtime/
session.rs

1use crate::api::model::Model;
2use crate::api::session::{ClientSecret, CreateSessionRequest, Session};
3use crate::api::voice::Voice;
4use crate::{ApiKeyRef, RealtimeError};
5
6#[derive(Debug, Clone)]
7pub struct SessionConfig {
8    pub api_key_ref: ApiKeyRef,
9    pub model: Model,
10    pub voice: Voice,
11}
12
13impl Default for SessionConfig {
14    fn default() -> Self {
15        Self {
16            model: Model::default(),
17            api_key_ref: ApiKeyRef::default(),
18            voice: Voice::Verse,
19        }
20    }
21}
22
23/// Creates an ephemeral token for WebRTC
24/// See: https://platform.openai.com/docs/guides/realtime#connect-with-webrtc
25/// See: https://platform.openai.com/docs/guides/realtime#connection-details
26pub async fn create_ephemeral_token(config: &SessionConfig) -> Result<ClientSecret, RealtimeError> {
27    Ok(create_session(config).await?.client_secret.unwrap())
28}
29
30/// Create a new Session
31pub async fn create_session(config: &SessionConfig) -> Result<Session, RealtimeError> {
32    let client = reqwest::Client::new();
33    let response = client
34        .post("https://api.openai.com/v1/realtime/sessions")
35        .header(
36            "Authorization",
37            format!("Bearer {}", config.api_key_ref.clone().api_key()),
38        )
39        .header("Content-Type", "application/json")
40        .json(&CreateSessionRequest {
41            model: config.model.clone(),
42            voice: config.voice.clone(),
43        })
44        .send()
45        .await
46        .map_err(RealtimeError::Http)?
47        .json()
48        .await
49        .map_err(RealtimeError::Http)?;
50    Ok(response)
51}
52
53#[cfg(test)]
54mod tests {
55    use crate::session::{SessionConfig, create_ephemeral_token};
56
57    #[tokio::test]
58    async fn test_get_token() {
59        let token = create_ephemeral_token(&SessionConfig::default())
60            .await
61            .unwrap();
62        println!("token: {token:?}");
63    }
64}