ChAbhishek28 commited on
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

Files changed (1) hide show
  1. enhanced_websocket_handler.py +47 -5
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
- if data["type"] == "text_message":
 
 
 
 
 
 
 
 
 
 
 
 
92
  await handle_text_message(
93
  websocket, data, session_data,
94
  use_hybrid, config, knowledge_base, graph
95
  )
96
 
97
- elif data["type"] == "voice_message":
98
  await handle_voice_message(
99
  websocket, data, session_data,
100
  use_hybrid, config, knowledge_base, graph
101
  )
102
 
103
- elif data["type"] == "preferences_update":
104
  await handle_preferences_update(websocket, data, session_data)
105
 
106
- elif data["type"] == "get_voice_status":
107
  await websocket.send_json({
108
  "type": "voice_status",
109
  "data": voice_service.get_voice_status()
110
  })
111
 
112
- elif data["type"] == "get_llm_status":
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({