mirror of
https://github.com/openai/codex.git
synced 2026-05-02 18:37:01 +00:00
add uuid to metadata
This commit is contained in:
@@ -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(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user