moving logic to one fn

This commit is contained in:
won
2026-03-10 13:44:07 -07:00
parent fc3ded2868
commit 9fbaf7be7c
3 changed files with 36 additions and 19 deletions

View File

@@ -6636,7 +6636,8 @@ 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) = handle_non_tool_response_item(item, true).await {
if let Some(turn_item) = handle_non_tool_response_item(sess, turn_context, item, true).await
{
emit_turn_item_in_plan_mode(
sess,
turn_context,
@@ -6816,7 +6817,14 @@ async fn try_run_sampling_request(
needs_follow_up |= output_result.needs_follow_up;
}
ResponseEvent::OutputItemAdded(item) => {
if let Some(turn_item) = handle_non_tool_response_item(&item, plan_mode).await {
if let Some(turn_item) = handle_non_tool_response_item(
sess.as_ref(),
turn_context.as_ref(),
&item,
plan_mode,
)
.await
{
let mut turn_item = turn_item;
let mut seeded_parsed: Option<ParsedAssistantTextDelta> = None;
let mut seeded_item_id: Option<String> = None;

View File

@@ -3205,7 +3205,7 @@ async fn handle_output_item_done_records_image_save_message_after_successful_sav
let history = session.clone_history().await;
let expected_message: ResponseItem =
DeveloperInstructions::new(default_image_save_developer_message_text()).into();
assert_eq!(history.raw_items(), &[item, expected_message]);
assert_eq!(history.raw_items(), &[expected_message, item]);
assert_eq!(
std::fs::read(&expected_saved_path).expect("saved file"),
b"foo"

View File

@@ -189,9 +189,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 mut record_default_image_save_developer_message = false;
if let Some(turn_item) = handle_non_tool_response_item(&item, plan_mode).await {
record_default_image_save_developer_message = matches!(&turn_item, TurnItem::ImageGeneration(item) if item.saved_path.is_some());
if let Some(turn_item) = handle_non_tool_response_item(
ctx.sess.as_ref(),
ctx.turn_context.as_ref(),
&item,
plan_mode,
)
.await
{
if previously_active_item.is_none() {
let mut started_item = turn_item.clone();
if let TurnItem::ImageGeneration(item) = &mut started_item {
@@ -212,18 +217,6 @@ pub(crate) async fn handle_output_item_done(
record_completed_response_item(ctx.sess.as_ref(), ctx.turn_context.as_ref(), &item)
.await;
if record_default_image_save_developer_message {
let image_output_dir = default_image_generation_output_dir();
let message: ResponseItem = DeveloperInstructions::new(format!(
"Generated images are saved to {} as {} by default.",
image_output_dir.display(),
image_output_dir.join("<image_id>.png").display(),
))
.into();
ctx.sess
.record_conversation_items(&ctx.turn_context, std::slice::from_ref(&message))
.await;
}
let last_agent_message = last_assistant_message_from_item(&item, plan_mode);
output.last_agent_message = last_agent_message;
@@ -288,6 +281,8 @@ pub(crate) async fn handle_output_item_done(
}
pub(crate) async fn handle_non_tool_response_item(
sess: &Session,
turn_context: &TurnContext,
item: &ResponseItem,
plan_mode: bool,
) -> Option<TurnItem> {
@@ -315,6 +310,18 @@ pub(crate) async fn handle_non_tool_response_item(
match save_image_generation_result(&image_item.id, &image_item.result).await {
Ok(path) => {
image_item.saved_path = Some(path.to_string_lossy().into_owned());
let image_output_dir = default_image_generation_output_dir();
let message: ResponseItem = DeveloperInstructions::new(format!(
"Generated images are saved to {} as {} by default.",
image_output_dir.display(),
image_output_dir.join("<image_id>.png").display(),
))
.into();
sess.record_conversation_items(
turn_context,
std::slice::from_ref(&message),
)
.await;
}
Err(err) => {
let output_dir = default_image_generation_output_dir();
@@ -390,6 +397,7 @@ mod tests {
use super::handle_non_tool_response_item;
use super::last_assistant_message_from_item;
use super::save_image_generation_result;
use crate::codex::make_session_and_context;
use crate::error::CodexErr;
use codex_protocol::items::TurnItem;
use codex_protocol::models::ContentItem;
@@ -410,9 +418,10 @@ mod tests {
#[tokio::test]
async fn handle_non_tool_response_item_strips_citations_from_assistant_message() {
let (session, turn_context) = make_session_and_context().await;
let item = assistant_output_text("hello<oai-mem-citation>doc1</oai-mem-citation> world");
let turn_item = handle_non_tool_response_item(&item, false)
let turn_item = handle_non_tool_response_item(&session, &turn_context, &item, false)
.await
.expect("assistant message should parse");