v3 / modules /studentact /claude_recommendations.py
AIdeaText's picture
Create claude_recommendations.py
2ecf95c verified
raw
history blame
6.45 kB
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
)