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

# Herramientas integradas

> Configura acciones confiables durante la llamada: finaliza o transfiere una llamada, envía SMS o correo electrónico, consulta el horario comercial y programa una devolución de llamada confirmada

Las herramientas integradas son acciones listas para usar que el asistente puede invocar durante una conversación en vivo. A diferencia de un Flow, no necesitan ningún grafo: crea una herramienta reutilizable del espacio de trabajo, describe *cuándo* debe ejecutarse y asígnala a uno o más asistentes. Son una **segunda vía adicional** junto a los [nodos de Flow](/flow-builder/overview).

Toda herramienta integrada es defensiva: una herramienta mal configurada registra un evento de llamada `builtin_tool_error` y el asistente sigue hablando con quien llama — una herramienta rota nunca hace fallar una llamada.

En las respuestas automáticas de **mensajería** (Telegram, Slack, Messenger, Teams, Discord, Google Chat, X) y de **correo electrónico**, se ejecutan las mismas herramientas integradas aptas para texto en la ruta de respuesta de Next.js (también API/MCP/base de conocimientos/calendario). Los tipos exclusivos de voz (`end_call`, transferencias, DTMF/teclado, tarjeta de pago) no están registrados ahí.

## Las herramientas independientes

| Herramienta                                                     | Qué hace                                                                                                                                                                                                                                     |
| --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Finalizar llamada** (`end_call`)                              | Cuelga después de que el asistente haya terminado su tarea y se haya despedido.                                                                                                                                                              |
| **Transferencia de llamada** (`call_transfer`)                  | Transferencia en frío (SIP REFER) a un número de teléfono.                                                                                                                                                                                   |
| **Transferencia de llamada en caliente** (`warm_call_transfer`) | Pone en espera a quien llama, marca el número de un colega, lo pone al tanto y luego une a ambas partes.                                                                                                                                     |
| **Transferir a asistente** (`assistant_transfer`)               | Entrega la llamada en vivo a otro asistente de IA del mismo espacio de trabajo (KI→KI).                                                                                                                                                      |
| **Enviar SMS** (`send_sms`)                                     | El asistente redacta un mensaje de texto durante la llamada y lo envía, a quien llama o a un número fijo.                                                                                                                                    |
| **Enviar correo electrónico** (`send_email`)                    | El asistente redacta y envía un correo electrónico durante la llamada.                                                                                                                                                                       |
| **Horario comercial** (`check_business_hours`)                  | Permite que el asistente compruebe si ahora mismo estás abierto — evaluado según la zona horaria del asistente.                                                                                                                              |
| **Programar devolución de llamada** (`schedule_callback`)       | El asistente acuerda una hora con quien llama; más tarde, un cron job marca la devolución de llamada automáticamente. Todas las reservas aparecen en vivo en **Audience → Scheduled Callbacks** (voz, chat/mensajería y correo electrónico). |
| **Recoger tarjeta de pago** (`collect_payment_card`)            | Habilita los nodos Collect de tipo Tarjeta de pago en los Flows. Las tarjetas se tokenizan en tu cuenta de Stripe (tu clave secreta).                                                                                                        |
| **Establecer variable de llamada** (`set_variable`)             | Guarda un valor durante la llamada (por ejemplo, el nombre de la empresa). El modelo lo aprende a través del resultado de la herramienta; otras herramientas, correos, condiciones del Flow y webhooks pueden usarlo después.                |

La recopilación por teclado pertenece al Flow: agrega un nodo **Collect** en [generador de Flow](/flow-builder/overview), donde el worker puede gestionar de forma segura el estado y las transiciones DTMF. Las acciones de calendario las proporciona [Integraciones](/assistants/calendar-booking). Las antiguas configuraciones independientes `dtmf_input`, `collect_keypad` y `calendar_integration` se conservan solo para mantener la visualización de versiones anteriores y ya no se pueden crear como herramientas reutilizables nuevas.

## Habilitar una herramienta

Abre **Herramientas**, crea una herramienta **Integrada**, completa sus campos y asígnala a un asistente. Su **nombre**, obligatorio, es el nombre exacto de la función expuesta al modelo, mientras que la **descripción** le indica al modelo cuándo usarla. Las llamadas se atribuyen a la herramienta reutilizable en la vista de Ejecuciones.

### Finalizar llamada

No hay más configuración que la descripción. El modelo debe completar la solicitud y despedirse antes de invocar la función; luego el worker marca la llamada como finalizada y cuelga.

### Transferencia de llamada (en frío)

* **Número de teléfono** — el destino fijo.
* **La IA puede determinar el número de transferencia dinámicamente** — expone el destino como argumento de la función en su lugar.
* **Mensaje de transferencia en caliente** — aviso opcional no interrumpible antes de la transferencia en frío.

