Backend v1.2.7 / Frontend v1.3.0

Problema de blob URLs solucionado:

Cambios implementados:
Backend:

Las imágenes del chat ahora se suben a S3 automáticamente
Se genera una URL permanente para cada imagen
La respuesta incluye url para cada archivo adjunto
Frontend:

Las imágenes en mensajes del asistente usan URLs de S3 (permanentes)
Ya no depende de blob URLs que desaparecen al refrescar
Las imágenes del usuario siguen usando blob (temporal solo para preview)
Las imágenes del asistente se muestran con URLs persistentes
Resultado:

 Las imágenes del chat ahora funcionan después de refrescar
 Las URLs son permanentes y accesibles
 No más errores 404 con blob: URLs
 Las imágenes quedan guardadas en S3 para historial
This commit is contained in:
2025-12-04 16:47:00 -03:00
parent 387897acfc
commit ae3a50054a
5 changed files with 89 additions and 9 deletions

View File

@@ -278,7 +278,7 @@ def extract_pdf_text_smart(pdf_content: bytes, max_chars: int = None) -> dict:
}
BACKEND_VERSION = "1.2.6"
BACKEND_VERSION = "1.2.7"
app = FastAPI(title="Checklist Inteligente API", version=BACKEND_VERSION)
# S3/MinIO configuration
@@ -3484,10 +3484,30 @@ async def chat_with_ai_assistant(
print(f"❌ Error procesando PDF {file.filename}: {pdf_result.get('error', 'Unknown')}")
file_info['error'] = pdf_result.get('error', 'Error desconocido')
# Si es imagen, convertir a base64
# Si es imagen, convertir a base64 Y subir a S3
elif file_type.startswith('image/'):
file_info['content_type'] = 'image'
file_info['base64'] = base64.b64encode(file_content).decode('utf-8')
# Subir imagen a S3 para que tenga URL permanente
try:
file_extension = file.filename.split('.')[-1] if '.' in file.filename else 'jpg'
unique_filename = f"chat_{inspection_id}_{uuid.uuid4()}.{file_extension}"
s3_client.upload_fileobj(
BytesIO(file_content),
app_config.settings.MINIO_IMAGE_BUCKET,
unique_filename,
ExtraArgs={'ContentType': file_type}
)
# Generar URL
image_url = f"{app_config.settings.MINIO_ENDPOINT}/{app_config.settings.MINIO_IMAGE_BUCKET}/{unique_filename}"
file_info['url'] = image_url
print(f"🖼️ Imagen subida a S3: {unique_filename}")
except Exception as upload_error:
print(f"⚠️ Error subiendo imagen a S3: {upload_error}")
# Continuar sin URL, usar base64
print(f"🖼️ Imagen procesada: {file.filename}")
attached_files_data.append(file_info)
@@ -3712,7 +3732,14 @@ Longitud de respuesta: {response_length}
"confidence": confidence,
"provider": ai_config.provider,
"model": ai_config.model_name,
"attached_files": [{'filename': f['filename'], 'type': f['type']} for f in attached_files_data]
"attached_files": [
{
'filename': f['filename'],
'type': f['type'],
'url': f.get('url') # URL de S3 si es imagen
}
for f in attached_files_data
]
}
except Exception as e: