fix(providers): include required annotations field on replayed output_text items (#11263)

Co-authored-by: Lifei Zhou <lifei@squareup.com>
This commit is contained in:
jonathan MERCIER
2026-08-17 04:54:33 +00:00
committed by GitHub
parent 3810898a74
commit 9915ba7eb7
@@ -405,15 +405,19 @@ fn add_message_items(input_items: &mut Vec<Value>, messages: &[Message]) {
for content in &message.content {
match content {
MessageContentBlock::Text(text) if !text.text.is_empty() => {
let content_type = if message.role == Role::Assistant {
"output_text"
if message.role == Role::Assistant {
// Responses output_text items require annotations even when empty.
text_items.push(json!({
"type": "output_text",
"text": text.text,
"annotations": []
}));
} else {
"input_text"
};
text_items.push(json!({
"type": content_type,
"text": text.text
}));
text_items.push(json!({
"type": "input_text",
"text": text.text
}));
}
}
MessageContentBlock::ToolRequest(request) if message.role == Role::Assistant => {
if !text_items.is_empty() {
@@ -2329,7 +2333,7 @@ mod tests {
}
#[test]
fn test_assistant_text_uses_output_text_type() {
fn test_assistant_text_uses_output_text_with_annotations() {
use crate::conversation::message::Message;
let messages = vec![Message::assistant().with_text("hello")];
@@ -2352,6 +2356,7 @@ mod tests {
assert_eq!(input[0]["role"], "assistant");
assert_eq!(input[0]["content"][0]["type"], "output_text");
assert_eq!(input[0]["content"][0]["text"], "hello");
assert_eq!(input[0]["content"][0]["annotations"], serde_json::json!([]));
}
#[test]