00:00:00Uma das formas mais simples de tornar seus agentes de IA mais poderosos é dando a eles
00:00:03acesso ao Bash, mas isso pode ser um pouco complexo. Você precisa de um shell real, de um sistema de arquivos,
00:00:09servidores e containers e, no geral, de muita infraestrutura — ou pelo menos precisava.
00:00:13E se eu te dissesse que existe um jeito mais simples? Você pode usar uma implementação em TypeScript
00:00:18do Bash. Eu sei que parece loucura, mas acredite, isso é fantástico
00:00:22e pode até te economizar dinheiro. Deixa eu te mostrar como.
00:00:30Este é um novo pacote chamado justbash e você pode ver no README que ele diz: “Ambiente Bash
00:00:34simulado com um sistema de arquivos virtual em memória escrito em TypeScript. Isso foi
00:00:38projetado para agentes de IA que precisam de um ambiente Bash seguro e isolado.”
00:00:42Mas antes de mostrar como conectar isso aos seus agentes de IA para dar a eles
00:00:45mais capacidades, quero mostrar um código bem simples para você entender o contexto
00:00:48de como isso funciona. Aqui estou iniciando um novo ambiente Bash do pacote justbash
00:00:53e, dentro dele, podemos rodar nossos comandos Bash. Estamos usando env.exec e aqui eu simplesmente
00:00:57rodo o comando Bash “echo hello” e digo que quero salvar isso em um arquivo chamado
00:01:01greeting.txt. Na linha seguinte, rodo o exec novamente no mesmo ambiente dizendo
00:01:06que agora quero ler esse arquivo greeting.txt. E veja que podemos registrar a
00:01:10saída padrão do resultado, o código de saída e também as variáveis de ambiente,
00:01:14e quando eu rodo isso, você vê que ele conseguiu gravar o arquivo e também
00:01:18lê-lo. Temos um código de saída zero e as variáveis de ambiente no nosso shell Bash simulado.
00:01:22O importante aqui é lembrar que, como eu disse, este é apenas um shell Bash simulado,
00:01:26literalmente uma versão desses comandos Bash escrita em TypeScript.
00:01:30Portanto, não está ligado a nenhum shell real, ele apenas converte o comando que damos
00:01:34em TypeScript e o executa. Esse arquivo chamado greeting.txt
00:01:39não existe em nenhum sistema de arquivos físico, está em um sistema virtual em memória, embora existam
00:01:44opções se você quiser conectar um real. Uma forma simples de pensar no que
00:01:47ele faz é: ele pega o comando Bash que escrevemos dentro da função exec
00:01:51e o converte em uma função JavaScript que ele executa, o que significa que não
00:01:55precisa de um shell real, e podemos ver isso no código-fonte. Quando coloco “echo” dentro
00:01:59do exec, ele está rodando esta função JavaScript, que simplesmente tem a lógica
00:02:03para processar as flags que o comando echo tem no Bash e transformá-las em JavaScript,
00:02:08imprimindo a saída do que colocamos após o echo. Você pode ver
00:02:11aqui embaixo que ele retorna um objeto com a saída padrão em JavaScript, o erro padrão e o código de saída.
00:02:15E se você acha que ele não consegue lidar com o básico do Bash, veja esta lista de todos os
00:02:19comandos suportados. Ele tem muitos: coisas como cat, copy, awk,
00:02:23base64, e até comandos avançados para processamento de dados como jq, python 3 e sqlite.
00:02:27Você pode até fazer requisições de rede usando curl. Você configura uma lista de permissões para que
00:02:33seja seguro, e também há recursos de shell aqui embaixo, como pipes, redirecionamentos,
00:02:36encadeamento de comandos... ele realmente oferece tudo o que um shell Bash básico ofereceria.
00:02:41O pacote é incrível e tem muita funcionalidade, mas você provavelmente ainda
00:02:45está se perguntando por que iria querer uma implementação de Bash em TypeScript, como isso ajuda seus agentes
00:02:48e como economiza dinheiro.
00:02:53Para responder a isso, deixe-me mostrar um caso de uso com um app de chat bem simples. Digamos que
00:02:57neste app eu quisesse falar sobre este arquivo JSON. Ele contém milhares de registros e digamos
00:03:02que eu peça para a IA recuperar certas informações ou talvez fazer uma análise em alguns campos.
00:03:06Como você pode ver, é um arquivo enorme. Uma das formas mais simples, mas definitivamente errada de fazer
00:03:11isso, seria pegar o conteúdo do arquivo inteiro e colocar dentro do prompt. Veja que estou
00:03:15usando o AI SDK e o GPT-4o. Se rodarmos esse agente e
00:03:19pedirmos para buscar um registro específico, o assistente vai responder e eu
00:03:24posso confirmar que está correto, pois modelos maiores são bons em recuperar valores de contextos grandes.
00:03:28O problema é que isso consumiu 133 mil tokens e também começaria a
00:03:33falhar se você fizesse perguntas mais avançadas, como manipulação de dados
00:03:39ou consultas sobre dados em certos intervalos. Mas como eu disse, esse é o jeito errado.
00:03:43A outra forma que você talvez já tenha tentado é usar RAG ou até
00:03:48dar ao agente um sandbox para ele rodar comandos Bash e manipular os dados,
00:03:51mas a dificuldade com essas abordagens é que você começa a precisar de muita infraestrutura.
00:03:56Em vez disso, vamos simular isso com o justbash. Para fazer isso com o AI SDK, você pode usar o
00:04:00pacote bash-tool, que é construído sobre o justbash, e o que ele nos permite
00:04:05fazer é: no nosso endpoint da API para o chat, podemos criar uma nova ferramenta Bash,
00:04:09passar os arquivos que queremos no nosso ambiente simulado — no meu caso,
00:04:13estou passando aquele arquivo JSON gigante de antes — e então defino o destino
00:04:17para onde esses arquivos vão, que será um diretório simulado “/workspace”.
00:04:21Depois disso, tudo o que precisamos fazer no stream do nosso AI SDK é passá-lo
00:04:26pela ferramenta Bash que temos. Além disso, passei algumas
00:04:31instruções para o agente que você encontra na pasta node_modules. São apenas instruções
00:04:34fornecidas pelo pacote para ajudar seu agente de IA a entender como usar a ferramenta Bash.
00:04:39Agora, com essa configuração simples, se pedirmos ao assistente exatamente a mesma coisa,
00:04:42para buscar uma informação daquele arquivo JSON, em vez de usar o próprio contexto
00:04:46e precisar procurar uma agulha num palheiro, veja que ele executa comandos Bash.
00:04:50Lembrando: isso ocorre no nosso ambiente simulado em TypeScript. Neste caso,
00:04:54ele tentou rodar um comando jq, mas parece que deu erro, então em seguida ele
00:04:58rodou um comando head para ver como o arquivo era e assim conseguir o formato correto para o jq
00:05:02e nos dar a resposta. Sim, embora tenhamos a mesma resposta e talvez tenha levado
00:05:06um pouco mais de tempo, o ponto chave é que ele usou apenas 6 mil tokens de entrada,
00:05:10enquanto o outro método usou 133 mil. Este é um método muito melhor para lidar com contextos longos.
00:05:15E essa não é a única vantagem. Ele se torna muito mais poderoso quando você faz perguntas
00:05:19mais profundas sobre seus dados. Por exemplo, se eu perguntar quantos registros entre
00:05:241000 e 2500 têm “metadata.active” como verdadeiro, ele simplesmente executa um comando Bash
00:05:28e nos dá a resposta na hora. Se você tentasse isso na outra versão, primeiro consumiria
00:05:33muito contexto e, segundo, provavelmente daria uma resposta errada baseada em estimativa.
00:05:37mesmo que tecnicamente ele não tenha. Sinceramente, é um valor agregado gratuito e simples
00:05:41tried this in the other version a it would take up a lot of context and b it probably
00:05:45para tornar seus agentes mais potentes sem necessidade de infraestrutura adicional. E é
00:05:49isso que eu adoro nele. Espero ter mostrado apenas um dos casos de uso, mas acredite,
00:05:53existem muitos outros. Como vimos antes, você tem comandos básicos de Python, SQL e Curl
00:05:57funcionando aqui e, se quiser, pode até conectá-lo a um sistema de arquivos real.
00:06:01Me diga o que achou do justbash nos comentários. Aproveite para se inscrever e,
00:06:05como sempre, nos vemos no próximo vídeo.
00:06:10commands working in here and if you wanted to you can actually attach this to a real file
00:06:14system let me know what you think of just bash in the comments below while you're there subscribe
00:06:18and as always see you in the next one