From e440f45b16a7cc125d21d26bf3a548b8ec774e69 Mon Sep 17 00:00:00 2001 From: Jack Amadeo Date: Tue, 2 Jun 2026 23:01:04 -0400 Subject: [PATCH] refactor: move provider image payload conversion Signed-off-by: Jack Amadeo --- crates/goose-providers/src/image.rs | 48 +++++++++++++++++++++++++++++ crates/goose/src/providers/utils.rs | 19 ++---------- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/crates/goose-providers/src/image.rs b/crates/goose-providers/src/image.rs index 880ec3a9f7b6..8c2e2df18c75 100644 --- a/crates/goose-providers/src/image.rs +++ b/crates/goose-providers/src/image.rs @@ -1,4 +1,5 @@ use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; #[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] pub enum ImageFormat { @@ -6,6 +7,25 @@ pub enum ImageFormat { Anthropic, } +pub fn convert_image(data: &str, mime_type: &str, image_format: &ImageFormat) -> Value { + match image_format { + ImageFormat::OpenAi => json!({ + "type": "image_url", + "image_url": { + "url": format!("data:{};base64,{}", mime_type, data) + } + }), + ImageFormat::Anthropic => json!({ + "type": "image", + "source": { + "type": "base64", + "media_type": mime_type, + "data": data, + } + }), + } +} + #[cfg(test)] mod tests { use super::*; @@ -17,4 +37,32 @@ mod tests { let decoded: ImageFormat = serde_json::from_str(&encoded).unwrap(); assert_eq!(decoded, ImageFormat::OpenAi); } + + #[test] + fn converts_image_to_openai_payload() { + assert_eq!( + convert_image("abc123", "image/png", &ImageFormat::OpenAi), + serde_json::json!({ + "type": "image_url", + "image_url": { + "url": "data:image/png;base64,abc123" + } + }) + ); + } + + #[test] + fn converts_image_to_anthropic_payload() { + assert_eq!( + convert_image("abc123", "image/png", &ImageFormat::Anthropic), + serde_json::json!({ + "type": "image", + "source": { + "type": "base64", + "media_type": "image/png", + "data": "abc123", + } + }) + ); + } } diff --git a/crates/goose/src/providers/utils.rs b/crates/goose/src/providers/utils.rs index e52993febb16..568690639d9f 100644 --- a/crates/goose/src/providers/utils.rs +++ b/crates/goose/src/providers/utils.rs @@ -16,28 +16,13 @@ pub use goose_types::{ }; use rmcp::model::{AnnotateAble, ImageContent, RawImageContent}; use serde::Serialize; -use serde_json::{json, Value}; +use serde_json::Value; use std::io::Read; use std::path::Path; /// Convert an image content into an image json based on format pub fn convert_image(image: &ImageContent, image_format: &ImageFormat) -> Value { - match image_format { - ImageFormat::OpenAi => json!({ - "type": "image_url", - "image_url": { - "url": format!("data:{};base64,{}", image.mime_type, image.data) - } - }), - ImageFormat::Anthropic => json!({ - "type": "image", - "source": { - "type": "base64", - "media_type": image.mime_type, - "data": image.data, - } - }), - } + goose_providers::image::convert_image(&image.data, &image.mime_type, image_format) } /// Check if a file is actually an image by examining its magic bytes