Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le bouclage de l’agent appelle à nouveau un agent jusqu’à ce qu’une condition d’achèvement soit satisfaite. Utilisez-le pour l’affinement itératif, la saisie semi-automatique, l’attente de tâches en arrière-plan ou l’évaluation si une réponse répond à des critères explicites.
Boucles autonomes toujours liées. Une condition d’achèvement peut échouer, un modèle peut se bloquer et un évaluateur peut être probabiliste.
Important
La boucle de l’agent est expérimentale.
Configurer manuellement la boucle
Utilisez l’API de composition directe lorsque vous souhaitez effectuer une boucle sans les autres paramètres par défaut de l’Agent Harness.
Importez les types de boucles et encapsulez-les AIAgent avec LoopAgent. Son maximum par défaut est 10 appels d’agent :
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
AIAgent baseAgent = chatClient.AsAIAgent();
AIAgent agent = new LoopAgent(
baseAgent,
new CompletionMarkerLoopEvaluator("DONE"),
new LoopAgentOptions { MaxIterations = 5 });
Importez AgentLoopMiddleware et ajoutez-le à un standard Agent. La valeur maximale par défaut est 10 exécutions de l’agent :
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,
)
],
)
Le prédicat peut être synchrone ou asynchrone. Revenez True à continuer, False à arrêter ou (continue, feedback) à transmettre des commentaires à l’itération suivante.
Note
La fonctionnalité de bouclage empaquetée décrite dans cette page n’est actuellement pas disponible dans Go.
Choisir une condition d’achèvement
LoopAgent accepte un évaluateur ou une collection ordonnée :
| Évaluateur | Continue pendant |
|---|---|
CompletionMarkerLoopEvaluator |
La dernière réponse ne contient pas le marqueur configuré. |
TodoCompletionLoopEvaluator |
Un élément résolu a toujours des éléments incomplets TodoProvider , éventuellement dans les modes d’agent sélectionnés. |
BackgroundTaskCompletionLoopEvaluator |
Une solution résolue a toujours des BackgroundAgentsProvider tâches en cours d’exécution. |
AIJudgeLoopEvaluator |
Un client de juge distinct indique que la demande d’origine n’est pas entièrement répondue. |
DelegateLoopEvaluator |
Votre rappel retourne LoopEvaluation.Continue(...). |
Lorsque plusieurs évaluateurs sont configurés, ils s’exécutent dans l’ordre. Le premier évaluateur qui demande une autre itération fournit ses commentaires ; la boucle s’arrête uniquement lorsque tous les évaluateurs refusent de continuer.
Utiliser un juge IA
Le juge reçoit la demande d’origine et la dernière réponse de l’agent. S’il trouve un écart, son analyse devient des commentaires pour l’itération suivante :
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 });
Utilisez uniquement un point de terminaison de juge que vous approuvez avec la demande d’origine et la réponse générée.
Contexte de contrôle et sortie
Par défaut, LoopAgent réutilise une session et envoie les commentaires les plus récents de l’évaluateur gagnant comme entrée suivante.
FreshContextPerIteration = true Regénère à la place chaque passe de la demande d’origine, ainsi qu’un journal de commentaires agrégé et réinitialise ou restaure la session.
Les exécutions en continu retournent une transcription agrégée par défaut. Définissez NonStreamingReturnsLastResponseOnly = true pour renvoyer uniquement la réponse finale. La diffusion en continu émet toujours toutes les itérations et tous les messages de commentaires visibles au nom de l’utilisateur.
Le prédicat reçoit des arguments de mot clé, notamment iteration, , last_resultoriginal_messagesmessages, session, agent, , , progresset .feedback Les assistances todos_remaining() et background_tasks_running() fournissent des conditions todo et des tâches en arrière-plan intégrées. Associez-les todos_remaining_message ou background_tasks_running_message générez une entrée suivante ciblée.
Utiliser un juge IA
AgentLoopMiddleware.with_judge crée une boucle basée sur un juge. Les boucles Juge sont par défaut de cinq itérations :
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],
)
Le raisonnement du juge est renvoyé à l’agent lorsque davantage de travail est nécessaire. Utilisez uniquement un point de terminaison de juge que vous approuvez avec la demande d’origine et la réponse générée.
Contrôler le contexte, la progression et la sortie
Pour les boucles avancées, construisez AgentLoopMiddleware directement :
-
record_feedbackcrée une entrée de progression concise après chaque itération de travail. -
progressexpose les entrées cumulées aux rappels. -
inject_progress=Trueajoute la progression à l’entrée de l’itération suivante. -
fresh_context=Trueredémarre à partir de la tâche d’origine et du journal de progression et restaure une session attachée à son instantané de pré-boucle. -
return_final_only=Trueretourne uniquement la dernière réponse pour les exécutions sans diffusion en continu.
max_iterations=None Passez uniquement lorsque le prédicat d’achèvement est garanti pour se terminer.
Les conditions d’achèvement empaquetées et l’intégration de juge décrites dans cette page ne sont pas actuellement disponibles dans Go.
Utiliser la boucle avec l’agent Harness
Utilisez la configuration de l’agent Harness lorsque vous souhaitez également que son historique préconfiguré, sa planification, sa mémoire, son approbation et son pipeline d’observabilité.
Définissez HarnessAgentOptions.LoopEvaluators. Le harnais s’applique LoopAgent comme décorateur d’agent le plus extérieur :
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();
Une collection vide nullLoopEvaluators laisse le harnais unique.
Comportement d’approbation et de session
LoopAgent s’arrête avant d’évaluer sa condition d’achèvement lorsqu’une itération retourne une demande d’approbation d’outil en attente. Elle retourne la requête à l’appelant au lieu de la masquer derrière une autre itération autonome. Une fois que l’appelant fournit la réponse d’approbation par le biais du flux d’approbation de l’outil normal, l’agent peut continuer.
LoopAgent n’ajoute pas de gestion des approbations elle-même. L’agent Harness applique la boucle en dehors ToolApprovalAgent, ce qui permet aux demandes d’approbation en attente d’échapper à la boucle.
Réutilisez les mêmes AgentSession appels pour poursuivre la conversation. Les itérations de boucle partagent cette session par défaut. Avec FreshContextPerIteration = true, LoopAgent réinitialise ou restaure l’état de session fourni par l’appelant, où il est pris en charge. Le stockage de conversation appartenant au service peut conserver l’historique lorsque la session sérialisée contient uniquement un identificateur de conversation distant.
Fournir loop_should_continue à create_harness_agent; loop_max_iterations la valeur par défaut est 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 personnalise l’entrée suivante.
loop_should_continueSans cela, la fabrique n’ajoute pas de boucle et ignore les autres arguments de boucle.
Comportement d’approbation et de session
AgentLoopMiddleware s’arrête avant d’évaluer son prédicat de continuation lorsqu’une itération retourne une demande d’approbation d’outil en attente. Elle retourne la requête à l’appelant au lieu de la masquer derrière une autre itération autonome. Une fois que l’appelant fournit la réponse d’approbation par le biais du flux d’approbation de l’outil normal, l’agent peut continuer.
AgentLoopMiddleware ne s’ajoute ToolApprovalMiddleware pas. L’agent Harness place la boucle en dehors de son intergiciel d’approbation, ce qui permet aux demandes d’approbation en attente d’échapper à la boucle. Créez et transmettez une AgentSession exécution à chaque exécution de l’Agent Harness pendant que l’approbation automatique de l’outil est activée.
Réutilisez les mêmes AgentSession appels pour poursuivre la conversation. Les itérations de boucle partagent cette session par défaut. Avec fresh_context=True, l’intergiciel restaure la session attachée à son instantané de pré-boucle entre les itérations. Le stockage de conversation appartenant au service peut conserver l’historique lorsque la session sérialisée contient uniquement un identificateur de conversation distant.
Note
Le bouclage de l’agent Harness n’est pas disponible actuellement dans Go. Par conséquent, son comportement d’approbation et de session ne s’applique pas.