feat: Validación inteligente de contexto en análisis de imágenes IA

Backend (v1.0.84):
- Agregado campo 'context_match' en respuesta JSON de análisis IA
- IA evalúa si imagen corresponde al contexto de la pregunta
- Tres niveles de validación: prompt personalizado, pregunta específica, análisis general
- Detección automática de imágenes fuera de contexto con recomendaciones específicas

Frontend (v1.0.84):
- Sistema de alertas cuando IA detecta imágenes que no corresponden
- Popup de advertencia muestra qué imágenes no coinciden y por qué
- Opción para eliminar automáticamente fotos incorrectas y cargar nuevas
- Validación con frases clave: "no corresponde", "no coincide", "no relacionad"
- Previene que mecánicos carguen imágenes irrelevantes a las preguntas

Evita errores en inspecciones al garantizar que cada foto corresponda a su pregunta específica
This commit is contained in:
2025-11-30 22:35:31 -03:00
parent 7b39648be5
commit 2db2833f27
3 changed files with 76 additions and 9 deletions

View File

@@ -1,7 +1,7 @@
{
"name": "checklist-frontend",
"private": true,
"version": "1.0.83",
"version": "1.0.84",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -4444,6 +4444,57 @@ function InspectionModal({ checklist, existingInspection, user, onClose, onCompl
if (analyses.length > 0) {
console.log(`✅ Análisis IA guardado (${analyses.length} análisis)`)
console.log(`📝 Las observaciones quedan para que el mecánico las escriba manualmente`)
// Verificar si alguna imagen no corresponde al contexto
const invalidImages = []
analyses.forEach((analysis, idx) => {
if (analysis.analysis) {
// Verificar si la IA indica que la imagen no corresponde
const obs = analysis.analysis.observations?.toLowerCase() || ''
const isInvalid =
obs.includes('no corresponde') ||
obs.includes('no coincide') ||
obs.includes('imagen incorrecta') ||
obs.includes('no es relevante') ||
obs.includes('no relacionad') ||
analysis.analysis.context_match === false
if (isInvalid) {
invalidImages.push({
index: idx + 1,
fileName: analysis.fileName,
reason: analysis.analysis.observations
})
}
}
})
// Mostrar advertencia si hay imágenes que no corresponden
if (invalidImages.length > 0) {
let warningMsg = '⚠️ ATENCIÓN: Se detectaron imágenes que podrían NO corresponder al contexto:\n\n'
invalidImages.forEach(img => {
warningMsg += `📸 Imagen ${img.index}: ${img.reason}\n\n`
})
warningMsg += '¿Deseas reemplazar estas imágenes?\n\n'
warningMsg += 'Presiona OK para eliminar las imágenes incorrectas y cargar nuevas.\n'
warningMsg += 'Presiona Cancelar si estás seguro de que las imágenes son correctas.'
if (confirm(warningMsg)) {
// Eliminar las imágenes que no corresponden
const validPhotos = files.filter((_, idx) => !invalidImages.some(inv => inv.index === idx + 1))
setAnswers(prev => ({
...prev,
[questionId]: {
...(prev[questionId] || { value: '', observations: '', photos: [] }),
photos: validPhotos,
aiAnalysis: undefined,
documentsLoaded: false // Resetear para que vuelva a cargar
}
}))
alert('📸 Por favor carga nuevas imágenes que correspondan a: ' + question.text)
return // No mostrar el popup de éxito
}
}
} else {
console.log(' No se generaron análisis IA, pero documentos procesados')
}