feat: AI prompts personalizados por pregunta - backend v1.0.13, frontend v1.0.21

Backend:
- Agregar campo ai_prompt a tabla questions
- Endpoint analyze-image recibe custom_prompt
- Validación de imagen apropiada (sugiere cambiar foto si no corresponde)
- Script de migración migrate_ai_prompt.py

Frontend:
- Campo de texto para configurar prompt de IA en editor de preguntas
- Envía custom_prompt al endpoint de análisis
- UI con fondo morado para sección de IA

La IA ahora analiza fotos según el contexto específico de cada pregunta
y sugiere cambiar la imagen si no corresponde al componente solicitado.
This commit is contained in:
2025-11-21 02:41:50 -03:00
parent 678a8cd24b
commit 2b5424790a
6 changed files with 110 additions and 12 deletions

View File

@@ -910,7 +910,8 @@ function QuestionsManagerModal({ checklist, onClose }) {
max_photos: 3,
requires_comment_on_fail: false,
parent_question_id: null,
show_if_answer: ''
show_if_answer: '',
ai_prompt: ''
})
useEffect(() => {
@@ -967,7 +968,8 @@ function QuestionsManagerModal({ checklist, onClose }) {
max_photos: 3,
requires_comment_on_fail: false,
parent_question_id: null,
show_if_answer: ''
show_if_answer: '',
ai_prompt: ''
})
loadQuestions()
} else {
@@ -1158,6 +1160,26 @@ function QuestionsManagerModal({ checklist, onClose }) {
</div>
</div>
{/* AI Prompt */}
<div className="bg-purple-50 border border-purple-200 rounded-lg p-4">
<h4 className="text-sm font-semibold text-purple-900 mb-3">🤖 Prompt de IA (opcional)</h4>
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">
Prompt personalizado para análisis de fotos
</label>
<textarea
value={formData.ai_prompt}
onChange={(e) => setFormData({ ...formData, ai_prompt: e.target.value })}
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500"
rows="3"
placeholder="Ej: Analiza si las luces delanteras están encendidas y funcionando correctamente. Verifica que ambas luces tengan brillo uniforme y no presenten daños visibles."
/>
<p className="text-xs text-gray-500 mt-1">
Este prompt guiará a la IA para analizar las fotos específicamente para esta pregunta. Si la foto no corresponde al contexto, la IA sugerirá cambiarla.
</p>
</div>
</div>
<div className="grid grid-cols-3 gap-4">
<div>
<label className="block text-sm font-medium text-gray-700 mb-1">
@@ -2289,6 +2311,11 @@ function InspectionModal({ checklist, user, onClose, onComplete }) {
const API_URL = import.meta.env.VITE_API_URL || ''
console.log(`🤖 Analizando ${files.length} foto(s) con IA para pregunta: ${question.text}`)
// Use custom AI prompt if available
if (question.ai_prompt) {
console.log(`📝 Usando prompt personalizado: ${question.ai_prompt.substring(0, 50)}...`)
}
// Analyze each photo
const analyses = []
@@ -2296,6 +2323,11 @@ function InspectionModal({ checklist, user, onClose, onComplete }) {
const formData = new FormData()
formData.append('file', file)
formData.append('question_id', question.id.toString())
// Include custom prompt if available
if (question.ai_prompt) {
formData.append('custom_prompt', question.ai_prompt)
}
const response = await fetch(`${API_URL}/api/analyze-image`, {
method: 'POST',