Considera este Robot como una condición `if/else` para crear flujos de trabajo avanzados de conversión de archivos. Con él, puedes filtrar y dirigir determinados archivos subidos según sus metadatos.

El Robot tiene dos modos de funcionamiento:

* Construir condiciones a partir de arrays con 3 miembros cada uno. Por ejemplo, `["${file.size}", "<=", "720"]`
* Escribir condiciones en JavaScript. Por ejemplo, `${file.size <= 720}`. Consulta también [Evaluación dinámica](/es/docs/topics/dynamic-evaluation.md).

Si quieres que un Step `/file/filter` deje pasar sin cambios todos los archivos de entrada, no establezcas `accepts` ni`declines`, o establécelos en `null`. No uses `"accepts": "true"` para esto: las cadenas simples solo se tratan como expresiones de JavaScript cuando usan la forma `${...}`, como `"${true}"`.

Proporcionar JavaScript te permite implementar una lógica tan compleja como quieras; sin embargo, es más lento que combinar arrays de condiciones y se cobrará por cada invocación mediante [🤖/script/run EN (English)](/docs/robots/script-run.md).

### Condiciones como arrays

Los parámetros `accepts` y `declines` pueden establecerse individualmente como un array de arrays con tres miembros:

1. Un valor o una variable de Job, como `${file.mime}`
2. Uno de los siguientes operadores: `=`, `==`, `===`, `<`, `>`, `<=`, `>=`, `!=`, `!==`, `regex`, `!regex`, `includes`, `!includes`, `empty`, `!empty`
3. Un valor o una variable de Job, como `50` o `"foo"`

Ejemplos:

* `[["${file.meta.width}", ">", "${file.meta.height}"]]`
* `[["${file.size}", "<=", "720"]]`
* `[["${file.size}", ">", "20mb"]]`
* `[["720", ">=", "${file.size}"]]`
* `[["${file.mime}", "regex", "image"]]`

Cuando se compara con `${file.mime}`, el valor suele basarse en los metadatos extraídos por Transloadit del lado del servidor durante el flujo normal de subida, y no únicamente en el tipo MIME indicado por el cliente o el navegador. Esto hace que `/file/filter` sea adecuado para rechazar archivos con etiquetas incorrectas. Según el contenedor del archivo y las herramientas de detección involucradas, algunos formatos pueden aparecer con tipos MIME estrechamente relacionados, como `image/heic` o `image/heif`.

Si solo quieres formatos que los navegadores rendericen de manera uniforme, opta por una lista explícita de permitidos como`^(image/jpeg|image/png|image/gif|image/webp|image/avif)$` en lugar de una regla amplia `^image/`.

Para las comparaciones numéricas (`<`, `>`, `<=`, `>=`), puedes usar valores de bytes legibles para humanos, como `"20mb"`, `"1gb"` o `"512kb"`. Estos usan multiplicadores binarios (basados en 1024). Unidades compatibles: `b`, `kb`, `mb`, `gb`, `tb`, `pb` (y sus equivalentes IEC `kib`, `mib`, `gib`, `tib`, `pib`).

Los operadores `includes` y `!includes` funcionan con arrays o cadenas (en las cadenas se comprueba la presencia de subcadenas).

###### Advertencia

Si quieres comparar con un valor `null` o con un valor que no está presente (por ejemplo, un archivo de audio no tiene una propiedad `video_codec` en sus metadatos), compara en su lugar con `""` (una cadena vacía). En el futuro admitiremos correctamente la comparación con `null`, pero en este momento no podemos hacerlo fácilmente sin afectar la compatibilidad con versiones anteriores.

### Condiciones como JavaScript

Los parámetros `accepts` y `declines` pueden establecerse individualmente como cadenas de JavaScript que devuelven un valor booleano.

Ejemplos:

* `${file.meta.width > file.meta.height}`
* `${file.size <= 720}`
* `${/image/.test(file.mime)}`
* `${Math.max(file.meta.width, file.meta.height) > 100}`

Como se indicó, cobramos por esto mediante [🤖/script/run EN (English)](/docs/robots/script-run.md). Consulta también [Evaluación dinámica](/es/docs/topics/dynamic-evaluation.md) para obtener más detalles sobre la sintaxis y el comportamiento permitidos.
