Spaces:
Running
Running
Commit Β·
eeb587f
1
Parent(s): abe172e
Add user-friendly error messages proposition report
Browse files
docs/20250923_USER_FRIENDLY_ERROR_MESSAGES_IMPLEMENTATION_REPORT.md
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# User-Friendly Error Messages Implementation Report
|
| 2 |
+
|
| 3 |
+
**Date:** 2025-01-23
|
| 4 |
+
**Issue:** Silent failure for API errors (e.g., OpenRouter 404) in chat interface
|
| 5 |
+
**Status:** Analysis Complete - Implementation Plan Ready
|
| 6 |
+
|
| 7 |
+
## Executive Summary
|
| 8 |
+
|
| 9 |
+
Currently, when API errors occur (like the OpenRouter 404 error for `openrouter/sonoma-dusk-alpha`), the system logs detailed error information to the terminal but shows only generic error messages or silent failures to users in the chat interface. This creates a poor user experience where users don't understand what went wrong or how to fix it.
|
| 10 |
+
|
| 11 |
+
## Current Error Handling Analysis
|
| 12 |
+
|
| 13 |
+
### 1. Error Flow Architecture
|
| 14 |
+
|
| 15 |
+
```
|
| 16 |
+
User Input β LangChain Agent β Native Streaming β Error Handler β Chat Display
|
| 17 |
+
β β β β β
|
| 18 |
+
Message LLM Instance StreamingEvent ErrorInfo Generic Error
|
| 19 |
+
```
|
| 20 |
+
|
| 21 |
+
### 2. Current Error Handling Points
|
| 22 |
+
|
| 23 |
+
#### A. Streaming Level (`native_langchain_streaming.py`)
|
| 24 |
+
- **Location:** Lines 638-663
|
| 25 |
+
- **Current Behavior:**
|
| 26 |
+
- Logs detailed error to terminal with full traceback
|
| 27 |
+
- Yields generic `StreamingEvent` with `_get_error_message(str(e), language)`
|
| 28 |
+
- Uses basic error template from i18n translations
|
| 29 |
+
|
| 30 |
+
#### B. Error Handler (`error_handler.py`)
|
| 31 |
+
- **Location:** Lines 741-787
|
| 32 |
+
- **Current Behavior:**
|
| 33 |
+
- Comprehensive error classification system exists
|
| 34 |
+
- Supports OpenRouter-specific error codes (400, 401, 403, 404, etc.)
|
| 35 |
+
- Provides structured `ErrorInfo` with descriptions and suggested actions
|
| 36 |
+
- **Issue:** Not integrated with streaming system
|
| 37 |
+
|
| 38 |
+
#### C. Chat Interface (`chat_tab.py`)
|
| 39 |
+
- **Current Behavior:**
|
| 40 |
+
- Receives streaming events and displays them
|
| 41 |
+
- No specific error message processing
|
| 42 |
+
- Generic error display
|
| 43 |
+
|
| 44 |
+
### 3. Current Error Message System
|
| 45 |
+
|
| 46 |
+
#### A. I18n Translations (`i18n_translations.py`)
|
| 47 |
+
- **Current Error Templates:**
|
| 48 |
+
```python
|
| 49 |
+
"error": "β **Error: {error}**",
|
| 50 |
+
"tool_error": "β **Tool Error: {error}**",
|
| 51 |
+
"unknown_tool": "β **Unknown Tool: {tool_name}**"
|
| 52 |
+
```
|
| 53 |
+
|
| 54 |
+
#### B. Streaming Error Messages (`native_langchain_streaming.py`)
|
| 55 |
+
- **Current Implementation:**
|
| 56 |
+
```python
|
| 57 |
+
def _get_error_message(self, error: str, language: str = "en") -> str:
|
| 58 |
+
template = get_translation_key("error", language)
|
| 59 |
+
return template.format(error=error)
|
| 60 |
+
```
|
| 61 |
+
|
| 62 |
+
## Problem Analysis
|
| 63 |
+
|
| 64 |
+
### 1. Root Cause
|
| 65 |
+
The error handling system has two disconnected components:
|
| 66 |
+
- **Comprehensive Error Handler:** Classifies errors and provides detailed information
|
| 67 |
+
- **Streaming System:** Uses basic error templates without leveraging error classification
|
| 68 |
+
|
| 69 |
+
### 2. Specific Issues
|
| 70 |
+
|
| 71 |
+
#### A. OpenRouter 404 Error
|
| 72 |
+
- **Raw Error:** `Error code: 404 - {'error': {'message': 'No endpoints found for openrouter/sonoma-dusk-alpha.', 'code': 404}`
|
| 73 |
+
- **Current User Message:** `β **Error: Error code: 404 - {'error': {'message': 'No endpoints found for openrouter/sonoma-dusk-alpha.', 'code': 404}`
|
| 74 |
+
- **Should Be:** User-friendly message explaining the model is not available and suggesting alternatives
|
| 75 |
+
|
| 76 |
+
#### B. Silent Failures
|
| 77 |
+
- Some errors result in no user feedback
|
| 78 |
+
- Users don't know if the system is working or broken
|
| 79 |
+
- No guidance on how to resolve issues
|
| 80 |
+
|
| 81 |
+
## Proposed Solution
|
| 82 |
+
|
| 83 |
+
### 1. Enhanced Error Message Registry
|
| 84 |
+
|
| 85 |
+
#### A. Create User-Friendly Error Message Registry
|
| 86 |
+
```python
|
| 87 |
+
# agent_ng/user_friendly_errors.py
|
| 88 |
+
class UserFriendlyErrorRegistry:
|
| 89 |
+
"""Registry for user-friendly error messages"""
|
| 90 |
+
|
| 91 |
+
ERROR_MESSAGES = {
|
| 92 |
+
# OpenRouter Errors
|
| 93 |
+
"openrouter_404": {
|
| 94 |
+
"en": {
|
| 95 |
+
"title": "π« Model Not Available",
|
| 96 |
+
"message": "The selected model '{model}' is not available on OpenRouter.",
|
| 97 |
+
"suggestion": "Please try a different model or check the OpenRouter documentation for available models.",
|
| 98 |
+
"action": "Switch to a different model"
|
| 99 |
+
},
|
| 100 |
+
"ru": {
|
| 101 |
+
"title": "π« ΠΠΎΠ΄Π΅Π»Ρ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π°",
|
| 102 |
+
"message": "ΠΡΠ±ΡΠ°Π½Π½Π°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ '{model}' Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π° Π² OpenRouter.",
|
| 103 |
+
"suggestion": "ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π΄ΡΡΠ³ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ OpenRouter Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ.",
|
| 104 |
+
"action": "ΠΠ΅ΡΠ΅ΠΊΠ»ΡΡΠΈΡΡΡΡ Π½Π° Π΄ΡΡΠ³ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ"
|
| 105 |
+
}
|
| 106 |
+
},
|
| 107 |
+
"openrouter_401": {
|
| 108 |
+
"en": {
|
| 109 |
+
"title": "π Authentication Error",
|
| 110 |
+
"message": "Invalid OpenRouter API key.",
|
| 111 |
+
"suggestion": "Please check your API key configuration in the settings.",
|
| 112 |
+
"action": "Check API key settings"
|
| 113 |
+
}
|
| 114 |
+
},
|
| 115 |
+
# Add more error types...
|
| 116 |
+
}
|
| 117 |
+
```
|
| 118 |
+
|
| 119 |
+
#### B. Enhanced Error Classification Integration
|
| 120 |
+
```python
|
| 121 |
+
# agent_ng/enhanced_error_handler.py
|
| 122 |
+
class EnhancedErrorHandler:
|
| 123 |
+
"""Enhanced error handler with user-friendly messages"""
|
| 124 |
+
|
| 125 |
+
def __init__(self):
|
| 126 |
+
self.error_handler = get_error_handler()
|
| 127 |
+
self.user_friendly_registry = UserFriendlyErrorRegistry()
|
| 128 |
+
|
| 129 |
+
def get_user_friendly_error(self, error: Exception, language: str = "en") -> Dict[str, str]:
|
| 130 |
+
"""Get user-friendly error message for display"""
|
| 131 |
+
# Classify error using existing error handler
|
| 132 |
+
error_info = self.error_handler.classify_error(error)
|
| 133 |
+
|
| 134 |
+
if error_info:
|
| 135 |
+
# Map to user-friendly message
|
| 136 |
+
return self._map_to_user_friendly(error_info, language)
|
| 137 |
+
else:
|
| 138 |
+
# Fallback to generic error
|
| 139 |
+
return self._get_generic_error(str(error), language)
|
| 140 |
+
```
|
| 141 |
+
|
| 142 |
+
### 2. Streaming System Integration
|
| 143 |
+
|
| 144 |
+
#### A. Enhanced Streaming Error Handling
|
| 145 |
+
```python
|
| 146 |
+
# agent_ng/native_langchain_streaming.py
|
| 147 |
+
def _get_user_friendly_error_message(self, error: Exception, language: str = "en") -> str:
|
| 148 |
+
"""Get user-friendly error message for streaming"""
|
| 149 |
+
from .enhanced_error_handler import get_enhanced_error_handler
|
| 150 |
+
|
| 151 |
+
enhanced_handler = get_enhanced_error_handler()
|
| 152 |
+
error_data = enhanced_handler.get_user_friendly_error(error, language)
|
| 153 |
+
|
| 154 |
+
# Format as rich markdown message
|
| 155 |
+
return f"""
|
| 156 |
+
## {error_data['title']}
|
| 157 |
+
|
| 158 |
+
{error_data['message']}
|
| 159 |
+
|
| 160 |
+
**π‘ Suggestion:** {error_data['suggestion']}
|
| 161 |
+
|
| 162 |
+
**π§ Action:** {error_data['action']}
|
| 163 |
+
"""
|
| 164 |
+
```
|
| 165 |
+
|
| 166 |
+
#### B. Provider-Specific Error Detection
|
| 167 |
+
```python
|
| 168 |
+
def _detect_provider_from_error(self, error: str) -> str:
|
| 169 |
+
"""Detect provider from error message"""
|
| 170 |
+
error_lower = error.lower()
|
| 171 |
+
|
| 172 |
+
if 'openrouter' in error_lower:
|
| 173 |
+
return 'openrouter'
|
| 174 |
+
elif 'mistral' in error_lower:
|
| 175 |
+
return 'mistral'
|
| 176 |
+
elif 'groq' in error_lower:
|
| 177 |
+
return 'groq'
|
| 178 |
+
# Add more providers...
|
| 179 |
+
|
| 180 |
+
return 'unknown'
|
| 181 |
+
```
|
| 182 |
+
|
| 183 |
+
### 3. Error Message Categories
|
| 184 |
+
|
| 185 |
+
#### A. API Errors
|
| 186 |
+
- **404 Not Found:** Model not available
|
| 187 |
+
- **401 Unauthorized:** Invalid API key
|
| 188 |
+
- **403 Forbidden:** Insufficient permissions
|
| 189 |
+
- **429 Rate Limited:** Too many requests
|
| 190 |
+
- **500 Internal Server Error:** Provider issues
|
| 191 |
+
|
| 192 |
+
#### B. Configuration Errors
|
| 193 |
+
- **Missing API Key:** No API key configured
|
| 194 |
+
- **Invalid Model:** Model not supported
|
| 195 |
+
- **Network Issues:** Connection problems
|
| 196 |
+
|
| 197 |
+
#### C. System Errors
|
| 198 |
+
- **Memory Issues:** Context too long
|
| 199 |
+
- **Tool Errors:** Tool execution failures
|
| 200 |
+
- **Streaming Errors:** Real-time processing issues
|
| 201 |
+
|
| 202 |
+
### 4. Implementation Plan
|
| 203 |
+
|
| 204 |
+
#### Phase 1: Core Infrastructure
|
| 205 |
+
1. **Create User-Friendly Error Registry**
|
| 206 |
+
- Define error message templates
|
| 207 |
+
- Support multiple languages (EN/RU)
|
| 208 |
+
- Include actionable suggestions
|
| 209 |
+
|
| 210 |
+
2. **Enhanced Error Handler**
|
| 211 |
+
- Integrate with existing error classification
|
| 212 |
+
- Map technical errors to user-friendly messages
|
| 213 |
+
- Extract context (model, provider, etc.)
|
| 214 |
+
|
| 215 |
+
#### Phase 2: Streaming Integration
|
| 216 |
+
1. **Update Native Streaming**
|
| 217 |
+
- Replace generic error messages
|
| 218 |
+
- Use enhanced error handler
|
| 219 |
+
- Maintain backward compatibility
|
| 220 |
+
|
| 221 |
+
2. **Error Context Extraction**
|
| 222 |
+
- Parse error messages for specific details
|
| 223 |
+
- Extract model names, error codes, etc.
|
| 224 |
+
- Provide contextual suggestions
|
| 225 |
+
|
| 226 |
+
#### Phase 3: UI Enhancement
|
| 227 |
+
1. **Rich Error Display**
|
| 228 |
+
- Markdown formatting for better readability
|
| 229 |
+
- Icons and visual indicators
|
| 230 |
+
- Collapsible error details
|
| 231 |
+
|
| 232 |
+
2. **Actionable Suggestions**
|
| 233 |
+
- Quick action buttons
|
| 234 |
+
- Model switching suggestions
|
| 235 |
+
- Configuration guidance
|
| 236 |
+
|
| 237 |
+
### 5. Error Message Examples
|
| 238 |
+
|
| 239 |
+
#### A. OpenRouter 404 Error
|
| 240 |
+
**Current:**
|
| 241 |
+
```
|
| 242 |
+
β **Error: Error code: 404 - {'error': {'message': 'No endpoints found for openrouter/sonoma-dusk-alpha.', 'code': 404}
|
| 243 |
+
```
|
| 244 |
+
|
| 245 |
+
**Proposed:**
|
| 246 |
+
```
|
| 247 |
+
## π« Model Not Available
|
| 248 |
+
|
| 249 |
+
The selected model 'sonoma-dusk-alpha' is not available on OpenRouter.
|
| 250 |
+
|
| 251 |
+
**π‘ Suggestion:** Please try a different model or check the OpenRouter documentation for available models.
|
| 252 |
+
|
| 253 |
+
**π§ Action:** Switch to a different model
|
| 254 |
+
|
| 255 |
+
<details>
|
| 256 |
+
<summary>Technical Details</summary>
|
| 257 |
+
|
| 258 |
+
- Provider: OpenRouter
|
| 259 |
+
- Error Code: 404
|
| 260 |
+
- Model: sonoma-dusk-alpha
|
| 261 |
+
- Timestamp: 2025-01-23 10:30:45
|
| 262 |
+
|
| 263 |
+
</details>
|
| 264 |
+
```
|
| 265 |
+
|
| 266 |
+
#### B. API Key Error
|
| 267 |
+
**Current:**
|
| 268 |
+
```
|
| 269 |
+
β **Error: 401 Unauthorized**
|
| 270 |
+
```
|
| 271 |
+
|
| 272 |
+
**Proposed:**
|
| 273 |
+
```
|
| 274 |
+
## π Authentication Error
|
| 275 |
+
|
| 276 |
+
Invalid OpenRouter API key detected.
|
| 277 |
+
|
| 278 |
+
**π‘ Suggestion:** Please check your API key configuration in the settings.
|
| 279 |
+
|
| 280 |
+
**π§ Action:** Check API key settings
|
| 281 |
+
|
| 282 |
+
<details>
|
| 283 |
+
<summary>Technical Details</summary>
|
| 284 |
+
|
| 285 |
+
- Provider: OpenRouter
|
| 286 |
+
- Error Code: 401
|
| 287 |
+
- Issue: Invalid API key
|
| 288 |
+
- Timestamp: 2025-01-23 10:30:45
|
| 289 |
+
|
| 290 |
+
</details>
|
| 291 |
+
```
|
| 292 |
+
|
| 293 |
+
### 6. Benefits
|
| 294 |
+
|
| 295 |
+
#### A. User Experience
|
| 296 |
+
- **Clear Communication:** Users understand what went wrong
|
| 297 |
+
- **Actionable Guidance:** Specific steps to resolve issues
|
| 298 |
+
- **Reduced Frustration:** No more silent failures or cryptic errors
|
| 299 |
+
|
| 300 |
+
#### B. Developer Experience
|
| 301 |
+
- **Centralized Error Management:** All error messages in one place
|
| 302 |
+
- **Easy Maintenance:** Simple to add new error types
|
| 303 |
+
- **Consistent Formatting:** Standardized error display
|
| 304 |
+
|
| 305 |
+
#### C. System Reliability
|
| 306 |
+
- **Better Error Tracking:** Detailed error context
|
| 307 |
+
- **Improved Debugging:** Rich error information
|
| 308 |
+
- **Graceful Degradation:** System continues working despite errors
|
| 309 |
+
|
| 310 |
+
## Implementation Files
|
| 311 |
+
|
| 312 |
+
### New Files
|
| 313 |
+
1. `agent_ng/user_friendly_errors.py` - Error message registry
|
| 314 |
+
2. `agent_ng/enhanced_error_handler.py` - Enhanced error handling
|
| 315 |
+
3. `agent_ng/error_message_formatter.py` - Message formatting utilities
|
| 316 |
+
|
| 317 |
+
### Modified Files
|
| 318 |
+
1. `agent_ng/native_langchain_streaming.py` - Integrate enhanced error handling
|
| 319 |
+
2. `agent_ng/i18n_translations.py` - Add error message translations
|
| 320 |
+
3. `agent_ng/tabs/chat_tab.py` - Enhanced error display (if needed)
|
| 321 |
+
|
| 322 |
+
## Testing Strategy
|
| 323 |
+
|
| 324 |
+
### 1. Unit Tests
|
| 325 |
+
- Test error message generation
|
| 326 |
+
- Test error classification mapping
|
| 327 |
+
- Test language support
|
| 328 |
+
|
| 329 |
+
### 2. Integration Tests
|
| 330 |
+
- Test streaming error handling
|
| 331 |
+
- Test UI error display
|
| 332 |
+
- Test error context extraction
|
| 333 |
+
|
| 334 |
+
### 3. User Acceptance Tests
|
| 335 |
+
- Test user-friendly error messages
|
| 336 |
+
- Test actionable suggestions
|
| 337 |
+
- Test error recovery flows
|
| 338 |
+
|
| 339 |
+
## Conclusion
|
| 340 |
+
|
| 341 |
+
The implementation of user-friendly error messages will significantly improve the user experience by providing clear, actionable error information instead of technical error codes. The proposed solution leverages the existing error handling infrastructure while adding a user-friendly layer that makes errors understandable and actionable.
|
| 342 |
+
|
| 343 |
+
The phased implementation approach ensures minimal disruption to existing functionality while providing immediate benefits to users experiencing API errors like the OpenRouter 404 issue.
|