from fastapi import FastAPI, HTTPException from pydantic import BaseModel from transformers import pipeline from typing import List # Crear la aplicación FastAPI app = FastAPI() # Cargar el modelo UNA VEZ al iniciar sentiment_pipeline = None try: sentiment_pipeline = pipeline( "sentiment-analysis", model="pysentimiento/robertuito-sentiment-analysis" ) print("✅ Modelo de sentimiento cargado exitosamente.") except Exception as e: print(f"❌ Error CRÍTICO al cargar el modelo de sentimiento: {e}") # Definir la estructura de los datos de entrada class SentimentRequest(BaseModel): texts: List[str] # Definir el endpoint de la API @app.post("/analyze/") def analyze_sentiment(request: SentimentRequest): # Comprobar si el modelo se cargó correctamente al inicio if sentiment_pipeline is None: raise HTTPException(status_code=503, detail="El modelo de IA no está disponible en este momento.") try: # Ejecutar el pipeline results = sentiment_pipeline(request.texts) # --- INICIO DE LA CORRECCIÓN ROBUSTA --- mapeo = {'POS': 'Positivo', 'NEG': 'Negativo', 'NEU': 'Neutro'} final_sentiments = [] for res_list in results: # Comprobación de seguridad: asegurarse de que la lista no esté vacía if res_list and isinstance(res_list, list) and len(res_list) > 0: # Acceder al primer diccionario de la lista de forma segura main_res = res_list[0] label = main_res.get('label', 'NEU') # Usar 'NEU' como valor por defecto si falta la etiqueta sentiment_label = mapeo.get(label, 'Neutro') # Usar 'Neutro' si la etiqueta no está en el mapeo final_sentiments.append(sentiment_label) else: # Si la respuesta para un texto está vacía o mal formada, asignar 'N/A' final_sentiments.append('N/A') # --- FIN DE LA CORRECCIÓN ROBUSTA --- return {"sentiments": final_sentiments} except Exception as e: # Si ocurre cualquier otro error durante el análisis, devolver un error 500 claro print(f"💥 Error durante el análisis: {str(e)}") raise HTTPException(status_code=500, detail=f"Error interno durante el análisis: {str(e)}") @app.get("/") def read_root(): return {"status": "API de Tono está en línea"}