import os import gc import uvicorn from fastapi import FastAPI from fastapi.responses import HTMLResponse from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from huggingface_hub import hf_hub_download from llama_cpp import Llama # ====================== # CONFIGURACIÓN DEL MODELO (Gemma 3 4B CPU) # ====================== print("⚙️ Configurando entorno para CPU...") # Usamos Gemma 3 4B Instruct en formato GGUF. # La versión Q4_K_M balancea perfectamente velocidad y calidad (aprox. 3-4 GB RAM). # REPO_ID actualizado a la versión de la comunidad compatible con llama.cpp REPO_ID = "lmstudio-community/gemma-3-4b-it-GGUF" FILENAME = "gemma-3-4b-it-Q4_K_M.gguf" print(f"📦 Descargando/Verificando modelo: {FILENAME}...") try: # Descarga el modelo a la caché local de Hugging Face model_path = hf_hub_download( repo_id=REPO_ID, filename=FILENAME ) # Cargar el modelo en memoria (Motor llama.cpp) # n_ctx=8192: Gemma 3 soporta contextos enormes (128k), pero en CPU # limitamos a 8k o 4k para evitar que la RAM explote. llm = Llama( model_path=model_path, n_ctx=8192, n_threads=max(1, os.cpu_count() - 1), verbose=False ) print("✅ Modelo Gemma 3 4B GGUF cargado correctamente en CPU.") except Exception as e: print(f"❌ Error crítico cargando el modelo: {e}") print("💡 Sugerencia: Verifica que el repo y filename existan en Hugging Face.") raise e # ====================== # FASTAPI # ====================== app = FastAPI( title="MTP Gemma 3 4B CPU", description="Versión optimizada para CPU (Gemma 3 4B GGUF)", version="4.0" ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) class PromptRequest(BaseModel): text: str max_tokens: int = 1024 temperature: float = 0.7 top_p: float = 0.9 # Prompt del sistema base SYSTEM_PROMPT_TEXT = ( "Eres MTP Gemma 3, una inteligencia artificial avanzada desarrollada por Teszen AI. " "Tu objetivo es ser útil, preciso y amigable. " "Responde siempre en formato Markdown bien estructurado. " "Tus capacidades incluyen razonamiento avanzado y comprensión de contexto." ) # ====================== # ENDPOINT DE GENERACIÓN # ====================== @app.post("/generate") def generate(req: PromptRequest): try: # Formato de Prompt para Gemma 2 y Gemma 3 (Chat ML style) # Estructura: user\n{content}\nmodel\n full_prompt = ( f"user\n" f"{SYSTEM_PROMPT_TEXT}\n\n" f"{req.text}\n" f"model\n" ) output = llm( full_prompt, max_tokens=req.max_tokens, temperature=req.temperature, top_p=req.top_p, stop=["", ""], # Tokens de parada críticos echo=False ) reply = output["choices"][0]["text"].strip() return {"reply": reply} except Exception as e: print(f"Error en generación: {e}") return {"reply": f"❌ Error interno del servidor: {str(e)}"} # ====================== # INTERFAZ WEB (UI PREMIUM - TESZEN STYLE) # ====================== @app.get("/", response_class=HTMLResponse) def chat_ui(): return """ MTP Gemma 3 | Teszen AI

MTP Gemma 3 | 4B CPU

Hola, soy MTP Gemma 3. 💎
Corriendo la arquitectura 4B optimizada en CPU. ¿Qué vamos a crear hoy?

""" # ====================== # EJECUCIÓN # ====================== if __name__ == "__main__": port = int(os.environ.get("PORT", 7860)) uvicorn.run(app, host="0.0.0.0", port=port)