Spaces:
Running
Running
Pulastya B commited on
Commit Β·
a0e15f1
1
Parent(s): 8154116
Fix infinite thinking when no file uploaded - properly handle analysis_failed SSE event
Browse files- FRRONTEEEND/components/ChatInterface.tsx +16 -0
- src/api/app.py +44 -19
FRRONTEEEND/components/ChatInterface.tsx
CHANGED
|
@@ -224,6 +224,22 @@ export const ChatInterface: React.FC<{ onBack: () => void }> = ({ onBack }) => {
|
|
| 224 |
} else if (data.type === 'token_update') {
|
| 225 |
// Optional: Display token budget updates
|
| 226 |
console.log('π° Token update:', data.message);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 227 |
} else if (data.type === 'analysis_complete') {
|
| 228 |
console.log('β
Analysis completed', data.result);
|
| 229 |
setIsTyping(false);
|
|
|
|
| 224 |
} else if (data.type === 'token_update') {
|
| 225 |
// Optional: Display token budget updates
|
| 226 |
console.log('π° Token update:', data.message);
|
| 227 |
+
} else if (data.type === 'analysis_failed') {
|
| 228 |
+
console.log('β Analysis failed', data);
|
| 229 |
+
setIsTyping(false);
|
| 230 |
+
|
| 231 |
+
// Show error message to user
|
| 232 |
+
setMessages((prev) => [
|
| 233 |
+
...prev,
|
| 234 |
+
{
|
| 235 |
+
id: Date.now().toString(),
|
| 236 |
+
role: 'assistant',
|
| 237 |
+
content: data.message || data.error || 'β Analysis failed',
|
| 238 |
+
session_id: activeSessionId,
|
| 239 |
+
},
|
| 240 |
+
]);
|
| 241 |
+
|
| 242 |
+
setCurrentStep('');
|
| 243 |
} else if (data.type === 'analysis_complete') {
|
| 244 |
console.log('β
Analysis completed', data.result);
|
| 245 |
setIsTyping(false);
|
src/api/app.py
CHANGED
|
@@ -474,13 +474,22 @@ def run_analysis_background(file_path: str, task_description: str, target_col: O
|
|
| 474 |
|
| 475 |
logger.info(f"[BACKGROUND] Analysis completed for session {session_id[:8]}...")
|
| 476 |
|
| 477 |
-
# Send completion event
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 484 |
|
| 485 |
except Exception as e:
|
| 486 |
logger.error(f"[BACKGROUND] Analysis failed for session {session_id[:8]}...: {e}")
|
|
@@ -667,12 +676,20 @@ async def run_analysis(
|
|
| 667 |
|
| 668 |
logger.info(f"Follow-up analysis completed: {result.get('status')}")
|
| 669 |
|
| 670 |
-
# Send completion event
|
| 671 |
-
|
| 672 |
-
|
| 673 |
-
|
| 674 |
-
|
| 675 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 676 |
|
| 677 |
# Make result JSON serializable
|
| 678 |
def make_json_serializable(obj):
|
|
@@ -760,12 +777,20 @@ async def run_analysis(
|
|
| 760 |
|
| 761 |
logger.info(f"Analysis completed: {result.get('status')}")
|
| 762 |
|
| 763 |
-
# Send completion event
|
| 764 |
-
|
| 765 |
-
|
| 766 |
-
|
| 767 |
-
|
| 768 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 769 |
|
| 770 |
# Filter out non-JSON-serializable objects (like matplotlib/plotly Figures)
|
| 771 |
def make_json_serializable(obj):
|
|
|
|
| 474 |
|
| 475 |
logger.info(f"[BACKGROUND] Analysis completed for session {session_id[:8]}...")
|
| 476 |
|
| 477 |
+
# Send appropriate completion event based on status
|
| 478 |
+
if result.get("status") == "error":
|
| 479 |
+
progress_manager.emit(session_id, {
|
| 480 |
+
"type": "analysis_failed",
|
| 481 |
+
"status": "error",
|
| 482 |
+
"message": result.get("summary", "β Analysis failed"),
|
| 483 |
+
"error": result.get("error", "Analysis error"),
|
| 484 |
+
"result": result
|
| 485 |
+
})
|
| 486 |
+
else:
|
| 487 |
+
progress_manager.emit(session_id, {
|
| 488 |
+
"type": "analysis_complete",
|
| 489 |
+
"status": result.get("status"),
|
| 490 |
+
"message": "β
Analysis completed successfully!",
|
| 491 |
+
"result": result
|
| 492 |
+
})
|
| 493 |
|
| 494 |
except Exception as e:
|
| 495 |
logger.error(f"[BACKGROUND] Analysis failed for session {session_id[:8]}...: {e}")
|
|
|
|
| 676 |
|
| 677 |
logger.info(f"Follow-up analysis completed: {result.get('status')}")
|
| 678 |
|
| 679 |
+
# Send appropriate completion event based on status
|
| 680 |
+
if result.get("status") == "error":
|
| 681 |
+
progress_manager.emit(actual_session_id, {
|
| 682 |
+
"type": "analysis_failed",
|
| 683 |
+
"status": "error",
|
| 684 |
+
"message": result.get("summary", "β Analysis failed"),
|
| 685 |
+
"error": result.get("error", "No dataset available")
|
| 686 |
+
})
|
| 687 |
+
else:
|
| 688 |
+
progress_manager.emit(actual_session_id, {
|
| 689 |
+
"type": "analysis_complete",
|
| 690 |
+
"status": result.get("status"),
|
| 691 |
+
"message": "β
Analysis completed successfully!"
|
| 692 |
+
})
|
| 693 |
|
| 694 |
# Make result JSON serializable
|
| 695 |
def make_json_serializable(obj):
|
|
|
|
| 777 |
|
| 778 |
logger.info(f"Analysis completed: {result.get('status')}")
|
| 779 |
|
| 780 |
+
# Send appropriate completion event based on status
|
| 781 |
+
if result.get("status") == "error":
|
| 782 |
+
progress_manager.emit(actual_session_id, {
|
| 783 |
+
"type": "analysis_failed",
|
| 784 |
+
"status": "error",
|
| 785 |
+
"message": result.get("summary", "β Analysis failed"),
|
| 786 |
+
"error": result.get("error", "Analysis error")
|
| 787 |
+
})
|
| 788 |
+
else:
|
| 789 |
+
progress_manager.emit(actual_session_id, {
|
| 790 |
+
"type": "analysis_complete",
|
| 791 |
+
"status": result.get("status"),
|
| 792 |
+
"message": "β
Analysis completed successfully!"
|
| 793 |
+
})
|
| 794 |
|
| 795 |
# Filter out non-JSON-serializable objects (like matplotlib/plotly Figures)
|
| 796 |
def make_json_serializable(obj):
|