{"id":1082,"date":"2026-08-07T14:01:12","date_gmt":"2026-08-07T17:01:12","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/agentes-de-ia-fluxo-de-trabalho-delegacao-real\/"},"modified":"2026-08-07T14:01:16","modified_gmt":"2026-08-07T17:01:16","slug":"agentes-de-ia-fluxo-de-trabalho-delegacao-real","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/agentes-de-ia-fluxo-de-trabalho-delegacao-real\/","title":{"rendered":"Agentes de IA no Fluxo de Trabalho: Da Tarefa Isolada \u00e0 Delega\u00e7\u00e3o Real"},"content":{"rendered":"<p>Voc\u00ea abre o terminal, cola um trecho de erro no chat da IA, recebe uma sugest\u00e3o, copia, cola no editor, testa, n\u00e3o funciona, volta para o chat, explica o que aconteceu, recebe outra sugest\u00e3o, testa de novo. Esse ciclo se repete cinco, dez, quinze vezes at\u00e9 o problema ser resolvido. Enquanto isso, voc\u00ea \u00e9 o mensageiro: copia contexto de um lado, cola no outro, executa comandos manualmente, interpreta resultados e decide o pr\u00f3ximo passo. A IA pensa, mas voc\u00ea faz todo o trabalho bra\u00e7al de transporte de informa\u00e7\u00e3o.<\/p>\n<p>Esse padr\u00e3o funciona, mas tem um limite claro: ele escala mal. Quanto mais complexa a tarefa \u2014 uma refatora\u00e7\u00e3o que toca dez arquivos, uma investiga\u00e7\u00e3o de bug que exige rodar testes repetidamente, uma migra\u00e7\u00e3o que precisa ler documenta\u00e7\u00e3o externa \u2014 mais tempo voc\u00ea gasta sendo o intermedi\u00e1rio entre a IA e o seu ambiente. \u00c9 exatamente esse gargalo que os agentes de IA para desenvolvimento resolvem, e \u00e9 por isso que vale entender como eles funcionam antes de simplesmente instalar mais uma ferramenta na sua stack.<\/p>\n<h2>O que muda quando a IA vira um agente<\/h2>\n<p>A diferen\u00e7a entre um assistente de chat e um agente n\u00e3o est\u00e1 no modelo de linguagem por tr\u00e1s \u2014 muitas vezes \u00e9 o mesmo modelo. A diferen\u00e7a est\u00e1 na <strong>arquitetura em volta dele<\/strong>. Um chat responde ao que voc\u00ea pergunta. Um agente executa um ciclo cont\u00ednuo de percep\u00e7\u00e3o, decis\u00e3o e a\u00e7\u00e3o at\u00e9 atingir um objetivo, sem que voc\u00ea precise mediar cada etapa.<\/p>\n<p>Esse ciclo costuma ser descrito como um loop de <em>observar, pensar, agir<\/em>:<\/p>\n<ul>\n<li><strong>Observar:<\/strong> o agente l\u00ea o estado atual \u2014 o conte\u00fado de um arquivo, a sa\u00edda de um comando, o resultado de uma busca.<\/li>\n<li><strong>Pensar:<\/strong> com base nessa observa\u00e7\u00e3o e no objetivo definido, o modelo decide qual a\u00e7\u00e3o tomar em seguida.<\/li>\n<li><strong>Agir:<\/strong> o agente executa a a\u00e7\u00e3o escolhida \u2014 editar um arquivo, rodar um teste, consultar uma API \u2014 e o resultado dessa a\u00e7\u00e3o vira a pr\u00f3xima observa\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Esse padr\u00e3o tem nome na literatura de IA: <strong>ReAct<\/strong> (Reasoning + Acting), descrito no artigo acad\u00eamico que popularizou a t\u00e9cnica de intercalar racioc\u00ednio e a\u00e7\u00e3o em modelos de linguagem.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> Se quiser entender a base te\u00f3rica por tr\u00e1s dos agentes modernos, vale ler o paper original do ReAct: <a href=\"https:\/\/arxiv.org\/abs\/2210.03629\" target=\"_blank\" rel=\"noopener\">&#8220;ReAct: Synergizing Reasoning and Acting in Language Models&#8221;<\/a> (Yao et al., 2022). \u00c9 a funda\u00e7\u00e3o conceitual usada, com varia\u00e7\u00f5es, por praticamente todas as ferramentas de agentes que voc\u00ea vai encontrar hoje.<\/p><\/blockquote>\n<h2>Agente n\u00e3o \u00e9 m\u00e1gica: \u00e9 modelo + ferramentas + loop<\/h2>\n<p>Um erro comum \u00e9 achar que um agente \u00e9 um modelo de IA &#8220;mais esperto&#8221;. Na pr\u00e1tica, um agente \u00e9 a combina\u00e7\u00e3o de tr\u00eas pe\u00e7as:<\/p>\n<ol>\n<li><strong>Um modelo de linguagem<\/strong> capaz de raciocinar sobre tarefas e decidir pr\u00f3ximos passos.<\/li>\n<li><strong>Um conjunto de ferramentas<\/strong> que o modelo pode invocar \u2014 ler arquivos, executar comandos de shell, fazer chamadas HTTP, consultar um banco de dados.<\/li>\n<li><strong>Um orquestrador<\/strong> que gerencia o loop, controla limites (quantas itera\u00e7\u00f5es, quanto tempo, quanto custo) e decide quando parar.<\/li>\n<\/ol>\n<p>\u00c9 essa composi\u00e7\u00e3o que faz a diferen\u00e7a entre pedir &#8220;corrija esse bug&#8221; no chat e pedir a mesma coisa a um agente com acesso ao seu reposit\u00f3rio. No chat, voc\u00ea descreve o bug, recebe uma hip\u00f3tese e testa manualmente. No agente, ele l\u00ea o c\u00f3digo, roda os testes, interpreta a falha, prop\u00f5e uma corre\u00e7\u00e3o, roda os testes de novo \u2014 tudo isso sem que voc\u00ea precise ficar copiando e colando.<\/p>\n<h3>Exemplo pr\u00e1tico: um agente simples com Claude e execu\u00e7\u00e3o de comandos<\/h3>\n<p>Para tornar isso concreto, veja um exemplo minimalista de agente constru\u00eddo com a API da Anthropic e a t\u00e9cnica de <em>tool use<\/em> (uso de ferramentas), que \u00e9 o mecanismo que permite ao modelo &#8220;pedir&#8221; para executar uma a\u00e7\u00e3o no seu ambiente.<\/p>\n<pre><code class=\"language-python\">import subprocess\nfrom anthropic import Anthropic\n\nclient = Anthropic()\n\ndef run_shell_command(command: str) -&gt; str:\n    \"\"\"Executa um comando de shell e retorna a sa\u00edda.\"\"\"\n    result = subprocess.run(\n        command, shell=True, capture_output=True, text=True, timeout=30\n    )\n    return result.stdout + result.stderr\n\ntools = [\n    {\n        \"name\": \"run_shell_command\",\n        \"description\": \"Executa um comando no terminal e retorna a sa\u00edda.\",\n        \"input_schema\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"command\": {\"type\": \"string\", \"description\": \"Comando a executar\"}\n            },\n            \"required\": [\"command\"],\n        },\n    }\n]\n\nmessages = [\n    {\n        \"role\": \"user\",\n        \"content\": \"Rode a su\u00edte de testes do projeto e me diga quais falharam.\"\n    }\n]\n\nresponse = client.messages.create(\n    model=\"claude-sonnet-4-5\",\n    max_tokens=1024,\n    tools=tools,\n    messages=messages,\n)\n\n# Loop simplificado: enquanto o modelo pedir para usar uma ferramenta, execute e devolva o resultado\nwhile response.stop_reason == \"tool_use\":\n    tool_call = next(b for b in response.content if b.type == \"tool_use\")\n    output = run_shell_command(tool_call.input[\"command\"])\n\n    messages.append({\"role\": \"assistant\", \"content\": response.content})\n    messages.append({\n        \"role\": \"user\",\n        \"content\": [{\n            \"type\": \"tool_result\",\n            \"tool_use_id\": tool_call.id,\n            \"content\": output,\n        }],\n    })\n\n    response = client.messages.create(\n        model=\"claude-sonnet-4-5\",\n        max_tokens=1024,\n        tools=tools,\n        messages=messages,\n    )\n\nprint(response.content[0].text)\n<\/code><\/pre>\n<p>Esse c\u00f3digo ilustra o essencial: o modelo recebe uma instru\u00e7\u00e3o, decide que precisa executar um comando, o programa executa esse comando de verdade e devolve o resultado, e o modelo continua raciocinando com base nisso \u2014 repetindo at\u00e9 ter uma resposta final. \u00c9 um agente rudimentar, mas j\u00e1 demonstra o loop observar-pensar-agir sem qualquer interven\u00e7\u00e3o manual sua no meio do processo.<\/p>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> A documenta\u00e7\u00e3o oficial da Anthropic sobre tool use explica em detalhes como estruturar ferramentas mais robustas, incluindo valida\u00e7\u00e3o de esquema e tratamento de erros: <a href=\"https:\/\/docs.claude.com\/en\/docs\/agents-and-tools\/tool-use\/overview\" target=\"_blank\" rel=\"noopener\">Tool use with Claude<\/a>.<\/p><\/blockquote>\n<h2>Ferramentas prontas: voc\u00ea n\u00e3o precisa construir tudo do zero<\/h2>\n<p>O exemplo acima \u00e9 did\u00e1tico, mas na pr\u00e1tica voc\u00ea raramente vai construir um agente de execu\u00e7\u00e3o de c\u00f3digo do zero. Existem ferramentas maduras que j\u00e1 implementam esse loop, com gerenciamento de contexto, controle de permiss\u00f5es e integra\u00e7\u00e3o com o sistema de arquivos. Tr\u00eas exemplos relevantes para quem desenvolve:<\/p>\n<h3>Claude Code<\/h3>\n<p>O <a href=\"https:\/\/www.anthropic.com\/claude-code\" target=\"_blank\" rel=\"noopener\">Claude Code<\/a> \u00e9 um agente de linha de comando que opera diretamente no seu reposit\u00f3rio. Voc\u00ea d\u00e1 uma instru\u00e7\u00e3o em linguagem natural, e ele l\u00ea arquivos, executa comandos, roda testes e edita c\u00f3digo \u2014 tudo dentro de um loop aut\u00f4nomo com checkpoints de confirma\u00e7\u00e3o quando a a\u00e7\u00e3o \u00e9 sens\u00edvel (como sobrescrever um arquivo ou rodar um comando destrutivo).<\/p>\n<pre><code class=\"language-bash\"># Exemplo de uso no terminal\nclaude \"Encontre a causa da falha no teste test_payment_flow e corrija,\n        mantendo a cobertura de testes existente\"\n<\/code><\/pre>\n<h3>Aider<\/h3>\n<p>O <a href=\"https:\/\/aider.chat\/\" target=\"_blank\" rel=\"noopener\">Aider<\/a> \u00e9 um agente de c\u00f3digo aberto que funciona de forma parecida, com foco forte em integra\u00e7\u00e3o com Git \u2014 cada altera\u00e7\u00e3o proposta j\u00e1 vem acompanhada de um commit, o que facilita revisar e reverter mudan\u00e7as.<\/p>\n<h3>OpenAI Agents SDK<\/h3>\n<p>Para quem quer construir agentes customizados sem reinventar a orquestra\u00e7\u00e3o, o <a href=\"https:\/\/openai.github.io\/openai-agents-python\/\" target=\"_blank\" rel=\"noopener\">OpenAI Agents SDK<\/a> oferece abstra\u00e7\u00f5es prontas para definir agentes, ferramentas e handoffs entre m\u00faltiplos agentes especializados.<\/p>\n<h2>O papel cr\u00edtico das permiss\u00f5es e do sandboxing<\/h2>\n<p>Delegar execu\u00e7\u00e3o de comandos a um agente levanta uma quest\u00e3o que n\u00e3o pode ser tratada como detalhe: o que acontece se o agente decidir rodar <code>rm -rf<\/code> em um diret\u00f3rio errado, ou fazer um <code>git push --force<\/code> sem necessidade? A resposta correta n\u00e3o \u00e9 confiar cegamente, mas configurar limites expl\u00edcitos.<\/p>\n<p>As boas pr\u00e1ticas mais consolidadas hoje incluem:<\/p>\n<ul>\n<li><strong>Listas de permiss\u00e3o (allowlists):<\/strong> definir explicitamente quais comandos o agente pode executar sem confirma\u00e7\u00e3o, e quais exigem aprova\u00e7\u00e3o manual.<\/li>\n<li><strong>Execu\u00e7\u00e3o em ambiente isolado:<\/strong> rodar o agente dentro de um container ou m\u00e1quina virtual descart\u00e1vel, especialmente ao testar tarefas novas ou desconhecidas.<\/li>\n<li><strong>Controle de vers\u00e3o como rede de seguran\u00e7a:<\/strong> nunca deixar um agente operar em uma branch sem commits recentes \u2014 se algo der errado, reverter precisa ser trivial.<\/li>\n<li><strong>Limites de itera\u00e7\u00e3o e custo:<\/strong> agentes em loop podem consumir muitas chamadas de API rapidamente se n\u00e3o houver um teto definido.<\/li>\n<\/ul>\n<blockquote><p><strong>\ud83d\udca1 Dica do Mestre:<\/strong> O Claude Code documenta um modelo de permiss\u00f5es detalhado, incluindo modo de &#8220;confian\u00e7a total&#8221; e listas de comandos aprovados previamente. Vale a leitura antes de rodar um agente em um reposit\u00f3rio de produ\u00e7\u00e3o: <a href=\"https:\/\/docs.claude.com\/en\/docs\/claude-code\/security\" target=\"_blank\" rel=\"noopener\">Claude Code \u2014 Security<\/a>.<\/p><\/blockquote>\n<h2>Come\u00e7ando pequeno: um roteiro pr\u00e1tico para os primeiros passos<\/h2>\n<p>Se voc\u00ea nunca delegou uma tarefa real a um agente, o caminho mais seguro n\u00e3o \u00e9 come\u00e7ar por uma refatora\u00e7\u00e3o ampla em um projeto cr\u00edtico. Um roteiro que funciona bem na pr\u00e1tica:<\/p>\n<h3>1. Escolha uma tarefa de escopo bem definido<\/h3>\n<p>Tarefas boas para come\u00e7ar: &#8220;adicione testes unit\u00e1rios para esta fun\u00e7\u00e3o&#8221;, &#8220;corrija este bug espec\u00edfico com stack trace conhecido&#8221;, &#8220;atualize esta depend\u00eancia e ajuste o c\u00f3digo quebrado por breaking changes&#8221;. Evite, no in\u00edcio, pedidos vagos como &#8220;melhore a performance do sistema&#8221;.<\/p>\n<h3>2. Trabalhe em uma branch isolada<\/h3>\n<pre><code class=\"language-bash\">git checkout -b experimento\/agente-testes\n<\/code><\/pre>\n<h3>3. Defina o objetivo com clareza e forne\u00e7a contexto suficiente<\/h3>\n<p>Um agente decide melhor quando tem acesso a informa\u00e7\u00e3o relevante: arquivos de configura\u00e7\u00e3o, conven\u00e7\u00f5es do projeto, exemplos de c\u00f3digo j\u00e1 existentes. Ferramentas como Claude Code permitem manter um arquivo <code>CLAUDE.md<\/code> na raiz do projeto justamente para isso \u2014 um contexto persistente que o agente l\u00ea antes de agir.<\/p>\n<pre><code class=\"language-markdown\"># CLAUDE.md\n\n## Conven\u00e7\u00f5es do projeto\n- Testes usam pytest, arquivos em `tests\/`, nomeados `test_*.py`\n- Sempre rodar `make lint` antes de considerar uma tarefa conclu\u00edda\n- N\u00e3o modificar arquivos em `legacy\/` sem confirma\u00e7\u00e3o expl\u00edcita\n<\/code><\/pre>\n<h3>4. Acompanhe a execu\u00e7\u00e3o, n\u00e3o delegue e esque\u00e7a<\/h3>\n<p>Nos primeiros usos, observe o agente trabalhando. Entenda quais decis\u00f5es ele toma, onde erra, onde acerta. Essa observa\u00e7\u00e3o \u00e9 o que constr\u00f3i a sua calibragem de confian\u00e7a \u2014 saber quando um agente pode operar com mais autonomia e quando exige supervis\u00e3o pr\u00f3xima.<\/p>\n<h3>5. Revise o resultado como revisaria um pull request de um colega<\/h3>\n<p>C\u00f3digo gerado por agente merece o mesmo rigor de revis\u00e3o que c\u00f3digo escrito por qualquer desenvolvedor da equipe \u2014 nem mais toler\u00e2ncia, nem menos.<\/p>\n<h2>Onde os agentes fazem mais diferen\u00e7a no dia a dia<\/h2>\n<p>Depois de superar a curva inicial, os casos de uso onde agentes trazem ganho real e consistente costumam ser:<\/p>\n<ul>\n<li><strong>Investiga\u00e7\u00e3o de bugs com m\u00faltiplas hip\u00f3teses:<\/strong> o agente pode testar v\u00e1rias hip\u00f3teses em sequ\u00eancia, rodando testes a cada tentativa, sem que voc\u00ea precise ficar alternando entre editor e terminal.<\/li>\n<li><strong>Migra\u00e7\u00f5es e upgrades de depend\u00eancias:<\/strong> tarefas mec\u00e2nicas, mas espalhadas por muitos arquivos, onde o agente aplica o mesmo padr\u00e3o de corre\u00e7\u00e3o repetidamente.<\/li>\n<li><strong>Gera\u00e7\u00e3o de cobertura de testes:<\/strong> mapear fun\u00e7\u00f5es sem testes e gerar casos de teste iniciais, que depois voc\u00ea refina.<\/li>\n<li><strong>Explora\u00e7\u00e3o de c\u00f3digo legado:<\/strong> pedir ao agente para mapear depend\u00eancias e fluxo de um m\u00f3dulo antigo antes de voc\u00ea mergulhar em uma mudan\u00e7a arriscada.<\/li>\n<\/ul>\n<h2>Junte-se \u00e0 Comunidade Dev&#8217;s AI<\/h2>\n<p>Entender a teoria por tr\u00e1s dos agentes \u00e9 o primeiro passo, mas a maturidade real vem da pr\u00e1tica compartilhada: ver como outros desenvolvedores configuram permiss\u00f5es, quais tarefas realmente valem a delega\u00e7\u00e3o e quais armadilhas evitar. Na <a href=\"https:\/\/adrianosantos.link\/ComunidadeDevAI\" target=\"_blank\" rel=\"noopener\">Comunidade Dev&#8217;s AI<\/a> discutimos casos reais de uso de agentes \u2014 Claude Code, Aider, integra\u00e7\u00f5es via MCP e muito mais \u2014 com desenvolvedores de diferentes linguagens e contextos trocando experi\u00eancia pr\u00e1tica, n\u00e3o apenas teoria de artigo. Se voc\u00ea est\u00e1 come\u00e7ando com agentes ou j\u00e1 usa e quer refinar seu fluxo, esse \u00e9 o lugar para acelerar essa curva de aprendizado.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>A passagem de &#8220;IA como assistente de chat&#8221; para &#8220;IA como agente aut\u00f4nomo&#8221; n\u00e3o \u00e9 apenas uma evolu\u00e7\u00e3o de ferramenta \u2014 \u00e9 uma mudan\u00e7a de papel no seu fluxo de trabalho. Voc\u00ea deixa de ser o mensageiro que carrega contexto de um lado para outro e passa a ser o revisor e definidor de escopo, enquanto o agente executa o trabalho repetitivo de observar, decidir e agir dentro dos limites que voc\u00ea estabeleceu.<\/p>\n<p>Os primeiros passos exigem cautela: comece com tarefas pequenas, trabalhe em ambientes isolados, configure permiss\u00f5es expl\u00edcitas e observe antes de confiar. Mas o investimento em aprender esse modelo de trabalho compensa rapidamente \u2014 porque a diferen\u00e7a entre pedir ajuda \u00e0 IA e delegar uma tarefa completa a ela \u00e9, na pr\u00e1tica, a diferen\u00e7a entre economizar minutos e economizar horas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea abre o terminal, cola um trecho de erro no chat da IA, recebe uma sugest\u00e3o, copia, cola no editor, testa, n\u00e3o funciona, volta para o chat, explica o que aconteceu, recebe outra sugest\u00e3o, testa de novo. Esse ciclo se repete cinco, dez, quinze vezes at\u00e9 o problema ser resolvido. Enquanto isso, voc\u00ea \u00e9 o [&hellip;]<\/p>\n","protected":false},"author":127,"featured_media":1083,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1082","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1082","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/127"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1082"}],"version-history":[{"count":1,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1082\/revisions"}],"predecessor-version":[{"id":1084,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/1082\/revisions\/1084"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/1083"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}