SantosPatazca
primer despliegue FastAPI con Docker
c71e312
import os
import google.generativeai as genai
from dotenv import load_dotenv
# Cargar variables desde .env
load_dotenv()
class TextGenerationService:
def __init__(self, model="gemini-1.5-flash"):
self.model_name = model
api_key = os.getenv("GEMINI_API_KEY")
if not api_key:
raise ValueError("GEMINI_API_KEY no encontrada en variables de entorno")
genai.configure(api_key=api_key)
# Usar modelo sin configuración fija para permitir ajustes dinámicos
self.model = genai.GenerativeModel(model)
def generate_structured_feedback(self, transcription: str, emotion: str, confidence: float, anxiety: float) -> tuple[str, str, str, str, str]:
# Contexto base con información de la presentación
context = (
f"ANÁLISIS DE PRESENTACIÓN ACADÉMICA\n"
f"====================================\n"
f"Transcripción: \"{transcription}\"\n\n"
f"Métricas detectadas:\n"
f"- Emoción dominante: {emotion}\n"
f"- Nivel de confianza: {int(confidence * 100)}%\n"
f"- Nivel de ansiedad: {int(anxiety * 100)}%\n"
)
def ask(prompt: str) -> str:
try:
# Crear el prompt completo con contexto
full_prompt = f"""Eres un experto en análisis de presentaciones académicas.
{context}
{prompt}
IMPORTANTE: Responde en máximo 60 palabras, de forma directa y profesional, sin usar comillas dobles."""
# Configuración dinámica como sugiere GPT
response = self.model.generate_content(
full_prompt,
generation_config={
"temperature": 0.7,
"max_output_tokens": 100
}
)
# Limpiar caracteres de escape y limitaciones
clean_text = response.text.strip().replace('\\"', '"').replace('\\n', ' ')
# Limitar palabras si es muy largo
words = clean_text.split()
if len(words) > 60:
clean_text = ' '.join(words[:60]) + "..."
return clean_text
except Exception as e:
print(f"Error al generar feedback con Gemini: {e}")
return f"Error al generar análisis. Verifique la configuración de la API."
# Pedir feedback por secciones con prompts más específicos
general = ask("Analiza brevemente la presentación general: fortalezas principales y área de mejora más importante.")
language = ask("Evalúa el lenguaje: ¿es académico o informal? Menciona 2 mejoras específicas para el vocabulario.")
confidence_fb = ask("¿Cómo se percibe la confianza del orador? Analiza el tono y seguridad proyectada.")
anxiety_fb = ask("¿Se detecta ansiedad? Proporciona 2 técnicas específicas para reducirla.")
suggestions = ask("Lista exactamente 3 mejoras concretas y accionables para futuras presentaciones.")
return general, language, confidence_fb, anxiety_fb, suggestions