Agenty działające w tle

Agenty działające w tle pozwalają agentowi nadrzędnemu delegować niezależne zadania nazwanym agentom podrzędnym. Każde zadanie działa równolegle we własnej sesji podrzędnego agenta, podczas gdy agent nadrzędny zachowuje identyfikator zadania, którego może użyć do oczekiwania na zakończenie, pobrania wyników, kontynuowania pracy lub zwolnienia zadania.

Important

Agenty działające w tle mają charakter eksperymentalny.

Agenty działające w tle różnią się od odpowiedzi działających w tle. Odpowiedź w tle reprezentuje jedno żądanie dostawcy, które aplikacja sonduje lub wznawia. Zadanie agenta działającego w tle wywołuje innego agenta z platformy Agent Framework, a następnie przekazuje wynik tekstowy tego agenta z powrotem do agenta nadrzędnego.

Ręczne konfigurowanie agentów w tle

Każdy agent podrzędny musi mieć unikatową nazwę bez uwzględniania wielkości liter. Przekaż agentom podrzędnym precyzyjne instrukcje oraz wyłącznie narzędzia potrzebne do ich powierzonej roli.

Zaimportuj BackgroundAgentsProvider i dodaj go do zwykłego agenta przez ChatClientAgentOptions.AIContextProviders:

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

var backgroundProvider = new BackgroundAgentsProvider(
    [webSearchAgent, codeAnalysisAgent]);

AIAgent parentAgent = chatClient.AsAIAgent(new ChatClientAgentOptions
{
    Name = "research-coordinator",
    AIContextProviders = [backgroundProvider],
});

AgentSession session = await parentAgent.CreateSessionAsync();

BackgroundAgentsProviderOptions dostosowuje instrukcje dostawcy i formatowanie listy agentów.

from agent_framework import Agent, BackgroundAgentsProvider

background_provider = BackgroundAgentsProvider(
    [web_search_agent, code_analysis_agent],
    wait_timeout_seconds=30,
)

parent_agent = Agent(
    client=client,
    name="research-coordinator",
    context_providers=[background_provider],
)
session = parent_agent.create_session()

Przekaż instructions= do BackgroundAgentsProvider, aby zastąpić jego instrukcje. Umieść {background_agents} w miejscu, w którym powinna zostać wyświetlona sformatowana lista agentów podrzędnych.

wait_timeout_seconds ustawia czas oczekiwania poszczególnych wywołań background_agents_wait_for_first_completion . Musi to być dodatnia liczba całkowita i wartość domyślna to 300 sekund. Jeśli limit czasu wygaśnie, narzędzie zakończy działanie normalnie i pozostawi zadania uruchomione, aby proces nadrzędny mógł wywołać je ponownie.

Uwaga / Notatka

Opisany na tej stronie gotowy mechanizm background-agent nie jest obecnie dostępny dla języka Go.

Cykl życia zadania

Dostawca dodaje te same narzędzia oparte na modelu w .NET i Python:

Narzędzie Akcja cyklu życia
background_agents_start_task Uruchom nieblokujące zadanie na agencie o określonej nazwie i zwróć jego całkowitoliczbowy identyfikator zadania.
background_agents_wait_for_first_completion Poczekaj, aż pierwsze zadanie w podanym zestawie osiągnie stan terminalu.
background_agents_get_task_results Zwraca ukończony tekst, komunikat o błędzie lub bieżący stan.
background_agents_get_all_tasks Wyświetl identyfikatory, statusy, nazwy agentów i opisy.
background_agents_continue_task Uruchom kolejne dane w istniejącej sesji podrzędnej po zakończeniu zadania lub jego niepowodzeniu.
background_agents_clear_completed_task Usuń zadanie terminalu i zwolnij sesję podrzędną.

Typowa sekwencja agenta nadrzędnego to:

  1. Uruchom każde niezależne zadanie, zanim zaczniesz czekać, aby zadania były wykonywane równolegle.
  2. Poczekaj na pierwsze ukończenie, pobierz ten wynik i powtórz, aż żadne zadania nie będą uruchomione.
  3. Kontynuuj ukończone lub nieudane zadanie, gdy dalsza praca wymaga zachowania dotychczasowego kontekstu rozmowy.
  4. Wyczyść zadania terminalowe po pobraniu wyników, chyba że będą kontynuowane.

Stan zadania to running, , completedfailedlub lost. Zadanie zostaje utracone, gdy jego dojście do zadania w procesie lub sesja podrzędna jest niedostępne, na przykład po ponownym uruchomieniu procesu lub przywróceniu sesji. Metadane zadań, które można serializować, mogą pozostać w sesji nadrzędnej, ale obsługa pracy w locie i sesji podrzędnej nie przetrwa tej granicy.

W dostawcy nie ma narzędzia anulowania. Przed wyczyszczeniem zadań poczekaj, aż osiągną stan końcowy.

Użyj ponownie tej samej sesji nadrzędnej w kolejnych turach. Każde zadanie ma przypisaną oddzielną sesję podrzędną. Kontynuowanie zadania w terminalu powoduje ponowne użycie tej sesji podrzędnej; jego wyczyszczenie usuwa metadane zadania i zwalnia uchwyt sesji podrzędnej.

Wyniki zadania są zwracane do elementu nadrzędnego jako tekst. Dostawca nie przekazuje z powrotem przez agenta nadrzędnego ustrukturyzowanego żądania zatwierdzenia użycia narzędzia wysłanego przez agenta podrzędnego, dlatego agentów podrzędnych należy skonfigurować tak, aby realizowali delegowane zadania bez interaktywnego zatwierdzania, albo obsługiwać proces zatwierdzania w hoście agenta podrzędnego.

