Saltar al contenido
Kira

IA · Redes y servidores

IA privada en casa: un agente que decide qué sale a la nube

Un agente de IA en mi homelab que, por el contenido de cada mensaje, decide si lo procesa un modelo local o uno en la nube. Lo confidencial nunca sale de la red.

Año
2026
Estado
En uso diario
Rol
Arquitectura, desarrollo e infraestructura
Repositorio
Repositorio en preparación

01 · Problema

Quería usar un agente de IA (Hermes) desde el celular sin que mis documentos privados terminaran en servicios de terceros. El gateway de modelos que uso (Bifrost) no puede enrutar por el texto del mensaje: sus reglas no ven el prompt.

02 · Enfoque

Construí un «router-shim» en FastAPI que se mete entre el agente y el gateway: lee cada mensaje, aplica reglas configurables (palabras clave → modelo, esfuerzo y local o nube) y, ante cualquier duda, manda a local (fail-closed). El agente, el gateway y el shim corren en Docker dentro de un LXC de Proxmox; los modelos locales, en Ollama.

03 · Resultado

Los mensajes confidenciales se procesan con modelos locales en Ollama y el resto con modelos en la nube. Hay un panel web para editar las reglas, un servidor MCP para cambiarlas conversando con el agente, otro para administrar Proxmox y el filtrado DNS sin exponer credenciales al modelo, y transcripción de notas de voz con faster-whisper dentro de la red local.

04 · Stack

  • Python
  • FastAPI
  • Docker
  • Proxmox (LXC)
  • Ollama
  • MCP
  • faster-whisper
  • Telegram

El flujo

Yo (Telegram, celular)
│
▼
Hermes (agente) ──► router-shim (FastAPI) ──┬──► Ollama · modelos locales [confidencial]
└──► Bifrost · modelos en la nube [normal]

Regla de oro: lo confidencial siempre gana. Si un mensaje coincide con una regla de privacidad —o si el shim falla—, se procesa en local. Nunca se «fuga» por accidente.

Por qué hizo falta el shim

El primer intento fue escribir reglas de ruteo directamente en el gateway con condiciones sobre el texto. No funcionaba: revisando la documentación oficial, el motor de reglas del gateway solo ve el modelo, el proveedor, los encabezados y los parámetros, no el contenido del mensaje. Las reglas «por palabra» eran inválidas y lo confidencial se iba a la nube. El shim es la única pieza que lee el prompt, así que es obligatoria.

Piezas que lo hacen útil

  • Reglas sin tocar código. Un panel web edita reglas (palabras clave → modelo + esfuerzo + local/nube) con caja de prueba y la lista de modelos disponibles en vivo.
  • Se configura conversando. Un servidor MCP con 6 herramientas permite al agente listar, crear, editar, borrar y probar reglas.
  • Homelab sin exponer llaves. Otro servidor MCP administra Proxmox (resumen, salud del SSD, contenedores) y el filtrado DNS; las credenciales viven en el contenedor y el modelo nunca las ve.
  • Voz local. Un servidor de transcripción compatible con la API de OpenAI corre faster-whisper en CPU: en mi PC, el modelo small transcribe 7 s de audio en unos 5 s. El audio no sale de casa.

Lo que me llevo

Antes de escribir código, verifiqué contra la documentación qué podía y qué no podía hacer cada pieza. Eso explicó un error que parecía de configuración y cambió el diseño completo.