> ## 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.

# Tools nativas

> Herramientas nativas disponibles en el nodo AI Agent para consultar productos, manipular fechas, enviar mensajes interactivos y transferir conversaciones

Las tools nativas son herramientas predefinidas e integradas en la plataforma que permiten al modelo de IA realizar acciones específicas durante una conversación. Estas herramientas extienden las capacidades del agente de IA más allá de la generación de texto, permitiéndole interactuar con el sistema, consultar información, manipular datos y ejecutar acciones concretas.

Las tools nativas se encuentran y configuran en el nodo **AI Agent**. Para acceder a ellas:

1. Selecciona el nodo AI Agent en tu flujo
2. Abre la sección **TOOLS** en la configuración del nodo
3. Haz clic en el botón **"+ Agregar tools"**
4. En el campo "Selecciona un Tool", verás la lista de todas las tools disponibles, incluyendo las nativas (marcadas con el texto "(Nativa)")

<Frame>
  <img src="https://mintcdn.com/jelouai/-o-kKrN0OQnomzAi/assets/images/agentes-ia/tools-nativas.png?fit=max&auto=format&n=-o-kKrN0OQnomzAi&q=85&s=8dc07a07712d7fc645578604c7d9267b" alt="Configuración de tools nativas en el nodo AI Agent" width="708" height="489" data-path="assets/images/agentes-ia/tools-nativas.png" />
</Frame>

A continuación se describen todas las herramientas nativas disponibles en el nodo AI Agent:

## Búsqueda de productos

Busca productos en el catálogo disponible para recomendar al usuario. Utiliza un motor de búsqueda para encontrar coincidencias basadas en el nombre del producto o términos relacionados.

**Parámetros:**

| Nombre                |   Tipo   | Obligatorio | Descripción                                                                        |
| :-------------------- | :------: | :---------: | :--------------------------------------------------------------------------------- |
| `product`             | `string` |    **Sí**   | Término de búsqueda o nombre del producto.                                         |
| `top_k`               | `number` |      No     | Cantidad máxima de resultados a retornar.                                          |
| `score_threshold`     | `number` |      No     | Puntuación mínima de similitud (0.0 a 1.0) para considerar un resultado relevante. |
| `client_reference_id` | `string` |      No     | ID de referencia del cliente para búsquedas personalizadas.                        |

**Ejemplo de Prompt:**

> "Si el usuario pregunta por la disponibilidad de algún artículo o modelo específico, DEBES usar la herramienta `search_products` para consultar el catálogo antes de responder."

**Ejemplo de Argumentos:**

```json theme={null}
{
  "product": "iPhone 15 Pro",
  "top_k": 5,
  "score_threshold": 0.85
}
```

**Respuesta:**
Retorna un listado de productos encontrados o un mensaje indicando que no se encontraron resultados. En caso de error, devuelve un mensaje de sistema descriptivo.

**Notas:**

* Requiere que el bot tenga un catálogo de productos configurado y accesible.

***

## Transferir a asesor

Transfiere la conversación actual del usuario a un agente humano o a una cola de atención. Permite especificar estrategias de enrutamiento y prioridades.

**Parámetros:**

| Nombre            |   Tipo   |       Obligatorio       | Descripción                                                                   |
| :---------------- | :------: | :---------------------: | :---------------------------------------------------------------------------- |
| `assignment_type` |  `enum`  |  No (Default: `direct`) | Método de asignación: `direct` (inmediato) o `queue` (cola de tickets).       |
| `assignment_by`   |  `enum`  | No (Default: `shuffle`) | Estrategia de enrutamiento: `shuffle` (auto), `team`, `operators`, `general`. |
| `teamId`          | `number` |           No\*          | ID del equipo. \*Requerido solo si `assignment_by` es 'team'.                 |
| `operatorId`      | `number` |           No\*          | ID del operador. \*Requerido solo si `assignment_by` es 'operators'.          |
| `priority`        | `number` |     No (Default: 0)     | Prioridad en la cola (0-10), solo relevante para `assignment_type='queue'`.   |

**Ejemplo de Prompt:**

> "Cuando el usuario exprese frustración o solicite hablar explícitamente con una persona real, ejecuta la función `transfer_to_agent` inmediatamente."

**Ejemplo de Argumentos:**

*Caso: Transferencia directa automática (más común)*

```json theme={null}
{
  "assignment_type": "direct",
  "assignment_by": "shuffle"
}
```

