Transferencia De Tareas (Handoffs)

El patrón de diseño handoff es un enfoque multi-agente introducido por OpenAI en un proyecto experimental llamado Swarm. La idea clave es permitir que un agente delegue tareas a otros agentes utilizando una llamada especial a herramientas.

Esto ofrece varias ventajas frente a la implementación de OpenAI:

  • Se puede escalar a entornos distribuidos mediante distributed agent runtime.

  • Permite traer tu propia implementación de agentes con flexibilidad.

  • La API nativa basada en async facilita la integración con interfaces de usuario u otros sistemas.

Este ejemplo demuestra una implementación sencilla del patrón handoff. Te recomendamos leer primero sobre Tema & Suscripción para entender cómo funciona el modelo pub-sub (publicador-suscriptor) y los agentes orientados a eventos.


Escenario

Imaginemos un escenario de atención al cliente en el que un cliente quiere solicitar un reembolso o comprar un nuevo producto a través de un chatbot. El chatbot está compuesto por un equipo multi-agente que incluye:

  • 🧠 Triage Agent: entiende la solicitud del cliente y decide a quién delegar la tarea.

  • 💸 Refund Agent: se encarga de solicitudes de reembolso.

  • 🛍️ Sales Agent: maneja solicitudes de compra.

  • 👨‍💼 Human Agent: se encarga de solicitudes complejas que los otros agentes no pueden resolver.

El cliente interactúa mediante un User Agent.

El siguiente diagrama muestra la topología de interacción entre los agentes.

Vamos a implementar este escenario paso a paso usando el core de Saptiva-Agents.


Protocolo de Mensajes

Primero definimos los tipos de mensajes que utilizarán los agentes para comunicarse.

  • UserLogin: publicado cuando un usuario inicia sesión y comienza una sesión.

  • UserTask: contiene el historial del chat de la sesión. También es publicado al hacer un handoff.

  • AgentResponse: publicado por los agentes IA o humanos, contiene historial y el topic para responder.


Clase AIAgent

Clase base para los agentes IA (Triage, Sales, Refund). Utiliza un modelo LLM (via ChatCompletionClient) para generar respuestas y ejecutar herramientas.

Los agentes:

  • Generan una respuesta.

  • Si es una llamada a herramienta especial (handoff), publican un UserTask al topic correspondiente.

  • Si es una herramienta común, la ejecutan y siguen generando respuesta.

  • Si la respuesta es texto, la publican como AgentResponse para el cliente.

En bloques de código como este, los comentarios se dejan ya traducidos, por lo tanto no repito el código aquí.


Clase HumanAgent

  • En el método handle_user_task, envía una notificación a través de una aplicación de chat como Microsoft Teams o Slack.

  • La aplicación de chat publica la respuesta del humano a través del runtime, al tópico especificado por agent_topic_type.

  • Crea otro manejador de mensajes para procesar la respuesta del humano y enviarla de vuelta al cliente.

En esta implementación, el HumanAgent simplemente utiliza la consola para recibir tu entrada. En una aplicación del mundo real, puedes mejorar este diseño de la siguiente manera:

La clase HumanAgent es un proxy del humano en el chatbot. Se utiliza para manejar solicitudes que los agentes de IA no pueden resolver. El HumanAgent se suscribe al tipo de tópico agent_topic_type para recibir mensajes, y publica al tipo de tópico user_topic_type para enviar mensajes al cliente.


Clase UserAgent

La clase UserAgent es un proxy para el cliente que interactúa con el chatbot. Maneja dos tipos de mensajes: UserLogin y AgentResponse. Cuando UserAgent recibe un mensaje UserLogin, inicia una nueva sesión con el chatbot y publica un mensaje UserTask al agente de IA que está suscrito al tipo de tópico agent_topic_type. Cuando UserAgent recibe un mensaje AgentResponse, muestra al usuario la respuesta del chatbot.

En esta implementación, UserAgent utiliza la consola para obtener tu entrada. En una aplicación del mundo real, puedes mejorar la interacción humana usando la misma idea descrita en la sección de HumanAgent más arriba.


Herramientas para los Agentes

Los agentes de IA pueden utilizar herramientas regulares para completar tareas si no necesitan delegar la tarea a otros agentes. Definimos las herramientas utilizando funciones simples y creamos las herramientas usando el contenedor FunctionTool.


Tipos de Tópico para los Agentes

Definimos los tipos de tópico a los que cada uno de los agentes se suscribirá. Lee más sobre los tipos de tópico en la sección Temas & Suscripciones.


Herramientas Delegadas para los Agentes de IA

Además de las herramientas regulares, los agentes de IA pueden delegar tareas a otros agentes utilizando herramientas especiales llamadas herramientas delegadas (delegate tools). El concepto de herramienta delegada se utiliza únicamente en este patrón de diseño, y dichas herramientas también se definen como funciones simples.

Diferenciamos las herramientas delegadas de las herramientas regulares en este patrón porque cuando un agente de IA llama a una herramienta delegada, transferimos la tarea a otro agente en lugar de continuar generando respuestas con el modelo dentro del mismo agente.


Creando el Equipo

Ya hemos definido los agentes de IA, el agente humano, el agente usuario, las herramientas y los tipos de tópicos. Ahora podemos crear el equipo de agentes.

Para los agentes de IA, usamos SaptivaAIChatCompletionClient junto con el modelo Saptiva Legacy.

Después de crear el runtime del agente, registramos cada agente proporcionando un tipo de agente y un método de fábrica para crear la instancia del agente. El runtime es responsable de gestionar el ciclo de vida de los agentes, por lo tanto, no necesitamos instanciar los agentes manualmente. Puedes leer más sobre el runtime de agentes en [Agent Runtime Environments] y sobre el ciclo de vida en [Agent Identity and Lifecycle].

En el código a continuación, puedes ver que estamos utilizando la clase AIAgent para definir los agentes de Triage, Ventas, y Problemas y Reparaciones. Añadimos herramientas regulares y herramientas delegadas a cada uno de ellos. También agregamos las suscripciones a los tipos de tópico correspondientes para cada agente.


Ejecutando el Equipo

Finalmente, podemos iniciar el runtime y simular una sesión de usuario publicando un mensaje UserLogin al runtime.

Este mensaje se publica a un topic_id con el tipo definido como user_topic_type y con un source establecido como un session_id único.

Este session_id se utilizará para crear todos los topic IDs en esta sesión de usuario, y también se usará para crear el agent ID de todos los agentes involucrados en esta misma sesión.

Última actualización