add uuid to metadata

This commit is contained in:
Roy Han
2026-03-19 09:47:54 -07:00
parent 1879c53d6e
commit 2fc35f8b6b
11 changed files with 251 additions and 5 deletions

View File

@@ -267,6 +267,47 @@ pub struct ResponseItemMetadata {
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional)]
pub user_message_type: Option<UserMessageType>,
/// Client-visible UUID generated by Codex for this item.
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional)]
pub uuid: Option<String>,
}
impl ResponseItem {
/// Ensures message metadata includes a generated UUID.
pub fn with_generated_metadata_uuid(self) -> Self {
match self {
ResponseItem::Message {
id,
role,
content,
metadata,
end_turn,
phase,
} => {
let metadata = ensure_generated_metadata_uuid(metadata);
ResponseItem::Message {
id,
role,
content,
metadata,
end_turn,
phase,
}
}
other => other,
}
}
}
fn ensure_generated_metadata_uuid(
metadata: Option<ResponseItemMetadata>,
) -> Option<ResponseItemMetadata> {
let mut metadata = metadata.unwrap_or_default();
if metadata.uuid.is_none() {
metadata.uuid = Some(uuid::Uuid::new_v4().to_string());
}
Some(metadata)
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema, TS)]
@@ -2958,4 +2999,51 @@ mod tests {
Ok(())
}
#[test]
fn generates_metadata_uuid_for_message_items() -> Result<()> {
let item = ResponseItem::Message {
id: Some("msg_123".to_string()),
role: "assistant".to_string(),
content: vec![ContentItem::OutputText {
text: "hello".to_string(),
}],
metadata: Some(ResponseItemMetadata {
user_message_type: Some(UserMessageType::Prompt),
uuid: None,
}),
end_turn: None,
phase: None,
};
let surfaced = item.with_generated_metadata_uuid();
let serialized = serde_json::to_value(&surfaced)?;
let metadata = serialized
.get("metadata")
.and_then(serde_json::Value::as_object)
.expect("metadata should be present");
let uuid = metadata
.get("uuid")
.and_then(serde_json::Value::as_str)
.expect("uuid should be present");
uuid::Uuid::parse_str(uuid).expect("uuid should be valid");
assert_eq!(serialized.get("type"), Some(&serde_json::json!("message")));
assert_eq!(
serialized.get("role"),
Some(&serde_json::json!("assistant"))
);
assert_eq!(
serialized.get("content"),
Some(&serde_json::json!([{ "type": "output_text", "text": "hello" }]))
);
assert_eq!(
metadata.get("user_message_type"),
Some(&serde_json::json!("prompt"))
);
assert_ne!(uuid, "msg_123");
Ok(())
}
}