*Caso: Transferencia directa a un equipo*

```json theme={null}
{
  "assignment_type": "direct",
  "assignment_by": "team",
  "teamId": 4501
}
```

*Caso: Crear ticket en cola general*

```json theme={null}
{
  "assignment_type": "queue",
  "assignment_by": "general",
  "priority": 5
}
```

**Respuesta:**
Retorna un objeto JSON con el resultado de la operación indicando si la transferencia se inició correctamente.

**Notas:**

* Puede finalizar el flujo de IA inmediatamente.
* Cuando se usa `assignment_type: "queue"` con `assignment_by: "general"`, se crea un ticket en la cola general de atención.
* **Importante:** No se deben inventar IDs de equipos u operadores; se deben usar los configurados explícitamente.

***

## Enviar mensajes interactivos

Envía un mensaje estructurado o interactivo al usuario. El formato exacto depende del canal (WhatsApp, Web, etc.), pero generalmente incluye botones o listas de opciones.

**Parámetros:**

| Nombre    |   Tipo   | Obligatorio | Descripción                                                                                                                                    |
| :-------- | :------: | :---------: | :--------------------------------------------------------------------------------------------------------------------------------------------- |
| `text`    | `string` |    **Sí**   | Contenido principal del mensaje. Máximo 1024 caracteres.                                                                                       |
| `title`   | `string` |      No     | Cabecera/título del mensaje. Máximo 60 caracteres.                                                                                             |
| `caption` | `string` |      No     | Subtítulo o descripción complementaria. Máximo 60 caracteres. En WhatsApp con 4+ opciones, se usa como texto del botón que despliega la lista. |
| `options` |  `array` |    **Sí**   | Lista de opciones/botones. Ver estructura abajo.                                                                                               |

*Estructura de `options` (Array de objetos):*

* `title` (string, obligatorio): Texto de la opción/botón. Máximo 20 caracteres. No se permiten títulos duplicados.
* `description` (string, opcional): Descripción adicional de la opción. Máximo 72 caracteres.

**Ejemplo de Prompt:**

> "Si el usuario pregunta qué servicios ofrecemos DEBES usar `send_interactive_message` para mostrar un menú con las opciones disponibles."

**Ejemplo de Argumentos (Botones - 3 o menos opciones):**

```json theme={null}
{
  "text": "¿Cómo deseas continuar con tu consulta?",
  "title": "Opciones de Servicio",
  "caption": "Selecciona una opción",
  "options": [
    {
      "title": "Hablar con Agente",
      "description": "Transferir a soporte humano"
    },
    {
      "title": "Ver Catálogo",
      "description": "Explorar productos disponibles"
    }
  ]
}
```

**Ejemplo de Argumentos (Lista WhatsApp - 4+ opciones):**

```json theme={null}
{
  "text": "Tenemos varios departamentos disponibles para atenderte.",
  "title": "Departamentos",
  "caption": "Ver opciones",
  "options": [
    { "title": "Ventas", "description": "Consultas de productos y precios" },
    { "title": "Soporte Técnico", "description": "Ayuda con problemas técnicos" },
    { "title": "Facturación", "description": "Consultas sobre pagos" },
    { "title": "Devoluciones", "description": "Gestionar devoluciones" }
  ]
}
```

<Note>
  En WhatsApp, cuando envías 4 o más opciones, el mensaje se muestra como una lista desplegable. El valor de `caption` se usa como texto del botón que abre la lista (en el ejemplo anterior, "Ver opciones").
</Note>

**Respuesta:**
Retorna `"Message sent successfully."` si el envío fue exitoso o un mensaje de error en caso contrario.

**Notas:**

* Envía un mensaje real al usuario.
* El tipo de mensaje se adapta automáticamente según el canal y la cantidad de opciones.

***

## Enviar Call to Action (CTA)

Envía un botón de llamada a la acción que abre una URL externa. Puede configurarse como WebView para formularios o pagos que requieren esperar una respuesta del usuario.

**Parámetros:**

