From f11d249215befad1a1ff15252e668d825ffa80e8 Mon Sep 17 00:00:00 2001 From: won Date: Tue, 12 May 2026 12:50:43 -0700 Subject: [PATCH] simplify --- codex-rs/core/src/session/turn.rs | 4 +- codex-rs/core/src/stream_events_utils.rs | 58 +++++++++++-------- .../core/src/stream_events_utils_tests.rs | 3 +- 3 files changed, 37 insertions(+), 28 deletions(-) diff --git a/codex-rs/core/src/session/turn.rs b/codex-rs/core/src/session/turn.rs index 0e64190d25..4a75ed0632 100644 --- a/codex-rs/core/src/session/turn.rs +++ b/codex-rs/core/src/session/turn.rs @@ -1771,7 +1771,7 @@ async fn handle_assistant_item_done_in_plan_mode( { maybe_complete_plan_item_from_message(sess, turn_context, state, item).await; - if let Some((turn_item, _item_for_history)) = + if let Some(turn_item) = handle_non_tool_response_item(sess, turn_context, item, /*plan_mode*/ true).await { emit_turn_item_in_plan_mode( @@ -2015,7 +2015,7 @@ async fn try_run_sampling_request( } else if matches!(&item, ResponseItem::FunctionCall { .. }) { active_tool_argument_diff_consumer = None; } - if let Some((turn_item, _item_for_history)) = handle_non_tool_response_item( + if let Some(turn_item) = handle_non_tool_response_item( sess.as_ref(), turn_context.as_ref(), &item, diff --git a/codex-rs/core/src/stream_events_utils.rs b/codex-rs/core/src/stream_events_utils.rs index adb8c04cf6..3d2bb50900 100644 --- a/codex-rs/core/src/stream_events_utils.rs +++ b/codex-rs/core/src/stream_events_utils.rs @@ -258,14 +258,14 @@ pub(crate) async fn handle_output_item_done( } // No tool call: convert messages/reasoning into turn items and mark them as complete. Ok(None) => { - let parsed_items = handle_non_tool_response_item( + let turn_item = handle_non_tool_response_item( ctx.sess.as_ref(), ctx.turn_context.as_ref(), &item, plan_mode, ) .await; - let modified_item = if let Some((turn_item, modified_item)) = parsed_items { + let item_for_history = if let Some(turn_item) = turn_item { if previously_active_item.is_none() { let mut started_item = turn_item.clone(); if let TurnItem::ImageGeneration(item) = &mut started_item { @@ -279,19 +279,19 @@ pub(crate) async fn handle_output_item_done( .await; } + let item_for_history = + item_for_completed_history(&item, &turn_item, ctx.turn_context.as_ref()); ctx.sess .emit_turn_item_completed(&ctx.turn_context, turn_item) .await; - - Some(modified_item) + item_for_history } else { - None + item.clone() }; - let item_for_history = modified_item.as_ref().unwrap_or(&item); record_completed_response_item( ctx.sess.as_ref(), ctx.turn_context.as_ref(), - item_for_history, + &item_for_history, ) .await; let last_agent_message = last_assistant_message_from_item(&item, plan_mode); @@ -362,7 +362,7 @@ pub(crate) async fn handle_non_tool_response_item( turn_context: &TurnContext, item: &ResponseItem, plan_mode: bool, -) -> Option<(TurnItem, ResponseItem)> { +) -> Option { debug!(?item, "Output item"); match item { @@ -370,7 +370,6 @@ pub(crate) async fn handle_non_tool_response_item( | ResponseItem::Reasoning { .. } | ResponseItem::WebSearchCall { .. } | ResponseItem::ImageGenerationCall { .. } => { - let mut modified_item = item.clone(); let mut turn_item = parse_turn_item(item)?; if let TurnItem::AgentMessage(agent_message) = &mut turn_item { let combined = agent_message @@ -397,21 +396,7 @@ pub(crate) async fn handle_non_tool_response_item( .await { Ok(path) => { - let image_output_dir = path - .parent() - .unwrap_or_else(|| turn_context.config.codex_home.clone()); - let saved_path_text = path.display().to_string(); - let output_hint_text = ImageGenerationInstructions::new( - image_output_dir.display(), - saved_path_text, - ) - .body(); image_item.saved_path = Some(path); - if let ResponseItem::ImageGenerationCall { output_hint, .. } = - &mut modified_item - { - *output_hint = Some(output_hint_text); - } } Err(err) => { let output_path = image_generation_artifact_path( @@ -430,7 +415,7 @@ pub(crate) async fn handle_non_tool_response_item( } } } - Some((turn_item, modified_item)) + Some(turn_item) } ResponseItem::FunctionCallOutput { .. } | ResponseItem::CustomToolCallOutput { .. } @@ -442,6 +427,31 @@ pub(crate) async fn handle_non_tool_response_item( } } +fn item_for_completed_history( + item: &ResponseItem, + turn_item: &TurnItem, + turn_context: &TurnContext, +) -> ResponseItem { + let mut item_for_history = item.clone(); + + if let ( + ResponseItem::ImageGenerationCall { output_hint, .. }, + TurnItem::ImageGeneration(image_item), + ) = (&mut item_for_history, turn_item) + && let Some(saved_path) = image_item.saved_path.as_ref() + { + let image_output_dir = saved_path + .parent() + .unwrap_or_else(|| turn_context.config.codex_home.clone()); + *output_hint = Some( + ImageGenerationInstructions::new(image_output_dir.display(), saved_path.display()) + .body(), + ); + } + + item_for_history +} + pub(crate) fn last_assistant_message_from_item( item: &ResponseItem, plan_mode: bool, diff --git a/codex-rs/core/src/stream_events_utils_tests.rs b/codex-rs/core/src/stream_events_utils_tests.rs index a9f94f0677..b1c8ccf4fd 100644 --- a/codex-rs/core/src/stream_events_utils_tests.rs +++ b/codex-rs/core/src/stream_events_utils_tests.rs @@ -117,11 +117,10 @@ async fn handle_non_tool_response_item_strips_citations_from_assistant_message() "hello\nMEMORY.md:1-2|note=[x]\n\n\n019cc2ea-1dff-7902-8d40-c8f6e5d83cc4\n world", ); - let (turn_item, item_for_history) = + let turn_item = handle_non_tool_response_item(&session, &turn_context, &item, /*plan_mode*/ false) .await .expect("assistant message should parse"); - assert_eq!(item_for_history, item); let TurnItem::AgentMessage(agent_message) = turn_item else { panic!("expected agent message");