Spaces:
Sleeping
Sleeping
Commit
Β·
102aa44
1
Parent(s):
08a93b9
Add comprehensive WebSocket error handling and message validation
Browse files- Add proper error handling for missing 'type' field in messages
- Validate message format and log detailed debugging information
- Handle connection and knowledge base requests properly
- Add graceful error responses for invalid messages
- This should fix the 'type' and 'text' KeyError messages in logs
enhanced_websocket_handler.py
CHANGED
|
@@ -43,6 +43,13 @@ async def handle_enhanced_websocket_connection(websocket: WebSocket):
|
|
| 43 |
# Get initial connection data
|
| 44 |
initial_data = await websocket.receive_json()
|
| 45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
# Extract user preferences
|
| 47 |
if "preferences" in initial_data:
|
| 48 |
session_data["user_preferences"].update(initial_data["preferences"])
|
|
@@ -88,36 +95,71 @@ async def handle_enhanced_websocket_connection(websocket: WebSocket):
|
|
| 88 |
try:
|
| 89 |
data = await websocket.receive_json()
|
| 90 |
|
| 91 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
await handle_text_message(
|
| 93 |
websocket, data, session_data,
|
| 94 |
use_hybrid, config, knowledge_base, graph
|
| 95 |
)
|
| 96 |
|
| 97 |
-
elif
|
| 98 |
await handle_voice_message(
|
| 99 |
websocket, data, session_data,
|
| 100 |
use_hybrid, config, knowledge_base, graph
|
| 101 |
)
|
| 102 |
|
| 103 |
-
elif
|
| 104 |
await handle_preferences_update(websocket, data, session_data)
|
| 105 |
|
| 106 |
-
elif
|
| 107 |
await websocket.send_json({
|
| 108 |
"type": "voice_status",
|
| 109 |
"data": voice_service.get_voice_status()
|
| 110 |
})
|
| 111 |
|
| 112 |
-
elif
|
| 113 |
await websocket.send_json({
|
| 114 |
"type": "llm_status",
|
| 115 |
"data": hybrid_llm_service.get_provider_info()
|
| 116 |
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
|
| 118 |
except WebSocketDisconnect:
|
| 119 |
logger.info("π WebSocket client disconnected.")
|
| 120 |
break
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
except Exception as e:
|
| 122 |
logger.error(f"β Error handling message: {e}")
|
| 123 |
await websocket.send_json({
|
|
|
|
| 43 |
# Get initial connection data
|
| 44 |
initial_data = await websocket.receive_json()
|
| 45 |
|
| 46 |
+
# Validate initial data
|
| 47 |
+
if not isinstance(initial_data, dict):
|
| 48 |
+
logger.warning(f"β οΈ Invalid initial data format: {type(initial_data)}")
|
| 49 |
+
initial_data = {}
|
| 50 |
+
|
| 51 |
+
logger.info(f"π¨ Initial connection data: {initial_data}")
|
| 52 |
+
|
| 53 |
# Extract user preferences
|
| 54 |
if "preferences" in initial_data:
|
| 55 |
session_data["user_preferences"].update(initial_data["preferences"])
|
|
|
|
| 95 |
try:
|
| 96 |
data = await websocket.receive_json()
|
| 97 |
|
| 98 |
+
# Validate message format
|
| 99 |
+
if not isinstance(data, dict):
|
| 100 |
+
logger.warning(f"β οΈ Invalid message format: {type(data)}")
|
| 101 |
+
continue
|
| 102 |
+
|
| 103 |
+
if "type" not in data:
|
| 104 |
+
logger.warning(f"β οΈ Message missing 'type' field: {data}")
|
| 105 |
+
continue
|
| 106 |
+
|
| 107 |
+
message_type = data["type"]
|
| 108 |
+
logger.debug(f"π¨ Received message type: {message_type}")
|
| 109 |
+
|
| 110 |
+
if message_type == "text_message":
|
| 111 |
await handle_text_message(
|
| 112 |
websocket, data, session_data,
|
| 113 |
use_hybrid, config, knowledge_base, graph
|
| 114 |
)
|
| 115 |
|
| 116 |
+
elif message_type == "voice_message":
|
| 117 |
await handle_voice_message(
|
| 118 |
websocket, data, session_data,
|
| 119 |
use_hybrid, config, knowledge_base, graph
|
| 120 |
)
|
| 121 |
|
| 122 |
+
elif message_type == "preferences_update":
|
| 123 |
await handle_preferences_update(websocket, data, session_data)
|
| 124 |
|
| 125 |
+
elif message_type == "get_voice_status":
|
| 126 |
await websocket.send_json({
|
| 127 |
"type": "voice_status",
|
| 128 |
"data": voice_service.get_voice_status()
|
| 129 |
})
|
| 130 |
|
| 131 |
+
elif message_type == "get_llm_status":
|
| 132 |
await websocket.send_json({
|
| 133 |
"type": "llm_status",
|
| 134 |
"data": hybrid_llm_service.get_provider_info()
|
| 135 |
})
|
| 136 |
+
|
| 137 |
+
elif message_type == "connection":
|
| 138 |
+
# Handle initial connection - already processed above
|
| 139 |
+
logger.debug("π¨ Connection message received (already processed)")
|
| 140 |
+
|
| 141 |
+
elif message_type == "get_knowledge_bases":
|
| 142 |
+
# Handle knowledge base request
|
| 143 |
+
await websocket.send_json({
|
| 144 |
+
"type": "knowledge_bases",
|
| 145 |
+
"knowledge_bases": ["government_docs", "rajasthan_documents"]
|
| 146 |
+
})
|
| 147 |
+
|
| 148 |
+
else:
|
| 149 |
+
logger.warning(f"β οΈ Unknown message type: {message_type}")
|
| 150 |
|
| 151 |
except WebSocketDisconnect:
|
| 152 |
logger.info("π WebSocket client disconnected.")
|
| 153 |
break
|
| 154 |
+
except Exception as e:
|
| 155 |
+
logger.error(f"β Error handling message: {e}")
|
| 156 |
+
try:
|
| 157 |
+
await websocket.send_json({
|
| 158 |
+
"type": "error",
|
| 159 |
+
"message": f"An error occurred: {str(e)}"
|
| 160 |
+
})
|
| 161 |
+
except:
|
| 162 |
+
pass # Connection might be closed
|
| 163 |
except Exception as e:
|
| 164 |
logger.error(f"β Error handling message: {e}")
|
| 165 |
await websocket.send_json({
|