diff --git a/codex-rs/core/src/realtime_conversation.rs b/codex-rs/core/src/realtime_conversation.rs index e614be106..cbb7837bd 100644 --- a/codex-rs/core/src/realtime_conversation.rs +++ b/codex-rs/core/src/realtime_conversation.rs @@ -376,7 +376,7 @@ fn realtime_text_from_handoff_request(handoff: &RealtimeHandoffRequested) -> Opt let messages = handoff .messages .iter() - .map(|message| message.text.as_str()) + .map(|message| format!("{}: {}", message.role, message.text)) .collect::>() .join("\n"); (!messages.is_empty()).then_some(messages).or_else(|| { @@ -605,7 +605,7 @@ mod tests { }; assert_eq!( realtime_text_from_handoff_request(&handoff), - Some("hello\nhi there".to_string()) + Some("user: hello\nassistant: hi there".to_string()) ); } diff --git a/codex-rs/core/tests/suite/realtime_conversation.rs b/codex-rs/core/tests/suite/realtime_conversation.rs index ff4e745dd..1a3d87b55 100644 --- a/codex-rs/core/tests/suite/realtime_conversation.rs +++ b/codex-rs/core/tests/suite/realtime_conversation.rs @@ -912,7 +912,11 @@ async fn inbound_handoff_request_starts_turn() -> Result<()> { let request = response_mock.single_request(); let user_texts = request.message_input_texts("user"); - assert!(user_texts.iter().any(|text| text == "text from realtime")); + assert!( + user_texts + .iter() + .any(|text| text == "user: text from realtime") + ); realtime_server.shutdown().await; Ok(()) @@ -982,11 +986,8 @@ async fn inbound_handoff_request_uses_all_messages() -> Result<()> { let request = response_mock.single_request(); let user_texts = request.message_input_texts("user"); - assert!( - user_texts - .iter() - .any(|text| text == "assistant context\ndelegated query\nassist confirm") - ); + assert!(user_texts.iter().any(|text| text + == "assistant: assistant context\nuser: delegated query\nassistant: assist confirm")); realtime_server.shutdown().await; Ok(()) @@ -1468,9 +1469,17 @@ async fn inbound_handoff_request_steers_active_turn() -> Result<()> { let second_texts = message_input_texts(&second_body, "user"); assert!(first_texts.iter().any(|text| text == "first prompt")); - assert!(!first_texts.iter().any(|text| text == "steer via realtime")); + assert!( + !first_texts + .iter() + .any(|text| text == "user: steer via realtime") + ); assert!(second_texts.iter().any(|text| text == "first prompt")); - assert!(second_texts.iter().any(|text| text == "steer via realtime")); + assert!( + second_texts + .iter() + .any(|text| text == "user: steer via realtime") + ); realtime_server.shutdown().await; api_server.shutdown().await; @@ -1578,7 +1587,8 @@ async fn inbound_handoff_request_starts_turn_and_does_not_block_realtime_audio() assert_eq!(requests.len(), 1); let first_body: Value = serde_json::from_slice(&requests[0]).expect("parse first request"); let first_texts = message_input_texts(&first_body, "user"); - assert!(first_texts.iter().any(|text| text == delegated_text)); + let expected_text = format!("user: {delegated_text}"); + assert!(first_texts.iter().any(|text| text == &expected_text)); realtime_server.shutdown().await; api_server.shutdown().await;