# modules/chatbot/chat_process.py import os import anthropic import logging from typing import Dict, Generator logger = logging.getLogger(__name__) #################################################### class ChatProcessor: def __init__(self): """Inicializa el procesador de chat con la API de Claude""" api_key = os.environ.get("ANTHROPIC_API_KEY") if not api_key: raise ValueError("No se encontró la clave API de Anthropic. Asegúrate de configurarla en las variables de entorno.") self.client = anthropic.Anthropic(api_key=api_key) self.conversation_history = [] def set_semantic_context(self, text, metrics, graph_data): """Configura el contexto semántico para conversaciones especializadas""" self.semantic_context = { 'text_sample': text[:2000], 'key_concepts': metrics.get('key_concepts', []), 'concept_centrality': metrics.get('concept_centrality', {}), 'graph_description': "Available" if graph_data else "Not available" } def process_chat_input(self, message: str, lang_code: str) -> Generator[str, None, None]: """Procesa el mensaje con contexto semántico si está disponible""" try: # Preparar mensaje con contexto si existe if self.semantic_context: system_prompt = f""" Eres un asistente especializado en análisis semántico. El usuario ha analizado un texto con los siguientes resultados: - Conceptos clave: {', '.join([c[0] for c in self.semantic_context['key_concepts'][:5]])}... - Centralidad: {len(self.semantic_context['concept_centrality'])} conceptos medidos - Grafo conceptual: {self.semantic_context['graph_description']} Responde preguntas específicas sobre este análisis y ayuda a interpretar los resultados. """ else: system_prompt = "Eres un asistente útil. Responde preguntas generales del usuario." # Agregar mensaje a la historia self.conversation_history.append({"role": "user", "content": message}) # Generar respuesta usando la API de Claude response = self.client.messages.create( model="claude-3-5-sonnet-20241022", messages=self.conversation_history, max_tokens=8000, # Añadimos este parámetro requerido temperature=0.7, ) # Procesar la respuesta claude_response = response.content[0].text self.conversation_history.append({"role": "assistant", "content": claude_response}) # Mantener un historial limitado if len(self.conversation_history) > 10: self.conversation_history = self.conversation_history[-10:] # Dividir la respuesta en palabras para streaming words = claude_response.split() for word in words: yield word + " " except Exception as e: logger.error(f"Error en process_chat_input: {str(e)}") yield f"Error: {str(e)}" def get_conversation_history(self) -> list: """Retorna el historial de la conversación""" return self.conversation_history def clear_history(self): """Limpia el historial de la conversación""" self.conversation_history = []