From 2ca173f441747abb0049a7a61b0bbf10b0aa9662 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Mon, 17 Nov 2025 15:23:39 +0000 Subject: [PATCH 1/2] feat: placeholder for image that can't be decoded to prevent 400 --- codex-rs/protocol/src/models.rs | 18 +++++++++++++++++- codex-rs/utils/image/src/error.rs | 13 +++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/codex-rs/protocol/src/models.rs b/codex-rs/protocol/src/models.rs index f44d847099..eaa4c9351a 100644 --- a/codex-rs/protocol/src/models.rs +++ b/codex-rs/protocol/src/models.rs @@ -158,6 +158,19 @@ fn local_image_error_placeholder( } } +fn invalid_image_error_placeholder( + path: &std::path::Path, + error: impl std::fmt::Display, +) -> ContentItem { + ContentItem::InputText { + text: format!( + "Image located at `{}` is invalid: {}", + path.display(), + error + ), + } +} + impl From for ResponseItem { fn from(item: ResponseInputItem) -> Self { match item { @@ -250,6 +263,8 @@ impl From> for ResponseInputItem { tracing::warn!("Failed to resize image {}: {}", path.display(), err); if matches!(&err, ImageProcessingError::Read { .. }) { local_image_error_placeholder(&path, &err) + } else if err.is_invalid_image() { + invalid_image_error_placeholder(&path, &err) } else { match std::fs::read(&path) { Ok(bytes) => { @@ -365,6 +380,7 @@ impl Serialize for FunctionCallOutputPayload { where S: Serializer, { + tracing::error!("Payload: {:?}", self); if let Some(items) = &self.content_items { items.serialize(serializer) } else { @@ -452,7 +468,7 @@ fn convert_content_blocks_to_items( ) -> Option> { let mut saw_image = false; let mut items = Vec::with_capacity(blocks.len()); - + tracing::warn!("Blocks: {:?}", blocks); for block in blocks { match block { ContentBlock::TextContent(text) => { diff --git a/codex-rs/utils/image/src/error.rs b/codex-rs/utils/image/src/error.rs index ffd0a7850e..6bd055115d 100644 --- a/codex-rs/utils/image/src/error.rs +++ b/codex-rs/utils/image/src/error.rs @@ -1,3 +1,4 @@ +use image::ImageError; use image::ImageFormat; use std::path::PathBuf; use thiserror::Error; @@ -23,3 +24,15 @@ pub enum ImageProcessingError { source: image::ImageError, }, } + +impl ImageProcessingError { + pub fn is_invalid_image(&self) -> bool { + matches!( + self, + ImageProcessingError::Decode { + source: ImageError::Decoding(_), + .. + } + ) + } +} From 55f119d457c10b3e03175fa52152bee582e1ed7f Mon Sep 17 00:00:00 2001 From: jif-oai Date: Mon, 17 Nov 2025 15:56:31 +0000 Subject: [PATCH 2/2] Update models.rs --- codex-rs/protocol/src/models.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/codex-rs/protocol/src/models.rs b/codex-rs/protocol/src/models.rs index eaa4c9351a..755b59f535 100644 --- a/codex-rs/protocol/src/models.rs +++ b/codex-rs/protocol/src/models.rs @@ -260,7 +260,6 @@ impl From> for ResponseInputItem { image_url: image.into_data_url(), }, Err(err) => { - tracing::warn!("Failed to resize image {}: {}", path.display(), err); if matches!(&err, ImageProcessingError::Read { .. }) { local_image_error_placeholder(&path, &err) } else if err.is_invalid_image() {