6.6 KiB
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
1880disponible 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
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:
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:curl http://localhost:1880/flowsPOST /flows: reemplaza todos los flows. Requiere el JSON completo del workspace.GET /flow/<id>: retorna un flow individual por suid.POST /flow: crea un nuevo flow (envía JSON conlabel,nodes, etc.).PUT /flow/<id>: actualiza un flow existente.DELETE /flow/<id>: 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:
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:
- Card “Inspector de proyectos ALS”: permite subir un archivo
.als(Ableton Live Set). El archivo se procesa solo en tu instancia. - 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_templatede subida convierte el archivo a base64 y lo envía mediantefetchal endpointPOST /als/upload. HTTP in+function JSON base64 → Buffervalidan y transforman el body en unBuffer.- El nodo
functionInspector ALS descomprime el.als(gzip de XML), usafast-xml-parserpara navegarAbleton.LiveSety 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
debugpara inspección.
Dependencias y estructura
- En
/home/ren/musica/data/package.jsonse añadieronnode-red-dashboard(UI) yfast-xml-parser(parser XML). Al levantar el contenedor se instalan automáticamente. - Los flujos viven en
data/flows.json; puedes exportarlos/importarlos conGET/POST /flows. - Los archivos de ejemplo que compartiste (
als/...) sirven para probar: levanta la app, ve a/ui, y sube uno de los.alspara 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-Typeapplication/json). El payload debe incluir{ filename, size, data }, dondedataes un DataURL/base64 del.als. El límite del body se amplió a20mbensettings.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.jsonpara versionarlo aquí.
Biblioteca y deduplicación
- Cada análisis queda persistido en
data/als-library.jsonjunto con su hash MD5 y todos los metadatos. - Si intentas subir el mismo
.als, el flujo detecta el hash duplicado, responde409y 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.alscreados se guardan endata/generated/y las plantillas descomprimidas viven endata/library/. - Configura en
.envlas 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:Devuelve el resumen del proyecto creado (nombre, hash y ruta del archivo). En el dashboard aparece la tarjeta Chatbot ALS para conversar visualmente.{ "prompt": "generame un als de reggaeton 2001" } - 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/uploadpara mantener la deduplicación. - También puedes usarlo desde terminal:
Ambos comandos generan el archivo dentro de
set -a && source .env node scripts/chatbot.js # modo interactivo node scripts/generate-als.js "generame un als tribal"data/generated/y lo añaden automáticamente a la biblioteca.