Planowanie i dozowanie

Dwaj dostawcy kontekstu obsługują operacje długotrwałe:

  • Dostawca zadań do wykonania przechowuje możliwe do śledzenia elementy robocze i udostępnia narzędzia agenta do dodawania, uzupełniania, usuwania i inspekcji.
  • Dostawca trybu agenta przechowuje bieżący tryb operacyjny i udostępnia narzędzia agenta do jego odczytu lub zmiany.

Skonfiguruj tych dostawców bezpośrednio, gdy potrzebujesz tylko planowania, lub użyj Harness Agent, aby włączyć obu w ramach jego szerszego domyślnego potoku.

Narzędzia do zadań

Dostawcy .NET i Python uwidaczniają te same narzędzia oparte na modelu:

Narzędzie Purpose
todos_add Dodaj co najmniej jeden element z tytułem i opcjonalnym opisem.
todos_complete Oznacz co najmniej jeden element jako ukończony i dołącz przyczynę ukończenia.
todos_remove Usuń elementy, które nie są już istotne.
todos_get_remaining Zwróć niekompletne elementy.
todos_get_all Zwróć ukończone i niekompletne elementy.

Dostawca wprowadza bieżącą listę zadań do wykonania przed każdym uruchomieniem, aby agent mógł wznowić zaległą pracę.

Tryby planowania i wykonywania

AgentModeProvider domyślnie dostarcza plan i execute tryby:

  1. Plan jest interaktywny. Agent analizuje wymagania, tworzy listę zadań, zadaje pytania doprecyzowujące, przedstawia plan i pyta przed zmianą trybu.
  2. Wykonywanie jest autonomiczne. Agent realizuje plan, dokonuje rozsądnych wyborów, gdy szczegóły są niejednoznaczne, i oznacza zadania jako ukończone.

Dostawca uwidacznia mode_get i mode_set. Jego instrukcje informują model o użyciu mode_set tylko wtedy, gdy użytkownik jawnie zezwala na przejście. Aplikacje mogą również bezpośrednio zmieniać tryb, co powoduje, że dostawca wprowadza powiadomienie o zmianie trybu w następnym uruchomieniu.

Skonfiguruj ręcznie planowanie i zadania

Zaimportuj i utwórz dostawców, a następnie dodaj ich za pomocą elementu ChatClientAgentOptions.AIContextProviders:

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

var todoProvider = new TodoProvider();
var modeProvider = new AgentModeProvider(
    new AgentModeProviderOptions
    {
        DefaultMode = "plan",
    });

AIAgent agent = chatClient.AsAIAgent(new ChatClientAgentOptions
{
    AIContextProviders = [todoProvider, modeProvider],
});

AgentSession session = await agent.CreateSessionAsync();

Dostosowywanie nazw trybów i instrukcji za pomocą polecenia AgentModeProviderOptions.Modes. Dostawca listy zadań .NET przechowuje stan w AgentSession.StateBag. TodoProviderOptions może zastąpić swoje instrukcje, pominąć wstrzyknięty komunikat z listą zadań do wykonania lub zdefiniować niestandardowy kreator komunikatów.

plan Domyślne instrukcje obejmują zapisanie planu w pamięci pliku. Jeśli ręcznie skomponowany agent nie udostępnia narzędzi pamięci plików, dostosuj instrukcje trybu lub dodaj odpowiedniego dostawcę pamięci.

Zmienianie trybów z aplikacji

await modeProvider.SetModeAsync(session, "execute");

Użyj GetModeAsync, aby odczytać bieżący tryb.

Zaimportuj i utwórz providery, a następnie dodaj je do zwykłego elementu Agent:

from agent_framework import (
    Agent,
    AgentModeProvider,
    TodoFileStore,
    TodoProvider,
)

todo_provider = TodoProvider(
    store=TodoFileStore("./todo-state"),
)
mode_provider = AgentModeProvider(
    default_mode="plan",
)

agent = Agent(
    client=client,
    context_providers=[todo_provider, mode_provider],
)

session = agent.create_session()

TodoProvider używa TodoSessionStore domyślnie. Użyj TodoFileStore lub niestandardowego TodoStore, gdy stan zadania do wykonania musi być przechowywany poza ładunkiem danych sesji. Dostosowywanie trybów za pomocą polecenia AgentModeProvider(mode_instructions={...}).

plan Domyślne instrukcje obejmują zapisanie planu w pamięci pliku. Jeśli ręcznie skomponowany agent nie udostępnia narzędzi pamięci plików, dostosuj mode_instructions lub dodaj odpowiedniego dostawcę pamięci.

Zmienianie trybów z aplikacji

from agent_framework import get_agent_mode, set_agent_mode

set_agent_mode(
    session,
    "execute",
    source_id=mode_provider.source_id,
    available_modes=mode_provider.available_modes,
)

current_mode = get_agent_mode(
    session,
    source_id=mode_provider.source_id,
    default_mode=mode_provider.default_mode,
    available_modes=mode_provider.available_modes,
)

Pomiń available_modes, aby użyć wbudowanych trybów plan i execute. Jeśli przekażesz available_modes, musi on zawierać co najmniej jeden tryb; pusta sekwencja powoduje zgłoszenie wyjątku ValueError, zanim stan sesji zostanie zmieniony.

Narzędzia trybu sterowania z aplikacji

Ukryj narzędzie trybu wbudowanego, gdy aplikacja dostarcza własny interfejs użytkownika lub narzędzie do obsługi modelu:

mode_provider = AgentModeProvider(
    default_mode="plan",
    expose_mode_set=False,
    expose_mode_get=False,
)

