00:00:00A maioria de vocês já conhece o shad cn como uma das bibliotecas de interface mais usadas,
00:00:04mas usar um agente de IA para desenvolver com ela pode ser problemático.
00:00:07Se você está construindo páginas de destino simples,
00:00:10não terá grandes problemas,
00:00:11mas se está desenvolvendo um novo aplicativo ou implementando uma nova funcionalidade,
00:00:15as coisas quebram e quebram outras partes do aplicativo também.
00:00:18Mas isso não é novidade,
00:00:19esse problema já foi resolvido e é assim que os engenheiros constroem aplicativos atualmente.
00:00:23Os agentes de IA sempre testam o código que escrevem,
00:00:26mas esses agentes se tornam não confiáveis com contextos grandes.
00:00:29Portanto,
00:00:29precisamos de uma forma de garantir que os agentes completem o trabalho que lhes é dado.
00:00:33É aqui que entra o conceito de loops agênticos,
00:00:36e a Anthropic resolve isso usando o loop ralph.
00:00:38Para resolver meu problema de interface,
00:00:40tentei implementar o loop ralph e no início falhou completamente,
00:00:43mas logo aprendi que não era por causa do loop ralph,
00:00:45era por causa do processo que eu havia implementado com ele.
00:00:48Então o ralph é na verdade um novo plugin que foi lançado pela própria Anthropic,
00:00:52mas essa não foi uma de suas ideias originais,
00:00:54é baseado em uma técnica de outra pessoa e a Anthropic implementou e disponibilizou como código aberto.
00:00:59Basicamente,
00:00:59ralph é um loop e se você conhece os hooks do claud code,
00:01:02ele usa esses hooks de parada que rodam quando o claud para de gerar uma resposta.
00:01:06Assim que para,
00:01:07o agente de IA recebe seu arquivo de prompt inicial novamente e isso permite que ele melhore seu trabalho iterativamente.
00:01:12Agora aqui está a pergunta importante: quando ele realmente sai do loop?
00:01:16Existe algo chamado promessa de conclusão que pode ser qualquer palavra que você inserir.
00:01:20Quando o claud sente que sua tarefa está concluída,
00:01:22ele emite essa promessa sozinho.
00:01:24Por exemplo, neste caso a promessa é a palavra complete.
00:01:26Se a promessa está no prompt de retorno,
00:01:28então o loop não roda novamente.
00:01:30Então até que o claud emita uma promessa, ele não para.
00:01:32Isso garante que o claud não desista quando quiser.
00:01:35Depois de instalar o plugin,
00:01:36você terá três comandos: o comando do loop ralph,
00:01:38um comando de cancelamento e um comando de ajuda.
00:01:41No comando do loop você precisa fornecer o prompt que é alimentado ao agente repetidamente.
00:01:45Às vezes ele pode receber uma tarefa impossível que não consegue resolver e pode ficar preso em um loop infinito,
00:01:50então definir uma contagem máxima de iterações é uma prática muito boa.
00:01:54Vou deixar o link para o repositório abaixo porque eles têm algumas boas práticas recomendadas para os prompts que você pode dar ao loop ralph,
00:02:00mas neste vídeo vou discutir apenas os relacionados ao fluxo de trabalho de interface que vou mostrar.
00:02:05Então digamos que queremos implementar dois recursos neste aplicativo.
00:02:08Um é uma paleta de comandos onde adicionamos um menu para pesquisar pelo nosso aplicativo e executar outros comandos.
00:02:14Para garantir que esse novo recurso não quebre outras partes do aplicativo,
00:02:17você começaria com os testes.
00:02:19Isso é chamado de desenvolvimento orientado a testes.
00:02:21Se você não está familiarizado com isso,
00:02:23pode pedir ao claud code para configurar a estrutura de TDD para você,
00:02:27onde ele cria uma pasta de testes ponta a ponta,
00:02:29uma pasta de capturas de tela para verificar problemas de interface e o teste correspondente também.
00:02:34O outro recurso que vamos implementar é uma visualização em quadro no banco de dados,
00:02:38semelhante ao que o Notion nos permite fazer com seus bancos de dados.
00:02:41Se você entendeu,
00:02:42desenvolvimento orientado a testes é uma abordagem onde os testes são escritos antes do código ser implementado,
00:02:47mas isso significa que os testes iniciais sempre falharão.
00:02:50Então se estou implementando o recurso da paleta de comandos,
00:02:53não começaria simplesmente escrevendo o código para ele.
00:02:55Em vez disso,
00:02:56primeiro escreveria testes elaborados para ele.
00:02:58Então escrevemos a quantidade mínima de código necessária para passar nesses testes.
00:03:02Quando isso está feito,
00:03:03refatoramos e adicionamos mais funcionalidades,
00:03:05e a cada adição garantimos que os testes ainda passem.
00:03:08Outra coisa interessante é que esses testes são automatizados e o playwright pode ser importado e usado para verificação visual.
00:03:14Se você pensa que estamos usando o MCP do playwright para verificar isso autonomamente através do navegador,
00:03:19está enganado.
00:03:19Com TDD,
00:03:20para cada comportamento funcional você pode tirar capturas de tela.
00:03:23Por exemplo,
00:03:24se o comportamento funcional é adicionar um cartão,
00:03:26então a captura de tela mostraria um cartão adicionado ao quadro.
00:03:29Então agora tudo que o agente de IA precisa fazer é olhar essas capturas de tela e garantir que não há problemas na forma como esses componentes shad cn foram implementados.
00:03:37Esses arquivos de teste garantem que sempre que algo novo é adicionado ou enquanto um recurso está sendo construído,
00:03:43todos os nossos requisitos comportamentais são atendidos.
00:03:45Mas no nosso caso queremos usar as capturas de tela puramente para verificação de interface.
00:03:50Mas se já temos TDD, por que precisamos do loop ralph?
00:03:52Como já mencionei,
00:03:53com tarefas maiores e janelas de contexto ficando quase cheias,
00:03:56esses modelos desistem abruptamente de suas tarefas e exigem entrada humana constante.
00:04:00Portanto,
00:04:00posso ter testes escritos antecipadamente para qualquer tipo de função que eu queira,
00:04:04então usar o loop para instruí-lo sobre o que fazer e ele pode trabalhar autonomamente,
00:04:08dizendo a ele qual fluxo de trabalho seguir e então dando a condição para quando ele pode emitir a promessa.
00:04:14Ele completa a tarefa e sai do loop,
00:04:15que neste caso é quando passa em todos os 25 testes únicos.
00:04:18Então usando o comando de barra ralph,
00:04:20dei a ele um prompt para que construísse iterativamente o recurso da paleta de comandos.
00:04:24No prompt estávamos basicamente dizendo para ele implementar o recurso junto com alguns requisitos básicos que não são realmente importantes porque os requisitos podem ser encontrados nos testes também,
00:04:33mas delineamos todo o fluxo de trabalho.
00:04:35Nesse fluxo de trabalho,
00:04:36ele deveria começar rodando os testes.
00:04:38Ele sabe que os testes vão falhar e depois disso precisa implementar os componentes para fazê-los passar.
00:04:43Então esse é o objetivo geral.
00:04:45Agora se essa fosse uma tarefa muito mais ampla,
00:04:47as chances são de que quando a janela de contexto encher ou o claud ficar confuso,
00:04:51ele desistirá automaticamente.
00:04:52Ele nunca emitirá a promessa de conclusão e como nunca emite a promessa,
00:04:55o prompt será alimentado de novo e ele terá que começar tudo de novo,
00:04:59o que significa que continuará trabalhando nisso iterativamente.
00:05:02Mas como essa era uma tarefa menor,
00:05:03ele foi capaz de implementar tudo de uma vez,
00:05:05escrever todos os componentes e fazer todos os testes passarem.
00:05:08Agora depois que os testes passam,
00:05:10o fluxo de trabalho diz a ele para revisar todas as capturas de tela da paleta de comandos.
00:05:14Estas são capturas de tela tiradas em diferentes estágios para garantir que a interface,
00:05:18seja shad cn ou qualquer outra biblioteca de componentes que você esteja usando,
00:05:22esteja implementada corretamente e que não haja problemas menores.
00:05:25Depois disso,
00:05:26ele deve rodar os testes novamente e garantir que ainda passem após as mudanças de interface.
00:05:30Como todos os testes estavam passando e as capturas de tela foram revisadas,
00:05:34ele emitiu a promessa de conclusão.
00:05:35É aqui que o loop parou e não continuou novamente.
00:05:38Mas havia um problema realmente grande com isso que eu não notei no recurso da paleta de comandos porque havia muito poucas chances de erros de interface.
00:05:45No entanto,
00:05:45quando passei a implementar a visualização em quadro,
00:05:48percebi que havia um erro enorme no sistema.
00:05:50Comecei implementando o quadro com o mesmo prompt.
00:05:52Os requisitos eram diferentes,
00:05:54claro,
00:05:54mas o fluxo de trabalho era praticamente o mesmo.
00:05:57Agora fiquei meio surpreso quando ele completou todos os requisitos de uma vez.
00:06:00Não me entenda mal,
00:06:01ele estava realmente garantindo que todos os testes estavam passando,
00:06:04mas enquanto fazia isso havia casos em que o número de testes bem-sucedidos na verdade diminuía porque ao mudar algo ele quebrava outra coisa e é por isso que TDD é realmente importante por causa desse teste recursivo e garantir que tudo funciona.
00:06:16Mas o principal problema era que depois que ele havia verificado que estava pronto e eu fui verificar a interface,
00:06:21a maioria das coisas estava implementada corretamente,
00:06:24mas ele havia perdido completamente alguns erros de interface como este.
00:06:27Também verifiquei as capturas de tela e os erros estavam aparecendo nessas capturas também.
00:06:31Então perguntei a ele e analisamos o que realmente deu errado.
00:06:34O problema real era uma falha de processo,
00:06:36especificamente em termos de corrigir a interface.
00:06:39O que aconteceu foi que ele passou em todos os testes porque deveria rodar os arquivos de teste repetidamente,
00:06:44mas não havia teste específico para a interface além das capturas de tela.
00:06:47Ele deu uma olhada rápida em algumas delas e até ignorou alguns dos erros de interface que havia visto.
00:06:52Alguns arquivos foram completamente ignorados.
00:06:54Então o principal problema era que ele emitiu sua declaração de promessa prematuramente e não verificou se a interface estava realmente corrigida.
00:07:01Passamos por toda uma sessão de brainstorming sobre como poderíamos corrigir isso e até dei as melhores práticas de escrita de prompt do repositório ao clod code,
00:07:09mas no final chegamos a algumas regras específicas e uma mudança no processo que garantiria que a interface estivesse sempre correta.
00:07:15Agora isso não tinha nada a ver com os testes porque eles sempre vão rodar.
00:07:18O prompt que usamos para a paleta de comandos é realmente útil quando o recurso ou implementação é muito grande,
00:07:24onde o clod não alucina que completou a tarefa,
00:07:26mas em vez disso devido a uma janela de contexto cheia ou à complexidade da tarefa,
00:07:30ele desiste abruptamente.
00:07:31Agora o clod code já é realmente autônomo,
00:07:33não há dúvida sobre isso,
00:07:34mas ainda há problemas como este que precisamos corrigir.
00:07:37Então mudamos várias coisas no prompt principal.
00:07:39A primeira foi o protocolo de verificação de capturas de tela.
00:07:42Adicionamos um prefixo simples a cada imagem que dizia ao clod se ele havia lido a captura de tela ou não.
00:07:47Mas quando implementei isso pela primeira vez,
00:07:49ele ainda não lia todas as imagens.
00:07:51Ele lia algumas,
00:07:52escrevia verified em cima delas e assim como antes desistia cedo.
00:07:55Então para resolver isso o encorajamos a pensar de uma forma diferente.
00:07:58Dissemos a ele que depois de renomear todas as capturas de tela,
00:08:01não deveria emitir a promessa ainda,
00:08:03ou seja,
00:08:03não deveria considerar a tarefa concluída e deveria deixar a próxima iteração confirmar a conclusão.
00:08:08Então pelo menos dois loops deveriam rodar.
00:08:10O que acontece na próxima verificação é que o clod verifica se todos os arquivos têm o prefixo verified.
00:08:15Claro que isso significava que tínhamos que mudar os testes e separar a verificação de imagem dos testes funcionais.
00:08:20A próxima iteração garante que todas as imagens tenham resultados verificados e se o clod perder alguma,
00:08:25ele olha para elas novamente e corrige a saída.
00:08:27Com essa mudança,
00:08:28os pequenos erros de interface que estávamos enfrentando finalmente foram corrigidos e ele foi capaz de implementar todos esses recursos corretamente.
00:08:35Então quando entrou no próximo loop,
00:08:37rodou os testes novamente.
00:08:38Como encontrou alguns erros,
00:08:39os corrigiu e porque todos os arquivos tinham a palavra verified neles,
00:08:43rodou um teste final.
00:08:44Desta vez completou sua tarefa em dois loops e foi capaz de corrigir todos os principais erros de interface no aplicativo.
00:08:49Vamos falar sobre a Automata agora.
00:08:51Depois de ensinar milhões de pessoas como construir com IA,
00:08:54começamos a implementar esses fluxos de trabalho nós mesmos.
00:08:57Descobrimos que podíamos construir produtos melhores mais rápido do que nunca.
00:09:00Ajudamos a dar vida às suas ideias,
00:09:02sejam aplicativos ou sites.
00:09:03Talvez você tenha assistido nossos vídeos pensando: tenho uma ótima ideia,
00:09:07mas não tenho uma equipe técnica para construí-la.
00:09:09É exatamente aí que entramos.
00:09:10Pense em nós como seu copiloto técnico.
00:09:12Aplicamos os mesmos fluxos de trabalho que ensinamos a milhões diretamente ao seu projeto,
00:09:16transformando conceitos em soluções reais e funcionais sem as dores de cabeça de contratar ou gerenciar uma equipe de desenvolvimento.
00:09:23Pronto para acelerar sua ideia em realidade?
00:09:25Entre em contato em hello@automata.dev.
00:09:27Se você quiser apoiar o canal e nos ajudar a continuar fazendo vídeos como este,
00:09:30pode fazê-lo usando o botão super thanks abaixo.
00:09:33Como sempre, obrigado por assistir e te vejo no próximo..