| | 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 |
| | } |
| |
|