Portabilidad, licencia GPL-3.0 y diagrama del stack

Portabilidad (el repo estaba escrito como si solo sirviera para el portatil
del autor):
- num_gpu ya NO se fija en los Modelfile: Ollama reparte las capas segun la
  VRAM, asi el modelo va igual en GPU pequeña, grande o CPU. Se documenta
  cuando conviene fijarlo (solo tarjetas de 4 GB muy justas).
- install.sh detecta el gestor de paquetes (apt/dnf/pacman/zypper) y la GPU
  (NVIDIA/AMD/ninguna), sin asumir Debian ni CUDA.
- README reescrito: el hardware es una REFERENCIA (lo probado), no un
  requisito. Nueva seccion de portabilidad: cualquier distro, cualquier
  escritorio (ventanas necesitan X11+xdotool, degradan solas en Wayland),
  GPU opcional.
- Eliminado config/jarvis-herramientas.json: llevaba rutas personales.

Licencia: GPL-3.0 (copyleft).

docs/stack.svg: diagrama del stack (oir-pensar-hacer-hablar), reemplaza el
ASCII en el README. Anadido que el RAG sube la recuperacion de 48 a 82%
(hit@1) medido.
This commit is contained in:
sito 2026-08-16 15:53:35 +02:00
parent 3c94c1f375
commit 55e967b940
8 changed files with 864 additions and 4272 deletions

103
README.md
View file

