|
|
|
from datetime import datetime, timezone, timedelta |
|
import logging |
|
from .mongo_db import get_collection |
|
|
|
logger = logging.getLogger(__name__) |
|
COLLECTION_NAME = 'student_claude_recommendations' |
|
|
|
def store_claude_recommendation(username, text, metrics, text_type, recommendations): |
|
""" |
|
Guarda las recomendaciones generadas por Claude AI. |
|
|
|
Args: |
|
username: Nombre del usuario |
|
text: Texto analizado |
|
metrics: M茅tricas del an谩lisis |
|
text_type: Tipo de texto (academic_article, university_work, general_communication) |
|
recommendations: Recomendaciones generadas por Claude |
|
|
|
Returns: |
|
bool: True si se guard贸 correctamente, False en caso contrario |
|
""" |
|
try: |
|
|
|
if not all([username, text, recommendations]): |
|
logger.error("Faltan par谩metros requeridos para guardar recomendaciones de Claude") |
|
return False |
|
|
|
collection = get_collection(COLLECTION_NAME) |
|
if collection is None: |
|
logger.error("No se pudo obtener la colecci贸n de recomendaciones de Claude") |
|
return False |
|
|
|
|
|
document = { |
|
'username': username, |
|
'timestamp': datetime.now(timezone.utc).isoformat(), |
|
'text': text, |
|
'metrics': metrics or {}, |
|
'text_type': text_type, |
|
'recommendations': recommendations, |
|
'analysis_type': 'claude_recommendation' |
|
} |
|
|
|
|
|
result = collection.insert_one(document) |
|
if result.inserted_id: |
|
logger.info(f""" |
|
Recomendaciones de Claude guardadas: |
|
- Usuario: {username} |
|
- ID: {result.inserted_id} |
|
- Tipo de texto: {text_type} |
|
- Longitud del texto: {len(text)} |
|
""") |
|
|
|
|
|
storage_verified = verify_recommendation_storage(username) |
|
if not storage_verified: |
|
logger.warning("Verificaci贸n de almacenamiento de recomendaciones fall贸") |
|
|
|
return True |
|
|
|
logger.error("No se pudo insertar el documento de recomendaciones") |
|
return False |
|
|
|
except Exception as e: |
|
logger.error(f"Error guardando recomendaciones de Claude: {str(e)}") |
|
return False |
|
|
|
def verify_recommendation_storage(username): |
|
""" |
|
Verifica que las recomendaciones se est谩n guardando correctamente. |
|
|
|
Args: |
|
username: Nombre del usuario |
|
|
|
Returns: |
|
bool: True si la verificaci贸n es exitosa, False en caso contrario |
|
""" |
|
try: |
|
collection = get_collection(COLLECTION_NAME) |
|
if collection is None: |
|
logger.error("No se pudo obtener la colecci贸n para verificaci贸n de recomendaciones") |
|
return False |
|
|
|
|
|
timestamp_threshold = (datetime.now(timezone.utc) - timedelta(minutes=5)).isoformat() |
|
recent_docs = collection.find({ |
|
'username': username, |
|
'timestamp': {'$gte': timestamp_threshold} |
|
}).sort('timestamp', -1).limit(1) |
|
|
|
docs = list(recent_docs) |
|
if docs: |
|
logger.info(f""" |
|
脷ltimo documento de recomendaciones guardado: |
|
- ID: {docs[0]['_id']} |
|
- Timestamp: {docs[0]['timestamp']} |
|
- Tipo de texto: {docs[0].get('text_type', 'N/A')} |
|
""") |
|
return True |
|
|
|
logger.warning(f"No se encontraron documentos recientes de recomendaciones para {username}") |
|
return False |
|
|
|
except Exception as e: |
|
logger.error(f"Error verificando almacenamiento de recomendaciones: {str(e)}") |
|
return False |
|
|
|
def get_claude_recommendations(username, limit=10): |
|
""" |
|
Obtiene las recomendaciones m谩s recientes de Claude para un usuario. |
|
|
|
Args: |
|
username: Nombre del usuario |
|
limit: N煤mero m谩ximo de recomendaciones a recuperar |
|
|
|
Returns: |
|
list: Lista de recomendaciones |
|
""" |
|
try: |
|
collection = get_collection(COLLECTION_NAME) |
|
if collection is None: |
|
logger.error("No se pudo obtener la colecci贸n de recomendaciones") |
|
return [] |
|
|
|
results = collection.find( |
|
{'username': username} |
|
).sort('timestamp', -1).limit(limit) |
|
|
|
recommendations = list(results) |
|
logger.info(f"Recuperadas {len(recommendations)} recomendaciones de Claude para {username}") |
|
return recommendations |
|
|
|
except Exception as e: |
|
logger.error(f"Error obteniendo recomendaciones de Claude: {str(e)}") |
|
return [] |