122 lines
6.9 KiB
Markdown
122 lines
6.9 KiB
Markdown
# 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/<id>`: retorna un flow individual por su `id`.
|
|
- `POST /flow`: crea un nuevo flow (envía JSON con `label`, `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:
|
|
|
|
```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.
|