mirror of
https://github.com/openai/codex.git
synced 2026-10-21 17:48:44 +00:00
Support typed content in contextual prompt fragments (#54776)
## Why Contextual fragments and extension-owned world-state sections currently return strings, limiting them to text content. ## What changed - Return `ContentItem` from fragment bodies and rendering, preserving classification and attribution. Apply text markers only to `InputText`; pass other content through unchanged. - Allow extension prompt and world-state contributions to carry typed content, and preserve media in context-window hints. - Hash non-text world-state fragments by their serialized content and role while retaining the existing text hashing behavior. - Add shared content-to-tool-output conversion that preserves image references, image detail, and audio. ## Testing Add coverage for typed world-state hashing and preservation of image content and attribution. Expand code-mode output tests to cover input text, output text, file-backed and inline images, and audio. GitOrigin-RevId: 2ed00d466a3f169b151202f3eef71e667ea64be1
This commit is contained in:
@@ -910,6 +910,21 @@ pub enum ContentItem {
|
||||
},
|
||||
}
|
||||
|
||||
/// Constructs an input-text content item.
|
||||
pub fn input_text(text: impl Into<String>) -> ContentItem {
|
||||
ContentItem::InputText { text: text.into() }
|
||||
}
|
||||
|
||||
impl ContentItem {
|
||||
/// Extracts text, returning `None` for non-text content.
|
||||
pub fn into_text(self) -> Option<String> {
|
||||
match self {
|
||||
Self::InputText { text } | Self::OutputText { text, .. } => Some(text),
|
||||
Self::InputImage { .. } | Self::InputAudio { .. } => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema, TS)]
|
||||
#[serde(untagged)]
|
||||
#[ts(untagged)]
|
||||
@@ -2251,6 +2266,20 @@ pub enum FunctionCallOutputContentItem {
|
||||
},
|
||||
}
|
||||
|
||||
/// Converts message content to tool output, preserving media and image detail.
|
||||
/// Output text becomes input text without its sampling annotations or logprobs.
|
||||
impl From<ContentItem> for FunctionCallOutputContentItem {
|
||||
fn from(item: ContentItem) -> Self {
|
||||
match item {
|
||||
ContentItem::InputText { text } | ContentItem::OutputText { text, .. } => {
|
||||
Self::InputText { text }
|
||||
}
|
||||
ContentItem::InputImage { image, detail } => Self::InputImage { image, detail },
|
||||
ContentItem::InputAudio { audio_url } => Self::InputAudio { audio_url },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Converts structured function-call output content into plain text for
|
||||
/// human-readable surfaces.
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user