Integrar IA local en terminal (Windows)


Floppy

Miembro activo
DEPENDENCIAS:

instalar requests, abre una terminal y escribe: pip install requests

instalar C++2019 redistributable https://learn.microsoft.com/es-es/cpp/windows/latest-supported-vc-redist?view=msvc-170

Instalar Python3 https://www.python.org/ftp/python/3.14.0/python-3.14.0-amd64.exe


ENTORNO:

Vamos a prepararlo todo, empieza por descargar el compilador de llama (el que se encarga de traducir lo que dice el modelo de lenguaje)
https://github.com/ggml-org/llama.cpp/releases asegúrate de descargar el que sea compatible con tu dispositivo (mi caso windows x64)
una vez descargado descomprime el .zip, llama a la carpeta: llama.cpp

Ahora descarga el modelo de lenguaje que mas te guste de https://huggingface.co/QuantFactory y mete tu modelo.gguf en la carpeta \llama.cpp

Para finalizar crea un documento de texto dentro de la carpeta \llama.cpp , llámalo iniciar.py y pega dentro el siguiente código (asegúrate en la línea 8 que el nombre de tu modelo es igual)

Antes de nada decir que se inicia muy fácil, abre la carpeta llama.cpp en la terminal y ejecuta python3 iniciar.py

Bienvenido a tu terminal interactiva <3



Python:
#!/usr/***/env python3
import os
import subprocess
import requests
import time
import sys
import signal
import json

MODEL = "llama3.gguf"  # nombre exacto de tu modelo
HOST = "127.0.0.1"
PORT = 8080

SERVER_CMD = [
    "llama-server.exe",
    "-m", MODEL,
    "--port", str(PORT),
    "--ctx-size", "4096"
]

def start_server():
    print(f"🚀 Iniciando llama-server con modelo {MODEL}...")
    proc = subprocess.Popen(
        SERVER_CMD,
        stdout=subprocess.DEVNULL,
        stderr=subprocess.STDOUT,
        creationflags=subprocess.CREATE_NEW_PROCESS_GROUP
    )
    return proc

def wait_for_server():
    print("⏳ Esperando a que el servidor arranque...", end="", flush=True)
    for _ in range(30):
        try:
            r = requests.get(f"http://{HOST}:{PORT}/health")
            if r.ok:
                print(" ✅ Listo.\n")
                return True
        except:
            pass
        print(".", end="", flush=True)
        time.sleep(1)
    print("\n❌ No se pudo conectar al servidor.")
    return False

def query_model(prompt):
    try:
        response = requests.post(
            f"http://{HOST}:{PORT}/completion",
            json={
                "prompt": prompt,
                "n_predict": 256,
                "temperature": 0.7
            },
            timeout=120
        )
        data = response.json()
        text = data.get("content", data.get("text", ""))
        print(text.strip())
    except Exception as e:
        print(f"⚠️ Error consultando el modelo: {e}")

def is_command_not_found(stderr_output: str):
    """Detecta si PowerShell devolvió un error por comando inexistente"""
    return "CommandNotFoundException" in stderr_output or "no se reconoce como" in stderr_output

def main():
    server = start_server()
    try:
        if not wait_for_server():
            server.terminate()
            sys.exit(1)

        print("💬 Terminal integrada lista.")
        print(" - Escribe texto para hablar con el modelo.")
        print(" - Usa comandos del sistema (dir, cd, cls, etc.) para ejecutarlos.")
        print(" - Escribe 'exit' para salir.\n")

        while True:
            prompt = f"PS {os.getcwd()}> "
            user_input = input(prompt).strip()

            if not user_input:
                continue
            if user_input.lower() in ("exit", "salir", "quit"):
                print("👋 Cerrando...")
                break

            if user_input.startswith("cd "):
                try:
                    os.chdir(user_input[3:].strip('" '))
                except FileNotFoundError:
                    print("⚠️ Carpeta no encontrada.")
                continue
            elif user_input in ("cls", "clear"):
                os.system("cls")
                continue

            result = subprocess.run(
                ["powershell", "-Command", user_input],
                capture_output=True,
                text=True
            )

            if result.returncode == 0 and result.stdout.strip():
                print(result.stdout.strip())
                continue
            elif is_command_not_found(result.stderr):
                query_model(user_input)
            elif result.stderr.strip():
                print(result.stderr.strip())
            else:
                query_model(user_input)

    except KeyboardInterrupt:
        print("\n🛑 Interrumpido por el usuario.")
    finally:
        print("🧹 Cerrando servidor...")
        try:
            server.send_signal(signal.CTRL_BREAK_EVENT)
        except Exception:
            pass
        time.sleep(1)

if __name__ == "__main__":
    main()