Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El bucle del agente vuelve a invocar un agente hasta que se cumpla 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 del agente es 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 |
La función de retorno 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 });
Utilice únicamente un endpoint de evaluación de confianza 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 todas las iteraciones y cualquier mensaje de comentarios visible en nombre de otro.
El predicado recibe argumentos de palabra clave, incluidos iteration, last_result, messagesoriginal_messages, session, , agent, progressy feedback. Las funciones auxiliares todos_remaining() y background_tasks_running() proporcionan condiciones integradas para todo 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. Use solo un punto de conexión de juez en el que confíe con la solicitud original y la respuesta generada.
Contexto de control, progreso y salida
Para bucles avanzados, construya AgentLoopMiddleware directamente:
-
record_feedbackcrea una entrada de progreso concisa después de cada iteración de trabajo. -
progresspone las entradas acumuladas a disposición de las funciones de devolución de llamada. -
inject_progress=Trueañade progreso a la entrada de la iteración siguiente. -
fresh_context=Truereinicia desde la tarea original y el registro de progreso y restaura una sesión adjunta a su instantánea de bucle previo. -
return_final_only=Truedevuelve solo la última respuesta para ejecuciones que no son de streaming.
Pase max_iterations=None solo cuando el predicado de finalización tenga garantizada la terminación.
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.
Usar bucles con Harness Agent
Utilice la configuración de Harness Agent si también quiere su historial, planificación, memoria, flujos de aprobación y canal de observabilidad preconfigurados.
Establezca HarnessAgentOptions.LoopEvaluators. El arnés se 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 o nullLoopEvaluators vacía deja el arnés de un solo disparo.
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 pendiente de aprobación de herramientas. 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 herramientas 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 de Harness coloca el bucle fuera de su middleware de aprobación, lo que permite que las solicitudes de aprobación pendientes salgan del bucle. Cree y transmita un AgentSession en cada ejecución de Harness Agent cuando 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 adjunta a su instantánea de bucle previo 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
La ejecución en bucle de Harness Agent no está disponible actualmente en Go, por lo que su comportamiento de aprobación y de sesión no se aplica.