|
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 |
|
""" |
|
|
|
text_type_names = { |
|
'academic_article': 'artículo académico', |
|
'student_essay': 'trabajo universitario', |
|
'general_communication': 'comunicación general' |
|
} |
|
|
|
|
|
areas = ['vocabulary', 'structure', 'cohesion', 'clarity'] |
|
scores = {area: metrics[area]['normalized_score'] for area in areas} |
|
weak_areas = sorted(areas, key=lambda x: scores[x]) |
|
|
|
|
|
try: |
|
client = anthropic.Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) |
|
|
|
|
|
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. |
|
""" |
|
|
|
|
|
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} |
|
] |
|
) |
|
|
|
|
|
return message.content[0].text |
|
|
|
except Exception as e: |
|
logger.error(f"Error generando recomendaciones con Claude: {str(e)}") |
|
|
|
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") |
|
|
|
|
|
recommendations_key = f"claude_recommendations_{text_type}" |
|
|
|
|
|
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 |
|
|
|
|
|
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 |
|
) |
|
|
|
|
|
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.") |
|
|
|
|
|
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. |
|
""" |
|
|
|
subtab1, subtab2 = st.tabs(["Diagnóstico", "Recomendaciones"]) |
|
|
|
|
|
with subtab1: |
|
display_diagnosis( |
|
metrics=current_metrics, |
|
text_type=text_type |
|
) |
|
|
|
|
|
with subtab2: |
|
display_personalized_recommendations( |
|
text=text_input, |
|
metrics=current_metrics, |
|
text_type=text_type, |
|
lang_code=lang_code, |
|
t=t |
|
) |