feat: Agrega primera version de template (revisar archivo de documentacion - docs.md)

This commit is contained in:
Francisco Pineda
2026-03-15 08:44:25 +01:00
parent d433942981
commit 4d6152a9fe
45 changed files with 1151 additions and 0 deletions

View File

@@ -0,0 +1,163 @@
"""
Gateway de IA de Qualidot - Módulo de Adaptadores de Transcripción
Propósito:
Este módulo contiene funciones de adaptadores que permiten transcribir audio usando diferentes proveedores de IA.
Cada función de adaptador se encarga de interactuar con un proveedor específico (como OpenAI, AssemblyAI, Deepgram, etc.)
y de convertir la respuesta del proveedor al formato estándar de transcripción de Qualidot.
"""
import tempfile
import os
from fastapi import HTTPException
from openai import OpenAI, AsyncOpenAI
import assemblyai as aai
from app.core.config import settings
from app.schemas.audio_standard import AudioRequestFile
from app.schemas.audio_standard import StandardTranscriptionResult
from app.utilities.audio_utilities import validate_audio_file, validate_audio_size, validate_audio_request
from app.core import config
# Función de adaptador principal que infiere el proveedor y llama al adaptador específico
async def transcribe_audio_with_provider(audio_request: AudioRequestFile) -> StandardTranscriptionResult:
"""
Función de adaptador para transcribir audio usando el proveedor de IA configurado.
"""
provider = audio_request.provider.lower()
match provider:
case "openai":
return await transcribe_with_openai(audio_request)
case "assemblyai":
return await transcribe_with_assemblyai(audio_request)
case _:
raise ValueError(f"Proveedor de IA no soportado: {audio_request.provider}")
# Función de adaptador para transcribir audio usando OpenAI
async def transcribe_with_openai(audio_request: AudioRequestFile) -> StandardTranscriptionResult:
"""
Función de adaptador para transcribir audio usando OpenAI.
"""
client = AsyncOpenAI(api_key=settings.OPENAI_API_KEY)
audio_content = await audio_request.file.read()
temp_audio_path = None # Inicializamos la variable fuera del try
# Validar el audio antes de continuar
validate_audio_request(audio_request, audio_content)
try:
# Crear archivo temporal para el audio
with tempfile.NamedTemporaryFile(
delete=False,
suffix=os.path.splitext(audio_request.file.filename)[1]
) as temp_audio:
temp_audio.write(audio_content)
temp_audio_path = temp_audio.name
with open(temp_audio_path, "rb") as audio_file_obj:
transcription = await client.audio.transcriptions.create(
model=audio_request.model,
file=audio_file_obj,
response_format="text"
)
result = StandardTranscriptionResult(
status="success",
original_filename=audio_request.file.filename,
full_transcript=transcription,
model_used=audio_request.model,
provider_used="OpenAI",
confidence_score=None
)
return result
except Exception as e:
# Capturamos cualquier error de OpenAI o de lectura de archivos
raise HTTPException(
status_code=500,
detail=f"Error transcribiendo el audio: {str(e)}"
)
finally:
if temp_audio_path and os.path.exists(temp_audio_path):
try:
os.unlink(temp_audio_path)
except Exception:
pass
# Función de adaptador para transcribir audio usando AssemblyAI
async def transcribe_with_assemblyai(audio_request: AudioRequestFile) -> StandardTranscriptionResult:
"""
Función de adaptador para transcribir audio usando AssemblyAI.
"""
aai.settings.api_key = settings.ASSEMBLYAI_API_KEY
audio_content = await audio_request.file.read()
temp_audio_path = None
# Validar el audio antes de continuar
validate_audio_request(audio_request, audio_content)
try:
# Crear archivo temporal para el audio
with tempfile.NamedTemporaryFile(
delete=False,
suffix=os.path.splitext(audio_request.file.filename)[1]
) as temp_audio:
temp_audio.write(audio_content)
temp_audio_path = temp_audio.name
#Definimos el modelo a usar
config = aai.TranscriptionConfig(language_code="es", speaker_labels=audio_request.diarization,
sentiment_analysis=audio_request.sentiment)
transcription_obj = aai.Transcriber(config=config).transcribe(temp_audio_path)
iterable = transcription_obj.sentiment_analysis if audio_request.sentiment else transcription_obj.utterances
if transcription_obj.status == aai.TranscriptStatus.error:
raise Exception(f"AssemblyAI Error: {transcription_obj.error}")
assemblyaiSegment = "utterances" if not audio_request.sentiment else "sentiment_analysis"
result = StandardTranscriptionResult(
status="success",
original_filename=audio_request.file.filename,
full_transcript=transcription_obj.text,
model_used=audio_request.model,
provider_used="AssemblyAI",
confidence_score=None,
segments=[
{
"text": segment.text,
"speaker": segment.speaker if audio_request.diarization else None,
"start_time": segment.start if audio_request.timestamps else None,
"end_time": segment.end if audio_request.timestamps else None,
"sentiment": segment.sentiment if audio_request.sentiment else None
}
for segment in iterable
] if (audio_request.diarization or audio_request.timestamps or audio_request.sentiment) else None
)
return result
except Exception as e:
# Capturamos cualquier error de OpenAI o de lectura de archivos
raise HTTPException(
status_code=500,
detail=f"Error transcribiendo el audio: {str(e)}"
)
finally:
if temp_audio_path and os.path.exists(temp_audio_path):
try:
os.unlink(temp_audio_path)
except Exception:
pass
# Aquí iría la implementación específica para AssemblyAI, similar a la de OpenAI pero usando su SDK y formato de respuesta
pass

View File

@@ -0,0 +1,68 @@
"""
Gateway de IA de Qualidot - Módulo de Adaptadores de Evaluación de Imágenes
Propósito:
Este módulo contiene funciones de adaptadores que permiten evaluar imágenes usando diferentes proveedores de IA.
Cada función de adaptador se encarga de interactuar con un proveedor específico (como OpenAI, AssemblyAI, Deepgram, etc.)
y de convertir la respuesta del proveedor al formato estándar de evaluación de imágenes de Qualidot.
"""
import tempfile
import os
from fastapi import HTTPException
from openai import OpenAI, AsyncOpenAI
import assemblyai as aai
from app.core.config import settings
from app.schemas.image_standard import ImageRequestFile, StandardImageAnalysisResult
from app.core import config
# Función de adaptador principal que infiere el proveedor y llama al adaptador específico
async def evaluate_image_with_provider(image_request: ImageRequestFile) -> StandardImageAnalysisResult:
"""
Función de adaptador para evaluar imágenes usando el proveedor de IA configurado.
"""
provider = image_request.provider.lower()
match provider:
case "openai":
return await evaluate_with_openai(image_request)
case "inserte nombre de otra ia aqui":
return await evaluate_with_ai_model2(image_request)
# AGREGAR OTROS CASOS PARA DIFERENTES PROVEEDORES DE IA AQUÍ
case _:
raise ValueError(f"Proveedor de IA no soportado: {image_request.provider}")
# Función de adaptador para evaluar imágenes usando OpenAI
async def evaluate_with_openai(image_request: ImageRequestFile) -> StandardImageAnalysisResult:
"""
Función de adaptador para evaluar imágenes usando OpenAI.
(Plantilla para futuras implementaciones)
"""
client = AsyncOpenAI(api_key=settings.OPENAI_API_KEY)
# PASOS A SEGUIR PARA IMPLEMENTAR LA LÓGICA DE EVALUACIÓN CON OPENAI:
# 1. Validar la imagen de entrada (tamaño, formato, etc.)
# 2. Configurar el cliente de OpenAI con la clave API
# 3. Llamar a la API de OpenAI para evaluar la imagen
# 4. Convertir la respuesta de OpenAI al formato estándar de evaluación de imágenes de Qualidot
# 5. Manejar errores y excepciones adecuadamente
raise NotImplementedError("La función evaluate_with_openai aún no está implementada.")
async def evaluate_with_ai_model2(image_request: ImageRequestFile) -> StandardImageAnalysisResult:
"""
Función de adaptador para transcribir video usando otra AI.
(Plantilla para futuras implementaciones)
"""
# PASOS A SEGUIR PARA IMPLEMENTAR LA LÓGICA DE TRANSCRIPCIÓN CON IA (ELEGIR MODELO):
# 1. Validar el video de entrada (tamaño, formato, etc.)
# 2. Configurar el cliente de OpenAI con la clave API
# 3. Llamar a la API de OpenAI para transcribir el video
# 4. Convertir la respuesta de OpenAI al formato estándar de resumen de texto de Qualidot
# 5. Manejar errores y excepciones adecuadamente
raise NotImplementedError("La función transcribe_with_ai_model2 aún no está implementada.")
# Otros modelos de IA

