Spaces:
Running
Running
| # modules/local_llm.py | |
| import os | |
| from loguru import logger | |
| from llama_cpp import Llama | |
| import threading | |
| MODEL_PATH = "/home/user/models/openhermes-2.5-mistral-7b.Q4_K_M.gguf" | |
| FINETUNED_PATH = "/home/user/data/finetuned_hermes" | |
| _llm_global = None | |
| _lock = threading.Lock() | |
| def _get_llm(): | |
| global _llm_global | |
| if _llm_global is not None: | |
| return _llm_global | |
| with _lock: | |
| if _llm_global is not None: | |
| return _llm_global | |
| logger.info("CARREGANDO HERMES 7B TURBO → 8-12 SEGUNDOS MÁXIMO!") | |
| if not os.path.exists(MODEL_PATH): | |
| logger.error("GGUF NÃO ENCONTRADO!") | |
| return None | |
| try: | |
| llm = Llama( | |
| model_path=MODEL_PATH, | |
| n_ctx=2048, # ← MENOS CONTEXTO = MAIS RÁPIDO | |
| n_threads=2, # ← SÓ 2 vCPU NO HF FREE | |
| n_batch=256, # ← MENOR BATCH = MENOS MEMÓRIA | |
| n_gpu_layers=0, | |
| verbose=False, | |
| logits_all=True, | |
| use_mlock=True, # ← EVITA SWAP (ACELERA MUITO) | |
| seed=-1, | |
| ) | |
| lora_path = f"{FINETUNED_PATH}/adapter_model.bin" | |
| if os.path.exists(lora_path): | |
| logger.info("LORA ANGOLANO CARREGADO → SOTAQUE LUANDA TURBO!") | |
| llm.load_lora(lora_path) | |
| _llm_global = llm | |
| logger.info("HERMES 7B TURBO ONLINE → 8-12s POR RESPOSTA!") | |
| return llm | |
| except Exception as e: | |
| logger.error(f"ERRO HERMES: {e}") | |
| import traceback | |
| logger.error(traceback.format_exc()) | |
| return None | |
| class LocalLLM: | |
| def __init__(self): | |
| self.llm = _get_llm() | |
| def is_available(self) -> bool: | |
| return self.llm is not None | |
| def generate(self, prompt: str, max_tokens: int = 35) -> str: # ← 35 TOKENS = 8 SEGUNDOS! | |
| if not self.is_available(): | |
| return "Akira off, kota." | |
| try: | |
| full_prompt = ( | |
| "<|im_start|>system\n" | |
| "Akira é kota fixe de Luanda. Responde bué rápido, curto e com gírias angolanas.\n" | |
| "<|im_end|>\n" | |
| "<|im_start|>user\n" | |
| f"{prompt}\n" | |
| "<|im_end|>\n" | |
| "<|im_start|>assistant\n" | |
| ) | |
| logger.info(f"[HERMES TURBO] Gerando {max_tokens} tokens → 8-12s MÁXIMO!") | |
| output = self.llm( | |
| full_prompt, | |
| max_tokens=max_tokens, | |
| temperature=0.9, | |
| top_p=0.95, | |
| repeat_penalty=1.12, | |
| stop=["<|im_end|>", "User:", "Assistant:"], | |
| echo=False | |
| ) | |
| text = output["choices"][0]["text"].strip() | |
| # BOTÃO CONTINUA | |
| if len(text.split()) > 12: | |
| text += "\n\n*continua* pra mais, kota! 😎" | |
| logger.info(f"[HERMES 8s] {text[:100]}...") | |
| return text | |
| except Exception as e: | |
| logger.error(f"HERMES BUG: {e}") | |
| return "Buguei, tenta de novo." | |
| HermesLLM = LocalLLM() |