milton124 commited on
Commit
64148ba
·
verified ·
1 Parent(s): 05ca4d9

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +40 -58
app.py CHANGED
@@ -1,78 +1,60 @@
 
1
  from fastapi import FastAPI
2
- from fastapi.middleware.cors import CORSMiddleware
3
  from huggingface_hub import hf_hub_download
4
  from llama_cpp import Llama
5
- import json
6
 
7
  app = FastAPI()
8
 
9
- app.add_middleware(
10
- CORSMiddleware,
11
- allow_origins=["*"],
12
- allow_methods=["*"],
13
- allow_headers=["*"],
14
- )
15
 
16
- # --------- Cargar modelo GGUF en RAM ---------
17
 
18
- print("Descargando modelo a RAM...")
19
- model_path = hf_hub_download(
20
- repo_id="second-state/Gemma-2B-Instruct-GGUF",
21
- filename="Gemma-2B-Instruct-Q4_K_M.gguf"
22
- )
23
 
24
- print("Cargando modelo...")
25
- llm = Llama(
26
- model_path=model_path,
27
- n_ctx=2000,
28
- n_threads=4,
29
- use_mlock=True
30
- )
31
 
32
- # --------- Cargar himnos.jsonl ---------
33
- print("Cargando himnos.jsonl...")
34
- HIMNOS = []
35
  with open("himnos.jsonl", "r", encoding="utf-8") as f:
36
  for line in f:
37
- HIMNOS.append(json.loads(line))
 
38
 
 
 
39
 
40
- # ============ ENDPOINT PRINCIPAL =============
 
 
 
 
41
 
42
- @app.post("/predict")
43
- def generar_respuesta(request: dict):
44
- prompt_usuario = request.get("prompt", "")
 
 
45
 
46
- # Pasar al modelo
47
- output = llm(
48
- f"Responde de forma breve y clara al usuario: {prompt_usuario}",
49
- max_tokens=200
50
- )
51
 
52
- texto = output["choices"][0]["text"]
53
-
54
- # Calcular relevancia simple (sin embeddings)
55
- resultados = []
56
- for h in HIMNOS:
57
- titulo = h["titulo"].lower()
58
- texto_prompt = prompt_usuario.lower()
59
-
60
- # coincidencia básica
61
- puntos = 0
62
- for palabra in texto_prompt.split():
63
- if palabra in titulo:
64
- puntos += 1
65
-
66
- resultados.append({
67
- "id": h["id"],
68
- "titulo": h["titulo"],
69
- "relacion": puntos
70
- })
71
-
72
- # ordenar por relación
73
- resultados = sorted(resultados, key=lambda x: -x["relacion"])[:7]
74
 
75
  return {
76
- "respuesta": texto,
77
- "recomendados": resultados
 
78
  }
 
1
+ import os, json
2
  from fastapi import FastAPI
3
+ from pydantic import BaseModel
4
  from huggingface_hub import hf_hub_download
5
  from llama_cpp import Llama
 
6
 
7
  app = FastAPI()
8
 
9
+ # --- CONFIGURA ESTO ---
10
+ MODEL_REPO = "TheBloke/TinyLlama-1.1B-Chat-v0.3-GGUF" # ejemplo
11
+ MODEL_FILE = "tinyllama-1.1b-chat-v0.3.Q4_K_M.gguf" # ejemplo exacto del repo
12
+ # -----------------------
 
 
13
 
14
+ MODEL_PATH = f"/dev/shm/{MODEL_FILE}"
15
 
16
+ # Descargar a RAM si no existe
17
+ if not os.path.exists(MODEL_PATH):
18
+ print("Descargando modelo a /dev/shm (RAM)...")
19
+ # Si necesita token: use_auth_token=os.getenv("HF_TOKEN")
20
+ hf_hub_download(repo_id=MODEL_REPO, filename=MODEL_FILE, local_dir="/dev/shm")
21
 
22
+ print("Cargando modelo en RAM (llama_cpp)...")
23
+ llm = Llama(model_path=MODEL_PATH, n_ctx=2048, n_threads=4)
 
 
 
 
 
24
 
25
+ # Cargar himnos.jsonl en RAM
26
+ HIMNOS = {}
 
27
  with open("himnos.jsonl", "r", encoding="utf-8") as f:
28
  for line in f:
29
+ item = json.loads(line)
30
+ HIMNOS[int(item["id"])] = item
31
 
32
+ class ExplainRequest(BaseModel):
33
+ id: int
34
 
35
+ @app.post("/explicar")
36
+ def explicar(req: ExplainRequest):
37
+ himno = HIMNOS.get(req.id)
38
+ if not himno:
39
+ return {"error": "Himno no encontrado", "id": req.id}
40
 
41
+ prompt = f"""Eres un asistente cristiano que explica himnos de forma breve y devocional.
42
+ Himno #{himno['id']}
43
+ Título: {himno['titulo']}
44
+ Letra:
45
+ {himno['letra']}
46
 
47
+ Explica brevemente:
48
+ - Mensaje principal
49
+ - Aplicación práctica (1–2 frases)
50
+ - Versículos relacionados (si procede)
51
+ """
52
 
53
+ out = llm(prompt, max_tokens=300, temperature=0.7)
54
+ texto = out["choices"][0]["text"].strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
  return {
57
+ "id": himno["id"],
58
+ "titulo": himno["titulo"],
59
+ "explicacion": texto
60
  }