Zwalnianie sesji nadrzędnej z hosta

Uwaga / Notatka

Wersja sesji agenta w tle po stronie hosta nie jest obecnie dostępna w .NET.

Gdy host eksmituje lub odrzuca sesję nadrzędną, zwolnij zadanie w procesie dostawcy i obsługę sesji podrzędnej finally w bloku:

session = parent_agent.create_session()
try:
    await parent_agent.run("Coordinate the research.", session=session)
finally:
    await background_provider.release_session(session)

release_session(session, *, cancel_running=True, timeout=30.0) jest interfejsem API cyklu życia po stronie hosta, a nie narzędziem przeznaczonym dla modelu. Domyślnie anuluje uruchamianie podrzędnych zadań i czeka do 30 sekund na anulowanie przed zwolnieniem całego stanu środowiska uruchomieniowego dla sesji nadrzędnej. Ustaw wartość cancel_running=False tak, aby odrzucała wydanie podczas wykonywania zadań, lub ustaw wartość timeout=None, aby czekać bezterminowo.

Z kolei background_agents_clear_completed_task umożliwia modelowi usunięcie jednego zadania terminala i jego sesji podrzędnej podczas rozmowy. Odrzuca uruchamianie zadań i nie zastępuje zamykania sesji nadrzędnej po stronie hosta.

Uwaga / Notatka

Zwalnianie sesji agenta działającego w tle po stronie hosta nie jest obecnie dostępne w Go.

Ręcznie dodaj automatyczne oczekiwanie

Zawijaj ręcznie skomponowany element nadrzędny za pomocą polecenia LoopAgent. BackgroundTaskCompletionLoopEvaluator trwa tylko wtedy, gdy zadanie pozostaje w Running stanie:

AIAgent loopingParent = new LoopAgent(
    parentAgent,
    new BackgroundTaskCompletionLoopEvaluator(),
    new LoopAgentOptions { MaxIterations = 10 });

Ewaluator zatrzymuje się w przypadku ukończonych, nieudanych i utraconych zadań.

Dodaj AgentLoopMiddleware do zwykłego elementu nadrzędnego i połącz predykat zadania w tle z pomocnikiem następnej wiadomości:

from agent_framework import (
    Agent,
    AgentLoopMiddleware,
    background_tasks_running,
    background_tasks_running_message,
)

parent_agent = Agent(
    client=client,
    context_providers=[background_provider],
    middleware=[
        AgentLoopMiddleware(
            background_tasks_running(),
            next_message=background_tasks_running_message,
            max_iterations=10,
        )
    ],
)

Predykat pozostaje spełniony tylko tak długo, jak długo utrwalony stan zadania nadal wskazuje, że zadanie jest uruchomione.

Automatyczna integracja pętli zadań w tle nie jest obecnie dostępna w języku Go.

Korzystanie z agentów działających w tle za pomocą Harness Agent

Użyj tej konfiguracji, jeśli chcesz również korzystać z domyślnego potoku planowania, pamięci, akceptacji i obserwowalności agenta Harness.

Ustaw wartość HarnessAgentOptions.BackgroundAgents. Dodaj moduł oceny ukończenia, gdy element nadrzędny powinien działać, dopóki delegowana praca nie jest już wykonywana:

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

var options = new HarnessAgentOptions
{
    Name = "research-coordinator",
    BackgroundAgents = [webSearchAgent, codeAnalysisAgent],
    LoopEvaluators = [new BackgroundTaskCompletionLoopEvaluator()],
    LoopAgentOptions = new LoopAgentOptions { MaxIterations = 10 },
};

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

Użyj HarnessAgentOptions.BackgroundAgentsProviderOptions, aby dostosować instrukcje dostawcy i formatowanie listy agentów. Pominięcie elementu LoopEvaluators sprawia, że delegowanie w tle pozostaje dostępne bez automatycznego ponownego wywołania.

Podaj background_agents do create_harness_agent. Połącz to z ograniczoną pętlą, gdy element nadrzędny powinien czekać automatycznie:

from agent_framework import (
    background_tasks_running,
    background_tasks_running_message,
    create_harness_agent,
)

parent_agent = create_harness_agent(
    client=client,
    name="research-coordinator",
    background_agents=[web_search_agent, code_analysis_agent],
    background_agents_wait_timeout_seconds=30,
    loop_should_continue=background_tasks_running(),
    loop_next_message=background_tasks_running_message,
    loop_max_iterations=10,
)
session = parent_agent.create_session()

Użyj polecenia background_agents_instructions , aby zastąpić instrukcje dostawcy. background_agents_wait_timeout_seconds konfiguruje ten sam ograniczony czas oczekiwania co wait_timeout_seconds na BackgroundAgentsProvider. Mechanizm uruchomieniowy Pythona domyślnie włącza middleware automatycznego zatwierdzania narzędzi, dlatego przy każdym uruchomieniu przekaż session.

Uwaga / Notatka

Delegowanie zadań w tle przez agenta Harness nie jest obecnie dostępne w języku Go.

Zagadnienia dotyczące zabezpieczeń

Rejestruj tylko zaufanych agentów podrzędnych. Obiekt nadrzędny może przekazywać im tekst pochodzący z prywatnego lub niezaufanego kontekstu, a uzyskane przez nie wyniki są następnie dodawane z powrotem do kontekstu obiektu nadrzędnego. Przejęty komponent podrzędny może eksfiltrować delegowane dane wejściowe lub zwracać treści pośredniego ataku typu prompt injection.

Następne kroki

Głębiej