llm-tuner 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.es.md CHANGED
@@ -6,89 +6,98 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
7
7
  [![Node.js Version](https://img.shields.io/badge/node-%3E%3D22-brightgreen.svg)](package.json)
8
8
 
9
- Carga un LLM local con la mejor configuración para el contexto que necesitas, en LM Studio u Ollama, en Windows, macOS y Linux. Tú eliges qué significa «mejor» mediante perfiles de carga deterministas: velocidad, equilibrio o máxima calidad de respuestas.
9
+ Carga un LLM local con la configuración más rápida para el contexto que necesitas, en LM Studio u Ollama, en Windows, macOS y Linux. Tú eliges qué significa «mejor» mediante perfiles de carga deterministas: velocidad pura (`speed`), equilibrio (`balanced`) o máxima calidad de respuestas (`quality`).
10
10
 
11
- Ningún LLM decide la configuración. LLM Tuner lee la topología de tu hardware y los metadatos GGUF del modelo, calcula matemáticamente qué cabe en la VRAM, mide empíricamente las mejores configuraciones candidatas en hardware real y guarda la ganadora como un **preset** persistente. La próxima vez que cargues ese modelo con ese contexto y perfil, el preset se aplica directamente (en ~20 s) sin volver a medir.
11
+ Ningún LLM decide la configuración. LLM Tuner lee la topología de tu hardware y los metadatos GGUF del modelo, calcula matemáticamente qué cabe en la VRAM, mide empíricamente las mejores configuraciones candidatas en hardware real y guarda la ganadora como un **preset** persistente. La próxima vez que cargues ese modelo con el mismo contexto y perfil, el preset se aplica de inmediato (~20 s) sin volver a medir.
12
12
 
13
13
  ---
14
14
 
15
15
  ## Tabla de contenidos
16
16
 
17
- - [Características](#características)
17
+ - [Características principales](#características-principales)
18
18
  - [Cómo funciona](#cómo-funciona)
19
19
  - [Perfiles de carga](#perfiles-de-carga)
20
20
  - [Instalación](#instalación)
21
21
  - [Uso](#uso)
22
- - [Asistente interactivo](#asistente-interactivo)
22
+ - [CLI interactiva y comandos slash](#cli-interactiva-y-comandos-slash)
23
23
  - [Aplicación de escritorio](#aplicación-de-escritorio)
24
+ - [Modo servidor remoto y daemon](#modo-servidor-remoto-y-daemon)
25
+ - [Integración MCP para agentes de IA](#integración-mcp-para-agentes-de-ia)
24
26
  - [Modo CLI no interactivo](#modo-cli-no-interactivo)
25
- - [Referencia de opciones CLI](#referencia-de-opciones-cli)
26
- - [Qué se prueba](#qué-se-prueba)
27
- - [Dónde se guardan los presets](#dónde-se-guardan-los-presets)
28
- - [Estado por plataforma](#estado-por-plataforma)
29
- - [Arquitectura del proyecto](#arquitectura-del-proyecto)
27
+ - [Referencia de opciones y banderas CLI](#referencia-de-opciones-y-banderas-cli)
28
+ - [Flujo de ajuste y medición](#flujo-de-ajuste-y-medición)
29
+ - [Arquitectura y rutas de almacenamiento](#arquitectura-y-rutas-de-almacenamiento)
30
+ - [Soporte por plataforma](#soporte-por-plataforma)
30
31
  - [Desarrollo y pruebas](#desarrollo-y-pruebas)
31
- - [Notas y solución de problemas](#notas-y-solución-de-problemas)
32
+ - [Solución de problemas y notas de plataforma](#solución-de-problemas-y-notas-de-plataforma)
32
33
  - [Licencia](#licencia)
33
34
 
34
35
  ---
35
36
 
36
- ## Características
37
+ ## Características principales
37
38
 
38
- - **Optimización determinista**: Basada en metadatos reales de tensores GGUF, ancho de banda PCIe y pruebas empíricas de velocidad de generación, sin que ninguna IA adivine parámetros.
39
- - **Detección multitarjeta y topología**: Reparte capas inteligentemente priorizando la GPU con mayor enlace PCIe y sin monitor conectado.
40
- - **Perfiles de carga a medida**: Optimiza para velocidad pura (`speed`), equilibrio ponderado por calidad (`balanced`) o retención íntegra en GPU sin pérdidas (`quality`).
41
- - **Soporte de motores locales**: Compatibilidad directa con LM Studio (a través de `llama-server`) y Ollama (instancias privadas aisladas).
42
- - **Presets persistentes**: Mide una única vez por combinación de hardware, modelo, contexto y perfil. Invalida presets automáticamente si el hardware o el archivo del modelo cambian.
43
- - **Doble interfaz**: Asistente en consola (`llm-tuner`) y aplicación gráfica de escritorio (`llm-tuner-desktop`).
44
- - **Integración MCP para agentes de IA**: Conecta tus motores locales (LM Studio, Ollama) como servidores Model Context Protocol (MCP) en Claude Desktop, Claude Code, OpenCode, Antigravity, VS Code y ChatGPT/Codex con nombres personalizados y seguridad multiplataforma.
45
- - **Bilingüe**: Localización completa en español e inglés tanto en terminal como en entorno gráfico.
39
+ - **Optimización determinista**: Basada en metadatos de tensores GGUF, mediciones de ancho de banda PCIe y pruebas reales de generación de tokens, sin que ninguna IA adivine parámetros.
40
+ - **Detección multi-GPU y topología**: Reparte capas inteligentemente entre múltiples GPUs, priorizando las tarjetas con mayor enlace PCIe y sin monitor conectado.
41
+ - **Perfiles de carga a medida**: Optimiza para velocidad máxima (`speed`), velocidad ponderada por calidad (`balanced`) o retención íntegra en GPU sin pérdidas (`quality`).
42
+ - **Soporte de motores locales**: Compatibilidad directa con LM Studio (gestión de `llama-server`) y Ollama (servidores de prueba aislados e integración con servicios del sistema).
43
+ - **Presets persistentes**: Mide una sola vez por huella de hardware, modelo, contexto y perfil. Invalida automáticamente el preset si cambia el hardware o el archivo del modelo.
44
+ - **Doble interfaz**: Asistente interactivo en terminal (`llm-tuner`) e interfaz gráfica multiplataforma (`llm-tuner-desktop`).
45
+ - **Modo servidor remoto y daemon**: Ejecuta `llm-tuner /serve` en un servidor con GPUs dedicadas con autenticación Bearer segura (`timingSafeEqual`) y telemetría sanitizada, y contrólalo desde cualquier cliente CLI o de escritorio.
46
+ - **Integración MCP para agentes de IA**: Conecta tus motores locales o remotos (LM Studio, Ollama) como servidores Model Context Protocol (MCP) en Claude Desktop, Claude Code, OpenCode, Antigravity, VS Code y ChatGPT/Codex.
47
+ - **Bilingüe**: Localización completa en inglés (`en`) y español (`es`) tanto en terminal como en escritorio.
46
48
 
47
49
  ---
48
50
 
49
51
  ## Cómo funciona
50
52
 
51
- 1. **Motor**: Eliges LM Studio u Ollama. Si no está instalado, la app ofrece planes de instalación oficiales.
52
- 2. **Modelo y contexto**: Eliges uno de tus modelos descargados y defines el tamaño de contexto deseado (p. ej. 16.384 tokens).
53
- 3. **Perfil de carga**: Eliges qué optimizar: `speed`, `balanced` (predeterminado) o `quality`. La app resalta una recomendación según la VRAM libre.
54
- 4. **Cargar**:
55
- - **Preset existente**: Si ya existe un preset para ese modelo, contexto, perfil y hardware, se aplica de inmediato y se carga el modelo (~20 s).
56
- - **Sin preset**: Descarga modelos previos para liberar VRAM, prueba las configuraciones más prometedoras (2–3 min), guarda la mejor como preset y carga el modelo.
53
+ 1. **Selección de motor**: Eliges LM Studio u Ollama. Si ninguno está instalado, LLM Tuner ofrece planes de instalación oficiales.
54
+ 2. **Modelo y contexto**: Seleccionas cualquiera de tus modelos descargados y defines la ventana de contexto deseada (entre `512` y el límite de entrenamiento del modelo, p. ej. `16384` tokens).
55
+ 3. **Perfil de carga**: Eliges entre `speed`, `balanced` (predeterminado) o `quality`. El planificador recomienda el perfil de mayor calidad que cabe íntegramente en la VRAM libre.
56
+ 4. **Carga y medición**:
57
+ - **Con preset existente**: Si ya existe un preset válido para ese modelo, contexto, perfil y huella de hardware, se aplica y carga de inmediato (~20 s).
58
+ - **Sin preset**: Descarga modelos previos para liberar VRAM, evalúa las configuraciones candidatas más prometedoras (2–3 min), mide la velocidad con contexto corto y profundo, guarda el preset ganador y carga el modelo.
57
59
 
58
- Solo se vuelve a medir cuando cambias el contexto o el perfil, cambia el hardware (GPU, VRAM, PCIe), cambia el archivo del modelo o se modifican las variantes descargadas (en `speed` y `quality`). También puedes forzar una nueva medición con `--force`.
60
+ Solo se vuelve a medir cuando cambias el contexto o el perfil, cambia el hardware (GPU, VRAM, enlace PCIe), cambia el archivo del modelo o cambian las variantes descargadas (en `speed` y `quality`). También puedes forzar la medición en cualquier momento con `--force`.
59
61
 
60
62
  ---
61
63
 
62
64
  ## Perfiles de carga
63
65
 
64
- Más tokens por segundo no siempre significa mejores respuestas. El perfil decide cuánta calidad de respuestas se puede ceder a cambio de velocidad o memoria:
66
+ Más tokens por segundo no siempre equivale a mejores respuestas. Los perfiles de carga permiten decidir cuándo ceder calidad a cambio de velocidad o ahorro de memoria:
65
67
 
66
- | Perfil | Qué optimiza | Comportamiento y compensaciones |
67
- |---|---|---|
68
- | `speed` (Velocidad) | Tokens por segundo al máximo. | Usa la variante descargada más ligera y cualquier tipo de caché KV (incluyendo `q4_0`). |
69
- | `balanced` (Equilibrado) | Velocidad ponderada por calidad de caché KV. *(Predeterminado)* | Término medio: usa la variante seleccionada y pondera la velocidad según la precisión de la caché. |
70
- | `quality` (Calidad) | Mínima pérdida que aún se ejecuta por completo en GPU. | Elige la variante descargada más pesada que quepa en VRAM con caché KV precisa (`f16` o `q8_0`). Si nada cabe completo en GPU, recurre a la regla de `balanced`. |
68
+ | Perfil | Objetivo de optimización | Comportamiento y compensaciones |
69
+ | :--- | :--- | :--- |
70
+ | `speed` | Máximos tokens por segundo. | Selecciona la variante descargada más ligera y permite cualquier tipo de caché KV (`f16`, `q8_0`, `q4_0`). |
71
+ | `balanced` | Velocidad ponderada por calidad de caché KV. *(Predeterminado)* | Utiliza la variante seleccionada y clasifica las candidatas según `tps × kvQuality`. |
72
+ | `quality` | Mínima pérdida ejecutándose por completo en GPU. | Elige la variante descargada más pesada que quepa al 100% en VRAM con caché KV precisa (`f16` o `q8_0`). Si ninguna cabe por completo en GPU, aplica la regla de `balanced`. |
71
73
 
72
- Las optimizaciones sin pérdida (reparto de capas entre GPUs, orden de tarjetas, hilos de CPU) se aplican siempre en todos los perfiles.
74
+ Las optimizaciones sin pérdida (distribución de capas entre GPUs, orden de tarjetas, número de hilos de CPU) se aplican siempre en todos los perfiles.
73
75
 
74
76
  ### Selección de variantes
75
77
 
76
- - **Ollama**: La app puede elegir automáticamente la variante (etiqueta) óptima para el perfil y cargarla entre las etiquetas que reconozca como el mismo modelo.
77
- - **LM Studio**: Dado que LM Studio no permite seleccionar variantes por API externa, la app optimiza la variante activa y te avisa cuando otra variante se ajusta mejor al perfil seleccionado.
78
+ - **Ollama**: Selecciona y carga automáticamente la variante (etiqueta) óptima para el perfil activo entre las etiquetas identificadas como la misma familia de modelo.
79
+ - **LM Studio**: Optimiza la variante activa y te avisa si otra cuantización descargada (o descargable como `Q8_0`, `Q6_K` o `Q5_K_M`) se adapta mejor al perfil elegido.
78
80
 
79
81
  ---
80
82
 
81
83
  ## Instalación
82
84
 
83
- Instalación global vía npm:
85
+ Instalación global mediante npm:
84
86
 
85
87
  ```bash
86
88
  npm install -g llm-tuner
87
89
  ```
88
90
 
89
- Requisitos previos:
90
- - **Node.js**: versión 22 o posterior (`node >= 22`).
91
- - **Motor local**: LM Studio (0.4.25+) u Ollama instalado (o instalarlo mediante las opciones del asistente).
91
+ O ejecución directa sin instalación permanente mediante `npx`:
92
+
93
+ ```bash
94
+ npx llm-tuner
95
+ ```
96
+
97
+ ### Requisitos previos
98
+
99
+ - **Node.js**: `>= 22` (`engines.node` en [`package.json`](package.json)).
100
+ - **Motor local**: LM Studio (0.4.25+) u Ollama instalado (o instálalo mediante el asistente integrado).
92
101
 
93
102
  ---
94
103
 
@@ -96,167 +105,235 @@ Requisitos previos:
96
105
 
97
106
  ### CLI interactiva y comandos slash
98
107
 
99
- Ejecuta la interfaz en la terminal:
108
+ Inicia el menú interactivo en la terminal:
100
109
 
101
110
  ```bash
102
111
  llm-tuner
103
112
  ```
104
113
 
105
- Ejecutar `llm-tuner` sin argumentos abre un menú interactivo para seleccionar la acción deseada:
106
- - `/load`: Ajustar y cargar un modelo con la configuración óptima para tu hardware
107
- - `/mcp`: Conectar tu motor local como servidor MCP con agentes de IA (Claude, OpenCode, VS Code, Codex)
108
- - `/presets`: Listar e inspeccionar los presets guardados
109
- - `/settings`: Configurar idioma (`en` / `es`) y tema visual (`system` / `light` / `dark`)
110
- - `/help`: Mostrar ayuda y opciones de uso
111
- - `/exit`: Salir del menú
114
+ Ejecutar `llm-tuner` sin argumentos abre un bucle de menú interactivo:
115
+ - `/load`: Ajustar y cargar un modelo con la configuración óptima de hardware.
116
+ - `/mcp`: Conectar el motor local con agentes de programación de IA como servidor MCP.
117
+ - `/presets`: Ver los presets de configuración guardados.
118
+ - `/serve`: Iniciar en modo servidor remoto con autenticación de API.
119
+ - `/settings`: Configurar el idioma (`en` / `es`) y el tema visual (`system` / `light` / `dark`).
120
+ - `/help`: Ver la ayuda de uso y las opciones de la CLI.
121
+ - `/exit`: Salir del menú interactivo.
112
122
 
113
- También puedes ejecutar cualquier comando slash directamente desde tu terminal:
123
+ También puedes ejecutar cualquier comando slash (o su alias sin barra) directamente desde la terminal:
114
124
 
115
125
  ```bash
116
126
  llm-tuner /load
117
127
  llm-tuner /mcp
118
128
  llm-tuner /presets
129
+ llm-tuner /serve
119
130
  llm-tuner /settings
131
+ llm-tuner /help
120
132
  ```
121
133
 
122
134
  ### Aplicación de escritorio
123
135
 
124
- Ejecuta la interfaz de escritorio:
136
+ Inicia la aplicación gráfica de escritorio:
125
137
 
126
138
  ```bash
127
139
  llm-tuner-desktop
128
140
  ```
129
141
 
130
- > **Nota**: El entorno de ejecución de Electron se descarga la primera vez que ejecutas `llm-tuner-desktop`. Se requiere conexión a internet en esa primera ejecución.
142
+ > [!NOTE]
143
+ > El entorno de ejecución de Electron se descarga en la primera ejecución si aún no está en caché. En Linux, `llm-tuner-desktop` también registra un acceso directo de escritorio en `~/.local/share/applications/llm-tuner.desktop`.
144
+
145
+ ### Modo servidor remoto y daemon
146
+
147
+ Ejecuta LLM Tuner como un servicio de red en un equipo con GPUs dedicadas:
148
+
149
+ ```bash
150
+ # Iniciar en 0.0.0.0:7860 por defecto (genera y guarda un token hexadecimal de 32 bytes si no se indica)
151
+ llm-tuner /serve
152
+
153
+ # Personalizar host, puerto y token Bearer
154
+ llm-tuner /serve --host 0.0.0.0 --port 7860 --token mi-token-secreto
155
+ ```
156
+
157
+ - **Seguridad y sanitización de telemetría**: Las peticiones remotas o en modo servidor exigen el encabezado `Authorization: Bearer <token>` verificado mediante `crypto.timingSafeEqual`. Las respuestas remotas de `/api/state` omiten datos identificativos del host (distribución de SO, modelo exacto de CPU, IDs de bus PCI, UUIDs de GPU) y bloquean llamadas remotas a `/api/install` (`403 Forbidden`).
158
+ - **Conexión desde clientes**: Agrega el servidor remoto (Nombre, URL, Token) en la interfaz de escritorio/web desde **Configuración → Servidores**, o selecciona un servidor guardado desde la CLI con `--server <id|nombre>`.
159
+
160
+ ### Integración MCP para agentes de IA
161
+
162
+ Registra LM Studio (`@mzxrai/mcp-openai`) u Ollama (`ollama-mcp-server`) en tus agentes de programación de IA:
163
+
164
+ ```bash
165
+ # Asistente interactivo
166
+ llm-tuner /mcp
167
+
168
+ # Con opciones por línea de comandos
169
+ llm-tuner /mcp --engine lmstudio --name mi-llm-local --host http://127.0.0.1:1234/v1 --apiKey sk-lm-local
170
+ ```
171
+
172
+ Agentes de IA compatibles:
173
+ - **Claude Desktop** (`claude_desktop_config.json`)
174
+ - **Claude Code** (`~/.claude.json`)
175
+ - **OpenCode** (`opencode.json`)
176
+ - **Antigravity** (`~/.gemini/config/mcp_config.json`)
177
+ - **VS Code** (`Code/User/mcp.json`)
178
+ - **ChatGPT / Codex** (`~/.codex/config.toml`)
131
179
 
132
180
  ### Modo CLI no interactivo
133
181
 
134
- Útil para automatizaciones, scripts y entornos desatendidos:
182
+ Ejecución directa en scripts, automatizaciones o entornos sin interfaz:
135
183
 
136
184
  ```bash
137
- # Ejecución básica con perfil balanced
185
+ # Ajustar y cargar sin confirmaciones con el perfil balanced predeterminado
138
186
  llm-tuner --engine lmstudio --model qwen/qwen2.5-coder-32b --ctx 16384 --yes
139
187
 
140
- # Especificando perfil de carga
141
- llm-tuner --engine lmstudio --model qwen/qwen2.5-coder-32b --ctx 16384 --profile quality --yes
188
+ # Optimizar para máxima calidad de respuesta con salida en JSON
189
+ llm-tuner --engine ollama --model qwen2.5-coder:14b --ctx 32768 --profile quality --yes --json
142
190
 
143
- # Listar presets guardados
144
- llm-tuner --presets
191
+ # Medir en modo simulación (--dry-run) sin modificar archivos ni guardar preset
192
+ llm-tuner --engine lmstudio --model qwen/qwen2.5-coder-32b --ctx 16384 --dry-run
145
193
 
146
- # Configurar idioma o tema
147
- llm-tuner /settings
194
+ # Ejecutar contra un servidor remoto configurado
195
+ llm-tuner --server gpu-rig --engine ollama --model llama3.1:8b --ctx 16384 --yes
148
196
  ```
149
197
 
150
- ### Referencia de opciones CLI
151
-
152
- | Opción | Descripción | Valor predeterminado |
153
- |---|---|---|
198
+ ### Referencia de opciones y banderas CLI
199
+
200
+ | Opción / Comando | Descripción | Valor predeterminado |
201
+ | :--- | :--- | :--- |
202
+ | `/load`, `load` | Ajustar y cargar un modelo con la configuración óptima. | Predeterminado al pasar opciones de ajuste |
203
+ | `/mcp`, `mcp` | Configurar LM Studio u Ollama como servidor MCP en agentes de IA. | — |
204
+ | `/presets`, `presets`, `--presets` | Listar los presets guardados (filtrable con `--engine` y `--model`). | — |
205
+ | `/serve`, `serve`, `--serve` | Iniciar el modo daemon de servidor remoto con autenticación Bearer. | — |
206
+ | `/settings`, `settings`, `--settings` | Abrir el menú interactivo de configuración (idioma y tema). | — |
207
+ | `/help`, `help`, `-h`, `--help` | Mostrar la ayuda de uso y la ruta del directorio de presets. | — |
208
+ | `-v`, `--version` | Mostrar la versión instalada (`0.4.4`). | — |
154
209
  | `--engine <lmstudio\|ollama>` | Motor local objetivo. | Preguntado interactivamente |
155
- | `--model <key>` | Clave del modelo (LM Studio) o nombre/etiqueta (Ollama). | Preguntado interactivamente |
156
- | `--ctx <tokens>` | Tamaño de contexto en tokens (ej. `16384`). | Preguntado interactivamente |
210
+ | `--model <clave>` | Clave del modelo (LM Studio) o etiqueta (Ollama). | Preguntado interactivamente |
211
+ | `--ctx <tokens>` | Tamaño de contexto en tokens (p. ej. `16384` o `16k`). | Preguntado interactivamente |
157
212
  | `--profile <speed\|balanced\|quality>` | Perfil de carga a optimizar. | `balanced` |
158
- | `--force` | Forzar nueva medición aunque exista un preset. | `false` |
159
- | `--candidates <n>` | Número de configuraciones candidatas a medir. | `3` |
160
- | `--yes` | Ejecutar sin pedir confirmación. | `false` |
161
- | `--dry-run` | Medir sin aplicar cambios ni guardar presets. | `false` |
162
- | `--presets` | Listar presets guardados. | — |
163
- | `--json` | Salida en formato JSON. | `false` |
164
- | `--lang <en\|es>` | Establece y guarda el idioma de la interfaz. | Sistema / `en` |
165
- | `--theme <system\|light\|dark>` | Establece y guarda el tema de la interfaz. | `system` |
166
- | `/settings` | Menú interactivo de configuración. | — |
167
- | `--help` | Muestra la ayuda de comandos. | — |
213
+ | `--force` | Volver a medir aunque exista un preset válido. | `false` |
214
+ | `--candidates <n>` | Número de configuraciones candidatas a probar al medir. | `3` |
215
+ | `--yes` | No pedir confirmación interactiva. | `false` |
216
+ | `--dry-run` | Medir y mostrar cambios sin aplicar nada ni guardar preset. | `false` |
217
+ | `--json` | Emitir el resultado final en formato JSON. | `false` |
218
+ | `--lang <en\|es>` | Establecer y guardar el idioma de la interfaz. | Configuración guardada / `en` |
219
+ | `--theme <system\|light\|dark>` | Establecer y guardar el tema visual. | `system` |
220
+ | `--server <id\|nombre>` | Seleccionar el servidor activo desde la configuración guardada. | `local` |
221
+ | `--host <host>` | Dirección de escucha para `/serve` o URL de host para `/mcp`. | `0.0.0.0` (`/serve`) |
222
+ | `--port <puerto>` | Puerto TCP para `/serve`. | `7860` |
223
+ | `--token <token>` | Token Bearer de autenticación para `/serve`. | Hexadecimal autogenerado de 32 bytes |
224
+ | `--name <nombre>` | Nombre personalizado del servidor MCP al usar `/mcp`. | ID del motor (`lmstudio` / `ollama`) |
225
+ | `--apiKey <clave>` | Clave API personalizada para LM Studio al usar `/mcp`. | `sk-lm-local` |
168
226
 
169
227
  ---
170
228
 
171
- ## Qué se prueba
229
+ ## Flujo de ajuste y medición
172
230
 
173
- Para cada tipo de caché KV admitido por el perfil (`f16`, `q8_0`, `q4_0`):
231
+ Para cada tipo de caché KV permitido por el perfil activo (`f16`, `q8_0`, `q4_0`):
174
232
 
175
- 1. **Inspección de tensores GGUF**: Lectura directa de tensores para conocer el peso exacto por capa.
176
- 2. **Modelado de memoria de contexto**: Cálculo de la caché KV según atención, cabezas, dimensiones y ventana deslizante (SWA).
177
- 3. **Reparto en múltiples GPUs**: Distribución proporcional al margen libre de VRAM, priorizando enlaces PCIe más anchos y excluyendo monitores.
178
- 4. **Descarga en modelos MoE**: En modelos con Mixture of Experts que exceden la VRAM, determina cuántos expertos pueden operar en RAM (`--n-cpu-moe`).
179
- 5. **Medición empírica**: Pruebas con un prompt corto y otro que ocupa ~50% del contexto.
180
- 6. **Aplicación de configuración**:
233
+ 1. **Inspección de tensores GGUF**: Lee directamente las cabeceras de tensores GGUF para obtener el tamaño exacto en bytes por capa, embeddings y cabezal de salida.
234
+ 2. **Modelado de memoria de contexto**: Calcula el consumo de caché KV considerando cabezas de atención, dimensiones y capas de ventana deslizante (SWA).
235
+ 3. **Reparto de capas multi-GPU**: Distribuye las capas proporcionalmente al margen de VRAM disponible, ordenando las GPUs por generación/ancho PCIe y penalizando las tarjetas con pantalla conectada.
236
+ 4. **Descarga de expertos MoE**: En arquitecturas Mixture-of-Experts (MoE) que superan la VRAM, calcula cuántas capas de expertos pueden alojarse en la RAM del sistema (`cpuMoeLayers` / `--n-cpu-moe`).
237
+ 5. **Medición empírica**: Mide la velocidad de generación con un prompt corto y un prompt profundo (~50% del contexto objetivo), registrando uso de CPU y pico de VRAM.
238
+ 6. **Aplicación atómica y copias de seguridad**:
181
239
  - **LM Studio**: Escribe la configuración por modelo en `~/.lmstudio/.internal/user-concrete-model-default-config/` y actualiza `hardware-config.json`.
182
- - **Ollama**: Genera un Modelfile específico (`<modelo>-tuned-<ctx>`) y ajusta las variables de entorno del servidor. Siempre se crea una copia de respaldo `*.bak-llm-tuner-*` antes de modificar archivos.
240
+ - **Ollama**: Crea un modelo ajustado (`<modelo>-tuned-<ctx>`) con `num_ctx`, `num_gpu` y `num_thread` fijados, y configura las variables de entorno del servicio (`OLLAMA_FLASH_ATTENTION`, `OLLAMA_KV_CACHE_TYPE`). Siempre se crea un respaldo con marca de tiempo (`*.bak-llm-tuner-*`) antes de modificar archivos.
183
241
 
184
242
  ---
185
243
 
186
- ## Dónde se guardan los presets
244
+ ## Arquitectura y rutas de almacenamiento
187
245
 
188
- Existe un preset por cada combinación de motor, modelo, contexto y perfil:
246
+ ### Estructura del repositorio
189
247
 
190
- - **Linux**: `~/.config/llm-tuner/presets/`
191
- - **macOS**: `~/Library/Application Support/llm-tuner/presets/`
192
- - **Windows**: `%APPDATA%\llm-tuner\presets\`
248
+ ```text
249
+ llmtuner/
250
+ ├── src/
251
+ │ ├── cli/ # Enrutador CLI, asistente interactivo y comandos slash
252
+ │ │ ├── commands/ # /load, /mcp, /presets, /serve, /settings, /help
253
+ │ │ ├── animation.js # Animación de progreso y telemetría en vivo en terminal
254
+ │ │ ├── colors.js # Estilos ANSI adaptados al tema
255
+ │ │ ├── index.js # Punto de entrada del binario CLI (llm-tuner)
256
+ │ │ ├── nav.js # Navegación hacia atrás con Backspace/Escape
257
+ │ │ ├── profile.js # Utilidades de selección de perfil en CLI
258
+ │ │ └── router.js # Parser de argumentos y bucle del menú interactivo
259
+ │ ├── core/ # Detección de hardware, parser GGUF, estimador, presets y MCP
260
+ │ │ ├── engines/ # Adaptadores para LM Studio y Ollama
261
+ │ │ ├── mcp/ # Registro multiagente MCP y adaptadores JSON/TOML
262
+ │ │ ├── benchmark.js # Ejecutor de pruebas de contexto corto y profundo
263
+ │ │ ├── client.js # Cliente HTTP/SSE unificado (TunerApiClient)
264
+ │ │ ├── estimator.js # Modelado matemático de VRAM y caché KV
265
+ │ │ ├── gguf.js # Lector binario de cabeceras y tensores GGUF
266
+ │ │ ├── hardware.js # Detección de topología de GPU, PCIe, RAM y CPU
267
+ │ │ ├── installer.js # Planes de instalación multiplataforma de motores
268
+ │ │ ├── llama-server.js # Arnés directo de llama-server para pruebas de LM Studio
269
+ │ │ ├── presets.js # Almacenamiento de presets con huella de hardware
270
+ │ │ ├── profiles.js # Reglas de los perfiles speed, balanced y quality
271
+ │ │ ├── settings.js # Preferencias persistentes y perfiles de servidores
272
+ │ │ ├── telemetry.js # Muestreo en vivo de CPU, RAM y VRAM de GPU
273
+ │ │ ├── tuner.js # Clase orquestadora principal (Tuner)
274
+ │ │ └── updater.js # Comprobación de actualizaciones en el registro npm
275
+ │ ├── i18n/ # Catálogos de localización en inglés (en.js) y español (es.js)
276
+ │ ├── platform/ # Autorización privilegiada del servicio Ollama (sudo/polkit)
277
+ │ └── web/ # Servidor HTTP + SSE embebido e interfaz gráfica web/escritorio
278
+ ├── electron/ # Lanzador de escritorio (launch.js) y proceso principal de Electron
279
+ ├── scripts/ # Scripts locales de utilidad y evaluación
280
+ ├── test/ # Suite de pruebas nativas de Node.js (test/*.test.js)
281
+ └── docs/ # Especificaciones de diseño, historias de usuario e informes de evaluación
282
+ ```
193
283
 
194
- ---
284
+ ### Rutas de configuración y presets
195
285
 
196
- ## Estado por plataforma
286
+ Por defecto, las preferencias (`settings.json`), la configuración del servidor (`server.json`) y los presets (`presets/*.json`) se guardan en el directorio de configuración del usuario (modificable mediante la variable de entorno `LLM_TUNER_CONFIG_DIR`):
197
287
 
198
- | Plataforma y Motor | Estado | Notas |
199
- |---|---|---|
200
- | **Linux + NVIDIA + LM Studio** | ✅ Verificado | Calibrado con mediciones reales (2× RTX 5070, Ryzen 7 5800X). |
201
- | **Linux + Ollama** | ✅ Verificado | Comprobado mediante instancias privadas y suite de pruebas unitarias. |
202
- | **Windows / macOS** | 🧪 Soportado | Rutas oficiales, comandos del sistema y detección implementados. |
203
- | **AMD ROCm / Apple Silicon / Intel Arc** | 🧪 Soportado | Detección de VRAM activa; ancho de banda estimado por tabla de especificaciones. |
288
+ | Sistema operativo | Directorio base de configuración | Directorio de presets |
289
+ | :--- | :--- | :--- |
290
+ | **Linux** | `~/.config/llm-tuner/` (o `$XDG_CONFIG_HOME/llm-tuner/`) | `~/.config/llm-tuner/presets/` |
291
+ | **macOS** | `~/Library/Application Support/llm-tuner/` | `~/Library/Application Support/llm-tuner/presets/` |
292
+ | **Windows** | `%APPDATA%\llm-tuner\` | `%APPDATA%\llm-tuner\presets\` |
204
293
 
205
294
  ---
206
295
 
207
- ## Arquitectura del proyecto
296
+ ## Soporte por plataforma
208
297
 
209
- ```
210
- llmtuner/
211
- ├── src/
212
- │ ├── core/ # Núcleo del afinador, estimador, detección de hardware, presets y perfiles
213
- │ │ ├── engines/ # Controladores de LM Studio y Ollama
214
- │ │ ├── estimator.js# Modelado matemático de memoria y VRAM
215
- │ │ ├── gguf.js # Parser de tensores GGUF
216
- │ │ ├── hardware.js # Detección de GPU, enlaces PCIe y estado de VRAM
217
- │ │ ├── presets.js # Lógica de guardado e invalidación de presets
218
- │ │ └── profiles.js # Reglas de perfiles speed, balanced y quality
219
- │ ├── cli/ # Asistente interactivo y análisis de argumentos CLI
220
- │ ├── i18n/ # Catálogos de internacionalización en español e inglés
221
- │ └── web/ # Servidor HTTP/SSE embebido que alimenta la interfaz gráfica
222
- ├── electron/ # Lanzador y proceso principal de Electron
223
- ├── test/ # Suite de pruebas unitarias de Node.js
224
- └── docs/ # Especificaciones técnicas, mediciones reales y notas
225
- ```
298
+ | Plataforma y Motor | Estado | Notas |
299
+ | :--- | :--- | :--- |
300
+ | **Linux + NVIDIA + LM Studio** | Verificado | Calibrado con mediciones en hardware real (2× RTX 5070, Ryzen 7 5800X). |
301
+ | **Linux + Ollama** | Verificado | Probado con instancias aisladas de medición, overrides de systemd y pruebas unitarias. |
302
+ | **Windows / macOS** | Soportado | Rutas oficiales, planes de instalación, variables `setx`/`launchctl` y detección de GPU implementados. |
303
+ | **AMD ROCm / Apple Silicon / Intel Arc** | Soportado | Detección de VRAM y memoria unificada activa; ancho de banda estimado por tablas de arquitectura. |
226
304
 
227
305
  ---
228
306
 
229
307
  ## Desarrollo y pruebas
230
308
 
231
- Clonar y preparar el repositorio local:
309
+ Clona el repositorio e instala las dependencias:
232
310
 
233
311
  ```bash
234
312
  git clone https://github.com/ronald32acunadev/llmtuner.git
235
313
  cd llmtuner
236
314
  npm install
237
315
 
238
- # Iniciar asistente CLI
316
+ # Iniciar el asistente CLI
239
317
  npm start
240
318
 
241
- # Iniciar aplicación de escritorio
319
+ # Iniciar la aplicación de escritorio con Electron
242
320
  npm run desktop
243
321
 
244
- # Ejecutar suite de pruebas
322
+ # Ejecutar la suite de pruebas automatizadas de Node.js
245
323
  npm test
246
324
  ```
247
325
 
248
- La suite incluye pruebas de regresión que verifican los resultados reales de doble RTX 5070 con Qwen2.5-Coder-32B.
249
-
250
326
  ---
251
327
 
252
- ## Notas y solución de problemas
328
+ ## Solución de problemas y notas de plataforma
253
329
 
254
- - **Descarga inicial de Electron**: Electron se descarga al ejecutar por primera vez `llm-tuner-desktop`. En entornos cerrados sin conexión, extrae `electron-v*.zip` en la carpeta `dist/` del paquete instalado de `electron` y crea `path.txt` con el texto `electron`.
255
- - **Instalaciones con sudo / permisos**: Evita instalar con permisos de superusuario desalineados (`sudo npm install -g`), ya que Electron podría no poder descomprimir sus binarios en la carpeta del usuario.
256
- - **Compatibilidad con LM Studio**: Verificado y calibrado con LM Studio 0.4.25+.
330
+ - **Primera ejecución de escritorio (`llm-tuner-desktop`)**: El binario de Electron se descarga en la primera instalación/ejecución. Si la interfaz de escritorio no puede iniciarse, ejecuta `llm-tuner` en la terminal (funciona sin Electron).
331
+ - **Sandbox de Linux en particiones NTFS/exFAT o sin permisos SUID**: `electron/launch.js` comprueba automáticamente los permisos de `chrome-sandbox` en Linux y activa `ELECTRON_DISABLE_SANDBOX=1` cuando el binario no pertenece a root con modo `04755`.
332
+ - **Autorización del servicio Ollama**: Actualizar las variables de entorno del servicio Ollama (`OLLAMA_KV_CACHE_TYPE`, `OLLAMA_FLASH_ATTENTION`) en Linux puede solicitar autorización de administrador (`sudo` o `pkexec`). Si los ajustes no cambian, el servicio no se reinicia. El modo no interactivo (`--json`) nunca bloquea pidiendo contraseña.
333
+ - **Cerrar LM Studio antes de aplicar cambios**: LM Studio sobrescribe sus archivos de configuración al cerrarse; ciérralo antes de aplicar una nueva configuración de hardware si el asistente lo solicita.
257
334
 
258
335
  ---
259
336
 
260
337
  ## Licencia
261
338
 
262
- [MIT](LICENSE) © Ronald Daniel Acuña Arias
339
+ Publicado bajo la [Licencia MIT](LICENSE).