Bucles de agentes

El bucle de agente vuelve a invocar un agente hasta que se cumple una condición de finalización. Úselo para refinamiento iterativo, finalización de tareas pendientes, esperando tareas en segundo plano o evaluando si una respuesta cumple criterios explícitos.

Limite siempre los bucles autónomos. Una condición de finalización puede producir un error, un modelo puede detenerse y un evaluador puede ser probabilístico.

Important

El bucle de agente es una función experimental.

Configurar la repetición en bucle manualmente

Use la API de composición directa cuando quiera crear bucles sin las demás configuraciones predeterminadas de Harness Agent.

Importa los tipos de bucle y envuelve cualquiera de los AIAgent con LoopAgent. Su máximo predeterminado es 10 invocaciones de agente:

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

AIAgent baseAgent = chatClient.AsAIAgent();
AIAgent agent = new LoopAgent(
    baseAgent,
    new CompletionMarkerLoopEvaluator("DONE"),
    new LoopAgentOptions { MaxIterations = 5 });

Importe AgentLoopMiddleware y agréguelo a un objeto normal Agent. El máximo predeterminado es 10 ejecuciones de agente:

from agent_framework import Agent, AgentLoopMiddleware


def needs_more_work(*, last_result, **kwargs):
    return "DONE" not in last_result.text


agent = Agent(
    client=client,
    middleware=[
        AgentLoopMiddleware(
            needs_more_work,
            max_iterations=5,
        )
    ],
)

El predicado puede ser sincrónico o asincrónico. Vuelva a True para continuar, False para detenerse o (continue, feedback) para pasar comentarios a la siguiente iteración.

Note

La funcionalidad de bucle empaquetado que se describe en esta página no está disponible actualmente en Go.

Elección de una condición de finalización

LoopAgent acepta un evaluador o una colección ordenada:

Evaluador Continúa mientras
CompletionMarkerLoopEvaluator La respuesta más reciente no contiene el marcador configurado.
TodoCompletionLoopEvaluator Un objeto resuelto TodoProvider todavía tiene elementos incompletos, opcionalmente en los modos de agente seleccionados.
BackgroundTaskCompletionLoopEvaluator Un objeto resuelto BackgroundAgentsProvider todavía tiene tareas en ejecución.
AIJudgeLoopEvaluator Un cliente de juez independiente dice que la solicitud original no es totalmente contestada.
DelegateLoopEvaluator Tu función de devolución de llamada devuelve LoopEvaluation.Continue(...).

Cuando se configuran varios evaluadores, se ejecutan en orden. El primer evaluador que solicita otra iteración proporciona sus comentarios; el bucle se detiene solo cuando todos los evaluadores rechazan continuar.

Uso de un juez de IA

El juez recibe la solicitud original y la respuesta del agente más reciente. Si encuentra una brecha, su análisis se convierte en comentarios para la siguiente iteración:

var evaluator = new AIJudgeLoopEvaluator(
    judgeClient,
    new AIJudgeLoopEvaluatorOptions
    {
        Criteria =
        [
            "Answer every part of the request.",
            "Support conclusions with evidence.",
        ],
    });

AIAgent loopAgent = new LoopAgent(
    agent,
    evaluator,
    new LoopAgentOptions { MaxIterations = 4 });

Utiliza únicamente un punto de conexión de evaluación en el que confíes con la solicitud original y la respuesta generada.

Controle el contexto y la salida

De forma predeterminada, LoopAgent reutiliza una sesión y envía los comentarios más recientes del evaluador ganador como la siguiente entrada. FreshContextPerIteration = true en su lugar, reconstruye cada pasada a partir de la solicitud original y de un registro agregado de comentarios, y restablece o restaura la sesión.

Las ejecuciones que no son de streaming devuelven una transcripción agregada de forma predeterminada. Establezca NonStreamingReturnsLastResponseOnly = true para devolver solo la respuesta final. La transmisión siempre emite cada iteración y cualquier mensaje de retroalimentación visible en nombre de.

El predicado recibe argumentos de palabra clave, incluidos iteration, last_result, messagesoriginal_messages, session, , agent, progressy feedback. Los ayudantes todos_remaining() y background_tasks_running() proporcionan condiciones integradas para tareas pendientes y tareas en segundo plano. Combínalos con todos_remaining_message o background_tasks_running_message para generar una siguiente entrada específica.

Uso de un juez de IA

AgentLoopMiddleware.with_judge crea un bucle controlado por juez. Los bucles del juez tienen cinco iteraciones de forma predeterminada:

from agent_framework import Agent, AgentLoopMiddleware

loop = AgentLoopMiddleware.with_judge(
    judge_client,
    criteria=[
        "Answer every part of the request.",
        "Support conclusions with evidence.",
    ],
    max_iterations=4,
)

agent = Agent(
    client=client,
    middleware=[loop],
)

