Gate realtime final answer filtering to v2

This commit is contained in:
Ahmed Ibrahim
2026-04-14 00:20:01 -07:00
parent 2a3ccfc8ff
commit abcedbf71b
2 changed files with 14 additions and 5 deletions

View File

@@ -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<String> {
fn realtime_text_for_event(msg: &EventMsg, suppress_final_answer: bool) -> Option<String> {
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,
},

View File

@@ -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<RealtimeStartOutput> {
let previous_state = {
let mut guard = self.state.lock().await;