Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Opakované spouštění agenta opakovaně spouští agenta, dokud není splněna podmínka dokončení. Můžete ho použít pro iterativní upřesnění, dokončení úkolů, čekání na úkoly na pozadí nebo vyhodnocení, jestli odpověď splňuje explicitní kritéria.
Autonomní smyčky vždy omezte. Podmínka dokončení může selhat, model může uvíznout a vyhodnocovač může být stochastický.
Důležité
Opakované běhy agenta jsou experimentální.
Nastavte opakování ručně
Použijte rozhraní API pro přímou kompozici, když chcete opakování bez ostatních výchozích nastavení agenta Harness.
Importujte typy smyček a obalte každý prvek AIAgent prvkem LoopAgent. Výchozí maximum je 10 volání 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 });
Importujte AgentLoopMiddleware a přidejte jej do běžného Agent. Výchozí maximum je 10 spuštění agenta:
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,
)
],
)
Predikát může být synchronní nebo asynchronní. Stisknutím True pokračujte, False zastavte nebo (continue, feedback) předejte zpětnou vazbu do další iterace.
Go poskytuje omezenou opětovnou aktivaci prostřednictvím agent/harness/loop. Zaregistrujte se loop.New(loop.Config{...}) v agent.Config.Middlewares. Middleware spouští agenta, vyhodnotí jeho odpověď a volitelně odešle zpětnou vazbu do jiné iterace.
Následující ukázka Foundry používá značku dokončení. Vyžaduje FOUNDRY_PROJECT_ENDPOINT, FOUNDRY_MODEL a přihlašovací údaj Azure:
// Copyright (c) Microsoft. All rights reserved.
package main
import (
"context"
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/agent/harness/loop"
"github.com/microsoft/agent-framework-go/examples/internal/demo"
"github.com/microsoft/agent-framework-go/provider/foundryprovider"
)
var logger = demo.NewLogger(
"Loop Harness",
"This sample shows how the loop harness keeps re-invoking an agent until it "+
"signals completion with a marker, so the agent can work across several turns "+
"on its own before returning.",
"Model", demo.FoundryModel,
)
// completionMarker is the token the agent is asked to emit once the task is
// fully done; the loop stops as soon as it appears in a response.
const completionMarker = "TASK COMPLETE"
func main() {
token := demo.FoundryTokenCredential()
// Wrap the agent with the loop harness: after each iteration the
// completion-marker evaluator decides whether to run the agent again.
a := foundryprovider.NewAgent(
demo.FoundryProjectEndpoint,
token,
foundryprovider.ModelDeployment(demo.FoundryModel),
foundryprovider.AgentConfig{
Instructions: "You are a diligent assistant. Work on the request step by step across " +
"multiple turns. End your final message with the marker '" + completionMarker +
"' once, and only once, the request is fully complete.",
Config: agent.Config{
Name: "Worker",
Middlewares: []agent.Middleware{
// The loop re-invokes the agent (and everything below it,
// including the logger) until an evaluator stops the loop.
loop.New(loop.Config{
Evaluators: []loop.Evaluator{
loop.NewCompletionMarkerEvaluator(loop.CompletionMarkerConfig{Marker: completionMarker}),
},
}),
logger, // for logging each agent iteration
},
},
},
)
ctx := context.Background()
resp, err := a.RunText(ctx, "Draft a short checklist for planning a small birthday party, "+
"then review it once for anything missing, and finish.").Collect()
demo.Response(resp, err)
}
MaxIterations je volitelná *int a výchozí hodnota je 10. Nastavte explicitní mez pro váš úkol. Při více vyhodnocovačích poskytne zpětnou vazbu první vyhodnocovač, který požádá o další iteraci; smyčka se zastaví pouze v případech, kdy se zastaví všechny vyhodnocovače nebo je dosažen limit iterací.
Příklad bez přihlašovacích údajů najdete v ukázce skriptované smyčky. Ukazuje dokončování značek, vlastní vyhodnocovač a bezpečnostní limit iterace.
Volba podmínky dokončení
LoopAgent přijímá jeden vyhodnocovače nebo seřazenou kolekci:
| Vyhodnocovač | Pokračuje, dokud |
|---|---|
CompletionMarkerLoopEvaluator |
Nejnovější odpověď neobsahuje nakonfigurovanou značku. |
TodoCompletionLoopEvaluator |
Vyřešené TodoProvider stále obsahuje neúplné položky, volitelně ve vybraných režimech agenta. |
BackgroundTaskCompletionLoopEvaluator |
Vyřešený BackgroundAgentsProvider má stále běžící úlohy. |
AIJudgeLoopEvaluator |
Samostatný klient rozhodčí služby uvádí, že původní žádost není plně zodpovězena. |
DelegateLoopEvaluator |
Vaše zpětné volání vrátí LoopEvaluation.Continue(...). |
Pokud je nakonfigurovaných více vyhodnocovačů, spustí se v pořadí. První hodnotitel, který požádá o další iteraci, poskytne svou zpětnou vazbu; smyčka se zastaví teprve tehdy, když všichni hodnotitelé odmítnou pokračovat.
Použití soudce AI
Soudce obdrží původní žádost a nejnovější odpověď agenta. Pokud najde mezeru, její analýza se stane zpětnou vazbou pro další iteraci:
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 });
Používejte pouze endpoint pro posuzování, kterému svěříte původní požadavek i vygenerovanou odpověď.
Kontext a výstup ovládacího prvku
Ve výchozím nastavení LoopAgent opakovaně používá jednu relaci a odešle jako další vstup nejnovější zpětnou vazbu vítězného hodnotitele.
FreshContextPerIteration = true místo toho znovu sestaví každé spuštění z původního požadavku spolu se souhrnným protokolem zpětné vazby a resetuje nebo obnoví relaci.
Nestreamovací běhy ve výchozím nastavení vracejí souhrnný přepis. Nastavte NonStreamingReturnsLastResponseOnly = true tak, aby se vrátila pouze konečná odpověď. Streamování vždy odesílá každou iteraci a všechny viditelné zástupné zprávy zpětné vazby.
Predikát přijímá argumenty klíčových slov, včetně iteration, last_result, messagesoriginal_messages, session, , agentprogressa feedback. Pomocníci todos_remaining() a background_tasks_running() poskytují vestavěné podmínky pro úkoly TODO a úlohy na pozadí. Spárujte je s todos_remaining_message nebo background_tasks_running_message a vygenerujte cílený další vstup.
Použití soudce AI
AgentLoopMiddleware.with_judge vytvoří smyčku řízenou hodnotitelem. Ve výchozím nastavení mají Judge loops pět iterací:
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],
)
Odůvodnění hodnotitele se předává zpět agentovi, když je potřeba další práce. Používejte pouze endpoint pro posuzování, kterému svěříte původní požadavek i vygenerovanou odpověď.
Řízení kontextu, průběhu a výstupu
U pokročilých smyček vytvořte AgentLoopMiddleware přímo:
-
record_feedbackvytvoří stručnou položku průběhu po každé iteraci práce. -
progresszpřístupňuje nashromážděné položky funkcím zpětného volání. -
inject_progress=Truepřidá průběžný výsledek ke vstupu další iterace. -
fresh_context=Truese znovu spustí z původního úkolu a protokolu průběhu a obnoví připojenou relaci do stavu zachyceného ve snímku před smyčkou. -
return_final_only=Truevrátí pouze poslední odpověď pro nestreamovaná spuštění.
Předávejte max_iterations=None pouze tehdy, je-li zaručeno, že predikát dokončení skončí.
Pomocí loop.NewCompletionMarkerEvaluator zastavíte, když nejnovější odpověď obsahuje nakonfigurovanou značku. Pro dokončení specifické pro aplikaci implementujte loop.Evaluator nebo použijte loop.EvaluatorFunc, vraťte loop.Stop(), loop.Continue(feedback) nebo loop.ContinueWithMessages(messages).
FreshContextPerIteration restartuje z původního vstupu plus kumulovanou zpětnou vazbu.
NonStreamingReturnsLastResponseOnly omezuje výsledek bez streamování na poslední iteraci.
Go neobsahuje integrovaný evaluátor AI-judge, který je zobrazen v příkladech jazyka C#. Pokud dokončení vyžaduje jiný model nebo externí kontrolu, zadejte vlastní vyhodnocovač.
Použití opakování s Harness Agent
Pokud chcete využít také předkonfigurovanou historii, plánování, paměť, schvalování a pipeline pro observabilitu agenta Harness, použijte jeho nastavení.
Nastavte HarnessAgentOptions.LoopEvaluators. Tento postroj se použije LoopAgent jako nejkrajnější dekorátor:
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();
Prázdná nebo nullLoopEvaluators kolekce způsobí, že postroj bude jednorázový.
Schválení a chování relace
LoopAgent se zastaví před vyhodnocením podmínky dokončení, pokud iterace vrátí nevyřízenou žádost o schválení nástroje. Vrátí požadavek volajícímu namísto toho, aby jej skryl za další autonomní iterací. Poté, co volající poskytne odpověď ke schválení prostřednictvím běžného procesu schválení nástroje, může agent pokračovat.
LoopAgent nepřidá samotné zpracování schválení. Harness Agent použije smyčku mimo ToolApprovalAgent, což umožní žádostem o schválení, které čekají na vyřízení, obejít smyčku.
Používejte stejné AgentSession napříč voláními, abyste mohli pokračovat v konverzaci. Iterace smyčky ve výchozím nastavení sdílejí danou relaci. Pomocí FreshContextPerIteration = trueLoopAgent resetuje nebo obnoví stav relace zadaný volajícím, je-li to podporováno. Úložiště konverzací vlastněných službou může uchovávat historii, pokud serializovaná relace obsahuje pouze identifikátor vzdálené konverzace.
Zadejte loop_should_continue až create_harness_agent; loop_max_iterations má výchozí hodnotu 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 přizpůsobí další zadání. Bez loop_should_continue továrna nepřidá cyklus a ignoruje ostatní argumenty cyklu.
Schválení a chování relace
AgentLoopMiddleware se zastaví před vyhodnocením podmínky pokračování, když iterace vrátí nevyřízený požadavek na schválení nástroje. Vrátí požadavek volajícímu namísto toho, aby jej skryl za další autonomní iterací. Poté, co volající poskytne odpověď ke schválení prostřednictvím běžného procesu schválení nástroje, může agent pokračovat.
AgentLoopMiddleware samo nepřidává ToolApprovalMiddleware. Harness Agent umisťuje smyčku mimo svou vrstvu middlewaru pro schvalování, takže čekající žádosti o schválení mohou smyčku obejít. Vytvořte a předejte AgentSession při každém běhu agenta Harness, když je povoleno automatické schvalování nástrojů.
Používejte stejné AgentSession napříč voláními, abyste mohli pokračovat v konverzaci. Iterace smyčky ve výchozím nastavení sdílejí danou relaci. Pomocí fresh_context=True middleware mezi jednotlivými iteracemi obnoví připojenou relaci do stavu zachyceného ve snímku pořízeném před smyčkou. Úložiště konverzací vlastněných službou může uchovávat historii, pokud serializovaná relace obsahuje pouze identifikátor vzdálené konverzace.
Pomocník Go harness.AgentConfig ve výchozím nastavení nepřidá smyčku. Zahrňte loop.New(...) do agent.Config.Middlewares volajícího, aby se nakonfigurovaný agent zabalil s ohraničeným opětovným vyvoláním.
Smyčka skončí, když iterace vytvoří čekající žádosti o schválení nástrojů. Neschválí nástroje automaticky. Před pokračováním zpracujte požadavky v hostu a vraťte odpovídající odpovědi na schválení prostřednictvím stejné relace.