Spaces:
Running
Running
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 | |
) |