diff --git a/backend/app/main.py b/backend/app/main.py index 6353575..6941d3d 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1591,13 +1591,25 @@ VALIDACIÓN DE IMAGEN: - Si la imagen NO corresponde al contexto de la pregunta (por ejemplo, si piden luces pero muestran motor), indica en "recommendation" que deben cambiar la foto - Si la imagen es borrosa, oscura o no permite análisis, indica en "recommendation" que tomen otra foto más clara -Responde en formato JSON: +Responde SOLO en formato JSON válido (sin markdown, sin ```json): {{ - "status": "ok|minor|critical", - "observations": "Análisis específico según el prompt personalizado, considerando el vehículo {inspection.vehicle_brand if inspection_id else ''}", - "recommendation": "Si la imagen no es apropiada, indica 'Por favor tome una foto de [componente correcto]'. Si es apropiada, da recomendación técnica.", - "confidence": 0.0-1.0 -}}""" + "status": "ok", + "observations": "Análisis técnico específico según las instrucciones del prompt personalizado", + "recommendation": "Acción recomendada basada en el análisis", + "confidence": 0.85 +}} + +NOTA IMPORTANTE sobre el campo "status": +- Usa "ok" si el componente está en buen estado y pasa la inspección +- Usa "minor" si hay problemas leves que requieren atención pero no son críticos +- Usa "critical" si hay problemas graves que requieren reparación inmediata + +RECORDATORIO: En tus observaciones, menciona si el estado es apropiado para el kilometraje y marca/modelo del vehículo.""" + + if vehicle_context: + user_message = f"Inspecciona esta imagen del vehículo y responde específicamente: {question_obj.text}. Aplica las instrucciones personalizadas y considera el contexto del vehículo en tu análisis." + else: + user_message = f"Inspecciona la imagen y responde específicamente: {question_obj.text}" else: # Prompt altamente específico para la pregunta question_text = question_obj.text @@ -1619,22 +1631,28 @@ VALIDACIÓN DE IMAGEN: - Si la imagen NO corresponde al contexto de la pregunta, indica en "recommendation" que deben cambiar la foto - Si la imagen es borrosa o no permite análisis, indica en "recommendation" que tomen otra foto más clara -Responde en formato JSON: +Responde SOLO en formato JSON válido (sin markdown, sin ```json): {{ - "status": "ok|minor|critical", - "observations": "Respuesta específica a: {question_text}", - "recommendation": "Si la imagen no es apropiada, indica 'Por favor tome una foto de [componente correcto]'. Si es apropiada, da acción técnica si aplica.", - "confidence": 0.0-1.0 + "status": "ok", + "observations": "Respuesta técnica específica a: {question_text}", + "recommendation": "Acción técnica recomendada o mensaje si la foto no es apropiada", + "confidence": 0.85 }} -IMPORTANTE: +NOTA IMPORTANTE sobre el campo "status": +- Usa "ok" si el componente está en buen estado y pasa la inspección +- Usa "minor" si hay problemas leves que requieren atención pero no son críticos +- Usa "critical" si hay problemas graves que requieren reparación inmediata + +RECUERDA: - Responde SOLO lo que la pregunta pide - No des información genérica del vehículo -- Sé específico y técnico -- Si la pregunta es pass/fail, indica claramente si pasa o falla -- Si la pregunta es bueno/regular/malo, indica el estado específico del componente""" +- Sé específico y técnico""" - user_message = f"Inspecciona la imagen y responde específicamente: {question_obj.text}" + if vehicle_context: + user_message = f"Inspecciona esta imagen del vehículo y responde específicamente: {question_obj.text}. En tus observaciones, menciona si el estado es apropiado para el kilometraje y marca/modelo del vehículo." + else: + user_message = f"Inspecciona la imagen y responde específicamente: {question_obj.text}" else: # Fallback para análisis general system_prompt = f"""Eres un experto mecánico automotriz. @@ -1647,13 +1665,15 @@ Analiza la imagen y proporciona: 3. Observaciones técnicas breves 4. Recomendación de acción -Responde en formato JSON: +Responde SOLO en formato JSON válido (sin markdown, sin ```json): {{ - "status": "ok|minor|critical", - "observations": "descripción técnica", + "status": "ok", + "observations": "descripción técnica del componente", "recommendation": "acción sugerida", - "confidence": 0.0-1.0 -}}""" + "confidence": 0.85 +}} + +NOTA: "status" debe ser "ok" (bueno), "minor" (problemas leves) o "critical" (problemas graves).""" user_message = "Analiza este componente del vehículo para la inspección general." if ai_config.provider == "openai": diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 871e168..127fe00 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -3032,13 +3032,13 @@ function InspectionModal({ checklist, user, onClose, onComplete }) { const filesArray = Array.from(files) // Update photos immediately - setAnswers({ - ...answers, + setAnswers(prev => ({ + ...prev, [questionId]: { - ...answers[questionId], + ...(prev[questionId] || { value: '', observations: '', photos: [] }), photos: filesArray } - }) + })) // If AI mode is assisted or full, analyze the photos if ((checklist.ai_mode === 'assisted' || checklist.ai_mode === 'full') && filesArray.length > 0) { @@ -3050,6 +3050,10 @@ function InspectionModal({ checklist, user, onClose, onComplete }) { const question = questions.find(q => q.id === questionId) if (!question) return + console.log('🔍 Iniciando análisis IA para pregunta:', questionId) + console.log('📸 Archivos a analizar:', files.length) + console.log('🎯 Modo IA del checklist:', checklist.ai_mode) + setAiAnalyzing(true) try { @@ -3106,9 +3110,11 @@ function InspectionModal({ checklist, user, onClose, onComplete }) { } if (analyses.length > 0) { + console.log('✅ Análisis recibidos:', analyses.length) // Process analysis results const firstResult = analyses[0] const analysis = firstResult.analysis + console.log('📊 Análisis completo:', analysis) let suggestedAnswer = null let observationsText = '' @@ -3193,6 +3199,19 @@ function InspectionModal({ checklist, user, onClose, onComplete }) { console.log(`🤖 ASSISTED MODE: Sugerencia agregada a observaciones`) console.log(`📝 Observaciones guardadas:`, `${suggestedAnswer ? `[IA Sugiere: ${suggestedAnswer}]\n` : ''}${observationsText}`) } + // Siempre guardar observaciones incluso si no hay modo específico o sugerencia + else if (observationsText) { + setAnswers(prev => ({ + ...prev, + [questionId]: { + ...(prev[questionId] || { value: '', observations: '', photos: [] }), + observations: observationsText, + photos: files, + aiAnalysis: firstResult.analysis + } + })) + console.log(`🤖 Análisis IA guardado en observaciones:`, observationsText) + } } } catch (error) { console.error('❌ Error al analizar fotos con IA:', error)