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:
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "checklist-frontend",
|
||||
"private": true,
|
||||
"version": "1.0.83",
|
||||
"version": "1.0.84",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -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')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user