View File

@@ -0,0 +1,50 @@
"""
Gateway de IA de Qualidot - Módulo de Adaptadores de Resumen de Texto
Propósito:
Este módulo contiene funciones de adaptadores que permiten resumir texto usando diferentes proveedores de IA.
Cada función de adaptador se encarga de interactuar con un proveedor específico (como OpenAI, AssemblyAI, Deepgram, etc.)
y de convertir la respuesta del proveedor al formato estándar de resumen de texto de Qualidot.
"""
import tempfile
import os
from fastapi import HTTPException
from openai import OpenAI, AsyncOpenAI
import assemblyai as aai
from app.core.config import settings
from app.schemas.text_standard import TextRequestFile, StandardTextAnalysisResult
from app.core import config
# Función de adaptador principal que infiere el proveedor y llama al adaptador específico
async def evaluate_text_with_provider(text_request: TextRequestFile) -> StandardTextAnalysisResult:
"""
Función de adaptador para evaluar texto usando el proveedor de IA configurado.
"""
provider = text_request.provider.lower()
match provider:
case "openai":
return await evaluate_with_openai(text_request)
# AGREGAR OTROS CASOS PARA DIFERENTES PROVEEDORES DE IA AQUÍ
case _:
raise ValueError(f"Proveedor de IA no soportado: {text_request.provider}")
# Función de adaptador para evaluar texto usando OpenAI
async def evaluate_with_openai(text_request: TextRequestFile) -> StandardTextAnalysisResult:
"""
Función de adaptador para evaluar texto usando OpenAI.
(Plantilla para futuras implementaciones)
"""
client = AsyncOpenAI(api_key=settings.OPENAI_API_KEY)
# PASOS A SEGUIR PARA IMPLEMENTAR LA LÓGICA DE EVALUACIÓN CON OPENAI:
# 1. Validar el texto de entrada (tamaño, formato, etc.)
# 2. Configurar el cliente de OpenAI con la clave API
# 3. Llamar a la API de OpenAI para evaluar el texto
# 4. Convertir la respuesta de OpenAI al formato estándar de evaluación de texto de Qualidot
# 5. Manejar errores y excepciones adecuadamente
raise NotImplementedError("La función evaluate_with_openai aún no está implementada.")
# Otros modelos de IA

View File

@@ -0,0 +1,50 @@
"""
Gateway de IA de Qualidot - Módulo de Adaptadores de Resumen de Texto
Propósito:
Este módulo contiene funciones de adaptadores que permiten resumir texto usando diferentes proveedores de IA.
Cada función de adaptador se encarga de interactuar con un proveedor específico (como OpenAI, AssemblyAI, Deepgram, etc.)
y de convertir la respuesta del proveedor al formato estándar de resumen de texto de Qualidot.
"""
import tempfile
import os
from fastapi import HTTPException
from openai import OpenAI, AsyncOpenAI
import assemblyai as aai
from app.core.config import settings
from app.schemas.text_standard import TextRequestFile, StandardTextAnalysisResult
from app.core import config
# Función de adaptador principal que infiere el proveedor y llama al adaptador específico
async def summarize_text_with_provider(text_request: TextRequestFile) -> StandardTextAnalysisResult:
"""
Función de adaptador para resumir texto usando el proveedor de IA configurado.
"""
provider = text_request.provider.lower()
match provider:
case "openai":
return await summarize_with_openai(text_request)
# AGREGAR OTROS CASOS PARA DIFERENTES PROVEEDORES DE IA AQUÍ
case _:
raise ValueError(f"Proveedor de IA no soportado: {text_request.provider}")
# Función de adaptador para resumir texto usando OpenAI
async def summarize_with_openai(text_request: TextRequestFile) -> StandardTextAnalysisResult:
"""
Función de adaptador para resumir texto usando OpenAI.
(Plantilla para futuras implementaciones)
"""
client = AsyncOpenAI(api_key=settings.OPENAI_API_KEY)
# PASOS A SEGUIR PARA IMPLEMENTAR LA LÓGICA DE RESUMEN CON OPENAI:
# 1. Validar el texto de entrada (tamaño, formato, etc.)
# 2. Configurar el cliente de OpenAI con la clave API
# 3. Llamar a la API de OpenAI para resumir el texto
# 4. Convertir la respuesta de OpenAI al formato estándar de resumen de texto de Qualidot
# 5. Manejar errores y excepciones adecuadamente
raise NotImplementedError("La función summarize_with_openai aún no está implementada.")
# Otros modelos de IA

