use std::sync::Arc;
use super::{models::*, session::*, types::*};
pub struct RealTimeClient {
api_key: Arc<String>,
base_url: String,
}
impl RealTimeClient {
pub fn new(api_key: impl Into<String>) -> Self {
Self {
api_key: Arc::new(api_key.into()),
base_url: "wss://open.bigmodel.cn/api/realtime".to_string(),
}
}
pub fn with_base_url(mut self, base_url: impl Into<String>) -> Self {
self.base_url = base_url.into();
self
}
pub fn audio_session(&self) -> AudioSessionBuilder {
AudioSessionBuilder {
client: self.clone(),
model: None,
config: None,
}
}
pub fn api_key(&self) -> &str {
&self.api_key
}
pub fn base_url(&self) -> &str {
&self.base_url
}
}
impl Clone for RealTimeClient {
fn clone(&self) -> Self {
Self {
api_key: Arc::clone(&self.api_key),
base_url: self.base_url.clone(),
}
}
}
pub struct AudioSessionBuilder {
#[allow(dead_code)]
client: RealTimeClient,
model: Option<RealTimeModel>,
config: Option<SessionConfig>,
}
impl AudioSessionBuilder {
pub fn model(mut self, model: RealTimeModel) -> Self {
self.model = Some(model);
self
}
pub fn config(mut self, config: SessionConfig) -> Self {
self.config = Some(config);
self
}
pub async fn build(self) -> Result<RealTimeSession, Box<dyn std::error::Error>> {
let _model = self.model.unwrap_or_default();
let config = self.config.unwrap_or_default();
let session_id = format!("session_{}", uuid::Uuid::new_v4());
let session = RealTimeSession::new(session_id, config);
session.update_state(SessionState::Connected).await;
Ok(session)
}
}