openai_realtime/
session.rs1use 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
23pub async fn create_ephemeral_token(config: &SessionConfig) -> Result<ClientSecret, RealtimeError> {
27 Ok(create_session(config).await?.client_secret.unwrap())
28}
29
30pub 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}