# Generador de Flows con Node-RED Este proyecto monta una instancia local de Node-RED dentro de un contenedor y expone su API de administración para poder crear y editar flows de manera programática. ## Requisitos - Docker 24+ con soporte para `docker compose` - Puerto `1880` disponible en la máquina host ## Variables de entorno Configura los parámetros en el archivo `.env` (usa `.env.example` como base): ``` NODE_RED_IMAGE=nodered/node-red # Imagen oficial NODE_RED_VERSION=3.1.5 # Tag de la imagen NODE_RED_PORT=1880 # Puerto expuesto en el host NODE_RED_DATA=./data # Directorio local para flows/lib/data NODE_RED_FLOW_CREDENTIAL_SECRET=... # Se usa para cifrar credenciales de los flows ``` Puedes modificar estos valores antes de levantar el contenedor. Compose usará automáticamente este archivo. ## Levantar Node-RED ```bash docker compose up -d ``` Esto descargará la imagen (si no existe), creará la red `musica_default` y levantará el contenedor `node-red-dev`. Para apagarlo: ```bash docker compose down ``` Los flows persistirán en la carpeta `data/` gracias al volumen montado. ## Endpoints relevantes para editar flows La API de administración de Node-RED queda expuesta en `http://localhost:${NODE_RED_PORT}`. Los endpoints más usados para gestionar flows son: - `GET /flows`: devuelve el flow completo (un arreglo de nodos). Ejemplo: ```bash curl http://localhost:1880/flows ``` - `POST /flows`: reemplaza todos los flows. Requiere el JSON completo del workspace. - `GET /flow/`: retorna un flow individual por su `id`. - `POST /flow`: crea un nuevo flow (envía JSON con `label`, `nodes`, etc.). - `PUT /flow/`: actualiza un flow existente. - `DELETE /flow/`: elimina un flow existente. Todos los endpoints aceptan/retornan JSON y necesitan el header `Content-Type: application/json`. Mientras no configures autenticación en `settings.js`, la API está abierta en localhost. Para validar el acceso básico puedes ejecutar: ```bash curl --silent http://localhost:1880/flows # [] -> instancia recién creada ``` La interfaz gráfica del editor sigue estando disponible en `http://localhost:${NODE_RED_PORT}` para editar flows manualmente. ## Próximos pasos - Añadir autenticación al editor (por ejemplo con `adminAuth`). - Conectar Node-RED con tus modelos IA (GLM, Minimax, etc.). - Integrar Node-RED a Node-RED Dashboard o Node-RED Projects para versionar flows. ## Dashboard para analizar proyectos `.als` Se añadió un flow en `data/flows.json` que usa Node-RED Dashboard para mostrar un pequeño panel en `http://localhost:${NODE_RED_PORT}/ui`. Allí encontrarás: 1. **Card “Inspector de proyectos ALS”**: permite subir un archivo `.als` (Ableton Live Set). El archivo se procesa solo en tu instancia. 2. **Card “Resumen del proyecto”**: enseña los metadatos extraídos: - Nombre del Live Set, versión de Ableton y tamaño del archivo. - Tempo detectado, longitud aproximada del arreglo (a partir de `LoopLength`) y número de escenas. - Conteo de tracks por tipo (Audio, MIDI y Grupos) junto con el número de dispositivos por track. - Lista de escenas y primeras rutas de samples (`RelativePath`) encontradas dentro del proyecto. ### ¿Cómo funciona el flujo? - El `ui_template` de subida convierte el archivo a base64 y lo envía mediante `fetch` al endpoint `POST /als/upload`. - `HTTP in` + `function JSON base64 → Buffer` validan y transforman el body en un `Buffer`. - El nodo `function` **Inspector ALS** descomprime el `.als` (gzip de XML), usa `fast-xml-parser` para navegar `Ableton.LiveSet` y construye el resumen (tempo, escenas, tracks, muestras, etc.). - La respuesta HTTP devuelve el JSON al navegador y, en paralelo, el flujo envía el resumen al dashboard y al nodo `debug` para inspección. ### Dependencias y estructura - En `/home/ren/musica/data/package.json` se añadieron `node-red-dashboard` (UI) y `fast-xml-parser` (parser XML). Al levantar el contenedor se instalan automáticamente. - Los flujos viven en `data/flows.json`; puedes exportarlos/importarlos con `GET/POST /flows`. - Los archivos de ejemplo que compartiste (`als/...`) sirven para probar: levanta la app, ve a `/ui`, y sube uno de los `.als` para ver la ingeniería inversa básica. - Para evitar desconexiones del dashboard al subir archivos grandes, la subida ahora se hace contra `POST /als/upload` (Content-Type `application/json`). El payload debe incluir `{ filename, size, data }`, donde `data` es un DataURL/base64 del `.als`. El límite del body se amplió a `20mb` en `settings.js (apiMaxLength)`. - Puedes automatizar la subida llamando directamente al endpoint; el servidor responde con el mismo JSON que consume el dashboard (o `{ error: \"...\" }` en caso de fallo). > Tip: si cambias el flujo desde el editor de Node-RED, recuerda exportarlo o guardar el nuevo `flows.json` para versionarlo aquí. ### Biblioteca y deduplicación - Cada análisis queda persistido en `data/als-library.json` junto con su hash MD5 y todos los metadatos. - Si intentas subir el mismo `.als`, el flujo detecta el hash duplicado, responde `409` y el dashboard avisa sin sobrescribir la biblioteca. - Para consultar el inventario (por ejemplo, desde una IA) usa `GET /als/library`; el endpoint devuelve el arreglo completo de proyectos almacenados. - Como el archivo vive dentro de `/data`, puedes versionarlo o respaldarlo fácilmente según tu flujo de trabajo. ### Chatbot y generación de nuevos `.als` - Coloca tus stems/loops en `data/sources/` (el contenedor los comparte con Node-RED). Los `.als` creados se guardan en `data/generated/` y las plantillas descomprimidas viven en `data/library/`. - Configura en `.env` las credenciales de MiniMax/GLM (`ANTHROPIC_BASE_URL`, `ANTHROPIC_AUTH_TOKEN`, etc.). Si la IA falla, el generador recurre a heurísticas locales con las plantillas existentes. - Nuevo endpoint `POST /als/chat`: ```json { "prompt": "generame un als de reggaeton 2001" } ``` Devuelve el resumen del proyecto creado (nombre, hash y ruta del archivo). En el dashboard aparece la tarjeta **Chatbot ALS** para conversar visualmente. - Si envías mensajes generales (“hola”, “¿qué estilos tenemos?”, “qué hay en sources?”) el bot usa la API de MiniMax para responder de forma amigable, recuerda el contexto reciente y te guía hasta que le pidas explícitamente “generame un als ...”. - Internamente se usa `data/lib/alsGenerator.js`: el bot elige una plantilla (`als-library.json`), edita el XML del `.als` (nombre del proyecto, tempo, anotaciones con los sources) y registra el resultado llamando otra vez a `/als/upload` para mantener la deduplicación. - También puedes usarlo desde terminal: ```bash set -a && source .env node scripts/chatbot.js # modo interactivo node scripts/generate-als.js "generame un als tribal" ``` Ambos comandos generan el archivo dentro de `data/generated/` y lo añaden automáticamente a la biblioteca.