open_ai: Support structured OpenAI tool output content (#51832)

Allow function call outputs to carry either plain text or a list
of input content items, so image tool results are serialized as
image content instead of a raw base64 string.

Release Notes:

- N/A
This commit is contained in:
Ben Brandt authored and GitHub committed 2026-03-18 12:06:54 +00:00
1 parent eba7cea22a
commit be3a5e2c06
2 files changed
+20 -5

No files matched your search

+12 -4
View File
@@ -14,8 +14,8 @@ use language_model::{
};
use menu;
use open_ai::responses::{
ResponseFunctionCallItem, ResponseFunctionCallOutputItem, ResponseInputContent,
ResponseInputItem, ResponseMessageItem,
ResponseFunctionCallItem, ResponseFunctionCallOutputContent, ResponseFunctionCallOutputItem,
ResponseInputContent, ResponseInputItem, ResponseMessageItem,
};
use open_ai::{
ImageUrl, Model, OPEN_AI_API_URL, ReasoningEffort, ResponseStreamEvent,
@@ -647,8 +647,16 @@ fn append_message_to_response_items(
ResponseFunctionCallOutputItem {
call_id: tool_result.tool_use_id.to_string(),
output: match tool_result.content {
LanguageModelToolResultContent::Text(text) => text.to_string(),
LanguageModelToolResultContent::Image(image) => image.to_base64_url(),
LanguageModelToolResultContent::Text(text) => {
ResponseFunctionCallOutputContent::Text(text.to_string())
}
LanguageModelToolResultContent::Image(image) => {
ResponseFunctionCallOutputContent::List(vec![
ResponseInputContent::Image {
image_url: image.to_base64_url(),
},
])
}
},
},
));
+8 -1
View File
@@ -55,7 +55,14 @@ pub struct ResponseFunctionCallItem {
#[derive(Debug, Serialize, Deserialize)]
pub struct ResponseFunctionCallOutputItem {
pub call_id: String,
pub output: String,
pub output: ResponseFunctionCallOutputContent,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ResponseFunctionCallOutputContent {
List(Vec<ResponseInputContent>),
Text(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]