Spaces:
Sleeping
Sleeping
import os | |
# Redirigir cach茅 de Hugging Face a un directorio temporal para evitar errores de permisos | |
os.environ["HF_HOME"] = "/tmp/hfcache" | |
os.environ["TRANSFORMERS_CACHE"] = "/tmp/hfcache" | |
os.makedirs("/tmp/hfcache", exist_ok=True) | |
from fastapi import FastAPI, Request | |
from pydantic import BaseModel | |
from typing import List, Optional, Dict | |
from transformers import pipeline | |
import json | |
import re | |
app = FastAPI(title="Trivia y Consultas IA generativa ligera") | |
# Cambia aqu铆 el modelo y tokens para pruebas r谩pidas | |
generator = pipeline( | |
"text-generation", | |
model="distilgpt2", # Modelo m谩s peque帽o y r谩pido para pruebas | |
max_new_tokens=50, # Menos tokens para responder m谩s r谩pido | |
do_sample=True, | |
temperature=0.9 | |
) | |
# Modelo de moderaci贸n peque帽o (toxicidad) | |
moderator = pipeline( | |
"text-classification", | |
model="unitary/toxic-bert" | |
) | |
class TriviaResponse(BaseModel): | |
pregunta: str | |
opciones: List[str] | |
respuesta_correcta: int | |
explicacion: str | |
class CompecomRequest(BaseModel): | |
pregunta: str | |
historial: Optional[List[Dict[str, str]]] = None # Para contexto conversacional | |
class CompecomResponse(BaseModel): | |
respuesta: str | |
moderado: Optional[bool] = True | |
moderacion: Optional[str] = None | |
async def trivia(request: Request): | |
print("Solicitud recibida en /trivia") # Log para depuraci贸n | |
try: | |
body = await request.json() | |
tema = body.get("tema", "competencia econ贸mica") | |
except Exception: | |
tema = "competencia econ贸mica" | |
prompt = ( | |
f"Genera una trivia de opci贸n m煤ltiple de 4 opciones sobre el tema '{tema}'. " | |
"Devuelve SOLO el JSON, SIN ning煤n texto extra. Ejemplo:\n" | |
'{"pregunta": "驴Qu茅 es un monopolio?", "opciones": ["Una sola empresa controla el mercado", "Muchas empresas compiten", "El Estado regula todo", "No hay empresas"], "respuesta_correcta": 0, "explicacion": "Un monopolio ocurre cuando una sola empresa domina el mercado."}\n' | |
"La pregunta debe ser clara, las opciones concisas y la explicaci贸n breve. Recuerda: SOLO el JSON." | |
) | |
for _ in range(3): | |
print("Enviando prompt al modelo generativo...") # Log para depuraci贸n | |
output = generator(prompt)[0]['generated_text'] | |
print("Respuesta recibida del modelo generativo.") # Log para depuraci贸n | |
match = re.search(r"\{.*\}", output, re.DOTALL) | |
if not match: | |
continue | |
try: | |
trivia_data = json.loads(match.group(0)) | |
# Validaciones robustas | |
if not all(k in trivia_data for k in ("pregunta", "opciones", "respuesta_correcta", "explicacion")): | |
continue | |
if not isinstance(trivia_data["opciones"], list) or len(trivia_data["opciones"]) != 4: | |
continue | |
if not isinstance(trivia_data["respuesta_correcta"], int) or not (0 <= trivia_data["respuesta_correcta"] < 4): | |
continue | |
mod_result = moderator(trivia_data["pregunta"] + " " + trivia_data["explicacion"]) | |
if any(r["label"] == "TOXIC" and r["score"] > 0.5 for r in mod_result): | |
continue | |
return TriviaResponse(**trivia_data) | |
except Exception as e: | |
print("Error procesando la respuesta del modelo:", e) | |
continue | |
# Fallback robusto si falla todo | |
print("Usando trivia de respaldo") | |
return TriviaResponse( | |
pregunta="驴Qu茅 es un monopolio?", | |
opciones=[ | |
"Una sola empresa controla el mercado.", | |
"Muchas empresas compiten.", | |
"El Estado regula todo.", | |
"No hay empresas." | |
], | |
respuesta_correcta=0, | |
explicacion="Un monopolio ocurre cuando una sola empresa domina el mercado." | |
) | |
async def compecom(req: CompecomRequest): | |
print("Solicitud recibida en /compecom") # Log para depuraci贸n | |
historial = req.historial or [] | |
historial_texto = "" | |
if historial: | |
for turno in historial: | |
preg = turno.get("pregunta", "") | |
resp = turno.get("respuesta", "") | |
if preg and resp: | |
historial_texto += f"Pregunta: {preg}\nRespuesta: {resp}\n" | |
prompt = ( | |
"Eres un experto en competencia econ贸mica, monopolios y el Plan de la Patria en Venezuela. " | |
"Responde de forma breve y clara.\n" | |
f"{historial_texto}Pregunta: {req.pregunta}\nRespuesta:" | |
) | |
for _ in range(2): | |
print("Enviando prompt a modelo generativo para consulta...") # Log | |
output = generator(prompt)[0]['generated_text'] | |
print("Respuesta recibida del modelo generativo para consulta.") # Log | |
respuesta = output.strip() | |
if not respuesta or len(respuesta) < 5: | |
continue | |
mod_result = moderator(respuesta) | |
if any(r["label"] == "TOXIC" and r["score"] > 0.5 for r in mod_result): | |
continue | |
return CompecomResponse( | |
respuesta=respuesta, | |
moderado=True, | |
moderacion="SAFE" | |
) | |
# Fallback claro | |
print("Usando respuesta de respaldo para consulta") | |
return CompecomResponse( | |
respuesta="No se pudo generar una respuesta en este momento. Por favor, intenta de nuevo.", | |
moderado=False, | |
moderacion="TOXIC" | |
) | |
def root(): | |
return {"status": "ok", "message": "Trivia y COMPECOM IA generativa lista"} |