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

# Human in the loop

# Human in the Loop

Pausa un flujo de trabajo y pide a un miembro del espacio de trabajo que elija de una lista de opciones, proporcione una respuesta de texto o apruebe/rechace una compuerta antes de que el flujo de trabajo continúe.

Úsalo cuando un flujo de trabajo puede recopilar o preparar opciones candidatas automáticamente, pero una persona necesita hacer la selección final. Por ejemplo, un paso de RSS puede obtener nuevos artículos, y luego un paso de Human in the Loop puede preguntar a un compañero de equipo qué artículo debe investigarse a continuación.

## Configuración

| Campo                     | Descripción                                                                                                                                                             |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Question / approval title | La pregunta o título principal que se muestra al destinatario en la página de aprobación y en la notificación. En el modo Approval, este es el título de la aprobación. |
| Response mode             | Elige **Choices** para una lista seleccionable, **Text area** para una respuesta escrita obligatoria, o **Approval** para acciones fijas de Aprobar/Rechazar.           |
| Options source            | Una expresión de variable que se resuelve a un arreglo, como `{{rss_step.output.items}}`. Solo se usa en el modo Choices.                                               |
| Label path                | Ruta relativa opcional usada como la etiqueta visible de cada opción, como `title` o `source.title`.                                                                    |
| Value path                | Ruta relativa opcional usada como el valor seleccionado, como `url` o `metadata.slug`.                                                                                  |
| Description path          | Ruta relativa opcional usada como texto de apoyo para cada opción, como `summary` o `content.excerpt`.                                                                  |
| Recipient                 | El miembro del espacio de trabajo autorizado a tomar la decisión cuando el canal de notificación es Email.                                                              |
| Notification channel      | Email o Telegram.                                                                                                                                                       |
| Telegram destination      | El destino del bot de Fetch Hive conectado utilizado cuando el canal de notificación es Telegram.                                                                       |
| Link TTL                  | Por cuánto tiempo permanece válido el token del enlace de aprobación antes de que el destinatario deba solicitar un enlace nuevo.                                       |
| Wait timeout              | Cuánto tiempo espera el flujo de trabajo antes de que el paso falle o continúe según el comportamiento ante fallos.                                                     |

Los campos de label, value y description son rutas relativas a cada elemento del arreglo de opciones. Solo aplican en el modo Choices. El editor puede sugerir rutas a partir del primer elemento de muestra cuando la fuente de opciones se resuelve desde la salida de un paso existente o desde ejemplos de entrada inicial. Los campos anidados con el mismo nombre se pueden desambiguar con rutas completas, como `source.title` y `author.title`. Las claves duplicadas en el mismo objeto JSON no se pueden distinguir después del análisis JSON.

## Salida

El paso siempre devuelve el mismo objeto de nivel superior para que los pasos posteriores puedan conectarse antes de que se ejecute el flujo de trabajo.

El modo Choices devuelve la opción seleccionada:

```json theme={null}
{
  "response_type": "choice",
  "choice": {
    "id": "option_1",
    "label": "Example article",
    "value": "https://example.com/article",
    "description": "Short summary",
    "raw": {}
  },
  "text": "",
  "files": [],
  "metadata": {}
}
```

Antes de que se complete una ejecución, los pasos posteriores aún pueden conectarse contra la misma forma vacía:

```json theme={null}
{
  "text": "",
  "files": [],
  "choice": {
    "id": "",
    "label": "",
    "value": "",
    "description": "",
    "raw": {}
  },
  "metadata": {},
  "response_type": "choice"
}
```

El modo Text devuelve la respuesta escrita:

```json theme={null}
{
  "text": "Submitted answer",
  "files": [],
  "choice": {
    "id": "",
    "label": "",
    "value": "",
    "description": "",
    "raw": {}
  },
  "metadata": {},
  "response_type": "text"
}
```

El modo Approval devuelve la decisión seleccionada. Approve permite que el flujo de trabajo continúe:

```json theme={null}
{
  "text": "",
  "files": [],
  "choice": {
    "id": "approved",
    "label": "Approved",
    "value": "approved",
    "description": "",
    "raw": { "approved": true }
  },
  "metadata": {
    "approved": true,
    "rejected": false
  },
  "response_type": "approval"
}
```

Reject detiene intencionalmente el flujo de trabajo y marca la ejecución como completada:

```json theme={null}
{
  "text": "",
  "files": [],
  "choice": {
    "id": "rejected",
    "label": "Rejected",
    "value": "rejected",
    "description": "",
    "raw": { "approved": false }
  },
  "metadata": {
    "approved": false,
    "rejected": true
  },
  "response_type": "approval"
}
```

Los pasos posteriores referencian el identificador real del paso que se muestra en el constructor de flujo de trabajo. Por ejemplo, si este paso es `step_5`, usa:

| Variable                               | Uso                                                                           |
| -------------------------------------- | ----------------------------------------------------------------------------- |
| `{{step_5.output.text}}`               | La respuesta de texto enviada en el modo Text area. Vacío en el modo Choices. |
| `{{step_5.output.choice.value}}`       | El valor de la opción seleccionada en el modo Choices.                        |
| `{{step_5.output.choice.label}}`       | La etiqueta de la opción seleccionada en el modo Choices.                     |
| `{{step_5.output.choice.description}}` | La descripción de la opción seleccionada en el modo Choices.                  |
| `{{step_5.output.choice.raw.url}}`     | Un campo del objeto de opción seleccionada original, cuando ese campo existe. |
| `{{step_5.output.metadata.approved}}`  | `true` cuando el modo Approval fue aprobado.                                  |
| `{{step_5.output.metadata.rejected}}`  | `true` cuando el modo Approval fue rechazado.                                 |
| `{{step_5.output.response_type}}`      | `choice`, `text` o `approval`, según cómo respondió el destinatario.          |

## Tiempo de ejecución

El flujo de trabajo se pausa mientras espera al destinatario. Fetch Hive envía un enlace de aprobación de corta duración por el canal de notificación configurado. El modo Email envía al destinatario seleccionado. El modo Telegram envía al destino de Telegram seleccionado. Si el enlace expira, el destinatario puede solicitar un enlace nuevo desde la página de aprobación.

Solo el destinatario configurado puede ver y enviar la selección, y aún debe pertenecer al espacio de trabajo del flujo.

En el modo Approval, Approve reanuda el flujo de trabajo normalmente. Reject se trata como una detención intencional: Fetch Hive registra la salida rechazada, omite los pasos restantes del flujo de trabajo y marca la ejecución del flujo como completada en lugar de fallida.

## Comportamiento de la API

Los flujos de trabajo desplegados que contienen Human in the Loop deben ejecutarse de forma asíncrona con una URL de callback. La invocación síncrona de la API devuelve un error de validación porque el flujo de trabajo no puede terminar hasta que se envíe la respuesta humana.

## Costo

Human in the Loop usa un cargo fijo de crédito por paso del flujo de trabajo y no llama a un LLM por sí mismo.

## Notas

* Human in the Loop no admite paralelización a nivel de paso.
* Human in the Loop no se puede colocar dentro de un cuerpo de iteración en la versión actual.
* Si el tiempo de espera expira, el paso sigue su comportamiento ante fallos configurado: terminar o continuar.
* Un timeout no es lo mismo que Reject. Los timeouts siguen el comportamiento ante fallos; Reject completa la ejecución intencionalmente.
