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
) |