mirror of
https://github.com/openai/codex.git
synced 2026-10-21 17:48:44 +00:00
Store generated image items as attachment references (#54398)
## What changed - Upload generated images to the attachment store and expose `fileId` in image-generation items when available, with inline `result` fallback on upload or decoding failure. - Preserve file references through legacy events, persisted rollouts, thread history, and task output summaries. Keep model-facing image preparation separate. - Add attachment request tags and mark generated-image uploads with `usage=image_gen`, preserving the thread's ephemeral setting. - Update public schemas and SDK types to accept either image representation, retain the Python `ImageGenerationThreadItem` alias, and prefer `fileId` when reading records containing both fields. ## Testing Add coverage for file-backed generation and rollout persistence, legacy history replay, inline and transitional serialization, task output visibility, and Python SDK alias compatibility. GitOrigin-RevId: f7a2bb5707e2f277348a547a988bc33c8e96d891
This commit is contained in:
committed by
copyberry
parent
1ef30bcbe7
commit
aabf13307a
@@ -65,6 +65,7 @@ use crate::protocol::ViewImageToolCallEvent;
|
||||
use crate::protocol::WebSearchBeginEvent;
|
||||
use crate::protocol::WebSearchEndEvent;
|
||||
use crate::user_input::UserInput;
|
||||
use codex_extension_items::image_generation::GeneratedImageRef;
|
||||
|
||||
/// Converts canonical item lifecycle events back into the legacy raw event stream used by
|
||||
/// compatibility consumers that have not migrated to `TurnItem`.
|
||||
@@ -463,7 +464,9 @@ impl ImageGenerationItem {
|
||||
call_id: self.id.clone(),
|
||||
status: self.status.clone(),
|
||||
revised_prompt: self.revised_prompt.clone(),
|
||||
result: self.result.clone(),
|
||||
image: GeneratedImageRef::Inline {
|
||||
result: self.result.clone(),
|
||||
},
|
||||
transparent_background: None,
|
||||
failure: None,
|
||||
saved_path: self.saved_path.clone(),
|
||||
|
||||
@@ -65,6 +65,7 @@ use crate::turn_input::TurnInputMode;
|
||||
use crate::turn_input::TurnInputRequest;
|
||||
use crate::turn_input::TurnInputSubmission;
|
||||
use crate::turn_input::TurnStartOptions;
|
||||
use codex_extension_items::image_generation::GeneratedImageRef;
|
||||
use codex_extension_items::image_generation::ImageGenerationFailure;
|
||||
use codex_utils_absolute_path::AbsolutePathBuf;
|
||||
use codex_utils_path_uri::PathUri;
|
||||
@@ -2924,7 +2925,8 @@ pub struct ImageGenerationEndEvent {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub revised_prompt: Option<String>,
|
||||
pub result: String,
|
||||
#[serde(flatten)]
|
||||
pub image: GeneratedImageRef,
|
||||
#[serde(default, skip_serializing_if = "Option::is_none")]
|
||||
#[ts(optional)]
|
||||
pub transparent_background: Option<bool>,
|
||||
@@ -5594,7 +5596,12 @@ mod tests {
|
||||
assert_eq!(event.call_id, "ig-1");
|
||||
assert_eq!(event.status, "completed");
|
||||
assert_eq!(event.revised_prompt.as_deref(), Some("A tiny blue square"));
|
||||
assert_eq!(event.result, "Zm9v");
|
||||
assert_eq!(
|
||||
event.image,
|
||||
GeneratedImageRef::Inline {
|
||||
result: "Zm9v".to_string(),
|
||||
}
|
||||
);
|
||||
assert_eq!(
|
||||
event.saved_path.as_ref().map(AbsolutePathBuf::as_path),
|
||||
Some(test_path_buf("/tmp/ig-1.png").as_path())
|
||||
|
||||
Reference in New Issue
Block a user