{"id":725,"date":"2026-09-16T18:34:24","date_gmt":"2026-09-16T21:34:24","guid":{"rendered":"https:\/\/yellowkode.com\/blog\/pizza-bot-inbox-agentes-ia-background\/"},"modified":"2026-09-16T18:34:24","modified_gmt":"2026-09-16T21:34:24","slug":"pizza-bot-inbox-agentes-ia-background","status":"publish","type":"post","link":"https:\/\/yellowkode.com\/blog\/pizza-bot-inbox-agentes-ia-background\/","title":{"rendered":"Pizza Bot: Como Funciona um Inbox para Agentes de IA em Background"},"content":{"rendered":"<p>Se voc\u00ea j\u00e1 teve um agente rodando e fechou o navegador sem querer, sabe o problema. O Pizza Bot resolve isso reorganizando o modelo mental: em vez de chat, um inbox.<\/p>\n<h2>O que foi lan\u00e7ado e por quem<\/h2>\n<p>A AWS apresentou o Pizza Bot, um inbox open source para agentes de IA que continuam trabalhando em background depois que o chat termina, constru\u00eddo com DeepAgents e LangGraph, projetado para mostrar o progresso das tarefas e os pontos em que uma pessoa precisa responder. O reposit\u00f3rio est\u00e1 em github.com\/pizza-bot-app\/pizza-bot sob licen\u00e7a Apache 2.0. O projeto \u00e9 um esfor\u00e7o comunit\u00e1rio e n\u00e3o um servi\u00e7o da AWS, ent\u00e3o os usu\u00e1rios s\u00e3o respons\u00e1veis por hospedar, backups, atualiza\u00e7\u00f5es e suporte.<\/p>\n<p>A ideia central \u00e9 simples de descrever e n\u00e3o trivial de implementar: voc\u00ea dispara uma tarefa, fecha a tela, e volta depois. Trabalho conclu\u00eddo cai em Unread e execu\u00e7\u00f5es que esperam sua decis\u00e3o caem em Action. Os agentes continuam trabalhando quando voc\u00ea navega para outro lugar ou desconecta; o processo api-server precisa continuar rodando.<\/p>\n<h2>Como funciona por baixo do cap\u00f4<\/h2>\n<p>Antes de olhar o Pizza Bot em si, precisamos dos dois blocos que ele empilha: LangGraph e DeepAgents. S\u00e3o pe\u00e7as independentes, com responsabilidades diferentes.<\/p>\n<h3>LangGraph: o runtime que salva o estado a cada passo<\/h3>\n<p>LangGraph modela a execu\u00e7\u00e3o do agente como um grafo de n\u00f3s, onde cada n\u00f3 \u00e9 uma fun\u00e7\u00e3o (chamar o modelo, chamar uma ferramenta, decidir o pr\u00f3ximo passo) e o estado global \u00e9 uma estrutura compartilhada que atravessa esses n\u00f3s. Esse estado global \u00e9 uma mem\u00f3ria compartilhada que persiste durante toda a execu\u00e7\u00e3o do workflow, mantendo progresso, resultados intermedi\u00e1rios, par\u00e2metros de configura\u00e7\u00e3o e dados contextuais acess\u00edveis a todos os n\u00f3s.<\/p>\n<p>A parte que importa aqui \u00e9 o checkpoint. A cada transi\u00e7\u00e3o entre n\u00f3s, o LangGraph serializa o estado e grava em disco. Isso permite tr\u00eas coisas que um loop em mem\u00f3ria n\u00e3o permite: pausar para pedir aprova\u00e7\u00e3o humana, sobreviver \u00e0 queda do cliente, e retomar do ponto exato onde parou.<\/p>\n<p>Uma analogia r\u00e1pida. Pense num jogo com save autom\u00e1tico depois de cada sala. Se o console reinicia, voc\u00ea n\u00e3o volta ao menu inicial, volta pra \u00faltima sala. Onde a analogia quebra: no jogo o save \u00e9 opcional, aqui o checkpoint \u00e9 a mec\u00e2nica que define o que \u00e9 um passo. Sem checkpoint, n\u00e3o h\u00e1 estado durante para reaproveitar.<\/p>\n<h3>DeepAgents: a camada opinativa em cima do LangGraph<\/h3>\n<p>DeepAgents \u00e9 um harness, um conjunto de padr\u00f5es prontos, que monta um grafo LangGraph j\u00e1 com ferramentas embutidas para planejamento, sub-agentes e um filesystem virtual. LangGraph \u00e9 o runtime do grafo. O create_agent do LangChain \u00e9 um harness m\u00ednimo em cima dele. Deep Agents \u00e9 um harness mais opinativo em cima do create_agent, mesmos blocos, mas com filesystem, sub-agentes, gerenciamento de contexto e skills embutidos.<\/p>\n<p>Dois padr\u00f5es de DeepAgents fazem diferen\u00e7a no Pizza Bot:<\/p>\n<ul>\n<li><strong>Planejamento como ferramenta.<\/strong> Ao for\u00e7ar o modelo a chamar uma ferramenta de todo, DeepAgents mant\u00e9m uma lista de tarefas expl\u00edcita e vis\u00edvel. Esse simples plano no-op melhora dramaticamente a coer\u00eancia de longo prazo. Na pr\u00e1tica, o agente escreve a pr\u00f3pria lista, marca itens como feitos, e isso vira estado inspecion\u00e1vel.<\/li>\n<li><strong>Sub-agentes com contexto isolado.<\/strong> Delegar subtarefas complexas a agentes especializados. Isso p\u00f5e o contexto em quarentena: o agente principal s\u00f3 v\u00ea os resultados finais, n\u00e3o cada busca ou passo intermedi\u00e1rio. No Pizza Bot isso aparece como skills.<\/li>\n<\/ul>\n<h3>Como o Pizza Bot conecta isso a um inbox<\/h3>\n<p>O runtime fica isolado num pacote pr\u00f3prio. A aplica\u00e7\u00e3o usa DeepAgents e LangGraph para execu\u00e7\u00e3o stateful. Um servidor de API Hono \u00e9 dono da execu\u00e7\u00e3o do runtime e do armazenamento. Clientes Electron e browser compartilham a mesma interface React, enquanto todos os clientes se comunicam com o servidor via HTTP e server-sent events. Checkpoints do LangGraph ret\u00eam o estado da thread e as pausas de aprova\u00e7\u00e3o; stores SQLite separados guardam mem\u00f3ria cross-thread e metadados da aplica\u00e7\u00e3o.<\/p>\n<p>O fluxo de uma tarefa, passo a passo:<\/p>\n<ol>\n<li>Voc\u00ea dispara a tarefa. O gatilho pode ser manual, mas tamb\u00e9m pode vir de cron ou webhook. O servidor \u00e9 dono do agendamento. Depois de um downtime, intervalos de cron perdidos produzem um \u00fanico catch-up run em vez de reproduzir cada intervalo perdido. Ocorr\u00eancias de trigger s\u00e3o gravadas durablemente.<\/li>\n<li>O api-server abre uma thread, cria o grafo DeepAgents e come\u00e7a a executar. Cada passo do grafo grava checkpoint em SQLite.<\/li>\n<li>Quando o agente chama uma ferramenta marcada como sens\u00edvel, o grafo interrompe. Deep Agents integra com interrupts do LangGraph para pausar em aprova\u00e7\u00f5es de chamadas de ferramentas sens\u00edveis. Ativa esse comportamento com o par\u00e2metro interrupt_on em create_deep_agent. interrupt_on aceita um mapeamento de nomes de ferramentas para configura\u00e7\u00f5es de interrupt. Por exemplo, interrupt_on={&#8220;edit_file&#8221;: True} pausa antes de cada edi\u00e7\u00e3o, permitindo aprovar a chamada, adicionar orienta\u00e7\u00e3o ou modificar os inputs antes da execu\u00e7\u00e3o.<\/li>\n<li>Essa thread pausada aparece na fila Action. Enquanto isso, outras threads que terminaram sozinhas caem em Unread.<\/li>\n<li>Voc\u00ea responde \u00e0 aprova\u00e7\u00e3o ou l\u00ea o resultado. O grafo retoma do checkpoint, n\u00e3o do in\u00edcio.<\/li>\n<\/ol>\n<p>O ponto t\u00e9cnico que sustenta tudo: o cliente n\u00e3o segura estado. O Pizza Bot separa o runtime do agente dos clientes usados para inspecion\u00e1-lo. O servidor de API \u00e9 dono das execu\u00e7\u00f5es ativas, estado e persist\u00eancia. Clientes Electron, browser e terminal se comunicam com esse servidor via HTTP\/SSE. Fechar a janela n\u00e3o mata a execu\u00e7\u00e3o. S\u00f3 mata a execu\u00e7\u00e3o se voc\u00ea derrubar o api-server.<\/p>\n<h2>O que isso significa na pr\u00e1tica<\/h2>\n<p>O primeiro caso \u00f3bvio \u00e9 delegar tarefa longa. Um agente que precisa fazer pesquisa em v\u00e1rias fontes, cruzar com dados internos, e chegar num relat\u00f3rio pode levar minutos ou horas. No chat tradicional, voc\u00ea fica olhando cursor piscar. No Pizza Bot, voc\u00ea dispara e vai fazer outra coisa.<\/p>\n<p>O segundo caso \u00e9 o que muda a arquitetura: aprova\u00e7\u00e3o dur\u00e1vel. Um agente que faz commit, envia email, ou executa comando no shell pode ser configurado para parar antes da a\u00e7\u00e3o. A thread fica em Action com o input proposto. Voc\u00ea aprova, edita ou nega. Essa \u00e9 uma diferen\u00e7a real em rela\u00e7\u00e3o a chat, onde &#8220;quer que eu fa\u00e7a?&#8221; \u00e9 uma pergunta que voc\u00ea precisa estar olhando pra responder.<\/p>\n<p>No StartAtende, meu agente de suporte no WhatsApp, esse padr\u00e3o j\u00e1 aparece em vers\u00e3o mais simples: certas a\u00e7\u00f5es ficam pendentes de uma decis\u00e3o humana antes de virarem efeito no sistema. A diferen\u00e7a de arquitetura pra algo como o Pizza Bot \u00e9 que l\u00e1 a pausa \u00e9 um estado de neg\u00f3cio no banco, aqui \u00e9 um checkpoint do runtime do agente. S\u00e3o camadas diferentes de estado com objetivos parecidos.<\/p>\n<p>Um exemplo m\u00ednimo do formato de uma skill, direto da documenta\u00e7\u00e3o:<\/p>\n<pre><code>---\nname: release-check\ndescription: Check release readiness and report blockers.\ntools:\n - mcp:release-tools:check_release\n---\n1. Run the release check.\n2. Report blockers.<\/code><\/pre>\n<p>Pizza Bot \u00e9 o agente de conversa; cada skill habilitada e pronta vira um worker com escopo de ferramentas que o Pizza Bot pode invocar atrav\u00e9s do task tool. O nome e a descri\u00e7\u00e3o da skill guiam o roteamento, o corpo do SKILL.md fornece as instru\u00e7\u00f5es do worker, e suas ferramentas declaradas definem a superf\u00edcie completa de ferramentas. Skills de usu\u00e1rio ficam em PIZZA_DATA_ROOT\/skills\/id\/SKILL.md. Traduzindo: skill \u00e9 markdown com frontmatter. O agente principal v\u00ea a skill como uma ferramenta cham\u00e1vel, sem enxergar o que acontece dentro dela.<\/p>\n<h2>Onde quebra<\/h2>\n<p>Alguns limites que ficam claros lendo a documenta\u00e7\u00e3o com aten\u00e7\u00e3o.<\/p>\n<p><strong>Se o api-server cai, tudo pausa.<\/strong> Se o servidor sobe pelo desktop e \u00e9 parado, o processo atual e as execu\u00e7\u00f5es ativas param junto; o estado com checkpoint permite retomar do workflow persistido em vez de perder a thread inteira. Para trabalho agendado confi\u00e1vel, o backend precisa continuar dispon\u00edvel. Retomar n\u00e3o \u00e9 o mesmo que continuar. Se a execu\u00e7\u00e3o dependia de uma janela de tempo, ela j\u00e1 passou.<\/p>\n<p><strong>Um data root, um backend por vez.<\/strong> Cada diret\u00f3rio de dados SQLite suporta um processo de backend, um detalhe que importa ao configurar o armazenamento e o runtime da aplica\u00e7\u00e3o. Se voc\u00ea quiser rodar duas inst\u00e2ncias, precisa de dois PIZZA_DATA_ROOT.<\/p>\n<p><strong>Plugins e MCP rodam com sua permiss\u00e3o de usu\u00e1rio.<\/strong> Isso significa que uma skill mal escrita, ou um servidor MCP n\u00e3o confi\u00e1vel, tem o mesmo alcance no sistema que voc\u00ea. O README \u00e9 expl\u00edcito em avisar isso e limitar acesso a arquivos por default a pastas explicitamente concedidas, mas o custo de seguran\u00e7a fica com quem instala.<\/p>\n<p><strong>DeepAgents \u00e9 opinativo.<\/strong> Se seu caso n\u00e3o encaixa em planejar-delegar-atualizar, voc\u00ea paga o custo cognitivo do harness sem colher o benef\u00edcio. Escolha Deep Agents quando quiser construir um agente aut\u00f4nomo para lidar com tarefas complexas, n\u00e3o determin\u00edsticas e de longa dura\u00e7\u00e3o. Escolha LangGraph quando quiser controle de baixo n\u00edvel para construir workflows e agentes stateful e de longa dura\u00e7\u00e3o.<\/p>\n<p>Nos livros que escrevi, entre eles a s\u00e9rie IA na Pr\u00e1tica, um padr\u00e3o repete: harness resolve 80% dos casos com uma escolha de arquitetura embutida, e cobrar caro nos 20% em que a escolha n\u00e3o serve. DeepAgents n\u00e3o foge disso.<\/p>\n<h2>O que n\u00e3o d\u00e1 para afirmar ainda<\/h2>\n<p>O Pizza Bot foi anunciado em setembro de 2026 e a vers\u00e3o p\u00fablica \u00e9 recente. Algumas perguntas n\u00e3o ficam respondidas s\u00f3 lendo o README e os posts de an\u00fancio.<\/p>\n<ul>\n<li><strong>Escala real de threads simult\u00e2neas.<\/strong> N\u00e3o vi n\u00famero publicado de quantas execu\u00e7\u00f5es concorrentes o api-server aguenta antes de o SQLite virar gargalo de escrita.<\/li>\n<li><strong>Custo por thread longa.<\/strong> Como o estado inteiro \u00e9 reserializado a cada checkpoint, threads com muitos passos e muito contexto podem inflar o banco. A documenta\u00e7\u00e3o n\u00e3o publica um perfil de crescimento.<\/li>\n<li><strong>Comportamento em modelos locais.<\/strong> A lista suporta Ollama, mas o DeepAgents depende de tool calling confi\u00e1vel. Em modelos menores rodando local, isso \u00e9 onde as coisas costumam falhar em sil\u00eancio. N\u00e3o testei.<\/li>\n<\/ul>\n<h2>Como testar isso voc\u00ea mesmo<\/h2>\n<p>Um caminho pequeno para experimentar, na ordem em que a documenta\u00e7\u00e3o recomenda:<\/p>\n<ol>\n<li>Instale Node.js 24 ou superior.<\/li>\n<li>Clone o reposit\u00f3rio e rode <code>npm install<\/code>, <code>npm run build<\/code>, <code>npm run dev<\/code>. O comando de dev sobe o frontend Vite e o Electron, que por sua vez sobe o api-server local.<\/li>\n<li>Em Settings &gt; Providers, configure um provider. Se voc\u00ea j\u00e1 tem chave da Anthropic ou OpenAI, \u00e9 o caminho mais curto. Se quer testar 100% local, configure Ollama com um modelo que suporte tool calling bem.<\/li>\n<li>Dispare uma tarefa que for\u00e7a planejamento, tipo &#8220;fa\u00e7a um resumo comparando tr\u00eas artigos sobre X e me pergunte antes de salvar arquivo&#8221;. Fecha a janela e reabre em outro momento. Observa se a thread aparece em Action.<\/li>\n<li>Escreve uma skill m\u00ednima em <code>PIZZA_DATA_ROOT\/skills\/minha-skill\/SKILL.md<\/code> com o formato do exemplo acima e observa ela aparecer como worker deleg\u00e1vel.<\/li>\n<\/ol>\n<p>Isso \u00e9 o suficiente para ver o ciclo checkpoint, interrupt e resume acontecendo. Depois disso, a decis\u00e3o de usar em produ\u00e7\u00e3o passa por quest\u00f5es que s\u00f3 seu caso responde: seguran\u00e7a de MCP, toler\u00e2ncia a servidor caindo, custo de rodar um backend sempre ligado.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como o Pizza Bot, projeto open source da Amazon, utiliza DeepAgents e LangGraph para manter agentes de IA ativos em background e retornar resultados como email.<\/p>\n","protected":false},"author":2,"featured_media":724,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-725","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/725","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/comments?post=725"}],"version-history":[{"count":0,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/725\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media\/724"}],"wp:attachment":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media?parent=725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/categories?post=725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/tags?post=725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}