Update modules/chatbot/chat_process.py
Browse files- modules/chatbot/chat_process.py +15 -13
modules/chatbot/chat_process.py
CHANGED
|
@@ -23,7 +23,7 @@ class ChatProcessor:
|
|
| 23 |
raise ValueError("Texto y métricas son requeridos")
|
| 24 |
|
| 25 |
self.semantic_context = {
|
| 26 |
-
'full_text': text,
|
| 27 |
'key_concepts': metrics.get('key_concepts', []),
|
| 28 |
'concept_centrality': metrics.get('concept_centrality', {}),
|
| 29 |
'graph_available': graph_data is not None,
|
|
@@ -51,7 +51,8 @@ class ChatProcessor:
|
|
| 51 |
1. Answer questions about concepts and their relationships
|
| 52 |
2. Explain the semantic network structure
|
| 53 |
3. Suggest text improvements
|
| 54 |
-
4. Provide insights based on concept centrality
|
|
|
|
| 55 |
|
| 56 |
'es': f"""Eres un experto en análisis semántico. El usuario analizó un artículo de investigación.
|
| 57 |
Texto completo disponible (abreviado para contexto).
|
|
@@ -61,8 +62,9 @@ class ChatProcessor:
|
|
| 61 |
Tus tareas:
|
| 62 |
1. Responder preguntas sobre conceptos y sus relaciones
|
| 63 |
2. Explicar la estructura de la red semántica
|
| 64 |
-
3. Sugerir
|
| 65 |
-
4. Proporcionar insights basados en centralidad de conceptos
|
|
|
|
| 66 |
|
| 67 |
'pt': f"""Você é um especialista em análise semântica. O usuário analisou um artigo de pesquisa.
|
| 68 |
Texto completo disponível (abreviado para contexto).
|
|
@@ -73,7 +75,8 @@ class ChatProcessor:
|
|
| 73 |
1. Responder perguntas sobre conceitos e suas relações
|
| 74 |
2. Explicar a estrutura da rede semântica
|
| 75 |
3. Sugerir melhorias no texto
|
| 76 |
-
4. Fornecer insights com base na centralidade dos conceitos
|
|
|
|
| 77 |
|
| 78 |
'fr': f"""Vous êtes un expert en analyse sémantique. L'utilisateur a analysé un article de recherche.
|
| 79 |
Texte complet disponible (abrégé pour le contexte).
|
|
@@ -84,14 +87,16 @@ class ChatProcessor:
|
|
| 84 |
1. Répondre aux questions sur les concepts et leurs relations
|
| 85 |
2. Expliquer la structure du réseau sémantique
|
| 86 |
3. Suggérer des améliorations de texte
|
| 87 |
-
4. Fournir des insights basés sur la centralité des concepts
|
|
|
|
| 88 |
}
|
| 89 |
|
| 90 |
return prompts.get(self.current_lang, prompts['en'])
|
| 91 |
|
| 92 |
def clean_generated_text(self, text):
|
| 93 |
-
"""Limpia caracteres especiales del texto generado"""
|
| 94 |
-
|
|
|
|
| 95 |
|
| 96 |
def process_chat_input(self, message: str, lang_code: str) -> Generator[str, None, None]:
|
| 97 |
"""Procesa el mensaje con todo el contexto disponible"""
|
|
@@ -100,12 +105,10 @@ class ChatProcessor:
|
|
| 100 |
yield "Error: Contexto semántico no configurado. Recargue el análisis."
|
| 101 |
return
|
| 102 |
|
| 103 |
-
# Actualizar idioma si es diferente
|
| 104 |
if lang_code != self.current_lang:
|
| 105 |
self.current_lang = lang_code
|
| 106 |
logger.info(f"Idioma cambiado a: {lang_code}")
|
| 107 |
|
| 108 |
-
# Construir historial de mensajes
|
| 109 |
messages = [
|
| 110 |
{
|
| 111 |
"role": "user",
|
|
@@ -115,7 +118,6 @@ class ChatProcessor:
|
|
| 115 |
{"role": "user", "content": message}
|
| 116 |
]
|
| 117 |
|
| 118 |
-
# Llamar a Claude con streaming
|
| 119 |
with self.client.messages.stream(
|
| 120 |
model="claude-sonnet-4-5-20250929",
|
| 121 |
max_tokens=4000,
|
|
@@ -129,10 +131,10 @@ class ChatProcessor:
|
|
| 129 |
full_response += cleaned_chunk
|
| 130 |
yield cleaned_chunk
|
| 131 |
|
| 132 |
-
#
|
| 133 |
self.conversation_history.extend([
|
| 134 |
{"role": "user", "content": message},
|
| 135 |
-
{"role": "assistant", "content": full_response}
|
| 136 |
])
|
| 137 |
logger.info("Respuesta generada y guardada en historial")
|
| 138 |
|
|
|
|
| 23 |
raise ValueError("Texto y métricas son requeridos")
|
| 24 |
|
| 25 |
self.semantic_context = {
|
| 26 |
+
'full_text': text,
|
| 27 |
'key_concepts': metrics.get('key_concepts', []),
|
| 28 |
'concept_centrality': metrics.get('concept_centrality', {}),
|
| 29 |
'graph_available': graph_data is not None,
|
|
|
|
| 51 |
1. Answer questions about concepts and their relationships
|
| 52 |
2. Explain the semantic network structure
|
| 53 |
3. Suggest text improvements
|
| 54 |
+
4. Provide insights based on concept centrality
|
| 55 |
+
5. IMPORTANT FORMATTING: Always format citations or numerical references using brackets with a leading space (e.g., text [1], concept [2]).""",
|
| 56 |
|
| 57 |
'es': f"""Eres un experto en análisis semántico. El usuario analizó un artículo de investigación.
|
| 58 |
Texto completo disponible (abreviado para contexto).
|
|
|
|
| 62 |
Tus tareas:
|
| 63 |
1. Responder preguntas sobre conceptos y sus relaciones
|
| 64 |
2. Explicar la estructura de la red semántica
|
| 65 |
+
3. Sugerir mejoras al texto
|
| 66 |
+
4. Proporcionar insights basados en centralidad de conceptos
|
| 67 |
+
5. FORMATO IMPORTANTE: Formatea siempre las citas o referencias numéricas usando corchetes y asegurando un espacio antes (por ejemplo: texto [1], concepto [2]).""",
|
| 68 |
|
| 69 |
'pt': f"""Você é um especialista em análise semântica. O usuário analisou um artigo de pesquisa.
|
| 70 |
Texto completo disponível (abreviado para contexto).
|
|
|
|
| 75 |
1. Responder perguntas sobre conceitos e suas relações
|
| 76 |
2. Explicar a estrutura da rede semântica
|
| 77 |
3. Sugerir melhorias no texto
|
| 78 |
+
4. Fornecer insights com base na centralidade dos conceitos
|
| 79 |
+
5. FORMATAÇÃO IMPORTANTE: Formate sempre as citações ou referências numéricas usando colchetes e garantindo um espaço antes (por exemplo: texto [1], conceito [2]).""",
|
| 80 |
|
| 81 |
'fr': f"""Vous êtes un expert en analyse sémantique. L'utilisateur a analysé un article de recherche.
|
| 82 |
Texte complet disponible (abrégé pour le contexte).
|
|
|
|
| 87 |
1. Répondre aux questions sur les concepts et leurs relations
|
| 88 |
2. Expliquer la structure du réseau sémantique
|
| 89 |
3. Suggérer des améliorations de texte
|
| 90 |
+
4. Fournir des insights basés sur la centralité des concepts
|
| 91 |
+
5. FORMATAGE IMPORTANT: Formatez toujours les citations ou les références numériques en utilisant des crochets et en assurant un espace avant (par exemple: texte [1], concept [2])."""
|
| 92 |
}
|
| 93 |
|
| 94 |
return prompts.get(self.current_lang, prompts['en'])
|
| 95 |
|
| 96 |
def clean_generated_text(self, text):
|
| 97 |
+
"""Limpia caracteres especiales del texto generado SIN eliminar espacios en blanco de los extremos."""
|
| 98 |
+
# Se elimina .strip() para no romper los espacios entre chunks del stream
|
| 99 |
+
return text.replace("\u2588", "").replace("▌", "")
|
| 100 |
|
| 101 |
def process_chat_input(self, message: str, lang_code: str) -> Generator[str, None, None]:
|
| 102 |
"""Procesa el mensaje con todo el contexto disponible"""
|
|
|
|
| 105 |
yield "Error: Contexto semántico no configurado. Recargue el análisis."
|
| 106 |
return
|
| 107 |
|
|
|
|
| 108 |
if lang_code != self.current_lang:
|
| 109 |
self.current_lang = lang_code
|
| 110 |
logger.info(f"Idioma cambiado a: {lang_code}")
|
| 111 |
|
|
|
|
| 112 |
messages = [
|
| 113 |
{
|
| 114 |
"role": "user",
|
|
|
|
| 118 |
{"role": "user", "content": message}
|
| 119 |
]
|
| 120 |
|
|
|
|
| 121 |
with self.client.messages.stream(
|
| 122 |
model="claude-sonnet-4-5-20250929",
|
| 123 |
max_tokens=4000,
|
|
|
|
| 131 |
full_response += cleaned_chunk
|
| 132 |
yield cleaned_chunk
|
| 133 |
|
| 134 |
+
# Opcional: Aplicar un strip final solo al guardarlo en el historial
|
| 135 |
self.conversation_history.extend([
|
| 136 |
{"role": "user", "content": message},
|
| 137 |
+
{"role": "assistant", "content": full_response.strip()}
|
| 138 |
])
|
| 139 |
logger.info("Respuesta generada y guardada en historial")
|
| 140 |
|