El razonamiento del juez se devuelve al agente cuando se requiere más trabajo. Utiliza únicamente un punto de conexión de evaluación en el que confíes con la solicitud original y la respuesta generada.

Contexto de control, progreso y salida

Para bucles avanzados, construya AgentLoopMiddleware directamente:

  • record_feedback crea una entrada de progreso concisa después de cada iteración de trabajo.
  • progress expone las entradas acumuladas a las funciones de devolución de llamada.
  • inject_progress=True añade progreso a la entrada de la iteración siguiente.
  • fresh_context=True se reinicia a partir de la tarea original y el registro de progreso, y restaura una sesión adjunta a su instantánea previa al bucle.
  • return_final_only=True devuelve solo la última respuesta para ejecuciones que no son de streaming.

Pasa max_iterations=None solo cuando se garantice que el predicado de finalización se ejecutará hasta el final.

Las condiciones de finalización predefinidas y la integración con el evaluador descritas en esta página no están disponibles actualmente en Go.

Utiliza el bucle con Harness Agent

Utiliza la configuración de Harness Agent cuando también desees su canal preconfigurado de historial, planificación, memoria, aprobación y observabilidad.

Establezca HarnessAgentOptions.LoopEvaluators. El Harness aplica LoopAgent como su decorador de agente más externo:

using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

var options = new HarnessAgentOptions
{
    LoopEvaluators =
    [
        new CompletionMarkerLoopEvaluator("DONE"),
    ],
    LoopAgentOptions = new LoopAgentOptions
    {
        MaxIterations = 5,
    },
};

HarnessAgent agent = chatClient.AsHarnessAgent(options);
// Equivalent construction: new HarnessAgent(chatClient, options)
AgentSession session = await agent.CreateSessionAsync();

Una colección vacía o nullLoopEvaluators hace que el Harness sea de un solo paso.

Aprobación y comportamiento de la sesión

LoopAgent se detiene antes de evaluar su condición de finalización cuando una iteración devuelve una solicitud de aprobación de herramienta pendiente. Devuelve la solicitud al autor de la llamada en lugar de ocultarla detrás de otra iteración autónoma. Una vez que el autor de la llamada proporciona la respuesta de aprobación a través del flujo de aprobación de herramientas normal, el agente puede continuar.

LoopAgent no añade por sí mismo la gestión de la aprobación. El Harness Agent aplica el bucle fuera de ToolApprovalAgent, lo que permite que las solicitudes de aprobación pendientes salgan del bucle.

Vuelva a usar lo mismo AgentSession en las llamadas para continuar la conversación. Las iteraciones de bucle comparten esa sesión de forma predeterminada. Con FreshContextPerIteration = true, LoopAgent restablece o restaura el estado de sesión proporcionado por el autor de la llamada cuando se admite. El almacenamiento de conversación propiedad del servicio puede conservar el historial cuando la sesión serializada solo contiene un identificador de conversación remota.

Proporcione loop_should_continue a create_harness_agent; loop_max_iterations el valor predeterminado es 10:

from agent_framework import create_harness_agent


def needs_more_work(*, last_result, **kwargs):
    return "DONE" not in last_result.text


agent = create_harness_agent(
    client=client,
    loop_should_continue=needs_more_work,
    loop_max_iterations=5,
)
session = agent.create_session()

loop_next_message personaliza la entrada siguiente. Sin loop_should_continue, la factoría no añade un bucle e ignora los demás argumentos del bucle.

Aprobación y comportamiento de la sesión

AgentLoopMiddleware se detiene antes de evaluar su predicado de continuación cuando una iteración devuelve una solicitud de aprobación de herramienta pendiente. Devuelve la solicitud al autor de la llamada en lugar de ocultarla detrás de otra iteración autónoma. Una vez que el autor de la llamada proporciona la respuesta de aprobación a través del flujo de aprobación de herramientas normal, el agente puede continuar.

AgentLoopMiddleware no agrega ToolApprovalMiddleware por sí mismo. El agente Harness coloca el bucle fuera de su middleware de aprobación, lo que permite que las solicitudes de aprobación pendientes salgan del bucle. Crea y pasa un AgentSession en cada ejecución del agente Harness mientras la aprobación automática de herramientas esté habilitada.

Vuelva a usar lo mismo AgentSession en las llamadas para continuar la conversación. Las iteraciones de bucle comparten esa sesión de forma predeterminada. Con fresh_context=True, el middleware restaura la sesión asociada a su instantánea previa al bucle entre iteraciones. El almacenamiento de conversación propiedad del servicio puede conservar el historial cuando la sesión serializada solo contiene un identificador de conversación remota.

Note

Actualmente, los bucles de Harness Agent no están disponibles en Go, por lo que su comportamiento de aprobación y sesión no es aplicable.

Pasos siguientes

Profundizar un poco más