| Nombre              |         Tipo         | Obligatorio | Descripción                                                                                             |
| :------------------ | :------------------: | :---------: | :------------------------------------------------------------------------------------------------------ |
| `text`              |       `string`       |    **Sí**   | Contenido principal del mensaje.                                                                        |
| `url`               |       `string`       |    **Sí**   | URL que se abre al hacer clic en el botón.                                                              |
| `display_text`      |       `string`       |    **Sí**   | Texto del botón CTA. Máximo 20 caracteres.                                                              |
| `title`             |       `string`       |      No     | Cabecera/título del mensaje.                                                                            |
| `caption`           |       `string`       |      No     | Subtítulo para complementar el mensaje.                                                                 |
| `is_webview`        |       `boolean`      |      No     | Si es `true`, envía como WebView que pausa el flujo y espera callback. Default: `false`.                |
| `expiration_time`   |       `number`       |      No     | Segundos para esperar el callback antes de expirar. Default: 300. Solo aplica cuando `is_webview=true`. |
| `pending_message`   |       `string`       |      No     | Mensaje a mostrar si el usuario envía texto mientras se espera el callback del WebView.                 |
| `response_variable` |       `string`       |      No     | Nombre de la variable donde guardar la respuesta del callback.                                          |
| `input`             | `string` \| `object` |      No     | Datos para pasar al WebView como parámetros de URL.                                                     |

**Ejemplo de Prompt:**

> "Cuando el usuario confirme que desea realizar el pago, usa `send_call_to_action` con `is_webview=true` para enviar el enlace de pago y esperar la confirmación."

**Ejemplo de Argumentos (CTA simple):**

```json theme={null}
{
  "text": "Visita nuestra tienda online para ver todos los productos disponibles.",
  "url": "https://tienda.ejemplo.com/catalogo",
  "display_text": "Ver Catálogo",
  "title": "Tienda Online"
}
```

**Ejemplo de Argumentos (WebView con espera de respuesta):**

```json theme={null}
{
  "text": "Haz clic en el botón para completar tu pago de forma segura.",
  "url": "https://pagos.ejemplo.com/checkout",
  "display_text": "Pagar Ahora",
  "title": "Completar Pago",
  "is_webview": true,
  "expiration_time": 600,
  "pending_message": "Por favor, completa el pago en la ventana abierta antes de continuar.",
  "response_variable": "payment_result",
  "input": {
    "order_id": "12345",
    "amount": 99.99
  }
}
```

**Respuesta:**

* CTA normal: `"Call-to-action message sent successfully."`
* WebView: `"WebView message sent. Waiting for user action."`

**Notas:**

* Disponible solo para los proveedores de WhatsApp que soportan este tipo de mensajes.
* Cuando `is_webview=true`, el flujo se pausa hasta que el WebView devuelve un callback o expira el tiempo.
* El valor de `input` se convierte a parámetros de URL query string.
* La respuesta del callback se guarda en la variable especificada en `response_variable`.

***

## Fecha y hora actual

Obtiene la fecha y hora actual. Permite especificar una zona horaria para obtener la hora local correcta.

**Parámetros:**

| Nombre     |   Tipo   | Obligatorio | Descripción                                                            |
| :--------- | :------: | :---------: | :--------------------------------------------------------------------- |
| `timezone` | `string` |      No     | Zona horaria deseada en formato IANA (ej: "America/Guayaquil", "UTC"). |

**Ejemplo de Prompt:**

> "Antes de procesar cualquier solicitud que dependa de la hora (como 'buenos días' o citas para 'hoy'), llama a `get_current_date_time` para saber la hora exacta."

**Ejemplo de Argumentos:**

```json theme={null}
{
  "timezone": "America/Mexico_City"
}
```

**Respuesta:**
Retorna un string con la fecha y hora formateada, por ejemplo: `"Monday, December 08, 2025 10:30 AM"`.

**Notas:**

* No tiene efectos secundarios visibles para el usuario.
* Es puramente informativa para el modelo.

***

## Día de la semana

Calcula y retorna el día de la semana correspondiente a una fecha específica proporcionada.

**Parámetros:**

| Nombre |   Tipo   | Obligatorio | Descripción                                                           |
| :----- | :------: | :---------: | :-------------------------------------------------------------------- |
| `date` | `string` |    **Sí**   | Fecha a consultar (formato ISO o legible standard, ej: "2024-12-25"). |

**Ejemplo de Prompt:**

> "Si el usuario quiere agendar para una fecha específica, verifica primero qué día de la semana es usando `get_weekday_of_a_date` para asegurar que sea un día hábil."

**Ejemplo de Argumentos:**

```json theme={null}
{
  "date": "2025-12-10"
}
```

**Respuesta:**
Retorna el nombre del día de la semana, por ejemplo: `"Wednesday"`.

**Notas:**

* Útil para validar citas o agendas.