@ -2,39 +2,18 @@
Asistente de voz **100 % local** para Linux. Ni el micrófono, ni las
conversaciones, ni el modelo salen de la máquina. Sin cuentas, sin claves, sin
nube. Núcleo propio, escrito para caber en una tarjeta pequeña (NVIDIA T1200 de
4 GB) y hacer lo que se le pide por voz, en castellano.
nube. Núcleo propio, en castellano, que corre en **cualquier Linux** —de un
portátil modesto a una torre— y aprovecha la GPU si la hay, o la CPU si no.
![Linux](https://img.shields.io/badge/Linux-Debian%2012-A81D33?logo=debian&logoColor=white)
![GNOME](https://img.shields.io/badge/GNOME-X11-4A86CF?logo=gnome&logoColor=white)
![Python](https://img.shields.io/badge/Python-3.11-3776AB?logo=python&logoColor=white)
![Linux](https://img.shields.io/badge/Linux-cualquier%20distro-FCC624?logo=linux&logoColor=black)
![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?logo=python&logoColor=white)
![Ollama](https://img.shields.io/badge/Ollama-qwen3.5%3A4b-000000?logo=ollama&logoColor=white)
![NVIDIA](https://img.shields.io/badge/CUDA-sm__75-76B900?logo=nvidia&logoColor=white)
![GPU](https://img.shields.io/badge/GPU-opcional%20(NVIDIA%2FAMD%2FCPU)-76B900)
![whisper.cpp](https://img.shields.io/badge/whisper.cpp-STT-555555)
![Piper](https://img.shields.io/badge/Piper-TTS-555555)
![License](https://img.shields.io/badge/licencia-GPL--3.0-blue)
```
┌───────────────────────────┐
micrófono ─────>│ OÍDO whisper.cpp CUDA │ STT castellano
│ sm_75 · small/GPU │ ~930 ms régimen
└─────────────┬─────────────┘
v
apuntes propios ──> ┌───────────┐ ┌─────────────────────────┐
(RAG) │ SABER │─>│ CEREBRO ollama │
│ model2vec │ │ qwen3.5:4b · tool-call │
│ +híbrido │ │ + RAG pasivo Y agéntico │
└───────────┘ └─────────────┬───────────┘
v
┌───────────────┐ ┌──────────────────────┐
altavoz <───────────│ BOCA Piper │<─│ MANOS │
│ / voz clonada│ │ acciones + shell │
└───────────────┘ └──────────────────────┘
┌───────────┴───────────────────────────┐
│ CARA panel web · WebSocket · reactor │
└────────────────────────────────────────┘
todo en 127.0.0.1 · 0 llamadas a la nube
```
![Arquitectura de JARVIS](docs/stack.svg)
![El panel de JARVIS](docs/panel.png)
@ -46,7 +25,7 @@ acciones, y las métricas de rendimiento del propio asistente. Hay un
| Capa | Pieza | Papel |
|---|---|---|
| Oír | whisper.cpp (CUDA, sm_75) | STT en castellano, en la GPU |
| Oír | whisper.cpp | STT en castellano (GPU si hay, si no CPU) |
| Pensar | Ollama · `qwen3.5:4b` | el cerebro, con tool-calling |
| Saber | model2vec + búsqueda híbrida | RAG sobre los apuntes del usuario |
| Hablar | Piper (o voz clonada con XTTS) | TTS local |
@ -56,36 +35,39 @@ acciones, y las métricas de rendimiento del propio asistente. Hay un
Todo corre en `127.0.0.1`. No hay ninguna llamada a la nube en el uso normal; lo
único que puede salir es una búsqueda web si el modelo decide usarla, y se avisa.
## Requisitos de hardware
## Portabilidad
Referencia (el equipo del autor):
Diseñado para correr en **cualquier Linux**, no en un equipo concreto:
| | |
|---|---|
| GPU | NVIDIA T1200, **4 GB VRAM**, Turing (sm_75) |
| RAM | 62 GB |
| SO | Debian 12, GNOME sobre X11, PipeWire |
| Distro | cualquiera. `install.sh` detecta apt / dnf / pacman / zypper |
| GPU | **opcional**. Ollama reparte el modelo entre GPU y CPU solo: va con NVIDIA (CUDA), AMD (ROCm) o **solo CPU**. Ningún parámetro está atado a una tarjeta |
| Escritorio | GNOME, KDE, lo que sea. Las acciones de **ventanas** necesitan X11 + `xdotool`; en Wayland esas órdenes se desactivan solas y el resto funciona igual |
| Audio | PipeWire o PulseAudio |
La restricción que manda es la VRAM. El presupuesto, medido:
**Requisito real:** que quepa el modelo. `qwen3.5:4b` va cómodo desde ~4 GB de
VRAM; con menos, usa un modelo más pequeño (`qwen3.5:2b`) o tira de CPU (hay RAM
de sobra). whisper.cpp se compila para tu plataforma —CUDA, ROCm, Metal o CPU—;
la guía está en [`config/README_whisper_gpu.md`](config/README_whisper_gpu.md).
```
┌──────────────────────────────────┬──────────┬───────────────────────┐
│ COMPONENTE │ VRAM │ NOTA │
├──────────────────────────────────┼──────────┼───────────────────────┤
│ qwen3.5:4b (24/32 capas en GPU) │ 2177 MiB │ el cerebro │
│ whisper small (PICO de la trans- │ 839 MiB │ el pico, no el reposo:│
│ cripción) │ │ ahí estuvo el OOM │
│ ── suma ── │ 3016 MiB │ cabe, con margen justo│
└──────────────────────────────────┴──────────┴───────────────────────┘
```
### Ajuste en tarjetas pequeñas (4 GB)
Corre en menos con un modelo más pequeño; con más VRAM, sobra sitio.
Solo si vas MUY justo de VRAM y el cerebro y whisper se pelean por ella: fijar
`num_gpu 24` en el `Modelfile` reserva sitio a whisper. Está explicado en los
comentarios del propio `Modelfile`. En una torre con una tarjeta normal **no
hace falta tocar nada**.
### Probado en
NVIDIA T1200 (4 GB), 62 GB RAM, Debian 12 con GNOME/X11. Es el equipo del autor,
el caso más ajustado; en una torre con más VRAM sobra sitio.
## Instalación
Necesita, en la máquina: [Ollama](https://ollama.com), whisper.cpp compilado con
CUDA (ver [`config/README_whisper_gpu.md`](config/README_whisper_gpu.md)) y
[Piper](https://github.com/rhasspy/piper).
Necesita, en la máquina: [Ollama](https://ollama.com), whisper.cpp (compilado
para tu plataforma, ver [`config/README_whisper_gpu.md`](config/README_whisper_gpu.md))
y [Piper](https://github.com/rhasspy/piper).
```bash
git clone https://gitea.laenre.net/hacklab/JARVIS.git
@ -118,9 +100,13 @@ Habla en castellano, natural. **150 acciones** en el catálogo, agrupadas:
Si lo que pides no está en el catálogo, el modelo lo resuelve con un **comando de
shell** (de solo lectura por defecto). Y si pregunta *cómo* se hace algo técnico,
puede **buscar en tus apuntes** (RAG) antes de responder, para dar el comando que
ya has probado en vez de inventarlo. El método, el pipeline y los resultados
medidos están en [docs/rag.md](docs/rag.md).
puede **buscar en tus apuntes** (RAG) antes de responder.
El RAG es lo que hace que el asistente dé el comando que **tú ya has probado** en
vez de inventarse los flags. Y no es un adorno: medido sobre un conjunto de
preguntas de pentesting, la recuperación sube de **hit@1 48 % → 82 %** y
**hit@5 77 % → 95 %**. El método, el pipeline y esos números están en
[docs/rag.md](docs/rag.md).
## Órdenes con root
@ -148,7 +134,7 @@ son del usuario, y el `.gitignore` los bloquea.
```
nucleo/ el asistente (oido, cerebro, boca, manos, cara, saber)
config/ configuración: modelo, voz, whisper CUDA
config/ configuración: modelo, voz, whisper
voz/ clonado de voz con XTTS y caché de frases
entrena/ fine-tuning con QLoRA
install.sh el instalador
@ -156,11 +142,12 @@ install.sh el instalador
## Estado y limitaciones
Proyecto en desarrollo. Rugosidades conocidas: varios scripts de `config/` y
`voz/` asumen rutas absolutas del entorno del autor (`~/COFRE/...`) y habría que
hacerlas configurables; el fine-tuning de `entrena/` está pendiente de un ajuste
para modelos multimodales.
Proyecto en desarrollo. En el radar: acabar de generalizar los scripts de `voz/`
(algunos aún asumen la disposición del autor), las acciones de ventanas sobre
**Wayland** (hoy solo X11), y el fine-tuning de `entrena/`, pendiente de un
ajuste para modelos multimodales.
## Licencia
Por decidir por el autor. El núcleo es código propio, no derivado.
[GPL-3.0](LICENSE). Software libre y copyleft: si lo modificas y lo distribuyes,
el resultado sigue siendo libre.