diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 09f5a8c21a..83cf4ffb1e 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -2922,14 +2922,15 @@ impl Session { } async fn maybe_mirror_event_text_to_realtime(&self, msg: &EventMsg) { - let Some(text) = realtime_text_for_event(msg) else { - return; - }; if self.conversation.running_state().await.is_none() || self.conversation.active_handoff_id().await.is_none() { return; } + let Some(text) = realtime_text_for_event(msg, self.conversation.is_realtime_v2().await) + else { + return; + }; if let Err(err) = self.conversation.handoff_out(text).await { debug!("failed to mirror event text to realtime conversation: {err}"); } @@ -7346,13 +7347,14 @@ fn agent_message_text(item: &codex_protocol::items::AgentMessageItem) -> String .collect() } -fn realtime_text_for_event(msg: &EventMsg) -> Option { +fn realtime_text_for_event(msg: &EventMsg, suppress_final_answer: bool) -> Option { match msg { EventMsg::AgentMessage(event) => Some(event.message.clone()), EventMsg::ItemCompleted(event) => match &event.item { TurnItem::AgentMessage(item) => match item.phase.as_ref() { - Some(MessagePhase::FinalAnswer) => None, + Some(MessagePhase::FinalAnswer) if suppress_final_answer => None, Some(MessagePhase::Commentary) | None => Some(agent_message_text(item)), + Some(MessagePhase::FinalAnswer) => Some(agent_message_text(item)), }, _ => None, }, diff --git a/codex-rs/core/src/realtime_conversation.rs b/codex-rs/core/src/realtime_conversation.rs index 8200ba4908..ef2f75147f 100644 --- a/codex-rs/core/src/realtime_conversation.rs +++ b/codex-rs/core/src/realtime_conversation.rs @@ -244,6 +244,13 @@ impl RealtimeConversationManager { .and_then(|state| state.realtime_active.load(Ordering::Relaxed).then_some(())) } + pub(crate) async fn is_realtime_v2(&self) -> bool { + let state = self.state.lock().await; + state + .as_ref() + .is_some_and(|state| state.handoff.session_kind == RealtimeSessionKind::V2) + } + async fn start(&self, start: RealtimeStart) -> CodexResult { let previous_state = { let mut guard = self.state.lock().await;