From 54c04c346605f562e46664a2137cae50377fbe66 Mon Sep 17 00:00:00 2001 From: Armin Sander Date: Mon, 11 May 2026 15:53:22 +0200 Subject: [PATCH] Add --model to the openai example and remove support for the preview / beta protocol --- examples/openai-dialog.rs | 8 +++- external/openai-api-rs | 2 +- justfile | 3 ++ services/openai-dialog/src/lib.rs | 77 +++++++++---------------------- 4 files changed, 34 insertions(+), 56 deletions(-) diff --git a/examples/openai-dialog.rs b/examples/openai-dialog.rs index a54d875..47186e7 100644 --- a/examples/openai-dialog.rs +++ b/examples/openai-dialog.rs @@ -35,6 +35,8 @@ struct Cli { protocol: Option, #[arg(long)] endpoint: Option, + #[arg(long)] + model: Option, #[arg(long, value_parser = realtime_voice_value_parser())] voice: Option, } @@ -114,7 +116,11 @@ async fn main() -> Result<()> { stream.play().expect("Failed to play stream"); let key = env::var("OPENAI_API_KEY").unwrap(); - let model = env::var("OPENAI_REALTIME_API_MODEL").unwrap(); + let model = cli + .model + .or_else(|| env::var("OPENAI_REALTIME_API_MODEL").ok()) + .filter(|model| !model.trim().is_empty()) + .context("Provide --model or set OPENAI_REALTIME_API_MODEL")?; let openai = OpenAIDialog; let mut params = openai_dialog::Params::new(key, model); diff --git a/external/openai-api-rs b/external/openai-api-rs index c37d725..c706d6c 160000 --- a/external/openai-api-rs +++ b/external/openai-api-rs @@ -1 +1 @@ -Subproject commit c37d72517f9645c6eed00a15d1b90cee0b14a7fe +Subproject commit c706d6c99b4ec987e4d148b53d7ef441c23e8c15 diff --git a/justfile b/justfile index a7838c4..56e4342 100644 --- a/justfile +++ b/justfile @@ -25,3 +25,6 @@ transcribe-google-latest-long: transcribe-google-diarization: cargo run --example transcribe -- google --diarization --language de-DE --model chirp_3 --region eu +openai-dialog-realtime-2: + cargo run --example openai-dialog -- --protocol openai --model gpt-realtime-2 + diff --git a/services/openai-dialog/src/lib.rs b/services/openai-dialog/src/lib.rs index 01333e1..af33219 100644 --- a/services/openai-dialog/src/lib.rs +++ b/services/openai-dialog/src/lib.rs @@ -250,14 +250,13 @@ impl Host { .await .map_err(|e| anyhow!(e.to_string()))?; - Ok(Client::new(read, write, self.client.protocol)) + Ok(Client::new(read, write)) } } pub struct Client { read: SplitStream>>, write: SplitSink>, Message>, - protocol: RealtimeProtocol, response_state: ResponseState, inflight_prompt: Option<(String, PromptRequest)>, @@ -275,32 +274,16 @@ impl Client { fn new( read: SplitStream>>, write: SplitSink>, Message>, - protocol: RealtimeProtocol, ) -> Self { Self { read, write, - protocol, response_state: ResponseState::Idle, inflight_prompt: None, pending_prompts: Default::default(), } } - fn session_update_payload( - &self, - session: types::RealtimeSession, - ) -> client_event::SessionUpdatePayload { - match self.protocol { - RealtimeProtocol::OpenAI => client_event::SessionUpdatePayload::Untagged( - types::UntaggedSession::Realtime(session), - ), - RealtimeProtocol::Azure => { - client_event::SessionUpdatePayload::Tagged(types::Session::Realtime(session)) - } - } - } - /// Run an audio dialog. pub async fn dialog( &mut self, @@ -345,21 +328,14 @@ impl Client { }; if let Some(voice) = params.voice { - match self.protocol { - RealtimeProtocol::OpenAI => { - session.voice = Some(voice); - } - RealtimeProtocol::Azure => { - session.audio = Some(types::AudioConfig { - input: None, - output: Some(types::AudioOutput { - format: None, - speed: 1.0, - voice: Some(voice), - }), - }); - } - } + session.audio = Some(types::AudioConfig { + input: None, + output: Some(types::AudioOutput { + format: None, + speed: 1.0, + voice: Some(voice), + }), + }); send_update = true; } @@ -374,11 +350,11 @@ impl Client { } if send_update { - let payload = self.session_update_payload(session); - self.send_client_event(ClientEvent::SessionUpdate(client_event::SessionUpdate { event_id: None, - session: payload, + session: client_event::SessionUpdatePayload::Tagged(types::Session::Realtime( + session, + )), })) .await?; debug!("Session updated"); @@ -551,34 +527,27 @@ impl Client { tools, tool_choice, } => { - let (voice, audio) = match self.protocol { - RealtimeProtocol::OpenAI => (voice, None), - RealtimeProtocol::Azure => { - let audio = voice.map(|voice| types::AudioConfig { - input: None, - output: Some(types::AudioOutput { - format: None, - speed: 1.0, - voice: Some(voice), - }), - }); - (None, audio) - } - }; + let audio = voice.map(|voice| types::AudioConfig { + input: None, + output: Some(types::AudioOutput { + format: None, + speed: 1.0, + voice: Some(voice), + }), + }); let session = types::RealtimeSession { instructions, - voice, audio, tools, tool_choice, ..Default::default() }; - let payload = self.session_update_payload(session); - let event = ClientEvent::SessionUpdate(client_event::SessionUpdate { - session: payload, + session: client_event::SessionUpdatePayload::Tagged( + types::Session::Realtime(session), + ), ..Default::default() }); self.send_client_event(event).await?;