El diagrama muestra la relación entre el Frontend (NextJS), la API (volume-api), el servidor MCP (volume-mcp) y el firmware del microcontrolador (ESP32). El flujo principal de comandos del usuario pasa por el Frontend hacia la API, que usa un cliente de chat (LLM) y solicita acciones al MCP para controlar el hardware.
El sistema se organiza en cuatro bloques principales:
- Frontend (NextJS): interfaz web para usuarios que envían comandos por voz o texto.
- API (
volume-api): expone el endpoint/chat, integra con el LLM y actúa como orquestador. - MCP (
volume-mcp): servidor de herramientas que traduce intenciones a acciones sobre el hardware. - Firmware (ESP32): ejecuta el
AudioMixer, controla el PCM5102, sensores y provee estado.
-
Percepción
- Sensores y entradas: micrófonos, botones, sensores táctiles y lectura desde SD.
- Recolección local de datos para estado y telemetría.
-
Procesamiento local (microcontrolador)
- Mezcla y reproducción de audio en tiempo real (AudioMixer, AudioPlayer).
- Lectura/escritura de archivos WAV desde SD.
- Exposición de un WebServer local para estado y control.
-
Comunicación con el LLM (API/librerías)
volume-apiformatea y envía prompts al LLM (Gemini/Vertex AI).- Uso de
spring-ai/ChatClientpara integrar con la capa de IA.
-
Toma de decisiones y acción
volume-apiinterpreta la intención y, si se requiere, invocavolume-mcp.volume-mcpenvía llamadas HTTP/REST al firmware (setVolume, muteChannel, etc.).
-
Separación de responsabilidades
- Mantener UI, orquestación (API/LLM) y control hardware desacoplados. Cada capa expone contratos claros (REST/JSON) para facilitar pruebas unitarias y despliegues independientes.
- Definir una interfaz MCP estable (endpoints y payloads) para que firmware y servicios evolucionen sin romper compatibilidad.
-
Escalabilidad y despliegue
- Empaquetar
volume-apiyvolume-mcpcomo contenedores (Docker) y orquestarlos con Kubernetes para autoescalado y tolerancia a fallos. - Separar las cargas: mantener la carga del LLM en instancias que puedan ser escaladas horizontalmente o reemplazadas por adaptadores a servicios gestionados.
- Empaquetar
-
Latencia y rendimiento
- Cachear intenciones y respuestas frecuentes para evitar llamadas repetidas al LLM.
- Establecer budgets de latencia para las rutas críticas (comando→acción) y degradar a comportamientos locales si el LLM no responde a tiempo.
- Optimizar buffers y tamaños de frames en el firmware para minimizar jitter y evitar underruns en audio.
-
Resiliencia y comunicaciones confiables
- Implementar reintentos con backoff y confirmaciones en las comunicaciones MCP → firmware.
- Diseñar mensajes idempotentes para evitar efectos indeseados en reintentos (por ejemplo, comandos de volumen con identificador de operación).
- Monitorizar estados y exponer health-checks para cada servicio.
-
Seguridad y gestión de secretos
- No incluir credenciales en el repo; usar gestores de secretos (Vault, Secret Manager) para Gemini API keys.
- Asegurar el canal entre MCP y firmware (TLS o VPN) cuando sea posible, o al menos autenticación por tokens.
-
Operabilidad y observabilidad
- Añadir métricas (Prometheus) y trazas distribuidas (OpenTelemetry) para trazar latencia desde el Frontend hasta la acción en el hardware.
- Centralizar logs y alertas para detectar degradaciones (LLM, MCP, firmware).
-
Soporte offline y adaptadores de LLM
- Diseñar un adaptador de LLM con interfaz única que permita intercambiar Gemini por un LLM local (Llama 3.x u otro) para operar sin conexión.
- Implementar un modo degradado que ejecute reglas locales o prompts preprocesados cuando el servicio de LLM no esté disponible.
-
Firmware y actualizaciones
- Definir un Hardware Abstraction Layer (HAL) en el firmware para aislar controladores (I2S, SD, UI) y facilitar pruebas unitarias.
- Planificar OTA o procedimientos de actualización seguros del firmware para mejorar el mantenimiento en campo.
-
Pruebas y validación
- Añadir pruebas integradas (integration tests) que simulen el flujo Frontend→API→MCP→firmware (hardware-in-the-loop o mock del firmware).
- Crear suites de pruebas para audio (latencia, calidad, underrun) y validación de comandos del LLM.
-
Gestión de versiones y compatibilidad
- Versionar la API MCP y documentar breaking changes.
- Mantener un CHANGELOG y políticas de release para coordinar cambios entre firmware y servicios.
