Spaces:
Running
A newer version of the Gradio SDK is available:
6.0.2
Fix Summary: Research Results Not Returned to User
Problem
The application was returning "Research completed" instead of the actual research report content to users. Reports were being generated and saved to files, but the final result wasn't being properly extracted and returned to the Gradio interface.
Root Causes
Incomplete Result Extraction: The
_execute_graphmethod ingraph_orchestrator.pyonly checked the last executed node (current_node_id) for the final result. If the graph execution broke early due to budget/time limits, or if the last node wasn't the synthesizer/writer exit node, the result wouldn't be found.Incomplete Dict Handling: When the synthesizer or writer nodes returned a dict with
{"message": final_report, "file": file_path}, the code only extracted the message if the dict had a "file" key. If the dict had a "message" key but no "file" key, the message wouldn't be extracted.No Fallback Logic: There was no fallback to check all exit nodes for results if the current node wasn't an exit node.
Solution
Changes Made to src/orchestrator/graph_orchestrator.py
Enhanced Result Extraction (lines 555-600):
- First checks if
current_node_idis an exit node and gets its result - If no result, prioritizes checking "synthesizer" and "writer" exit nodes
- Falls back to checking all exit nodes if still no result
- Added comprehensive logging to help debug result extraction
- First checks if
Improved Dict Handling (lines 602-640):
- Now checks for "message" key first (most important)
- Extracts message from dict even if "file" key is missing
- Only uses default messages if "message" key is not present
- Added logging for result type and extraction process
Better Error Handling:
- Logs warnings when no result is found, including all available node results
- Logs unexpected result types for debugging
Key Code Changes
Before:
final_result = context.get_node_result(current_node_id) if current_node_id else None
message: str = "Research completed"
if isinstance(final_result, str):
message = final_result
elif isinstance(final_result, dict):
if "file" in final_result:
# Only extracts message if file exists
message = final_result.get("message", "Report generated. Download available.")
After:
# Check all exit nodes with priority
final_result = None
if current_node_id and current_node_id in self._graph.exit_nodes:
final_result = context.get_node_result(current_node_id)
if not final_result:
# Prioritize synthesizer/writer nodes
for exit_node_id in ["synthesizer", "writer"]:
if exit_node_id in self._graph.exit_nodes:
result = context.get_node_result(exit_node_id)
if result:
final_result = result
break
# Extract message from dict first
if isinstance(final_result, dict):
if "message" in final_result:
message = final_result["message"] # Extract message regardless of file
Testing Recommendations
Test Deep Research Flow:
- Run a query that triggers deep research mode
- Verify the full report is returned, not just "Research completed"
- Check that reports are properly displayed in the UI
Test Iterative Research Flow:
- Run a query that triggers iterative research mode
- Verify the report is returned correctly
Test Budget/Time Limits:
- Run queries that exceed budget or time limits
- Verify that partial results are still returned if available
Test File Saving:
- Verify reports are saved to files
- Verify file paths are included in event data when available
Files Modified
src/orchestrator/graph_orchestrator.py: Enhanced result extraction and message handling logic
Expected Behavior After Fix
- Users will see the full research report content in the chat interface
- Reports will be properly extracted from synthesizer/writer nodes
- File paths will be included in event data when reports are saved
- Better logging will help debug any future issues with result extraction