From 3dd197b24c611f459119df2545dbe15ea4c85bc2 Mon Sep 17 00:00:00 2001 From: Rabi Mishra Date: Thu, 19 Feb 2026 11:08:38 +0530 Subject: [PATCH] fix: skip whitespace-only text blocks in Anthropic message (#7343) Signed-off-by: rabi --- .../goose/src/providers/formats/anthropic.rs | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/crates/goose/src/providers/formats/anthropic.rs b/crates/goose/src/providers/formats/anthropic.rs index f47a387aa8..9f7ab78984 100644 --- a/crates/goose/src/providers/formats/anthropic.rs +++ b/crates/goose/src/providers/formats/anthropic.rs @@ -44,10 +44,12 @@ pub fn format_messages(messages: &[Message]) -> Vec { for msg_content in &message.content { match msg_content { MessageContent::Text(text) => { - content.push(json!({ - TYPE_FIELD: TEXT_TYPE, - TEXT_TYPE: text.text - })); + if !text.text.trim().is_empty() { + content.push(json!({ + TYPE_FIELD: TEXT_TYPE, + TEXT_TYPE: text.text + })); + } } MessageContent::ToolRequest(tool_request) => { match &tool_request.tool_call { @@ -1005,4 +1007,37 @@ mod tests { ); assert_eq!(spec[1]["content"][0]["is_error"], true); } + + #[test] + fn test_whitespace_only_text_blocks_are_skipped() { + let messages = vec![ + Message::user().with_text("Hello"), + Message::assistant().with_text("").with_tool_request( + "tool_1", + Ok(CallToolRequestParams { + meta: None, + task: None, + name: "search".into(), + arguments: Some(object!({"query": "test"})), + }), + ), + Message::user().with_tool_response( + "tool_1", + Ok(rmcp::model::CallToolResult { + content: vec![], + structured_content: None, + is_error: Some(false), + meta: None, + }), + ), + ]; + + let spec = format_messages(&messages); + + assert_eq!(spec.len(), 3); + + let assistant_content = spec[1]["content"].as_array().unwrap(); + assert_eq!(assistant_content.len(), 1); + assert_eq!(assistant_content[0]["type"], "tool_use"); + } }