diff --git a/crates/goose/src/providers/formats/google.rs b/crates/goose/src/providers/formats/google.rs index eeef7f9253d0..feacb20165c4 100644 --- a/crates/goose/src/providers/formats/google.rs +++ b/crates/goose/src/providers/formats/google.rs @@ -182,6 +182,14 @@ pub fn format_messages(messages: &[Message]) -> Vec { } parts.push(json!(part)); } + MessageContent::Image(image) => { + parts.push(json!({ + "inline_data": { + "mime_type": image.mime_type, + "data": image.data, + } + })); + } _ => {} } @@ -719,6 +727,38 @@ mod tests { assert_eq!(payload[1]["parts"][0]["text"], "World"); } + #[test] + fn test_message_to_google_spec_image_message() { + use rmcp::model::{AnnotateAble, RawImageContent}; + + let image = RawImageContent { + mime_type: "image/png".to_string(), + data: "base64encodeddata".to_string(), + meta: None, + }; + let messages = vec![Message::new( + Role::User, + 0, + vec![ + MessageContent::text("What is in this image?".to_string()), + MessageContent::Image(image.no_annotation()), + ], + )]; + let payload = format_messages(&messages); + + assert_eq!(payload.len(), 1); + assert_eq!(payload[0]["role"], "user"); + assert_eq!(payload[0]["parts"][0]["text"], "What is in this image?"); + assert_eq!( + payload[0]["parts"][1]["inline_data"]["mime_type"], + "image/png" + ); + assert_eq!( + payload[0]["parts"][1]["inline_data"]["data"], + "base64encodeddata" + ); + } + #[test] fn test_message_to_google_spec_tool_request_message() { let arguments = json!({