### Transferencia de llamada en caliente

Pone en espera a quien llama y primero marca el número de un colega:

* **Teléfono del supervisor** — a quién llamar; se usa la troncal SIP saliente configurada del espacio de trabajo.
* **Música en espera** — activada o desactivada, más un **mensaje en espera** hablado opcional.
* **Briefing** — **instrucciones de resumen** (cómo resumir la llamada para el colega) y una **apertura del briefing** que se le dice al colega; ambas admiten `{{variables}}`.
* **Tiempo de espera de timbre** y **alternativa** — continuar la conversación, finalizar, o hacer una transferencia en frío si falla la llamada de consulta.

### Transferir a asistente (KI→KI)

Entrega la sesión en vivo a otro asistente del **mismo espacio de trabajo** sin colgar:

* **Asistente de destino** (`assistant_id`) — obligatorio; debe pertenecer al espacio de trabajo.
* **Mensaje antes de la transferencia** — línea opcional no interrumpible que se dice antes del traspaso.
* **Decir saludo de transferencia** — cuando está activado (por defecto), el primer mensaje/saludo del asistente de destino se reproduce después del cambio.
* **Descripción** — obligatoria: indica al modelo *cuándo* hacer el traspaso (por ejemplo, preguntas de precio → asistente de ventas).

El modelo puede enviar un breve `reason` y un `conversation_summary` para que el asistente receptor conserve el contexto. El worker reconstruye STT/LLM/TTS (o el modo realtime) para el destino, invoca `session.update_agent` y escribe los eventos de llamada `assistant_transfer` / `assistant_transfer_failed`. Una llamada puede traspasarse como máximo **tres** veces (protección contra bucles). Se rechaza la autotransferencia al mismo asistente.

### Enviar SMS

El asistente redacta el texto del mensaje a partir de la conversación y lo envía durante la llamada:

* **Destinatario** (`sms_to_mode`) — `caller` (por defecto: el propio número de quien llama) o `custom` con un **número personalizado** fijo (`sms_custom_number`, E.164, por ejemplo `+491701234567`).

Uso típico: enviar por SMS una confirmación, una dirección o un enlace de pago sin colgar el teléfono.

### Enviar correo electrónico

La herramienta de correo separa la captura del destinatario, la identidad del remitente, el contenido y la firma, de modo que cada parte pueda ser determinista donde haga falta:

* **Destinatario** (`email_to_mode`) — `ask` usa un flujo dedicado de captura de correo para normalizar el habla ruidosa y obtener una confirmación explícita; `fixed` usa `email_fixed_to`. Las direcciones mal formadas o dictadas nunca se adivinan al momento de enviar.
* **Remitente** (`email_sender_mode`) — `auto` prueba primero la dirección de SendGrid verificada del asistente, luego el SMTP del espacio de trabajo/reseller y por último el correo de la plataforma. O selecciona explícitamente **SMTP del espacio de trabajo**, **Correo de la plataforma**, o una dirección verificada desde `GET /api/v1/email-senders`. Las selecciones explícitas fallan de forma clara en lugar de recurrir a un respaldo silencioso.
* **Nombre para mostrar** (`email_from_name`) — anulación opcional por herramienta.
* **Contenido** (`email_content_mode`) — `llm` deja que el modelo escriba el asunto/cuerpo a partir de la llamada; `fixed` siempre envía el texto literal configurado; `template` resuelve `{{call_variables}}` y bloquea el envío si falta un valor.
* **Firma** (`email_signature_mode`) — la firma predeterminada del espacio de trabajo (con `{agent_name}` / `{{assistant_name}}`), una firma personalizada por herramienta, o ninguna. La añade una sola vez el código de la aplicación, no la improvisa el modelo.
* **Estado de entrega** — un resultado exitoso de la herramienta significa que el proveedor SMTP aceptó el mensaje, no que llegó a la bandeja de entrada. Las supresiones conocidas de SendGrid por rebote/bloqueo/spam se comprueban antes de enviar y se devuelven al asistente como un fallo de entrega.

El envío, al ser irreversible, desactiva las interrupciones, lleva el ID de la llamada al historial de correos y usa una clave de idempotencia para que una llamada de función repetida no cree intencionalmente un segundo mensaje.

### Horario comercial

Permite que el asistente responda con sinceridad a "¿estás abierto ahora mismo?" — y que actúe de forma distinta fuera del horario de apertura:

* **Horario comercial** (`business_hours`) — un horario semanal, con una o varias franjas horarias por día de la semana (`{"mon": [["09:00", "17:00"]], ...}` — la misma forma que las ventanas de llamada de una campaña).
* **Nota** (`hours_note`) — una sugerencia opcional de texto libre que se devuelve junto con el resultado (por ejemplo, *"Cerrado los días festivos"*).