View File

@@ -0,0 +1,67 @@
"""
Gateway de IA de Qualidot - Módulo de Adaptadores de Transcripción de Video
Propósito:
Este módulo contiene funciones de adaptadores que permiten resumir texto usando diferentes proveedores de IA.
Cada función de adaptador se encarga de interactuar con un proveedor específico (como OpenAI, AssemblyAI, Deepgram, etc.)
y de convertir la respuesta del proveedor al formato estándar de resumen de texto de Qualidot.
"""
import tempfile
import os
from fastapi import HTTPException
from openai import OpenAI, AsyncOpenAI
import assemblyai as aai
from app.core.config import settings
from app.schemas.video_standard import VideoRequestFile, StandardTranscriptionResult
from app.core import config
# Función de adaptador principal que infiere el proveedor y llama al adaptador específico
async def transcribe_video_with_provider(video_request: VideoRequestFile) -> StandardTranscriptionResult:
"""
Función de adaptador para transcribir video usando el proveedor de IA configurado.
"""
provider = video_request.provider.lower()
match provider:
case "nombre de la ia 1 aqui":
return await transcribe_with_ai_model1(video_request)
case "nombre de la ia 2 aqui":
return await transcribe_with_ai_model2(video_request)
# AGREGAR OTROS CASOS PARA DIFERENTES PROVEEDORES DE IA AQUÍ
case _:
raise ValueError(f"Proveedor de IA no soportado: {video_request.provider}")
# Función de adaptador para transcribir video usando OpenAI
async def transcribe_with_ai_model1(video_request: VideoRequestFile) -> StandardTranscriptionResult:
"""
Función de adaptador para transcribir video usando OpenAI.
(Plantilla para futuras implementaciones)
"""
# PASOS A SEGUIR PARA IMPLEMENTAR LA LÓGICA DE TRANSCRIPCIÓN CON IA (ELEGIR MODELO):
# 1. Validar el video de entrada (tamaño, formato, etc.)
# 2. Configurar el cliente de OpenAI con la clave API
# 3. Llamar a la API de OpenAI para transcribir el video
# 4. Convertir la respuesta de OpenAI al formato estándar de resumen de texto de Qualidot
# 5. Manejar errores y excepciones adecuadamente
raise NotImplementedError("La función transcribe_with_ai_model1 aún no está implementada.")
async def transcribe_with_ai_model2(video_request: VideoRequestFile) -> StandardTranscriptionResult:
"""
Función de adaptador para transcribir video usando OpenAI.
(Plantilla para futuras implementaciones)
"""
# PASOS A SEGUIR PARA IMPLEMENTAR LA LÓGICA DE TRANSCRIPCIÓN CON IA (ELEGIR MODELO):
# 1. Validar el video de entrada (tamaño, formato, etc.)
# 2. Configurar el cliente de OpenAI con la clave API
# 3. Llamar a la API de OpenAI para transcribir el video
# 4. Convertir la respuesta de OpenAI al formato estándar de resumen de texto de Qualidot
# 5. Manejar errores y excepciones adecuadamente
raise NotImplementedError("La función transcribe_with_ai_model2 aún no está implementada.")
# Otros modelos de IA