Seus agentes ainda trabalham em fila? Conheça o BackgroundAgentsProvider do MAF

Seus agentes ainda trabalham em fila? Conheça o BackgroundAgentsProvider do MAF

Seus agentes de IA ainda executam tarefas uma por vez? Neste episódio do MAF na prática, mostro como o BackgroundAgentsProvider permite que um agente pai dispare múltiplas subtarefas em paralelo em C# — cobrindo a arquitetura, a configuração do Harness Agent filho e a agregação final dos resultados.

18 de junho de 2026

Se você já construiu um agente que precisa pesquisar múltiplas fontes e ficou olhando para chamadas sequenciais se empilhando, esse episódio foi feito pra você.

No MAF na prática #23, mostro como o BackgroundAgentsProvider transforma a orquestração em C#: um agente pai que delega tarefas para agentes filhos rodando em background, coleta os resultados conforme chegam e entrega uma tabela consolidada — sem bloquear, sem polling manual.

O problema que esse recurso resolve

Pesquisar o preço de fechamento de 5 ações sequencialmente significa esperar a soma de todas as buscas. Disparar todas ao mesmo tempo significa esperar apenas a mais lenta.

A diferença parece simples, mas exige um mecanismo que o agente pai consiga iniciar tarefas sem bloquear e coletar os resultados depois. É exatamente o que o BackgroundAgentsProvider entrega.

Como o BackgroundAgentsProvider funciona de verdade

Ele herda de AIContextProvider. Antes de cada chamada ao LLM, o framework invoca o método ProvideAIContextAsync, que devolve um AIContext com instruções adicionais no system prompt e um array de AITool injetado no ChatOptions. Do ponto de vista do modelo, essas tools são function calls normais — sem nenhuma mágica escondida.

As cinco tools que ele injeta são:

  • BackgroundAgents_StartTask — dispara o agente filho e retorna um ID imediatamente
  • BackgroundAgents_WaitForFirstCompletion — espera o primeiro task da lista completar
  • BackgroundAgents_GetTaskResults — busca o resultado de um task completo
  • BackgroundAgents_GetAllTasks — lista todos os tasks com status atual
  • BackgroundAgents_ClearCompletedTask — libera a sessão do task da memória

O pai nunca acessa a web diretamente — ele só usa essas tools para delegar.

O que você vai ver no vídeo

A arquitetura pai-filho configurada com .AsHarnessAgent(). O WebSearchAgent é criado com flags explícitas desligando tudo que ele não precisa: memória, acesso a arquivos, todo provider que não seja executar a tarefa delegada. Clean Agent Design sem firula.

Como o BackgroundAgents property conecta tudo. Basta preencher BackgroundAgents = [webSearchAgent] no agente pai para o framework instanciar e registrar o BackgroundAgentsProvider automaticamente. O pai também recebe DisableWebSearch = true — ele não acessa a web; quem acessa é o filho.

O loop de coleta que define o paralelismo. A chave está nas instructions: disparar StartTask para todos os tickers antes de chamar qualquer WaitForFirstCompletion. Cada StartTask retorna imediatamente com um ID — o filho já está rodando. O loop de WaitForFirstCompletion vai coletando os resultados conforme chegam, não na ordem que foram disparados.

A demo ao vivo com 5 tickers. Você vê as 5 chamadas a StartTask saindo em sequência rápida e o pai começando a coletar enquanto todos os filhos ainda estão trabalhando. É a diferença de tempo total que torna o padrão convincente.

Por que o padrão importa além do exemplo

O cenário das ações é simples por design. Mas o mesmo mecanismo se aplica a qualquer fan-out: separar análise de front-end, back-end e testes entre agentes especializados, processar múltiplos documentos em paralelo, pesquisar fontes independentes simultaneamente. O BackgroundAgentsProvider é a peça que faltava quando o modelo precisa ser o próprio orquestrador das subtarefas.

▶️ Assista agora:

Código completo em https://github.com/carlosmachel/maf-video-23. Dúvida sobre algum trecho, deixa nos comentários.

Confira mais:

Fique por dentro das novidades

Assine nossa newsletter e receba as últimas atualizações e artigos diretamente em seu email.

Assinar gratuitamente