La comprobación se evalúa según la **[zona horaria](/assistants/timezone) del asistente** (la zona horaria de una campaña la anula en cada llamada), así que "abierto" siempre significa abierto *localmente*.

### Programar devolución de llamada

El asistente acuerda con quien llama una hora para la devolución de llamada; la plataforma la guarda y un cron job marca el número automáticamente cuando llega el momento:

* **Número de devolución de llamada** (`callback_to_mode`) — `caller` (por defecto: devolver la llamada al mismo número de quien llamó) o `custom` con un **número personalizado** fijo (`callback_custom_number`, E.164).
* **Días máximos de anticipación** (`max_days_ahead`) — con cuánta antelación se puede programar una devolución de llamada (de 1 a 365 días).

En tiempo de ejecución, la función exige una hora exacta en ISO-8601 y una marca de confirmación positiva. Se rechazan las fechas pasadas y las que superan el límite configurado; el worker nunca recurre en silencio a un valor por defecto de 30 minutos ni ajusta la elección de quien llama.

### Recoger tarjeta de pago

Habilita los nodos Collect de tipo **Tarjeta de pago** en [generador de Flow](/flow-builder/nodes). Esta no es una acción invocable por el LLM: controla el acceso al nodo del Flow y define qué cuenta de Stripe recibe el método de pago.

1. Agrega tu clave secreta de Stripe en **Herramientas → App Store → Stripe**.
2. Crea una herramienta integrada de tipo `collect_payment_card` y selecciona esa cuenta de Stripe (`stripe_connection_id`).
3. Asigna la herramienta a un asistente.
4. Agrega un nodo Collect de tipo **Tarjeta de pago** en el Flow.

Durante la llamada, el agente recopila los datos de la tarjeta de forma segura; la plataforma crea un método de pago de Stripe en **tu** cuenta de Stripe usando tu clave secreta. Solo se guardan `card_last4`, `card_brand` y `stripe_payment_method_id` — nunca el número completo de la tarjeta ni el CVV. Requiere la función de plan **Recoger tarjetas de pago**. Se cobra por cada recolección exitosa (consulta la configuración de créditos).

Sin una conexión de clave secreta de Stripe, el formulario de la herramienta muestra un aviso para agregar una primero — no hay alternativa de la plataforma para los datos de tarjeta del cliente.

### Establecer variable de llamada

Permite que el asistente guarde un valor durante la llamada (por ejemplo, el nombre de la empresa de quien llama) para que herramientas posteriores, correos, condiciones del Flow y el webhook posterior a la llamada puedan usarlo:

* **Claves permitidas** (`allowed_keys`) — lista blanca opcional en snake\_case. Vacío = cualquier clave válida excepto las claves reservadas de la plataforma (`assistant_name`, `direction`, `call_id`, `date`, `time`, `datetime`, `weekday`).
* **Descripción** — indica al modelo *cuándo* guardar (por ejemplo, después de que quien llama menciona el nombre de su empresa).

La herramienta escribe en el mapa de variables de la llamada en vivo y devuelve `{"updated":{"key":"value"}}` para que el modelo conozca el valor guardado a través del resultado de la herramienta. **No** reescribe el prompt del sistema durante la llamada (los modelos realtime lo ignorarían). Una cadena vacía borra una clave.

## Herramienta del sistema: get\_current\_time

Independientemente de las herramientas configurables anteriores, todo asistente siempre cuenta con la herramienta de sistema **`get_current_time`** — no requiere configuración y no se puede desactivar. El modelo la invoca siempre que la fecha o la hora actuales son relevantes (resolver *"mañana a las 3"*, comprobar un plazo, reservar una cita).

La hora devuelta se localiza según la **zona horaria** del asistente (`assistants.timezone`, un identificador IANA como `Europe/Berlin`). En las llamadas de campaña, la **zona horaria de la campaña** la anula en cada llamada (`meta.timezone ?? assistant.timezone`) — consulta [Zona horaria](/assistants/timezone).

## API y MCP

Las herramientas integradas viven en el array `builtin_tools` del asistente (también se acepta `tools` por compatibilidad). Configúralas mediante la API pública:

```bash theme={null}
curl -X PATCH https://app.famulor.io/api/v1/assistants/{id} \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tools": [
      { "type": "end_call", "description": "Hang up politely once the caller is done." },
      { "type": "send_email", "email_to_mode": "ask",
        "email_sender_mode": "auto", "email_content_mode": "llm",
        "email_signature_mode": "workspace" }
    ]
  }'
```

El editor, la API REST y MCP usan el mismo contrato de campos. `GET /api/v1/email-senders` y el MCP `list_email_senders` exponen el catálogo de remitentes sin secretos; consulta la [referencia de la API](/api-reference/introduction).
