From ee65a39d68ae1dc817f8f90ff4b30b7352c9e4fd Mon Sep 17 00:00:00 2001 From: asim48-ctrl Date: Fri, 22 May 2026 18:42:37 +0100 Subject: [PATCH] fix: preserve thinking content for provider context (#9314) Signed-off-by: Douwe Osinga Co-authored-by: Douwe Osinga Co-authored-by: Jack Amadeo --- crates/goose/src/conversation/message.rs | 27 +++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/crates/goose/src/conversation/message.rs b/crates/goose/src/conversation/message.rs index 7f1eb5fa65..83ab932119 100644 --- a/crates/goose/src/conversation/message.rs +++ b/crates/goose/src/conversation/message.rs @@ -377,7 +377,13 @@ impl MessageContent { metadata: res.metadata.clone(), })) } - MessageContent::Thinking(_) | MessageContent::RedactedThinking(_) => None, + MessageContent::Thinking(_) | MessageContent::RedactedThinking(_) => { + if audience == Role::Assistant { + Some(self.clone()) + } else { + None + } + } _ => Some(self.clone()), } } @@ -1227,6 +1233,25 @@ mod tests { assert!(thinking.signature.is_empty()); } + #[test] + fn test_agent_visible_content_preserves_thinking_for_provider() { + let message = Message::assistant() + .with_thinking("internal reasoning", "sig") + .with_redacted_thinking("redacted") + .with_text("final answer"); + + let provider_message = message.agent_visible_content(); + assert_eq!(provider_message.content.len(), 3); + assert!(matches!( + provider_message.content[0], + MessageContent::Thinking(_) + )); + assert!(matches!( + provider_message.content[1], + MessageContent::RedactedThinking(_) + )); + } + #[test] fn test_deserialization_drops_invalid_reasoning_blocks() { let json = serde_json::json!({