fix(ui): Fix SSE in chat

This commit is contained in:
Richard Palethorpe
2025-04-01 08:43:12 +01:00
parent 1f8c601795
commit ab3e6ae3c8
3 changed files with 29 additions and 21 deletions

View File

@@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"os" "os"
"path/filepath"
"strings" "strings"
"time" "time"
@@ -215,7 +216,7 @@ func (a *App) ImportAgent(pool *state.AgentPool) func(c *fiber.Ctx) error {
os.MkdirAll("./uploads", os.ModePerm) os.MkdirAll("./uploads", os.ModePerm)
// Safely save the file to prevent path traversal // Safely save the file to prevent path traversal
destination := fmt.Sprintf("./uploads/%s", file.Filename) destination := filepath.Join("./uploads", file.Filename)
if err := c.SaveFile(file, destination); err != nil { if err := c.SaveFile(file, destination); err != nil {
// Handle error // Handle error
return err return err
@@ -385,7 +386,7 @@ func (a *App) ChatAPI(pool *state.AgentPool) func(c *fiber.Ctx) error {
xlog.Error("Error marshaling error message", "error", err) xlog.Error("Error marshaling error message", "error", err)
} else { } else {
manager.Send( manager.Send(
sse.NewMessage(string(errorData)).WithEvent("error")) sse.NewMessage(string(errorData)).WithEvent("json_error"))
} }
} else { } else {
// Send agent response // Send agent response

View File

@@ -109,6 +109,7 @@ export function useChat(agentName) {
setSending(true); setSending(true);
setError(null); setError(null);
try {
// Add user message to the local state immediately for better UX // Add user message to the local state immediately for better UX
const messageId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const messageId = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
@@ -124,7 +125,6 @@ export function useChat(agentName) {
// Track this message content to avoid duplication from SSE // Track this message content to avoid duplication from SSE
localMessageContents.current.add(content); localMessageContents.current.add(content);
try {
// Use the JSON-based API endpoint // Use the JSON-based API endpoint
await chatApi.sendMessage(agentName, content); await chatApi.sendMessage(agentName, content);
return true; return true;
@@ -133,8 +133,15 @@ export function useChat(agentName) {
console.error('Error sending message:', err); console.error('Error sending message:', err);
setSending(false); setSending(false);
return false; return false;
} finally {
// Ensure sending state is reset after a timeout in case SSE doesn't update
setTimeout(() => {
if (sending) {
setSending(false);
} }
}, [agentName]); }, 5000); // 5 second timeout
}
}, [agentName, sending]);
// Clear chat history // Clear chat history
const clearChat = useCallback(() => { const clearChat = useCallback(() => {

View File

@@ -63,8 +63,8 @@ export function useSSE(agentName) {
} }
}); });
// Handle 'status' event // Handle 'json_status' event
eventSource.addEventListener('status', (event) => { eventSource.addEventListener('json_status', (event) => {
try { try {
const data = JSON.parse(event.data); const data = JSON.parse(event.data);
const timestamp = data.timestamp || new Date().toISOString(); const timestamp = data.timestamp || new Date().toISOString();
@@ -81,7 +81,7 @@ export function useSSE(agentName) {
}); });
// Handle 'error' event // Handle 'error' event
eventSource.addEventListener('error', (event) => { eventSource.addEventListener('json_error', (event) => {
try { try {
const data = JSON.parse(event.data); const data = JSON.parse(event.data);
const timestamp = data.timestamp || new Date().toISOString(); const timestamp = data.timestamp || new Date().toISOString();