File size: 3,551 Bytes
9bbbea3
390251e
9bbbea3
bef9637
 
 
 
 
27ec158
bef9637
 
de81808
390251e
 
9bbbea3
390251e
bef9637
4713c81
 
 
 
 
 
 
 
 
de81808
075d270
4713c81
075d270
4713c81
 
 
 
 
 
 
 
 
 
 
 
 
075d270
 
27ec158
075d270
 
164bc89
075d270
b0d7f21
075d270
 
 
 
 
 
27ec158
de81808
075d270
 
 
 
 
 
 
 
 
 
 
390251e
 
de81808
6f432c7
de81808
390251e
de81808
6f432c7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 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 = []