#!/usr/bin/env bash # Instalador del nucleo de JARVIS. Prepara el entorno de Python, el modelo de # Ollama y comprueba los servicios externos. No descarga modelos pesados ni # toca el sistema sin avisar. set -uo pipefail AQUI=$(cd -P "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd) cd "$AQUI" ok() { printf ' \033[32mok\033[0m %s\n' "$*"; } falta(){ printf ' \033[33mfalta\033[0m %s\n' "$*"; } malo() { printf ' \033[31mERROR\033[0m %s\n' "$*"; } echo "JARVIS — instalacion" echo # ── Detectar el entorno (para no asumir Debian ni NVIDIA) ─────────────────── for g in apt dnf pacman zypper; do command -v "$g" >/dev/null && { PKG=$g; break; }; done : "${PKG:=desconocido}" if command -v nvidia-smi >/dev/null 2>&1; then GPU="NVIDIA (CUDA)" elif command -v rocminfo >/dev/null 2>&1; then GPU="AMD (ROCm)" else GPU="ninguna → CPU"; fi echo "0. Entorno" ok "gestor de paquetes: $PKG" ok "GPU detectada: $GPU" [ "$GPU" = "ninguna → CPU" ] && echo " (sin GPU va igual, mas lento; considera qwen3.5:2b)" echo # ── 1. Servicios externos (los instala el usuario; aqui solo se comprueban) ── echo "1. Servicios externos" command -v python3 >/dev/null && ok "python3 $(python3 -V 2>&1 | awk '{print $2}')" \ || { malo "python3 no esta (instalalo con tu gestor: $PKG)"; exit 1; } command -v ollama >/dev/null && ok "ollama" \ || falta "ollama — instalalo desde https://ollama.com (es el cerebro)" command -v whisper-server >/dev/null && ok "whisper-server (STT)" \ || falta "whisper.cpp para tu plataforma ($GPU) — ver config/README_whisper_gpu.md" command -v piper >/dev/null && ok "piper (TTS)" \ || falta "piper — https://github.com/rhasspy/piper (la voz)" echo # ── 2. Entorno de Python del nucleo ───────────────────────────────────────── echo "2. Entorno de Python" if [ ! -d nucleo/venv ]; then python3 -m venv nucleo/venv && ok "creado nucleo/venv" else ok "nucleo/venv ya existe" fi nucleo/venv/bin/pip install -q --upgrade pip >/dev/null 2>&1 if nucleo/venv/bin/pip install -q -r requirements.txt; then ok "dependencias instaladas" else malo "fallo instalando dependencias (ver requirements.txt)"; exit 1 fi echo # ── 3. El modelo de Ollama ────────────────────────────────────────────────── echo "3. El modelo" if command -v ollama >/dev/null; then if ollama list 2>/dev/null | grep -q '^qwen3.5:4b-jarvis'; then ok "qwen3.5:4b-jarvis ya existe" else echo " creando qwen3.5:4b-jarvis (necesita qwen3.5:4b en Ollama)..." if ollama create qwen3.5:4b-jarvis -f config/qwen3.5-4b-jarvis.Modelfile 2>/dev/null; then ok "modelo creado" else falta "no se pudo crear; baja el base con: ollama pull qwen3.5:4b" fi fi else falta "sin ollama no hay modelo; instalalo y re-ejecuta" fi echo # ── 4. Lanzador de escritorio (icono en el menu de aplicaciones) ──────────── echo "4. Lanzador de escritorio" APPS="$HOME/.local/share/applications" ICONO="$AQUI/jarvis-icon.png" [ -f "$ICONO" ] || ICONO="$AQUI/jarvis-icon.svg" mkdir -p "$APPS" cat > "$APPS/jarvis.desktop" </dev/null command -v update-desktop-database >/dev/null && update-desktop-database "$APPS" 2>/dev/null ok "creado $APPS/jarvis.desktop — busca «JARVIS» en el menu de aplicaciones" echo # ── 5. Siguiente paso ─────────────────────────────────────────────────────── echo "Hecho. Ya puedes:" echo " · buscar JARVIS en el menu de aplicaciones y pulsar el icono, o" echo " · ./nucleo/arranca.sh # arrancar a mano (panel en 127.0.0.1)" echo " · ./nucleo/saber/indexa.py # (opcional) indexar tus apuntes para el RAG"