Planeamento e tarefas

Dois fornecedores de contexto apoiam trabalhos de longa duração:

  • Um fornecedor de tarefas armazena os itens de trabalho rastreáveis e fornece ao agente ferramentas para os adicionar, completar, remover e inspecionar.
  • Um fornecedor de modo agente armazena o modo operacional atual e fornece ao agente ferramentas para o ler ou alterar.

Combine estes provedores diretamente quando apenas precisar de planeamento, ou utilize o Harness Agent para ativar ambos os provedores como parte do pipeline predefinido mais abrangente.

Ferramentas de tarefas

Os fornecedores .NET e Python expõem as mesmas ferramentas orientadas para modelos:

Tool Purpose
todos_add Adicione um ou mais itens com título e descrição opcional.
todos_complete Marque um ou mais itens como concluídos e inclua uma razão de conclusão.
todos_remove Remova itens que já não são relevantes.
todos_get_remaining Devolver itens incompletos.
todos_get_all Devolver itens completos e incompletos.

O fornecedor insere a lista de tarefas atual antes de cada execução, para que o agente possa retomar o trabalho pendente.

Modos de planeamento e execução

AgentModeProvider fornece os modos plan e execute predefinidos:

  1. O plano é interativo. O agente analisa requisitos, cria tarefas, faz perguntas esclarecedoras, apresenta um plano e pergunta antes de mudar de modo.
  2. Executar é autónomo. O agente segue o plano, faz escolhas razoáveis quando os detalhes são ambíguos e marca as tarefas pendentes como concluídas.

O fornecedor disponibiliza mode_get e mode_set. As suas instruções dizem ao modelo para usar mode_set apenas quando o utilizador permite explicitamente a transição. As aplicações também podem alterar o modo diretamente, o que faz com que o fornecedor injete uma notificação de mudança de modo na execução seguinte.

Configurar o planeamento e as tarefas manualmente

Importe e construa os providers e, em seguida, adicione-os através de 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();

Personalize os nomes e instruções dos modos com AgentModeProviderOptions.Modes. O fornecedor .NET todo armazena o estado em AgentSession.StateBag. TodoProviderOptions pode substituir as suas instruções, suprimir a mensagem da lista de tarefas injetada ou fornecer um construtor de mensagens personalizado.

As instruções predefinidas plan incluem escrever o plano na memória de ficheiros. Se o agente composto manualmente não fornecer ferramentas de memória de ficheiros, personalize as instruções de modo ou adicione um fornecedor de memória adequado.

Alterar os modos na aplicação

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

Use GetModeAsync para ler o modo atual.

Importa e constrói os providers e, em seguida, adiciona-os a um elemento Agent normal:

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 usa TodoSessionStore por defeito. Use TodoFileStore ou um TodoStore personalizado quando o estado de tarefas pendentes tiver de ser armazenado fora da carga útil da sessão. Personalizar modos com AgentModeProvider(mode_instructions={...}).

As instruções padrão plan incluem escrever o plano na memória de ficheiros. Se o agente composto manualmente não fornecer ferramentas de memória de ficheiros, personalize mode_instructions ou adicione um fornecedor de memória adequado.

Alterar modos na aplicação

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,
)

Observação

Os fornecedores incluídos de todo e do modo de agente descritos nesta página não estão atualmente disponíveis em Go.

Execute o plano até à conclusão manualmente

O Todo regista o progresso, mas não reinvoca o agente, por si só. Combine-o com um ciclo de agente limitado quando o modo de execução deve continuar até que todas as tarefas estejam concluídas:

Envolva o agente composto manualmente com LoopAgent. TodoCompletionLoopEvaluator pode restringir a repetição aos modos selecionados:

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

Adicione AgentLoopMiddleware ao agente normal e use todos_remaining() com um filtro de modo:

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,
        )
    ],
)

A integração de ciclos baseada em Todo não está atualmente disponível em Go.

Use planeamento e tarefas com o Harness Agent

Utilize esta configuração quando também pretender o histórico, a memória, a aprovação e o pipeline de observabilidade pré-configurados do Harness Agent.

HarnessAgent ativa TodoProvider e AgentModeProvider por defeito. Configure o fornecedor de modo e o ciclo opcional orientado por TODOs através de 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();

Defina DisableTodoProvider ou DisableAgentModeProvider para remover um fornecedor predefinido. Para usar um TodoProvider configurado, desative a predefinição e adicione a sua instância através de AIContextProviders. Pode resolver os fornecedores habilitados através de agent.GetService<TProvider>().

create_harness_agent Ativa ambos os fornecedores por defeito. Forneça instâncias configuradas para as substituir e adicione um ciclo opcional orientado por 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()

Defina disable_todo ou disable_mode para remover um fornecedor padrão. O harness de Python ativa o middleware de aprovação automática de ferramentas por defeito, por isso, deve passar session em cada execução.

Observação

Os componentes de planeamento e de tarefas do Harness Agent não estão atualmente disponíveis em Go.

Comportamento da sessão

Usa a mesma sessão entre turnos. O estado do modo é mantido na sessão em ambos os SDKs. O estado das tarefas pendentes no .NET é armazenado em AgentSession.StateBag; por predefinição, o Python usa TodoSessionStore, enquanto TodoFileStore ou um TodoStore personalizado podem externalizar a persistência das tarefas pendentes.

Alterar o modo através do código da aplicação agenda uma notificação única de alteração de modo para a próxima execução. A ferramenta destinada ao modelo mode_set não coloca essa notificação adicional em fila de espera porque o modelo já observou a sua própria invocação da ferramenta.

A confirmação para planear e executar é um comportamento ao nível das instruções, não um pedido de aprovação de uma ferramenta. As próprias ferramentas todo e mode não requerem aprovação para funções; o código da aplicação pode alterar os modos diretamente quando o seu host já tiver obtido a permissão necessária.

Passos seguintes

Aprofunde-se