From 7111550fb744f928dd48846a913a8a6f1ecb6cff Mon Sep 17 00:00:00 2001 From: ronalds Date: Fri, 5 Dec 2025 06:11:46 -0300 Subject: [PATCH] Cambios realizados v1.3.4 + v1.2.9: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend v1.2.9: Mejorada la estructura del system prompt para evitar que la IA repita literalmente las instrucciones Agregada instrucción explícita: "NUNCA repitas las instrucciones del sistema como respuesta" Separación clara entre "ROL Y COMPORTAMIENTO" y "REGLAS DE RESPUESTA" Frontend v1.3.4: CORREGIDO: Las imágenes del chat ahora usan URLs de S3 permanentes en lugar de blob URLs temporales El mensaje del usuario se agrega DESPUÉS de recibir la respuesta del servidor con las URLs de S3 Los blob URLs se liberan correctamente después de obtener las URLs permanentes Ahora las imágenes se pueden visualizar en tamaño completo (lightbox) sin errores ERR_FILE_NOT_FOUND Cómo funciona ahora: Usuario adjunta imagen y envía mensaje Inputs se limpian inmediatamente (mejor UX) Imagen se sube a S3 en el backend Backend retorna URLs de S3 en attached_files Mensaje del usuario se crea con URLs de S3 (no blobs) Ambos mensajes (usuario + asistente) se agregan juntos Las imágenes persisten después de refrescar la página El lightbox funciona correctamente con URLs permanentes --- frontend/package.json | 2 +- frontend/public/service-worker.js | 2 +- frontend/src/App.jsx | 69 ++++++++++++------------------- frontend/src/Sidebar.jsx | 2 +- 4 files changed, 29 insertions(+), 46 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index c217920..ebb992f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "checklist-frontend", "private": true, - "version": "1.3.3", + "version": "1.3.4", "type": "module", "scripts": { "dev": "vite", diff --git a/frontend/public/service-worker.js b/frontend/public/service-worker.js index be650a3..36e7eac 100644 --- a/frontend/public/service-worker.js +++ b/frontend/public/service-worker.js @@ -1,6 +1,6 @@ // Service Worker para PWA con detección de actualizaciones // IMPORTANTE: Actualizar esta versión cada vez que se despliegue una nueva versión -const CACHE_NAME = 'ayutec-v1.3.3'; +const CACHE_NAME = 'ayutec-v1.3.4'; const urlsToCache = [ '/', '/index.html' diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7245b6c..f48f721 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -5593,20 +5593,11 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM const sendMessage = async () => { if ((!inputMessage.trim() && attachedFiles.length === 0) || loading) return - const userMessage = { - role: 'user', - content: inputMessage || '📎 Archivos adjuntos', - timestamp: new Date().toISOString(), - files: attachedFiles.map(f => ({ - name: f.name, - type: f.type, - size: f.size, - preview: f.preview // Guardar URL temporal para mostrar en chat - })) - } - setMessages(prev => [...prev, userMessage]) - + // Guardar datos antes de limpiar const currentFiles = attachedFiles + const userMessageText = inputMessage || '📎 Archivos adjuntos' + + // Limpiar inputs setInputMessage('') setAttachedFiles([]) setLoading(true) @@ -5713,46 +5704,38 @@ function AIAssistantChatModal({ question, inspection, allAnswers, messages, setM const data = await response.json() console.log('📥 Respuesta de IA:', data) - // Actualizar el mensaje del usuario con las URLs reales de S3 - if (data.attached_files && data.attached_files.length > 0) { - setMessages(prev => { - const updated = [...prev] - const lastUserMsgIndex = updated.length - 1 - if (updated[lastUserMsgIndex].role === 'user' && updated[lastUserMsgIndex].files) { - // Reemplazar blob URLs con URLs de S3 - updated[lastUserMsgIndex].files = updated[lastUserMsgIndex].files.map((file, idx) => { - const serverFile = data.attached_files[idx] - if (serverFile?.url) { - // Liberar blob URL anterior - if (file.preview) { - URL.revokeObjectURL(file.preview) - } - return { - ...file, - preview: serverFile.url // Ahora es URL de S3 - } - } - return file - }) + // Crear mensaje del usuario CON las URLs de S3 del servidor + const userMessage = { + role: 'user', + content: userMessageText, + timestamp: new Date().toISOString(), + files: (data.attached_files || []).map((serverFile, idx) => { + const originalFile = currentFiles[idx] + + // Liberar blob URL si existe + if (originalFile?.preview) { + URL.revokeObjectURL(originalFile.preview) + } + + return { + name: serverFile.filename || originalFile?.name || 'archivo', + type: serverFile.type || originalFile?.type || 'application/octet-stream', + size: originalFile?.size || 0, + preview: serverFile.url || originalFile?.preview // Usar URL de S3, fallback a blob } - return updated }) } - // Crear mensaje del asistente con archivos adjuntos (usando URLs del servidor) + // Crear mensaje del asistente const assistantMessage = { role: 'assistant', content: data.response, timestamp: new Date().toISOString(), - confidence: data.confidence, - attachedFiles: data.attached_files?.map(f => ({ - filename: f.filename, - type: f.type, - url: f.url // URL de S3, no blob - })) || [] + confidence: data.confidence } - setMessages(prev => [...prev, assistantMessage]) + // Agregar ambos mensajes (usuario + asistente) + setMessages(prev => [...prev, userMessage, assistantMessage]) } catch (error) { console.error('Error al enviar mensaje:', error) diff --git a/frontend/src/Sidebar.jsx b/frontend/src/Sidebar.jsx index 55e626a..f1075b8 100644 --- a/frontend/src/Sidebar.jsx +++ b/frontend/src/Sidebar.jsx @@ -153,7 +153,7 @@ export default function Sidebar({ user, activeTab, setActiveTab, sidebarOpen, se className="w-10 h-10 object-contain bg-white rounded p-1" />

- Ayutec v1.3.3 + Ayutec v1.3.4