¿Cómo enviar datos binarios nulos si no hay datos de archivo disponibles?

En este flujo, si recibo una URL de medios, descargo la imagen de la URL y la envío al modelo de IA como datos.

Si no hay medios, se activa la otra rama. Los datos no existen.

¿Cómo le digo al modelo que use los datos si existen e ignore si no existen?

2 Me gusta

Si la rama false no tiene datos, el nodo AI puede fallar. Necesitas 2 mensajes diferentes. Se verá algo así

¡Bienvenido @Yash_Ganthe a nuestra comunidad! Soy Jay y soy un creador verificado de n8n.

El enfoque con el nodo de código es el camino más limpio aquí. En la rama falsa, utiliza un nodo Code para eliminar datos binarios antes de fusionar:

return $input.all().map(item => ({
  json: item.json,
  binary: {}
}));

Luego fusiona ambas ramas y pasa la salida combinada a un único nodo de IA - el modelo simplemente recibirá un objeto binario vacío en la ruta sin medios, que maneja correctamente sin generar errores.

Realicé los cambios como se muestra arriba. El Merge está configurado para Append los Inputs. No hay opción para elegir una entrada si la otra falta.

El nodo Merge produce:

[ 
{
"text": "Test15", 
"media_url": "" 
}
]

Los valores binarios parecen estar vacíos.

El nodo LLM da el error:

El primer argumento debe ser de tipo string o una instancia de Buffer, ArrayBuffer, o Array o un objeto similar a Array. Se recibió undefined

El nodo está configurado como:

El problema es que pasar binary: {} sigue dejando la clave binary en el elemento, e intenta leer el campo data del nodo LLM desde ella, que está indefinido. La solución es eliminar la clave binary completamente cuando no hay archivo:

return $input.all().map(item => {
  const result = { json: item.json };
  if (item.binary && Object.keys(item.binary).length > 0) {
    result.binary = item.binary;
  }
  return result;
});

De esta manera, los elementos sin archivo no tendrán una propiedad binary, por lo que el nodo LLM no intentará leer desde ella.

El LLM ahora da un error que dice:

Esta operación espera que los datos de entrada del nodo contengan un archivo binario ‘data’, pero no se encontró ninguno [elemento 0]

@Yash_Ganthe Intenta con este flujo de trabajo, funciona al 100%.

Sigue siendo el mismo error. Ten en cuenta que se espera que los datos sean binarios. No una matriz.

Esta operación espera que los datos de entrada del nodo contengan un archivo binario “data”, pero no se encontró ninguno [item 0]

@Yash_Ganthe el error viene del nodo que sigue esperando una propiedad binaria llamada data en el elemento, incluso cuando estás en la rama false. Añade un nodo Code en la ruta false (antes de que llegue al modelo de IA) con esto:

for (const item of $input.all()) {
  item.binary = {};
}
return $input.all();

Esto establece explícitamente binary como un objeto vacío, lo que le indica al nodo siguiente que no hay datos binarios disponibles en lugar de dejarlo indefinido. La diferencia es: undefined activa el error «binary not found», mientras que un {} vacío pasa sin problemas.

The binary is expected to have a data property which is expected to be empty in the False branch.

item.binary = { data:{} };

Added this. Still the same error.

El elemento no tiene un campo binario ‘data’ [elemento 0]

Verifica que el parámetro donde especificaste el nombre del campo binario de entrada sea correcto y que coincida con un campo en la entrada binaria.

Recibo este error cuando dejo el binario vacío.

Todo lo que necesito es una forma de hacer que la entrada al modelo vaya como un archivo vacío si no se envía ninguna imagen en la entrada.

Usa el JSON que se muestra a continuación, funcionará correctamente. Solo una nota rápida: soy creador de n8n y ya he construido muchos flujos de trabajo como este, así que puedes aplicar este enfoque con confianza.

Necesitas usar un Agente de IA junto con el nodo OpenAI Chat Model para que esta función se comporte correctamente (enviar archivo cuando esté disponible y tratarlo como sin archivo cuando falte). He probado esta configuración y funciona perfectamente en mi flujo de trabajo.

The Aggregate node removes the binary data that has come from the Download node. Due to this, the Agent node does not receive the binary data.

If I remove the Aggregate node and connect the Merge to the Agent, the JSON data reaches the Agent twice as 2 items. Is there a way to retain the binary data?

Versión corta: no intentes hacer que un nodo tome la imagen “opcionalmente” — esa es la parte que te está causando problemas. Ya que ya tienes las dos ramas, mantenlas separadas hasta el modelo:

• Si estás usando un nodo de IA/modelo integrado: coloca un nodo de modelo en cada rama — la rama de medios configurada con la entrada de imagen binaria, la rama sin medios solo texto — y Merge después del modelo si necesitas recombinarlas.
• Si estás llamando al modelo a través del nodo HTTP Request: construye el cuerpo de la solicitud por rama — la rama de medios incluye la parte de imagen (base64), la rama sin medios envía un cuerpo solo texto. (Puedes hacerlo en un nodo con una expresión que solo agregue el bloque de imagen cuando exista el binario, pero dos nodos es más fácil de leer.)
Lo que debes evitar es fusionar las dos ramas antes del modelo — lanzará un error en los elementos binarios vacíos, y Merge tiende a perder el binario de todas formas. Bienvenido a la comunidad :waving_hand:

@Yash_Ganthe Disculpa, olvidé activar el modo Incluir binario, ya lo he arreglado.

Puedes revisar mi JSON nuevamente. ¡Me alegra poder ayudarte! Espero que sea la solución para tu problema.

I did it in a simpler way. The image received from Whatsapp is successfully uploaded to Google drive. However, the Agent is not able to access it. I have kept the drive images in a public folder and have tried accessing them successfully from other browsers.