@hef2024/llmasaservice-ui 0.19.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,247 @@
1
+ # Changelog: Error Handling for 413 and Network Errors
2
+
3
+ **Date**: December 15, 2025
4
+ **Version**: 0.19.2 (proposed)
5
+
6
+ ## Summary
7
+
8
+ Implemented comprehensive error handling for 413 (Content Too Large) errors and other network failures across all chat components. Previously, these errors resulted in silent failures with the UI stuck in a "thinking" state. Now, users receive clear, actionable feedback with graceful error recovery.
9
+
10
+ ## Changes Made
11
+
12
+ ### 1. AIChatPanel.tsx
13
+
14
+ **Added:**
15
+ - Error state management: `const [error, setError] = useState<{ message: string; code?: string } | null>(null)`
16
+ - Error extraction from useLLM hook: `const llmError = (llmResult as any).error || null`
17
+ - Error monitoring useEffect to detect and categorize errors
18
+ - Error clearing in `continueChat()` function
19
+ - Error clearing in `handleNewConversation()` function
20
+ - Error banner UI component with dismiss functionality
21
+ - Alert and Close icon components
22
+
23
+ **Key Code Additions:**
24
+
25
+ ```typescript
26
+ // Error monitoring
27
+ useEffect(() => {
28
+ if (llmError) {
29
+ const errorMessage = typeof llmError === 'string' ? llmError : llmError.message || 'An error occurred';
30
+
31
+ if (errorMessage.includes('413') || errorMessage.toLowerCase().includes('content too large')) {
32
+ setError({
33
+ message: 'The context is too large to process. Please start a new conversation or reduce the amount of context.',
34
+ code: '413',
35
+ });
36
+ }
37
+ // ... other error handling
38
+ setIsLoading(false);
39
+ }
40
+ }, [llmError, lastKey, lastCallId]);
41
+ ```
42
+
43
+ ### 2. AIChatPanel.css
44
+
45
+ **Added:**
46
+ - `.error-banner` - Main error banner container
47
+ - `.error-banner__icon` - Alert icon styling
48
+ - `.error-banner__content` - Content container
49
+ - `.error-banner__message` - Main error message
50
+ - `.error-banner__hint` - Additional hint text
51
+ - `.error-banner__close` - Dismiss button
52
+ - `@keyframes slideDown` - Smooth entrance animation
53
+ - Dark theme variants for all error banner styles
54
+
55
+ ### 3. ChatPanel.tsx
56
+
57
+ **Added:**
58
+ - Error state management: `const [error, setError] = useState<{ message: string; code?: string } | null>(null)`
59
+ - Error extraction from useLLM hook: `const llmError = (llmResult as any).error || null`
60
+ - Error monitoring useEffect (same logic as AIChatPanel)
61
+ - Error clearing in `continueChat()` function
62
+ - Error clearing in reset conversation handler
63
+ - Error banner UI component with inline SVG icons
64
+
65
+ ### 4. ChatPanel.css
66
+
67
+ **Added:**
68
+ - Complete error banner styling (same as AIChatPanel.css)
69
+ - SVG icon sizing for inline icons
70
+ - Dark theme support
71
+ - Slide-down animation
72
+
73
+ ### 5. Documentation
74
+
75
+ **Created:**
76
+ - `docs/ERROR-HANDLING-413.md` - Comprehensive documentation
77
+ - `docs/CHANGELOG-ERROR-HANDLING.md` - This file
78
+
79
+ ## Error Types Handled
80
+
81
+ 1. **413 Content Too Large**
82
+ - Clear message about context size
83
+ - Actionable hint to start new conversation
84
+ - Most common error for long conversations
85
+
86
+ 2. **Network Errors**
87
+ - Generic network failure detection
88
+ - Suggests checking connection
89
+ - Covers fetch failures, timeouts, etc.
90
+
91
+ 3. **Unknown Errors**
92
+ - Displays original error message
93
+ - Graceful fallback for unexpected errors
94
+
95
+ ## UI/UX Improvements
96
+
97
+ ### Before
98
+ - Error only visible in console
99
+ - UI stuck in "thinking" state
100
+ - Stop button remains visible
101
+ - No user feedback
102
+ - No way to recover except refresh
103
+
104
+ ### After
105
+ - Prominent error banner at top of chat
106
+ - Clear, user-friendly error messages
107
+ - Contextual hints for recovery
108
+ - Automatic state reset (loading cleared, send button restored)
109
+ - Dismissible error banner
110
+ - Errors cleared on new message or conversation
111
+ - Smooth animations
112
+ - Full theme support
113
+
114
+ ## Technical Details
115
+
116
+ ### Error Detection Strategy
117
+
118
+ Since the `llmasaservice-client` package handles the actual HTTP requests, we monitor the `error` property it exposes (if available) through the `useLLM` hook. The error is parsed to determine the type and appropriate user-facing message.
119
+
120
+ ### State Management
121
+
122
+ - Error state is independent of loading state
123
+ - Errors automatically clear on new operations
124
+ - Loading state is properly reset when errors occur
125
+ - No stale error messages between conversations
126
+
127
+ ### Component Hierarchy
128
+
129
+ ```
130
+ AIAgentPanel (wrapper)
131
+ └─ AIChatPanel (contains error handling)
132
+
133
+ ChatPanel (standalone, also contains error handling)
134
+ ```
135
+
136
+ Both components implement identical error handling independently.
137
+
138
+ ## Breaking Changes
139
+
140
+ **None.** This is a backward-compatible enhancement that adds error handling without modifying any existing APIs or props.
141
+
142
+ ## Testing Recommendations
143
+
144
+ 1. **Manual Testing**
145
+ - Trigger 413 by creating very long conversation
146
+ - Verify error banner appears
147
+ - Verify message clarity
148
+ - Test dismiss functionality
149
+ - Test error clearing on new conversation
150
+ - Test in both light and dark themes
151
+
152
+ 2. **Integration Testing**
153
+ - Mock `useLLM` hook errors
154
+ - Verify error states transition correctly
155
+ - Verify loading states reset properly
156
+
157
+ 3. **Accessibility Testing**
158
+ - Verify error banner is keyboard accessible
159
+ - Verify dismiss button has proper aria-label
160
+ - Test with screen readers
161
+
162
+ ## Migration Guide
163
+
164
+ **For existing implementations:** No changes required. Error handling is automatic and transparent.
165
+
166
+ **For custom error handling:** If you've implemented custom error handling, you may want to:
167
+ 1. Remove custom error detection code
168
+ 2. Rely on the built-in error banner
169
+ 3. Or hide the built-in banner and use your own (via CSS)
170
+
171
+ ## Performance Impact
172
+
173
+ - Minimal: One additional useEffect per component
174
+ - No impact on render performance
175
+ - Error detection only runs when errors occur
176
+ - Animations are CSS-based (GPU accelerated)
177
+
178
+ ## Browser Compatibility
179
+
180
+ - Modern browsers (Chrome, Firefox, Safari, Edge)
181
+ - CSS animations supported in all target browsers
182
+ - Flexbox layout widely supported
183
+
184
+ ## Future Enhancements
185
+
186
+ See `docs/ERROR-HANDLING-413.md` for proposed future improvements including:
187
+ - Automatic context trimming
188
+ - Token counter
189
+ - Retry logic
190
+ - Rate limit handling
191
+ - Error analytics
192
+
193
+ ## Files Modified
194
+
195
+ - `src/AIChatPanel.tsx` (added error handling)
196
+ - `src/AIChatPanel.css` (added error banner styles)
197
+ - `src/ChatPanel.tsx` (added error handling)
198
+ - `src/ChatPanel.css` (added error banner styles)
199
+ - `docs/ERROR-HANDLING-413.md` (new documentation)
200
+ - `docs/CHANGELOG-ERROR-HANDLING.md` (this file)
201
+
202
+ ## Commit Message (Suggested)
203
+
204
+ ```
205
+ feat: Add graceful error handling for 413 and network errors
206
+
207
+ Implements comprehensive error handling across AIChatPanel and ChatPanel:
208
+
209
+ - Detect 413 Content Too Large errors from backend
210
+ - Display user-friendly error banners with clear messages
211
+ - Provide actionable hints for recovery (e.g., start new conversation)
212
+ - Handle network errors and generic failures
213
+ - Auto-clear errors on new messages/conversations
214
+ - Support light and dark themes
215
+ - Add smooth animations
216
+ - Properly reset UI state on errors
217
+
218
+ Fixes issue where UI would remain in "thinking" state after
219
+ failed requests, with errors only visible in console.
220
+
221
+ Components updated:
222
+ - AIChatPanel.tsx / AIChatPanel.css
223
+ - ChatPanel.tsx / ChatPanel.css
224
+
225
+ Closes: Issue about silent 413 failures
226
+ ```
227
+
228
+ ## Review Checklist
229
+
230
+ - [x] Error detection implemented
231
+ - [x] Error messages are user-friendly
232
+ - [x] UI state properly reset on errors
233
+ - [x] Error clearing works correctly
234
+ - [x] Dismissible error banner
235
+ - [x] Dark theme support
236
+ - [x] Animations smooth
237
+ - [x] No linting errors
238
+ - [x] Documentation complete
239
+ - [ ] Manual testing completed
240
+ - [ ] Integration testing added (if applicable)
241
+ - [ ] Accessibility verified
242
+
243
+ ## Questions or Issues?
244
+
245
+ For questions about this implementation, see:
246
+ - `docs/ERROR-HANDLING-413.md` - Detailed technical documentation
247
+ - GitHub Issues - Report bugs or request enhancements
@@ -0,0 +1,253 @@
1
+ # 413 Error Handling Implementation
2
+
3
+ ## Overview
4
+
5
+ This document describes the implementation of graceful error handling for 413 (Content Too Large) errors and other network errors in the chat components.
6
+
7
+ ## Problem
8
+
9
+ When the context (conversation history + user input) becomes too large, the backend returns a 413 "Content Too Large" HTTP error. Previously, this error was:
10
+
11
+ 1. Only visible in the browser console
12
+ 2. Left the UI in a "thinking" state with the stop button showing
13
+ 3. Provided no user feedback about what went wrong
14
+ 4. Required manual intervention to recover
15
+
16
+ ## Solution
17
+
18
+ We implemented comprehensive error handling across all chat components:
19
+
20
+ ### Components Updated
21
+
22
+ 1. **AIChatPanel.tsx** - Modern shadcn-style chat component
23
+ 2. **ChatPanel.tsx** - Legacy chat component
24
+ 3. **AIChatPanel.css** - Styles for error banner
25
+ 4. **ChatPanel.css** - Styles for error banner
26
+
27
+ ### Features
28
+
29
+ #### 1. Error Detection
30
+
31
+ - Monitors the `error` property from the `useLLM` hook
32
+ - Detects specific error types:
33
+ - 413 Content Too Large
34
+ - Network errors
35
+ - Generic errors
36
+
37
+ #### 2. Error Display
38
+
39
+ - **Error Banner**: Displays at the top of the chat panel
40
+ - **User-Friendly Messages**: Clear explanation of what went wrong
41
+ - **Contextual Hints**: For 413 errors, suggests starting a new conversation
42
+ - **Dismissible**: Users can close the error banner with an X button
43
+ - **Theme Support**: Works in both light and dark themes
44
+ - **Animations**: Smooth slide-down animation
45
+
46
+ #### 3. State Management
47
+
48
+ - Automatically resets loading state on error
49
+ - Stops showing "thinking" indicator
50
+ - Reverts stop button back to send button
51
+ - Clears error when starting a new message
52
+ - Clears error when starting a new conversation
53
+
54
+ ### Error Messages
55
+
56
+ #### 413 Content Too Large
57
+
58
+ ```
59
+ Message: "The context is too large to process. Please start a new conversation or reduce the amount of context."
60
+ Hint: "Try starting a new conversation or reducing the amount of information being sent."
61
+ ```
62
+
63
+ #### Network Errors
64
+
65
+ ```
66
+ Message: "Network error. Please check your connection and try again."
67
+ ```
68
+
69
+ #### Generic Errors
70
+
71
+ ```
72
+ Message: [Original error message from the API]
73
+ ```
74
+
75
+ ## Technical Implementation
76
+
77
+ ### State Management
78
+
79
+ ```typescript
80
+ const [error, setError] = useState<{ message: string; code?: string } | null>(null);
81
+ ```
82
+
83
+ ### Error Monitoring
84
+
85
+ ```typescript
86
+ useEffect(() => {
87
+ if (llmError) {
88
+ const errorMessage = typeof llmError === 'string' ? llmError : llmError.message || 'An error occurred';
89
+
90
+ if (errorMessage.includes('413') || errorMessage.toLowerCase().includes('content too large')) {
91
+ setError({
92
+ message: 'The context is too large to process. Please start a new conversation or reduce the amount of context.',
93
+ code: '413',
94
+ });
95
+ }
96
+ // ... other error types
97
+
98
+ setIsLoading(false);
99
+ }
100
+ }, [llmError, lastKey, lastCallId]);
101
+ ```
102
+
103
+ ### Error Clearing
104
+
105
+ Errors are automatically cleared when:
106
+
107
+ 1. Starting a new message (`continueChat`)
108
+ 2. Starting a new conversation (`handleNewConversation`)
109
+ 3. User dismisses the error banner
110
+
111
+ ### UI Component
112
+
113
+ ```jsx
114
+ {error && (
115
+ <div className="error-banner">
116
+ <div className="error-banner__icon">{/* Alert icon */}</div>
117
+ <div className="error-banner__content">
118
+ <div className="error-banner__message">{error.message}</div>
119
+ {error.code === '413' && (
120
+ <div className="error-banner__hint">
121
+ Try starting a new conversation or reducing the amount of information being sent.
122
+ </div>
123
+ )}
124
+ </div>
125
+ <button onClick={() => setError(null)}>{/* Close icon */}</button>
126
+ </div>
127
+ )}
128
+ ```
129
+
130
+ ## Styling
131
+
132
+ ### Error Banner Classes
133
+
134
+ - `.error-banner` - Main container with flexbox layout
135
+ - `.error-banner__icon` - Alert circle icon (red/warning color)
136
+ - `.error-banner__content` - Text content container
137
+ - `.error-banner__message` - Main error message (bold)
138
+ - `.error-banner__hint` - Additional hint text (lighter)
139
+ - `.error-banner__close` - Dismiss button
140
+
141
+ ### Theme Support
142
+
143
+ Both light and dark themes are supported with appropriate color adjustments:
144
+
145
+ **Light Theme:**
146
+ - Background: `#fef2f2`
147
+ - Border: `#fecaca`
148
+ - Text: `#991b1b`
149
+
150
+ **Dark Theme:**
151
+ - Background: `#7f1d1d`
152
+ - Border: `#991b1b`
153
+ - Text: `#fecaca`
154
+
155
+ ### Animation
156
+
157
+ The error banner slides down smoothly on appearance:
158
+
159
+ ```css
160
+ @keyframes slideDown {
161
+ from {
162
+ opacity: 0;
163
+ transform: translateY(-8px);
164
+ }
165
+ to {
166
+ opacity: 1;
167
+ transform: translateY(0);
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## User Experience Flow
173
+
174
+ ### Before Fix
175
+
176
+ 1. User sends a message with large context
177
+ 2. Request fails with 413 error
178
+ 3. Console shows error (not visible to user)
179
+ 4. UI stuck in "thinking" state
180
+ 5. Stop button still showing
181
+ 6. No indication of what went wrong
182
+
183
+ ### After Fix
184
+
185
+ 1. User sends a message with large context
186
+ 2. Request fails with 413 error
187
+ 3. Error banner appears at top of chat
188
+ 4. Clear message: "The context is too large to process..."
189
+ 5. Helpful hint: "Try starting a new conversation..."
190
+ 6. Loading state cleared, send button restored
191
+ 7. User can dismiss error and start a new conversation
192
+
193
+ ## Testing
194
+
195
+ ### Manual Testing
196
+
197
+ 1. **Test 413 Error**:
198
+ - Create a very long conversation
199
+ - Try to send a message
200
+ - Verify error banner appears
201
+ - Verify message is clear and helpful
202
+
203
+ 2. **Test Error Dismissal**:
204
+ - Trigger an error
205
+ - Click the X button
206
+ - Verify error banner disappears
207
+
208
+ 3. **Test Error Clearing**:
209
+ - Trigger an error
210
+ - Start a new conversation
211
+ - Verify error is cleared
212
+
213
+ 4. **Test Theme Support**:
214
+ - Trigger error in light theme
215
+ - Switch to dark theme
216
+ - Verify colors are appropriate
217
+
218
+ ### Simulating Errors
219
+
220
+ To test without actually hitting the 413 limit, you can modify the `llmError` in the useEffect or manually set the error state in browser DevTools:
221
+
222
+ ```javascript
223
+ // In browser console:
224
+ // Find the component and manually trigger error
225
+ document.querySelector('.llm-panel').__reactInternalInstance$...
226
+ ```
227
+
228
+ ## Future Enhancements
229
+
230
+ Potential improvements for future iterations:
231
+
232
+ 1. **Error Retry Logic**: Add a "Retry" button for transient errors
233
+ 2. **Context Reduction**: Automatically trim old messages when approaching limit
234
+ 3. **Token Counter**: Show token count before sending to prevent errors
235
+ 4. **Error Analytics**: Track error rates for monitoring
236
+ 5. **Offline Detection**: Detect network connectivity issues proactively
237
+ 6. **Rate Limiting**: Handle 429 (Too Many Requests) errors similarly
238
+
239
+ ## Related Files
240
+
241
+ - `src/AIChatPanel.tsx` - Main chat component implementation
242
+ - `src/AIChatPanel.css` - Chat component styles
243
+ - `src/ChatPanel.tsx` - Legacy chat component implementation
244
+ - `src/ChatPanel.css` - Legacy chat component styles
245
+ - `src/hooks/useConversationStore.ts` - Conversation management
246
+ - `docs/CONVERSATION-STARTING.md` - Related documentation
247
+
248
+ ## Notes
249
+
250
+ - The error handling works with the external `llmasaservice-client` package
251
+ - Errors are detected by monitoring the `error` property from `useLLM` hook
252
+ - The implementation is consistent across both modern (AIChatPanel) and legacy (ChatPanel) components
253
+ - Error state is properly synchronized with loading state to prevent UI inconsistencies
@@ -0,0 +1,131 @@
1
+ # Error Handling Implementation - Quick Summary
2
+
3
+ ## What Was Fixed
4
+
5
+ The 413 "Content Too Large" error that was only visible in the console and left the UI in a broken "thinking" state.
6
+
7
+ ## What Changed
8
+
9
+ ### User-Visible Changes
10
+
11
+ 1. **Error Banner**: Clear, prominent error messages appear at the top of the chat
12
+ 2. **Helpful Hints**: Specific guidance for recovery (e.g., "start a new conversation")
13
+ 3. **Dismissible**: Users can close the error with an X button
14
+ 4. **Auto-Recovery**: UI properly resets - send button returns, loading stops
15
+ 5. **Theme Support**: Works beautifully in both light and dark themes
16
+
17
+ ### Error Messages
18
+
19
+ **Before:** Console only shows:
20
+ ```
21
+ POST https://chat.llmasaservice.io/ 413 (Content Too Large)
22
+ Error: Error in fetch. (Error: Network error for service. (413 ))
23
+ ```
24
+
25
+ **After:** User sees a prominent banner:
26
+ ```
27
+ ⚠️ The context is too large to process. Please start a new conversation
28
+ or reduce the amount of context.
29
+
30
+ 💡 Try starting a new conversation or reducing the amount of
31
+ information being sent.
32
+
33
+ [✕ Close]
34
+ ```
35
+
36
+ ## Files Modified
37
+
38
+ 1. **src/AIChatPanel.tsx** - Added error state, monitoring, and UI
39
+ 2. **src/AIChatPanel.css** - Added error banner styling
40
+ 3. **src/ChatPanel.tsx** - Added error state, monitoring, and UI
41
+ 4. **src/ChatPanel.css** - Added error banner styling
42
+ 5. **README.md** - Added feature to features list
43
+ 6. **docs/** - Added comprehensive documentation
44
+
45
+ ## How It Works
46
+
47
+ ```
48
+ User sends message with large context
49
+
50
+ Request fails with 413
51
+
52
+ useLLM hook reports error
53
+
54
+ useEffect detects error type
55
+
56
+ Error banner appears with helpful message
57
+
58
+ Loading state cleared, send button restored
59
+
60
+ User dismisses or starts new conversation
61
+
62
+ Error cleared automatically
63
+ ```
64
+
65
+ ## Testing
66
+
67
+ ### Manual Test
68
+
69
+ 1. Start a conversation
70
+ 2. Continue for many exchanges (build up context)
71
+ 3. Send a message that triggers 413
72
+ 4. **Expected**: Error banner appears with clear message
73
+ 5. Click "New Conversation"
74
+ 6. **Expected**: Error clears, fresh start
75
+
76
+ ### Visual Indicators
77
+
78
+ - ✅ Error banner appears smoothly (slide-down animation)
79
+ - ✅ Red/warning color scheme (light theme)
80
+ - ✅ Dark red scheme (dark theme)
81
+ - ✅ Alert icon on left
82
+ - ✅ Close button on right
83
+ - ✅ Message is bold and prominent
84
+ - ✅ Hint text is lighter/smaller
85
+ - ✅ Stop button changes back to send button
86
+ - ✅ "Thinking..." disappears
87
+
88
+ ## Error Types Covered
89
+
90
+ 1. **413 Content Too Large** - Most common, gets special handling
91
+ 2. **Network Errors** - Generic connectivity issues
92
+ 3. **Unknown Errors** - Graceful fallback for unexpected issues
93
+
94
+ ## Zero Breaking Changes
95
+
96
+ - All existing code works unchanged
97
+ - No new required props
98
+ - No API changes
99
+ - Purely additive enhancement
100
+
101
+ ## Next Steps
102
+
103
+ ### Recommended
104
+
105
+ 1. Test manually with a long conversation
106
+ 2. Verify error banner appearance
107
+ 3. Verify error clearing on new conversation
108
+ 4. Test in both themes
109
+
110
+ ### Optional Enhancements (Future)
111
+
112
+ - Add token counter to prevent errors
113
+ - Add automatic context trimming
114
+ - Add retry button for transient errors
115
+ - Track error rates for monitoring
116
+
117
+ ## Documentation
118
+
119
+ - **Full Details**: `docs/ERROR-HANDLING-413.md`
120
+ - **Changelog**: `docs/CHANGELOG-ERROR-HANDLING.md`
121
+ - **This Summary**: `docs/ERROR-HANDLING-SUMMARY.md`
122
+
123
+ ## Questions?
124
+
125
+ The implementation is straightforward:
126
+ - Monitors errors from `useLLM` hook
127
+ - Shows user-friendly banner on error
128
+ - Clears error on new action
129
+ - That's it!
130
+
131
+ No configuration needed, works automatically! 🎉
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hef2024/llmasaservice-ui",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "description": "Prebuilt UI components for LLMAsAService.io",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",