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.
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 imediatamenteBackgroundAgents_WaitForFirstCompletion— espera o primeiro task da lista completarBackgroundAgents_GetTaskResults— busca o resultado de um task completoBackgroundAgents_GetAllTasks— lista todos os tasks com status atualBackgroundAgents_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.