Compare commits

...

4 Commits

Author SHA1 Message Date
Ahmed Ibrahim
abcedbf71b Gate realtime final answer filtering to v2 2026-04-14 00:20:01 -07:00
Ahmed Ibrahim
2a3ccfc8ff Use match for realtime message phase 2026-04-14 00:19:19 -07:00
Ahmed Ibrahim
42aa5bc802 Simplify realtime final answer filtering 2026-04-14 00:16:43 -07:00
Ahmed Ibrahim
4d3a5dc799 Avoid realtime final answer progress echo 2026-04-14 00:10:52 -07:00
2 changed files with 18 additions and 5 deletions

View File

@@ -107,6 +107,7 @@ use codex_protocol::items::UserMessageItem;
use codex_protocol::items::build_hook_prompt_message;
use codex_protocol::mcp::CallToolResult;
use codex_protocol::models::BaseInstructions;
use codex_protocol::models::MessagePhase;
use codex_protocol::models::PermissionProfile;
use codex_protocol::models::format_allow_prefixes;
use codex_protocol::openai_models::ModelInfo;
@@ -2921,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}");
}
@@ -7345,11 +7347,15 @@ 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) => Some(agent_message_text(item)),
TurnItem::AgentMessage(item) => match item.phase.as_ref() {
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,
},
EventMsg::Error(_)

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;