AIdeaText commited on
Commit
2ecf95c
·
verified ·
1 Parent(s): 042a654

Create claude_recommendations.py

Browse files
modules/studentact/claude_recommendations.py ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import anthropic
2
+ import os
3
+ import streamlit as st
4
+ import logging
5
+ from typing import Dict, Any
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ def generate_claude_recommendations(text: str, metrics: Dict[str, Any], text_type: str, lang_code: str):
10
+ """
11
+ Genera recomendaciones personalizadas utilizando la API de Claude.
12
+
13
+ Args:
14
+ text: El texto original que se analizó
15
+ metrics: Métricas calculadas por el sistema
16
+ text_type: Tipo de texto (academic_article, student_essay, general_communication)
17
+ lang_code: Código del idioma
18
+
19
+ Returns:
20
+ str: HTML formateado con recomendaciones personalizadas
21
+ """
22
+ # Diccionario para traducción de tipos de texto
23
+ text_type_names = {
24
+ 'academic_article': 'artículo académico',
25
+ 'student_essay': 'trabajo universitario',
26
+ 'general_communication': 'comunicación general'
27
+ }
28
+
29
+ # Identificar las áreas más débiles (ordenadas de peor a mejor)
30
+ areas = ['vocabulary', 'structure', 'cohesion', 'clarity']
31
+ scores = {area: metrics[area]['normalized_score'] for area in areas}
32
+ weak_areas = sorted(areas, key=lambda x: scores[x])
33
+
34
+ # Crear un mensaje estructurado para Claude
35
+ try:
36
+ client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
37
+
38
+ # Construir el prompt para Claude
39
+ prompt = f"""
40
+ Actúa como un asistente experto en escritura académica y comunicación.
41
+
42
+ Analiza el siguiente texto (clasificado como {text_type_names.get(text_type, text_type)}) y genera recomendaciones personalizadas para mejorarlo.
43
+
44
+ Las métricas de análisis del texto son:
45
+ - Vocabulario: {scores['vocabulary']:.2f}/1.00
46
+ - Estructura: {scores['structure']:.2f}/1.00
47
+ - Cohesión: {scores['cohesion']:.2f}/1.00
48
+ - Claridad: {scores['clarity']:.2f}/1.00
49
+
50
+ Áreas que necesitan mayor atención (de mayor a menor prioridad):
51
+ {', '.join([area for area in weak_areas[:2]])}
52
+
53
+ Texto analizado:
54
+ "{text[:1000]}..." (texto truncado para análisis)
55
+
56
+ Por favor, proporciona:
57
+ 1. Un breve resumen del análisis (2-3 oraciones)
58
+ 2. 3-4 recomendaciones específicas para mejorar el texto, identificando problemas concretos
59
+ 3. Sugerencias de qué herramientas de AIdeaText serían más útiles (Análisis Morfosintáctico, Análisis Semántico, o Análisis del Discurso)
60
+ 4. Un ejemplo concreto de cómo mejorar una frase del texto
61
+
62
+ Utiliza un tono profesional pero amigable, y estructura tus recomendaciones en HTML simple usando etiquetas <h4>, <p>, <ul>, <li>, y <strong>. No uses estilos inline ni clases CSS.
63
+ """
64
+
65
+ # Llamada a la API de Claude
66
+ message = client.messages.create(
67
+ model="claude-3-5-sonnet-20241022",
68
+ max_tokens=1000,
69
+ temperature=0.3,
70
+ system="Eres un asistente experto en análisis textual que proporciona recomendaciones claras y útiles para mejorar textos.",
71
+ messages=[
72
+ {"role": "user", "content": prompt}
73
+ ]
74
+ )
75
+
76
+ # Obtener la respuesta
77
+ return message.content[0].text
78
+
79
+ except Exception as e:
80
+ logger.error(f"Error generando recomendaciones con Claude: {str(e)}")
81
+ # Fallback en caso de error
82
+ return f"""
83
+ <h4>Recomendaciones para mejorar tu texto</h4>
84
+ <p>Hemos detectado que las áreas de <strong>{weak_areas[0]}</strong> y <strong>{weak_areas[1]}</strong>
85
+ son las que más podrían beneficiarse de mejoras.</p>
86
+ <p>Para obtener recomendaciones más detalladas, utiliza el asistente virtual de Claude AI
87
+ ubicado en la esquina superior izquierda (presiona la flecha junto al logo).</p>
88
+ """
89
+
90
+ def display_personalized_recommendations(text, metrics, text_type, lang_code, t):
91
+ """
92
+ Muestra recomendaciones personalizadas en una interfaz amigable.
93
+
94
+ Args:
95
+ text: El texto original que se analizó
96
+ metrics: Métricas calculadas por el sistema
97
+ text_type: Tipo de texto
98
+ lang_code: Código del idioma
99
+ t: Diccionario de traducciones
100
+ """
101
+ st.markdown("### 📝 Recomendaciones Personalizadas")
102
+
103
+ # Verificar si ya tenemos las recomendaciones en la sesión
104
+ recommendations_key = f"claude_recommendations_{text_type}"
105
+
106
+ # Generar nuevas recomendaciones si no existen o si se ha cambiado el tipo de texto
107
+ if recommendations_key not in st.session_state:
108
+ with st.spinner("Generando recomendaciones personalizadas..."):
109
+ recommendations_html = generate_claude_recommendations(
110
+ text=text,
111
+ metrics=metrics,
112
+ text_type=text_type,
113
+ lang_code=lang_code
114
+ )
115
+ st.session_state[recommendations_key] = recommendations_html
116
+
117
+ # Mostrar las recomendaciones
118
+ st.markdown(
119
+ f"""
120
+ <div style="border: 1px solid #ddd; border-radius: 8px; padding: 20px; background-color: #f9f9f9;">
121
+ {st.session_state[recommendations_key]}
122
+ </div>
123
+ """,
124
+ unsafe_allow_html=True
125
+ )
126
+
127
+ # Mensaje para animar a usar el chatbot
128
+ st.info("💡 **Para seguir mejorando tu texto:** Despliega el asistente virtual (potenciado por Claude AI) ubicado en la parte superior izquierda, presionando la flecha junto al logo.")
129
+
130
+ # Función para integrar este nuevo sistema en la interfaz existente
131
+ def display_recommendations_section(text_input, current_doc, current_metrics, text_type, lang_code, t):
132
+ """
133
+ Función principal para mostrar la sección de recomendaciones en la interfaz.
134
+
135
+ Reemplaza a la función display_recommendations_with_actions anterior.
136
+ """
137
+ # Subtabs para diferentes tipos de recomendaciones
138
+ subtab1, subtab2 = st.tabs(["Diagnóstico", "Recomendaciones"])
139
+
140
+ # Tab de diagnóstico (mantener el radar chart existente)
141
+ with subtab1:
142
+ display_diagnosis(
143
+ metrics=current_metrics,
144
+ text_type=text_type
145
+ )
146
+
147
+ # Tab de recomendaciones personalizadas por Claude
148
+ with subtab2:
149
+ display_personalized_recommendations(
150
+ text=text_input,
151
+ metrics=current_metrics,
152
+ text_type=text_type,
153
+ lang_code=lang_code,
154
+ t=t
155
+ )