Spaces:
Running
Running
| # 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 | |
| 1. **Incomplete Result Extraction**: The `_execute_graph` method in `graph_orchestrator.py` only 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. | |
| 2. **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. | |
| 3. **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` | |
| 1. **Enhanced Result Extraction** (lines 555-600): | |
| - First checks if `current_node_id` is 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 | |
| 2. **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 | |
| 3. **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: | |
| ```python | |
| 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: | |
| ```python | |
| # 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 | |
| 1. **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 | |
| 2. **Test Iterative Research Flow**: | |
| - Run a query that triggers iterative research mode | |
| - Verify the report is returned correctly | |
| 3. **Test Budget/Time Limits**: | |
| - Run queries that exceed budget or time limits | |
| - Verify that partial results are still returned if available | |
| 4. **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 | |