diff --git a/codex-rs/core/src/context/image_generation_instructions.rs b/codex-rs/core/src/context/image_generation_instructions.rs index 6986a7c64f25..b0c274f00f22 100644 --- a/codex-rs/core/src/context/image_generation_instructions.rs +++ b/codex-rs/core/src/context/image_generation_instructions.rs @@ -18,7 +18,7 @@ fn image_generation_hint( image_output_path: impl Display, ) -> String { format!( - "Generated images are saved to {image_output_dir} as {image_output_path} by default.\nIf you need to use a generated image at another path, copy it and leave the original in place unless the user explicitly asks you to delete it." + "Generated images are saved to {image_output_dir} as {image_output_path} by default.\nAlready displayed; do not repeat it or an unchanged copy in final Markdown unless asked.\nFor another path, copy it and keep the original unless asked to delete it." ) } diff --git a/codex-rs/core/tests/suite/model_switching.rs b/codex-rs/core/tests/suite/model_switching.rs index 9ef3675b3ed2..b53ee1cba7ae 100644 --- a/codex-rs/core/tests/suite/model_switching.rs +++ b/codex-rs/core/tests/suite/model_switching.rs @@ -703,8 +703,11 @@ async fn generated_image_is_replayed_for_image_capable_models() -> Result<()> { second_request .message_input_texts("developer") .iter() - .any(|text| text.contains("Generated images are saved to")), - "second request should include the saved-path note in model-visible history" + .any(|text| { + text.contains("Generated images are saved to") + && text.contains("do not repeat it or an unchanged copy") + }), + "second request should include the saved-path and render-once note in model-visible history" ); let _ = std::fs::remove_file(&saved_path); @@ -827,8 +830,11 @@ async fn model_change_from_generated_image_to_text_preserves_prior_generated_ima second_request .message_input_texts("developer") .iter() - .any(|text| text.contains("Generated images are saved to")), - "second request should include the saved-path note in model-visible history" + .any(|text| { + text.contains("Generated images are saved to") + && text.contains("do not repeat it or an unchanged copy") + }), + "second request should include the saved-path and render-once note in model-visible history" ); let _ = std::fs::remove_file(&saved_path); diff --git a/codex-rs/ext/image-generation/src/tests.rs b/codex-rs/ext/image-generation/src/tests.rs index 1ec9371214a4..a607ef6314f4 100644 --- a/codex-rs/ext/image-generation/src/tests.rs +++ b/codex-rs/ext/image-generation/src/tests.rs @@ -224,9 +224,12 @@ async fn recent_image_fallback_requires_requested_count() { fn generated_output_returns_image_input_and_output_hint() { let output_hint = extension_image_generation_output_hint("/tmp", "/tmp/call-1.png").expect("hint should fit"); + let expected_output_hint = "Generated images are saved to /tmp as /tmp/call-1.png by default. +Already displayed; do not repeat it or an unchanged copy in final Markdown unless asked. +For another path, copy it and keep the original unless asked to delete it."; let output = GeneratedImageOutput { result: RESULT.to_string(), - output_hint: Some(output_hint.clone()), + output_hint: Some(output_hint), }; let ResponseInputItem::FunctionCallOutput { @@ -246,7 +249,9 @@ fn generated_output_returns_image_input_and_output_hint() { image_url: format!("data:image/png;base64,{RESULT}"), detail: Some(DEFAULT_IMAGE_DETAIL), }, - FunctionCallOutputContentItem::InputText { text: output_hint }, + FunctionCallOutputContentItem::InputText { + text: expected_output_hint.to_string(), + }, ] ); }