Spaces:
Sleeping
Sleeping
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 | |
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)}") | |
def read_root(): | |
return {"status": "API de Tono está en línea"} |