|
|
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() |
|
|
|
|
|
|
|
|
MODEL_REPO = "TheBloke/TinyLlama-1.1B-Chat-v0.3-GGUF" |
|
|
MODEL_FILE = "tinyllama-1.1b-chat-v0.3.Q4_K_M.gguf" |
|
|
|
|
|
|
|
|
MODEL_PATH = f"/dev/shm/{MODEL_FILE}" |
|
|
|
|
|
|
|
|
if not os.path.exists(MODEL_PATH): |
|
|
print("Descargando modelo a /dev/shm (RAM)...") |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
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 |
|
|
} |
|
|
|