File size: 6,446 Bytes
2ecf95c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import anthropic
import os
import streamlit as st
import logging
from typing import Dict, Any

logger = logging.getLogger(__name__)

def generate_claude_recommendations(text: str, metrics: Dict[str, Any], text_type: str, lang_code: str):
    """
    Genera recomendaciones personalizadas utilizando la API de Claude.
    
    Args:
        text: El texto original que se analizó
        metrics: Métricas calculadas por el sistema
        text_type: Tipo de texto (academic_article, student_essay, general_communication)
        lang_code: Código del idioma
        
    Returns:
        str: HTML formateado con recomendaciones personalizadas
    """
    # Diccionario para traducción de tipos de texto
    text_type_names = {
        'academic_article': 'artículo académico',
        'student_essay': 'trabajo universitario',
        'general_communication': 'comunicación general'
    }
    
    # Identificar las áreas más débiles (ordenadas de peor a mejor)
    areas = ['vocabulary', 'structure', 'cohesion', 'clarity']
    scores = {area: metrics[area]['normalized_score'] for area in areas}
    weak_areas = sorted(areas, key=lambda x: scores[x])
    
    # Crear un mensaje estructurado para Claude
    try:
        client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
        
        # Construir el prompt para Claude
        prompt = f"""
        Actúa como un asistente experto en escritura académica y comunicación.
        
        Analiza el siguiente texto (clasificado como {text_type_names.get(text_type, text_type)}) y genera recomendaciones personalizadas para mejorarlo.
        
        Las métricas de análisis del texto son:
        - Vocabulario: {scores['vocabulary']:.2f}/1.00
        - Estructura: {scores['structure']:.2f}/1.00
        - Cohesión: {scores['cohesion']:.2f}/1.00
        - Claridad: {scores['clarity']:.2f}/1.00
        
        Áreas que necesitan mayor atención (de mayor a menor prioridad):
        {', '.join([area for area in weak_areas[:2]])}
        
        Texto analizado:
        "{text[:1000]}..." (texto truncado para análisis)
        
        Por favor, proporciona:
        1. Un breve resumen del análisis (2-3 oraciones)
        2. 3-4 recomendaciones específicas para mejorar el texto, identificando problemas concretos
        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)
        4. Un ejemplo concreto de cómo mejorar una frase del texto
        
        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.
        """
        
        # Llamada a la API de Claude
        message = client.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=1000,
            temperature=0.3,
            system="Eres un asistente experto en análisis textual que proporciona recomendaciones claras y útiles para mejorar textos.",
            messages=[
                {"role": "user", "content": prompt}
            ]
        )
        
        # Obtener la respuesta
        return message.content[0].text
        
    except Exception as e:
        logger.error(f"Error generando recomendaciones con Claude: {str(e)}")
        # Fallback en caso de error
        return f"""
        <h4>Recomendaciones para mejorar tu texto</h4>
        <p>Hemos detectado que las áreas de <strong>{weak_areas[0]}</strong> y <strong>{weak_areas[1]}</strong> 
        son las que más podrían beneficiarse de mejoras.</p>
        <p>Para obtener recomendaciones más detalladas, utiliza el asistente virtual de Claude AI
        ubicado en la esquina superior izquierda (presiona la flecha junto al logo).</p>
        """

def display_personalized_recommendations(text, metrics, text_type, lang_code, t):
    """
    Muestra recomendaciones personalizadas en una interfaz amigable.
    
    Args:
        text: El texto original que se analizó
        metrics: Métricas calculadas por el sistema
        text_type: Tipo de texto
        lang_code: Código del idioma
        t: Diccionario de traducciones
    """
    st.markdown("### 📝 Recomendaciones Personalizadas")
    
    # Verificar si ya tenemos las recomendaciones en la sesión
    recommendations_key = f"claude_recommendations_{text_type}"
    
    # Generar nuevas recomendaciones si no existen o si se ha cambiado el tipo de texto
    if recommendations_key not in st.session_state:
        with st.spinner("Generando recomendaciones personalizadas..."):
            recommendations_html = generate_claude_recommendations(
                text=text,
                metrics=metrics,
                text_type=text_type,
                lang_code=lang_code
            )
            st.session_state[recommendations_key] = recommendations_html
    
    # Mostrar las recomendaciones
    st.markdown(
        f"""
        <div style="border: 1px solid #ddd; border-radius: 8px; padding: 20px; background-color: #f9f9f9;">
            {st.session_state[recommendations_key]}
        </div>
        """, 
        unsafe_allow_html=True
    )
    
    # Mensaje para animar a usar el chatbot
    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.")

# Función para integrar este nuevo sistema en la interfaz existente
def display_recommendations_section(text_input, current_doc, current_metrics, text_type, lang_code, t):
    """
    Función principal para mostrar la sección de recomendaciones en la interfaz.
    
    Reemplaza a la función display_recommendations_with_actions anterior.
    """
    # Subtabs para diferentes tipos de recomendaciones
    subtab1, subtab2 = st.tabs(["Diagnóstico", "Recomendaciones"])
    
    # Tab de diagnóstico (mantener el radar chart existente)
    with subtab1:
        display_diagnosis(
            metrics=current_metrics,
            text_type=text_type
        )
    
    # Tab de recomendaciones personalizadas por Claude
    with subtab2:
        display_personalized_recommendations(
            text=text_input,
            metrics=current_metrics,
            text_type=text_type,
            lang_code=lang_code,
            t=t
        )