> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jelou.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Composición de Tools

> Anida lógica reutilizable con el nodo Tool: salvaguardas anti-recursión y trazabilidad completa.

Puedes usar el nodo **Tool** dentro de otras Tools. Así armas bloques reutilizables (validar identidad, cobrar, consultar stock) y los combinas sin duplicar el canvas.

Disponible para todas las compañías.

## Cómo usarla

<Steps>
  <Step title="Abre el canvas">
    En Brain Studio, ve a la pestaña **Tools** y abre la que quieres componer (o crea una nueva).
  </Step>

  <Step title="Arrastra otra desde el buscador">
    En el canvas aparece el buscador de Tools. Arrastra la que necesites; se inserta como nodo con su `toolId`.

    La Tool que estás editando **no aparece** en la lista: no puedes referenciarte a ti misma.
  </Step>

  <Step title="Configura inputs y outputs">
    Mapea los inputs de la Tool hija (variables de memoria, `$input`, o valores fijos). Los tipos declarados (**NUMBER**, **BOOLEAN**, **OBJECT**, **ARRAY**) se preservan al invocarla; no llegan como string.
  </Step>

  <Step title="Publica">
    Publica la Tool padre. Al guardar y publicar, la plataforma rechaza autorreferencias y detecta ciclos (por ejemplo, A → B → A).
  </Step>
</Steps>

<Frame caption="Buscador en el canvas">
  <img src="https://mintcdn.com/jelouai/xODihpYvJ1U6EAyJ/assets/images/nodos/tool-composition-picker-es.png?fit=max&auto=format&n=xODihpYvJ1U6EAyJ&q=85&s=c0d7e58f4c4702f14a30dc1a2461c0ba" alt="Canvas mostrando el buscador para arrastrar otra Tool" width="1571" height="902" data-path="assets/images/nodos/tool-composition-picker-es.png" />
</Frame>

## Salvaguardas anti-recursión

Para evitar bucles infinitos:

* **Sin autorreferencia**: la Tool actual no aparece en el buscador y el guardado bloquea si intentas referenciarla.
* **Límite de anidamiento**: en tiempo de ejecución hay un tope de profundidad (por defecto **5** niveles). Si se supera, la ejecución falla de forma controlada.
* **Detección de ciclos**: al publicar, un analizador detecta ciclos entre Tools.

<Warning>
  Diseña Tools pequeñas y con una sola responsabilidad. Anidar en exceso dificulta depurar y acerca el límite de profundidad.
</Warning>

## Trazabilidad y depuración

Cada ejecución de una Tool hija genera un `executionId` que queda registrado en la Tool padre, aunque la ejecución termine en **timeout**, error o éxito.

Desde el [Tester](/guides/getting-started/tester), en el nodo usa **Debuggear Tool** para inspeccionar la ejecución interna de la hija (nodos, inputs, outputs y errores) sin abrir el canvas por separado.

## Timeout

Las Tools hijas tienen un timeout configurable. El valor por defecto es **30 segundos**. Si se agota, el estado final de la padre incluye el `executionId` de la hija y el resultado `TIMEOUT`, para que puedas depurarla igual que en un error normal.

## Tipos de inputs

Al mapear inputs hacia una Tool hija, el builder persiste el tipo junto con el valor. El motor convierte según el tipo declarado:

| Tipo declarado     | Comportamiento                                       |
| ------------------ | ---------------------------------------------------- |
| `NUMBER`           | Se envía como número (no como `"15"`)                |
| `BOOLEAN`          | Se envía como booleano                               |
| `OBJECT` / `ARRAY` | Se envía como estructura, no como string serializado |
| `STRING`           | Se envía como texto                                  |

Así evitas bugs silenciosos cuando la Tool hija espera un ID numérico o un objeto.

## Buenas prácticas

* Prefiere Tools genéricas y reutilizables como piezas de composición.
* Documenta inputs y outputs de cada Tool hija para que el mapeo en la padre sea claro.
* Prueba la composición en el Tester y usa **Debuggear Tool** en cada nivel anidado.
* Mantén la profundidad baja; si necesitas más de unos pocos niveles, revisa si puedes aplanar el diseño.
