Spaces:
Running
Running
# 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 = [] |