""" Esquema de resultado esperado de modelos de análisis de documentos. Propósito: Define el formato estándar de los resultados devueltos por los modelos de análisis de documentos, independientemente del proveedor de IA utilizado. Homologación: Garantiza que el resultado del análisis de documentos siempre se entregue en el mismo formato estándar para Qualidot. """ from dataclasses import dataclass from fastapi import UploadFile from fastapi.params import File, Form from pydantic import BaseModel, Field from typing import List, Optional class DocumentEvaluationCriteria(BaseModel): """Modelo que representa un criterio de evaluación específico dentro de una rúbrica de análisis de imágenes.""" name: str = Field(..., description="Nombre del criterio de evaluación") description: str = Field(None, description="Descripción detallada del criterio") score: float = Field(None, description="Puntuación asignada al criterio después del análisis") subcriteria: Optional[List["DocumentEvaluationCriteria"]] = Field(None, description="Lista de subcriterios de evaluación") class DocumentEvaluationRubric(BaseModel): """Modelo que representa una rúbrica de evaluación personalizada para análisis de documentos.""" name: str = Field(..., description="Nombre de la rúbrica de evaluación") description: str = Field(None, description="Descripción detallada de la rúbrica") category: Optional[str] = Field( None, description="Contexto jerárquico de la categoría para especializar a la IA (ej. Audio > Education > English > B2)" ) criteria: List[DocumentEvaluationCriteria] = Field(None, description="Lista de criterios de evaluación específicos") @dataclass class DocumentRequestFile: """Modelo de solicitud para análisis de documentos.""" file: UploadFile = File(..., description="Archivo de documento a procesar (ej. pdf, docx)") provider: str = Form(..., description="Proveedor de IA a utilizar (ej. openai, google)") model: str = Form(..., description="Modelo de IA a utilizar (ej. vision-1)") rubric: UploadFile = File(..., description="Archivo JSON de evaluación") class StandardDocumentAnalysisResult(BaseModel): """Modelo que representa el resultado estándar de un análisis de documentos para Qualidot.""" status: str = Field(..., description="Estado del análisis (ej. 'success', 'error')") original_filename: str = Field(..., description="Nombre original del archivo de documento procesado") provider_used: str = Field(..., description="Proveedor de IA utilizado para el análisis (ej. 'OpenAI')") model_used: str = Field(..., description="Modelo específico utilizado para el análisis (ej. 'vision-1')") score: float = Field(None, description="Puntuación general asignada al documento después del análisis") feedback: str = Field(None, description="Comentarios o retroalimentación generada por el modelo de IA sobre el documento") detailed_criteria: List[DocumentEvaluationCriteria] = Field(None, description="Lista de criterios de evaluación detallados con sus respectivas puntuaciones y descripciones") class StandardDocumentAnalysis(BaseModel): """Modelo que representa el resultado estándar de un análisis de documentos para Qualidot.""" score: float = Field(None, description="Puntuación general asignada al documento después del análisis") feedback: str = Field(None, description="Comentarios o retroalimentación generada por el modelo de IA sobre la imagen") detailed_criteria: List[DocumentEvaluationCriteria] = Field(None, description="Lista de criterios de evaluación detallados con sus respectivas puntuaciones y descripciones")