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.
Bucles autónomos enlazados siempre. Una condición de finalización puede producir un error, un modelo puede detenerse y un evaluador puede ser probabilístico.
Importante
El bucle del agente es experimental.
Configurar bucles manualmente
Use la API de composición directa cuando desee realizar bucles sin los demás valores predeterminados del agente de Harness.
Importe los tipos de bucle y ajuste cualquiera 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 True a continuar, False detener o (continue, feedback) 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 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 });
Use solo un punto de conexión de juez en el que confíe con la solicitud original y la respuesta generada.
Control del 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, vuelve a generar cada paso de la solicitud original más un registro de comentarios agregado 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. El streaming siempre emite cada iteración y los mensajes visibles en nombre de los comentarios.
El predicado recibe argumentos de palabra clave, incluidos iteration, last_result, messagesoriginal_messages, session, , agent, progressy feedback. Los asistentes todos_remaining() y background_tasks_running() proporcionan condiciones integradas de tareas pendientes y en segundo plano. Emparejarlos con todos_remaining_message o background_tasks_running_message para generar una entrada de destino siguiente.
Uso de un juez de IA
AgentLoopMiddleware.with_judge crea un bucle controlado por juez. El juez repite de forma predeterminada cinco iteraciones:
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. -
progressexpone entradas acumuladas a devoluciones de llamada. -
inject_progress=Trueagrega progreso a la entrada de la siguiente iteración. -
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 se garantiza que el predicado de finalización finalice.
Las condiciones de finalización empaquetadas y la integración del juez descritas en esta página no están disponibles actualmente en Go.
Uso de bucles con harness Agent
Use la configuración del agente de Harness cuando también desee su historial preconfigurado, planeación, memoria, aprobación y canalización de observabilidad.
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.
Comportamiento de la sesión y la aprobación
LoopAgent se detiene antes de evaluar su condición de finalizació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.
LoopAgent no agrega el propio control de aprobación. El agente de Harness aplica el bucle fuera ToolApprovalAgentde , lo que permite que las solicitudes de aprobación pendientes escapen al 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_continueel generador no agrega un bucle y omite los demás argumentos de bucle.
Comportamiento de la sesión y la aprobació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 se agrega ToolApprovalMiddleware a 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 escapen el bucle. Cree y pase un AgentSession en cada ejecución del Agente de Harness mientras la aprobación automática de la herramienta 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
El bucle harness Agent no está disponible actualmente en Go, por lo que su comportamiento de aprobación y sesión no se aplica.