Dwie opcje są niezależne i domyślnie mają wartość True. Ukrycie obu narzędzi zachowuje stan trybu powiązany z sesją, instrukcje dla poszczególnych tur oraz zewnętrzne powiadomienia o zmianie trybu. Dodaj zastępcze narzędzie udostępniane modelowi przez argument tools agenta i spraw, aby wywoływało set_agent_mode(..., notify=False), ponieważ model już obserwuje wynik działania tego narzędzia. Zmiany aplikacji lub interfejsu użytkownika mogą zachować wartość domyślną notify=True , aby agent odbierał powiadomienie o zmianie podczas następnego uruchomienia.

Uwaga / Notatka

Opisani na tej stronie wbudowani dostawcy todo i trybu agenta nie są obecnie dostępni dla Go.

Uruchom plan ręcznie do końca

Śledzenie zadań do wykonania rejestruje postęp, ale nie powoduje ponownego wywołania agenta. Połącz ją z ograniczoną pętlą agenta, gdy tryb wykonywania ma być kontynuowany, aż wszystkie zadania do wykonania zostaną ukończone:

Otocz ręcznie skomponowanego agenta elementem LoopAgent. TodoCompletionLoopEvaluator może ograniczyć pętlę do wybranych trybów:

AIAgent loopingAgent = new LoopAgent(
    agent,
    new TodoCompletionLoopEvaluator(
        new TodoCompletionLoopEvaluatorOptions
        {
            Modes = ["execute"],
        }),
    new LoopAgentOptions { MaxIterations = 10 });

Dodaj AgentLoopMiddleware do standardowego agenta i użyj todos_remaining() z filtrem trybu:

from agent_framework import (
    Agent,
    AgentLoopMiddleware,
    todos_remaining,
    todos_remaining_message,
)

agent = Agent(
    client=client,
    context_providers=[todo_provider, mode_provider],
    middleware=[
        AgentLoopMiddleware(
            todos_remaining(looping_modes=["execute"]),
            next_message=todos_remaining_message,
            max_iterations=10,
        )
    ],
)

Integracja pętli todo-driven nie jest obecnie dostępna w języku Go.

Używaj planowania i list zadań za pomocą agenta Harness

Użyj tej konfiguracji, jeśli chcesz także skorzystać ze wstępnie skonfigurowanych mechanizmów historii, pamięci, zatwierdzania i potoku obserwowalności agenta Harness.

HarnessAgent włącza TodoProvider i AgentModeProvider domyślnie. Skonfiguruj dostawcę trybu i opcjonalną pętlę sterowaną listą zadań za pomocą elementu HarnessAgentOptions:

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

var options = new HarnessAgentOptions
{
    AgentModeProviderOptions = new AgentModeProviderOptions
    {
        DefaultMode = "plan",
    },
    LoopEvaluators =
    [
        new TodoCompletionLoopEvaluator(
            new TodoCompletionLoopEvaluatorOptions
            {
                Modes = ["execute"],
            }),
    ],
    LoopAgentOptions = new LoopAgentOptions { MaxIterations = 10 },
};

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

Ustaw DisableTodoProvider lub DisableAgentModeProvider usuń domyślnego dostawcę. Aby użyć skonfigurowanego TodoProvider, wyłącz ustawienie domyślne i dodaj swoją instancję za pomocą AIContextProviders. Możesz rozwiązać problemy z włączonymi dostawcami za pomocą usługi agent.GetService<TProvider>().

create_harness_agent włącza domyślnie obu dostawców. Dostarcz skonfigurowane instancje w celu ich zastąpienia i dodaj opcjonalną pętlę sterowaną przez todo:

from agent_framework import (
    AgentModeProvider,
    TodoFileStore,
    TodoProvider,
    create_harness_agent,
    todos_remaining,
    todos_remaining_message,
)

todo_provider = TodoProvider(store=TodoFileStore("./todo-state"))
mode_provider = AgentModeProvider(default_mode="plan")

agent = create_harness_agent(
    client=client,
    todo_provider=todo_provider,
    mode_provider=mode_provider,
    loop_should_continue=todos_remaining(looping_modes=["execute"]),
    loop_next_message=todos_remaining_message,
    loop_max_iterations=10,
)
session = agent.create_session()

Ustaw disable_todo lub disable_mode usuń domyślnego dostawcę. Mechanizm uruchomieniowy Pythona domyślnie włącza middleware automatycznego zatwierdzania narzędzi, dlatego przy każdym uruchomieniu przekaż session.

Uwaga / Notatka

Planowanie agenta Harness i dostawcy list zadań nie są obecnie dostępne dla języka Go.

Zachowanie sesji

Używaj tej samej sesji w kolejnych turach. Stan trybu jest utrzymywany w ramach sesji w obu pakietach SDK. Stan zadań do wykonania w platformie .NET jest przechowywany w AgentSession.StateBag; Python domyślnie używa TodoSessionStore, podczas gdy TodoFileStore lub niestandardowy TodoStore mogą przenieść trwałe przechowywanie stanu zadań na zewnątrz.

Zmiana trybu z poziomu kodu aplikacji powoduje umieszczenie w kolejce jednorazowego powiadomienia o zmianie trybu przy następnym uruchomieniu. Narzędzie przeznaczone dla modelu mode_set nie umieszcza tego dodatkowego powiadomienia w kolejce, ponieważ model widział już własne wywołanie narzędzia.

Potwierdzenie przejścia do wykonania planu jest działaniem na poziomie instrukcji, a nie prośbą o zatwierdzenie użycia narzędzia. Same w sobie narzędzia todo i mode nie wymagają zatwierdzenia wywołania funkcji; kod aplikacji może bezpośrednio zmieniać tryby, jeśli host uzyskał już wymagane uprawnienia.

Następne kroki

Głębiej