From 9e161bb3957dcb2cad62753c3dd272d2cac3cec2 Mon Sep 17 00:00:00 2001 From: Michael Ansel Date: Fri, 14 Nov 2025 16:07:31 +0000 Subject: [PATCH] fix: add fallback for empty response content Subprocess execution sometimes succeeds but result.get("result") returns empty string, causing "Message text is empty" errors. Response content exists in assistant message stream. Changes: - Collect all assistant text messages during parsing - Use last assistant text as fallback when result is empty - Add debug logging for fallback usage Fixes "Message text is empty" error when subprocess completes successfully but result field is empty. --- src/claude/integration.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/claude/integration.py b/src/claude/integration.py index ed857f7..5cb1838 100644 --- a/src/claude/integration.py +++ b/src/claude/integration.py @@ -520,6 +520,8 @@ def _parse_result(self, result: Dict, messages: List[Dict]) -> ClaudeResponse: """Parse final result message.""" # Extract tools used from messages tools_used = [] + assistant_texts = [] # Collect all assistant text responses + for msg in messages: if msg.get("type") == "assistant": message = msg.get("message", {}) @@ -531,9 +533,25 @@ def _parse_result(self, result: Dict, messages: List[Dict]) -> ClaudeResponse: "timestamp": msg.get("timestamp"), } ) + elif block.get("type") == "text": + # Collect text from assistant messages + text = block.get("text", "").strip() + if text: + assistant_texts.append(text) + + # Get content from result, or fallback to collected assistant texts + content = result.get("result", "") + if not content and assistant_texts: + # Fallback: use the last assistant text message + content = assistant_texts[-1] + logger.debug( + "Using fallback content from assistant messages", + num_texts=len(assistant_texts), + content_length=len(content) + ) return ClaudeResponse( - content=result.get("result", ""), + content=content, session_id=result.get("session_id", ""), cost=result.get("cost_usd", 0.0), duration_ms=result.get("duration_ms", 0),