import os, json from fastapi import FastAPI from pydantic import BaseModel from huggingface_hub import hf_hub_download from llama_cpp import Llama app = FastAPI() # --- CONFIGURA ESTO --- MODEL_REPO = "TheBloke/TinyLlama-1.1B-Chat-v0.3-GGUF" # ejemplo MODEL_FILE = "tinyllama-1.1b-chat-v0.3.Q4_K_M.gguf" # ejemplo exacto del repo # ----------------------- MODEL_PATH = f"/dev/shm/{MODEL_FILE}" # Descargar a RAM si no existe if not os.path.exists(MODEL_PATH): print("Descargando modelo a /dev/shm (RAM)...") # Si necesita token: use_auth_token=os.getenv("HF_TOKEN") hf_hub_download(repo_id=MODEL_REPO, filename=MODEL_FILE, local_dir="/dev/shm") print("Cargando modelo en RAM (llama_cpp)...") llm = Llama(model_path=MODEL_PATH, n_ctx=2048, n_threads=4) # Cargar himnos.jsonl en RAM HIMNOS = {} with open("himnos.jsonl", "r", encoding="utf-8") as f: for line in f: item = json.loads(line) HIMNOS[int(item["id"])] = item class ExplainRequest(BaseModel): id: int @app.post("/explicar") def explicar(req: ExplainRequest): himno = HIMNOS.get(req.id) if not himno: return {"error": "Himno no encontrado", "id": req.id} prompt = f"""Eres un asistente cristiano que explica himnos de forma breve y devocional. Himno #{himno['id']} Título: {himno['titulo']} Letra: {himno['letra']} Explica brevemente: - Mensaje principal - Aplicación práctica (1–2 frases) - Versículos relacionados (si procede) """ out = llm(prompt, max_tokens=300, temperature=0.7) texto = out["choices"][0]["text"].strip() return { "id": himno["id"], "titulo": himno["titulo"], "explicacion": texto }