Laravel AI SDK v0.10.0 añade aprobación humana de herramientas (human-in-the-loop)
Anunciado en la Laracon US 2026, el SDK de IA de Laravel permite ahora que los agentes pausen antes de ejecutar herramientas sensibles para que una persona apruebe, rechace o edite la llamada.
La función opcional llega en la v0.10.0 con contratos de aprobación, objetos Decision y soporte para streaming, colas y broadcasting.
En la Laracon US 2026 de Boston, el equipo de Laravel anunció una API human-in-the-loop (HITL) para el Laravel AI SDK. Se integró mediante laravel/ai#773 y se publicó en la v0.10.0 el 21 de julio. Hasta ahora, una vez que un agente empezaba a llamar herramientas, se ejecutaba hasta el final sin supervisión — aceptable para herramientas de solo lectura, pero arriesgado para acciones como borrar un archivo, reembolsar un pago o enviar un correo a un cliente. Con HITL, un agente puede pausarse antes de ejecutar una herramienta y esperar a que una persona apruebe, rechace o edite sus argumentos.
La aprobación es opcional por herramienta. Una herramienta implementa el contrato Laravel\Ai\Contracts\Approvable y usa el trait InteractsWithApprovals, lo que hace la aprobación obligatoria por defecto. Para un control más fino, un método needsApproval puede examinar los argumentos y devolver un booleano o una instancia Approval con un motivo — por ejemplo, exigir validación solo en reembolsos superiores a 20 $. Los requisitos también pueden sobrescribirse al registrar las herramientas en el método tools() del agente con withoutApproval() y requireApproval().
Cuando el modelo llama a una herramienta sujeta a aprobación, el agente se detiene y expone las llamadas pendientes en la respuesta mediante hasPendingApprovals() y pendingApprovals; cada entrada incluye el ID de llamada, el nombre de la herramienta, los argumentos y el motivo. Para continuar, se retoma la conversación con una instancia Decisions indexada por ID de llamada, usando Decision::approve() o Decision::reject() — true/false sirven como atajo. Cada llamada pendiente requiere una decisión, de lo contrario se lanza una ApprovalMismatchException; approveRemaining() y rejectRemaining() establecen un valor por defecto para el resto. Un rechazo con cadena de resultado se devuelve al modelo para que siga respondiendo, mientras que un rechazo sin resultado detiene el bucle de generación.
Hay detalles importantes: el agente debe ser Conversational con historial persistido (trait RemembersConversations) para poder reanudar la llamada pausada. La aprobación funciona con prompt, stream, queue, broadcast, broadcastNow y broadcastOnQueue; en streaming aparece como evento tool_approval_request, con partes nativas de aprobación en el protocolo de stream del Vercel AI SDK, y los agentes en cola reciben la respuesta en el callback then junto a un evento ToolApprovalRequested. Las pausas son por llamada, no por paso — las herramientas sin aprobación del mismo paso se ejecutan de inmediato, por lo que los efectos secundarios deben ser idempotentes usando $request->toolCallId(). El resultado de una herramienta aprobada se registra antes de que el modelo continúe; si la generación falla después, hay que reanudar con un prompt de texto normal en lugar de reenviar las decisiones.
La actualización a 0.10 incluye cambios que rompen compatibilidad: una nueva columna nullable approval_state en la tabla de mensajes de conversación y un método storeApprovalResults() que las implementaciones personalizadas de ConversationStore deben proporcionar. La documentación incluye un flujo completo con dos rutas que aceptan tanto un mensaje nuevo como un conjunto de decisiones desde una pantalla de chat.
Tribuna de lectores
Aún no hay aportaciones — abre el debate.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
Esperando tu clic …
·