diff --git a/codex-rs/core/src/session/mod.rs b/codex-rs/core/src/session/mod.rs index cf1912359..e21b5394d 100644 --- a/codex-rs/core/src/session/mod.rs +++ b/codex-rs/core/src/session/mod.rs @@ -1134,7 +1134,7 @@ impl Session { pub(crate) async fn route_realtime_text_input(self: &Arc, text: String) { handlers::user_input_or_turn_inner( self, - self.next_internal_sub_id(), + Uuid::now_v7().to_string(), Op::UserInput { items: vec![UserInput::Text { text, diff --git a/codex-rs/core/tests/suite/realtime_conversation.rs b/codex-rs/core/tests/suite/realtime_conversation.rs index 61fc38e8b..a2aa6d61d 100644 --- a/codex-rs/core/tests/suite/realtime_conversation.rs +++ b/codex-rs/core/tests/suite/realtime_conversation.rs @@ -50,6 +50,7 @@ use std::sync::Mutex; use std::time::Duration; use tokio::sync::oneshot; use tokio::time::timeout; +use uuid::Uuid; use wiremock::Match; use wiremock::Mock; use wiremock::Request as WiremockRequest; @@ -3019,6 +3020,14 @@ async fn inbound_handoff_request_starts_turn() -> Result<()> { }) .await; + let turn_id = loop { + let event = test.codex.next_event().await?; + if let EventMsg::TurnStarted(turn_started) = event.msg { + break turn_started.turn_id; + } + }; + Uuid::parse_str(&turn_id).context("realtime-routed turn ID should be a UUID")?; + wait_for_event(&test.codex, |event| { matches!(event, EventMsg::TurnComplete(_)) })