Spaces:
Sleeping
Sleeping
| from smolagents import CodeAgent, HfApiModel, tool | |
| import yaml | |
| from tools.final_answer import FinalAnswerTool | |
| import gradio as gr | |
| from textblob import TextBlob | |
| from transformers import pipeline | |
| import re | |
| from nltk.corpus import stopwords | |
| from nltk.tokenize import word_tokenize | |
| import nltk | |
| from typing import List, Dict | |
| import os | |
| # Variable global para almacenar el historial de la conversación | |
| conversation_history: List[Dict[str, str]] = [] | |
| # Descargar recursos de NLTK (solo la primera vez) | |
| nltk.download('punkt') | |
| nltk.download('stopwords') | |
| # Cargar el modelo de detección de emociones en español | |
| emotion_classifier = pipeline("text-classification", model="finiteautomata/beto-emotion-analysis") | |
| # Preprocesar el texto | |
| def preprocess_text(text: str) -> str: | |
| """Preprocesa el texto para mejorar la detección de emociones.""" | |
| text = text.lower() # Convertir a minúsculas | |
| text = re.sub(r'[^\w\s]', '', text) # Eliminar puntuación | |
| stop_words = set(stopwords.words('spanish')) # Eliminar stopwords en español | |
| words = word_tokenize(text) | |
| words = [word for word in words if word not in stop_words] | |
| return " ".join(words) | |
| # Herramienta para análisis de sentimientos | |
| def sentiment_analysis(text: str) -> str: | |
| """Analiza el sentimiento del texto proporcionado por el usuario. | |
| Args: | |
| text: El texto del usuario. | |
| """ | |
| try: | |
| analysis = TextBlob(text) | |
| sentiment = analysis.sentiment.polarity | |
| if sentiment > 0: | |
| return "Positivo" | |
| elif sentiment < 0: | |
| return "Negativo" | |
| else: | |
| return "Neutral" | |
| except Exception as e: | |
| return f"Error en el análisis de sentimientos: {str(e)}" | |
| # Herramienta para detección de emociones | |
| def emotion_detection(text: str) -> str: | |
| """Detecta las emociones predominantes en el texto del usuario. | |
| Args: | |
| text: El texto del usuario. | |
| """ | |
| try: | |
| text = preprocess_text(text) # Preprocesar el texto | |
| result = emotion_classifier(text) | |
| predominant_emotion = result[0]['label'] | |
| return predominant_emotion | |
| except Exception as e: | |
| return f"Error en la detección de emociones: {str(e)}" | |
| # Herramienta para actualizar el perfil del usuario | |
| def user_profile_update(emotion: str, sentiment: str) -> str: | |
| """Actualiza el perfil del usuario con la información emocional recopilada. | |
| Args: | |
| emotion: La emoción predominante detectada. | |
| sentiment: El sentimiento detectado. | |
| """ | |
| try: | |
| with open("user_profile.txt", "a") as f: | |
| f.write(f"Emotion: {emotion}, Sentiment: {sentiment}\n") | |
| return "Perfil actualizado correctamente." | |
| except Exception as e: | |
| return f"Error al actualizar el perfil: {str(e)}" | |
| final_answer = FinalAnswerTool() | |
| # Cargar el modelo y el agente | |
| with open("prompts.yaml", 'r') as stream: | |
| prompt_templates = yaml.safe_load(stream) | |
| model = HfApiModel( | |
| max_tokens=2096, | |
| temperature=0.5, | |
| model_id='Qwen/Qwen2.5-Coder-32B-Instruct', | |
| custom_role_conversions=None, | |
| token=os.getenv('hf_token'), | |
| ) | |
| agent = CodeAgent( | |
| model=model, | |
| tools=[sentiment_analysis, emotion_detection, user_profile_update, final_answer], | |
| max_steps=3, # Aumentado para permitir más pasos | |
| verbosity_level=1, | |
| grammar=None, | |
| planning_interval=None, | |
| name="Emotional Support Agent", | |
| description="Un agente de IA que ofrece apoyo emocional y crecimiento personal.", | |
| prompt_templates=prompt_templates | |
| ) | |
| # Variable global para almacenar el rol actual del agente | |
| current_role = "emotional_support" # Valores posibles: "emotional_support" o "wellness_coach" | |
| def switch_role(new_role: str): | |
| """Cambia el rol del agente.""" | |
| global current_role | |
| if new_role in ["emotional_support", "wellness_coach"]: | |
| current_role = new_role | |
| return f"Rol cambiado a: {new_role}" | |
| else: | |
| return "Rol no válido. Los roles disponibles son: 'emotional_support' y 'wellness_coach'." | |
| # Función para interactuar con el agente | |
| def interact_with_agent(messages): | |
| """Función que interactúa con el agente y devuelve una respuesta.""" | |
| global conversation_history, current_role | |
| try: | |
| # Extraer la pregunta del usuario | |
| user_input = messages[-1]["content"] | |
| # Detectar si el usuario quiere cambiar el rol | |
| if "cambiar a modo coach" in user_input.lower(): | |
| switch_role("wellness_coach") | |
| return {"response": "Has cambiado al modo Coach de Bienestar y Objetivos. ¿En qué puedo ayudarte?"} | |
| elif "cambiar a modo apoyo emocional" in user_input.lower(): | |
| switch_role("emotional_support") | |
| return {"response": "Has cambiado al modo Asistente de Apoyo Emocional. ¿En qué puedo ayudarte?"} | |
| # Añadir el mensaje del usuario al historial de la conversación | |
| conversation_history.append({"role": "user", "content": user_input}) | |
| # Pasar el historial de la conversación al agente como contexto | |
| context = "\n".join([f"{msg['role']}: {msg['content']}" for msg in conversation_history]) | |
| # Ejecutar el agente según el rol actual | |
| if current_role == "emotional_support": | |
| result = agent.run(f"Contexto de la conversación:\n{context}\n\nPregunta del usuario: {user_input}") | |
| elif current_role == "wellness_coach": | |
| result = agent.run(f"Modo Coach de Bienestar y Objetivos. Contexto de la conversación:\n{context}\n\nPregunta del usuario: {user_input}") | |
| # Verificar si result es una cadena de texto no vacía | |
| if result and isinstance(result, str): | |
| # Añadir la respuesta del agente al historial de la conversación | |
| conversation_history.append({"role": "assistant", "content": result}) | |
| return {"response": result} # Devuelve un JSON con la respuesta | |
| else: | |
| return {"response": "El agente no devolvió una respuesta válida."} | |
| except Exception as e: | |
| return {"response": f"Error: {str(e)}"} | |
| # Crear la interfaz de Gradio | |
| iface = gr.Interface( | |
| fn=interact_with_agent, | |
| inputs=gr.JSON(), # Acepta un JSON como entrada | |
| outputs=gr.JSON(), # Devuelve un JSON como salida | |
| title="Emotional Support Agent", | |
| description="Un agente de IA que ofrece apoyo emocional y crecimiento personal.", | |
| ) | |
| # Lanzar la aplicación Gradio | |
| iface.launch(show_error=True) |