Módulo de audio y avance imágenes (schemas y openAI)

This commit is contained in:
lansan69
2026-03-31 02:25:58 -06:00
parent 4d6152a9fe
commit fc25a47f04
37 changed files with 538 additions and 82 deletions

View File

@@ -14,28 +14,22 @@ Pendiente (recomendación personal):
- Delimitar los proveedores de IA soportados inicialmente
"""
from dataclasses import dataclass
from fastapi import UploadFile
from fastapi.params import File, Form
from pydantic import BaseModel, Field
from typing import List, Optional
@dataclass
class AudioRequestFile:
"""Modelo de solicitud para transcripción de audio."""
def __init__(
self,
file: UploadFile = File(..., description="Archivo de audio a procesar (ej. mp3, wav)"),
provider: str = Form(..., description="Proveedor de IA a utilizar (ej. openai, assemblyai)"),
model: str = Form(..., description="Modelo de IA a utilizar (ej. whisper-1)"),
diarization: Optional[bool] = Form(False, description="Activa la separación e identificación de múltiples hablantes"),
timestamps: Optional[bool] = Form(False, description="Activa las marcas de tiempo exactas por cada segmento hablado"),
sentiment: Optional[bool] = Form(False, description="Activa el análisis de sentimiento (POSITIVO/NEGATIVO) por segmento")
):
self.file = file
self.provider = provider
self.model = model
self.diarization = diarization
self.timestamps = timestamps
self.sentiment = sentiment
file: UploadFile = File(..., description="Archivo de audio a procesar (ej. mp3, wav)")
provider: str = Form(..., description="Proveedor de IA a utilizar (ej. openai, assemblyai)")
model: str = Form(..., description="Modelo de IA a utilizar (ej. whisper-1)")
diarization: Optional[bool] = Form(False, description="Activa la separación e identificación de múltiples hablantes")
timestamps: Optional[bool] = Form(False, description="Activa las marcas de tiempo exactas por cada segmento hablado")
sentiment: Optional[bool] = Form(False, description="Activa el análisis de sentimiento (POSITIVO/NEGATIVO) por segmento")
class TranscriptionSegment(BaseModel):
"""Modelo que representa un segmento de transcripción de audio detallado."""

View File

@@ -9,36 +9,44 @@ Homologación:
Garantiza que el resultado del análisis de imágenes 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 ImageEvaluationCriteria(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["ImageEvaluationCriteria"]] = Field(None, description="Lista de subcriterios de evaluación")
class ImageEvaluationRubric(BaseModel):
"""Modelo que representa una rúbrica de evaluación personalizada para análisis de imágenes."""
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[ImageEvaluationCriteria] = Field(None, description="Lista de criterios de evaluación específicos")
@dataclass
class ImageRequestFile:
"""Modelo de solicitud para análisis de imágenes."""
def __init__(
self,
file: UploadFile = File(..., description="Archivo de imagen a procesar (ej. jpg, png)"),
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: Optional[str] = Form(None, description="Rúbrica de evaluación personalizada para el análisis")
):
self.file = file
self.provider = provider
self.model = model
self.rubric = rubric
file: UploadFile = File(..., description="Archivo de imagen a procesar (ej. jpg, png)")
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 StandardImageAnalysisResult(BaseModel):
"""Modelo que representa el resultado estándar de un análisis de imágenes para Qualidot."""
status: str = Field(
...,
description="Estado del análisis (ej. 'success', 'error')"
)
analysis: Optional[dict] = Field(
None,
description="Resultados detallados del análisis de la imagen, estructurados según la rúbrica si se proporcionó"
)
error: Optional[str] = Field(
None,
description="Mensaje de error en caso de que el análisis haya fallado"
)
status: str = Field(..., description="Estado del análisis (ej. 'success', 'error')")
original_filename: str = Field(..., description="Nombre original del archivo de imagen procesada")
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 a la imagen 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[ImageEvaluationCriteria] = Field(None, description="Lista de criterios de evaluación detallados con sus respectivas puntuaciones y descripciones")