3 pontos por GN⁺ 2025-05-28 | 1 comentários | Compartilhar no WhatsApp
  • O LLM 0.26 adiciona vários recursos de execução de ferramentas, permitindo que diversos modelos de LLM, como OpenAI, Anthropic, Gemini e Ollama, usem ferramentas implementadas como funções Python ou plugins
  • É possível instalar ferramentas diretamente ou passá-las como funções pela linha de comando ou pela API Python, aumentando bastante a extensibilidade e a flexibilidade
  • Com plugins de ferramentas, fica fácil adicionar ao modelo recursos como cálculos matemáticos, execução de JavaScript, consultas SQL e integração com serviços externos
  • O padrão de chamada de ferramentas está se tornando comum entre todos os principais vendors de LLM e modelos locais, e o LLM 0.26 também o integra de forma padronizada
  • Como planos futuros e direção de evolução, estão sendo discutidos suporte ao padrão MCP, expansão do ecossistema de desenvolvimento de plugins e melhorias nos logs de execução de ferramentas

LLM 0.26: suporte à execução de ferramentas com grandes modelos de linguagem no terminal

Em 27 de maio de 2025, foi lançada a versão LLM 0.26. Esta é a maior mudança desde o início do projeto LLM, com a adição de suporte a ferramentas. Agora, diversos modelos de LLM, como OpenAI, Anthropic, Gemini e Ollama, podem ser conectados à ferramenta CLI e à biblioteca Python do LLM para acessar qualquer ferramenta que possa ser expressa como uma função Python.

Principais recursos e mudanças

  • Instalação e carregamento de ferramentas a partir de plugins: é possível registrar e usar ferramentas por meio de plugins instalados com a opção --tool/-T
  • Envio de código Python pela linha de comando: com a opção --functions, dá para passar diretamente código de funções Python para usar ferramentas
  • Suporte a ferramentas também na API Python: é fácil conectar ferramentas passando tools=[nome_da_função] ao método .chain
  • Suporte a contextos síncronos e assíncronos: chamadas de ferramentas funcionam tanto em cenários sync quanto async

Exemplos de uso de ferramentas

Preparação para uso

  1. É necessário instalar ou atualizar para a versão mais recente do LLM

  2. Registrar a chave de API, como a da OpenAI:

    llm keys set openai
    # inserir a chave da API
    
  3. Exemplo de execução da primeira ferramenta:

    llm --tool llm_version "What version?" --td
    
    • llm_version é uma ferramenta de demonstração simples fornecida por padrão
    • --td é a opção de saída de depuração da ferramenta, que permite verificar o processo de chamada e o conteúdo da resposta
  4. Troca de modelo:

    llm models default gpt-4.1-mini
    
    • Também há suporte a vários modelos por opção (-m o4-mini etc.)
  5. Chamada da ferramenta interna de horário:

    llm --tool llm_time "What time is it?" --td -m o4-mini
    
    • Exibe em detalhe informações de horário e fuso horário

Suporte a vários modelos e plugins

  • Funciona com a mesma interface de ferramentas em vários ambientes de modelos de LLM, como Anthropic Claude 4, Google Gemini 2.5 Flash e Ollama Qwen3:4b
  • Exemplo de comandos:
    llm install llm-anthropic -U
    llm keys set anthropic
    llm --tool llm_version "What version?" --td -m claude-4-sonnet
    

Operações matemáticas e execução de código

  • É possível superar as limitações dos LLMs em matemática usando ferramentas Python
  • O plugin llm-tools-simpleeval oferece suporte a operações aritméticas seguras
    llm install llm-tools-simpleeval
    llm -T simpleeval
    llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
    
    • Caso não haja suporte a sqrt(), é possível substituir por ** 0.5, garantindo flexibilidade na execução de código

Apresentação de plugins de ferramentas

  • [llm-tools-simpleeval]: cálculos aritméticos e expressões simples
  • [llm-tools-quickjs]: ferramenta de interpretador sandbox JavaScript com QuickJS
  • [llm-tools-sqlite]: consultas SQL somente leitura em bancos de dados SQLite locais
  • [llm-tools-datasette]: suporte à execução de consultas SQL em instâncias remotas do Datasette

Exemplo:

llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content";)' --td "What has the most stars?"
  • Como é um plugin em formato de toolbox, pode ser configurado com argumentos como URL
  • Quando uma coluna é especificada incorretamente, ocorre detecção de erro da ferramenta e nova tentativa → consulta do esquema → geração da consulta correta, demonstrando a capacidade adaptativa do LLM

Definição de ferramentas diretamente com código Python

  • Pela linha de comando, é possível passar funções Python arbitrárias com a opção --functions e transformá-las imediatamente em ferramentas
  • Exemplo:
    llm --functions '
    import httpx
    
    def search_blog(q):
        "Search Simon Willison blog"
        return httpx.get("https://simonwillison.net/search/";, params={"q": q}).content
    ' --td 'Three features of sqlite-utils' -s 'use Simon search'
    
    • Dá para implementar uma ferramenta simples de busca na web
    • É importante usar o system prompt para definir a direção de uso da ferramenta pelo modelo

Uso integrado com a biblioteca Python

  • O LLM oferece suporte tanto à CLI quanto à API Python
  • O método .chain() automatiza toda a sequência: detectar a solicitação de chamada de ferramenta → executar → refletir o resultado
  • Exemplo:
    import llm
    
    def count_char_in_text(char: str, text: str) -> int:
        "How many times does char appear in text?"
        return text.count(char)
    
    model = llm.get_model("gpt-4.1-mini")
    chain_response = model.chain(
        "Rs in strawberry?",
        tools=[count_char_in_text],
        after_call=print
    )
    for chunk in chain_response:
        print(chunk, end="", flush=True)
    
  • Também há suporte a funções assíncronas (async def), permitindo execução concorrente
  • Plugins do tipo toolbox também podem ser conectados diretamente no formato tools=[Datasette(...)]

Evolução do paradigma de ferramentas

  • O padrão de chamada de ferramentas foi apresentado em trabalhos como o artigo ReAcT de 2022 e, desde então, foi adotado por todos os principais vendors de LLM e modelos locais
  • Cada API usa nomes diferentes, como "Function calling" ou "uso de ferramentas", mas adotando uma forma unificada
  • Ollama, llama.cpp e outros já adicionaram suporte a ferramentas e seguem ampliando esses recursos

Bastidores de desenvolvimento e operação

  • Já havia o reconhecimento, há bastante tempo, de que o LLM precisava de suporte à integração com ferramentas, mas projetar uma camada de abstração entre diferentes modelos era difícil
  • À medida que a padronização dos padrões de ferramentas entre vendors avançou, tornou-se possível implementar essa integração unificada no LLM 0.26
  • O recurso foi demonstrado em casos de uso práticos durante um workshop na PyCon US 2025

Relação com “agentes”

  • O termo "agente" ainda gera debate, mas atualmente o ecossistema de LLM vem se padronizando no formato de "tool in the loop"
  • O LLM 0.26 também é uma implementação adequada para o desenvolvimento de agentes
  • Estão avançando ativamente templates para criação de plugins, issues de melhoria e documentação de plugins avançados

Suporte futuro ao Model Context Protocol (MCP)

  • O MCP está emergindo rapidamente como um novo protocolo padrão para acesso de LLMs a ferramentas
  • Nos últimos 8 dias, ele também vem sendo adotado rapidamente nas APIs de grandes vendors, como OpenAI, Anthropic e Mistral
  • O plano futuro é transformar o LLM em um cliente MCP para facilitar a integração com diversos servidores MCP

Comunidade e expansão

  • A comunidade no Discord é usada para discutir plugins, desenvolvimento de ferramentas e a expansão do ecossistema do projeto LLM
  • Destaca-se que, no ecossistema open source, as possibilidades de uso de LLMs baseados em ferramentas são praticamente infinitas

Dessa forma, o LLM 0.26 está se consolidando como uma plataforma de integração de ferramentas universal e extensível, conectada a todos os principais modelos de LLM. Como as ferramentas ampliam enormemente o escopo de uso dos modelos de linguagem, trata-se de um recurso muito relevante para desenvolvedores e profissionais de TI.

1 comentários

 
GN⁺ 2025-05-28
Comentários no Hacker News
  • Tenho um renderizador de Markdown em streaming que eu mesmo criei para essa ferramenta
    Dá para ver mais detalhes no Streamdown
    Também há algo que pode servir de referência aqui
    Também criei eu mesmo uma ferramenta para tmux chamada llmehelp, construída sobre o llm do Simon
    Virou uma ferramenta essencial que uso todos os dias

    • Essa biblioteca parece realmente fantástica
      Fico pensando que seria ótimo se existisse um hook para permitir que os plugins controlassem diretamente a parte de exibição do conteúdo
      Abri uma issue sobre isso aqui
      Incluí algumas opções de design, mas ainda não estou 100% convencido de nenhuma delas
      Gostaria muito de receber feedback

    • Tem mais uma coisa que eu tinha esquecido
      Desta vez é um plugin de ZSH feito com base no llm
      Eu o uso com zle para traduzir inglês em comandos de shell de uma vez só
      O nome é Zummoner
      É uma ferramenta que mudou completamente a minha vida
      Por exemplo, um comando que criei hoje

        $ git find out if abcdefg is a descendent of hijklmnop 
      

      Um comando que de fato usei em um destes comentários

        $ for i in $(seq 1 6); do 
         printf "%${i}sh${i}\n\n-----\n" | tr " " "#"; 
        done | pv -bqL 30 
      

      Originalmente era

        $ for i in $(seq 1 6); do 
         printf "(# $i times)\n\n-----\n"
        done | pv (30 bps and quietly)
      

      Eu envio o buffer para o openrouter com minha confiável combinação ctrl-x x, e em menos de 1 segundo ele volta com a sintaxe correta

    • Muito legal
      Eu também já tive a experiência de criar renderizadores de Markdown em streaming em várias linguagens para exibir rapidamente saídas de LLM em streaming
      É bom saber que eu não era o único

    • Interessante, pretendo testar
      Eu uso llm com bat para highlight de sintaxe

    • Eu realmente queria esse tipo de funcionalidade
      Obrigado

  • Ferramentas desse tipo aumentam bastante o risco de virar uma footgun (algo que pode causar problemas para você mesmo)
    A documentação traz um alerta sobre prompt injection, mas na prática parece mais provável que o prejuízo venha de erro do próprio usuário
    Por exemplo, se você der à ferramenta acesso à sua conta de corretora, dá para automatizar operações
    Mesmo sem prompt injection, não há como impedir que o bot faça operações estúpidas
    Documentação de referência

    • O risco de acidentes desse tipo é realmente enorme
      Quando você conecta ferramentas a um LLM, podem surgir muitas situações inesperadas em que ele age em seu nome com chamadas autenticadas
      Dá para ver esse fenômeno em casos recentes como o do GitHub MCP artigo relacionado
      Também deixei avisos de risco bem destacados na documentação e, de fato, nem publiquei plugins iniciais de ferramentas que pudessem causar prejuízo real
      Por isso, meu sandbox em QuickJS e meu plugin de SQLite são estritamente somente leitura
      Ainda assim, esse campo inteiro é um espectro fascinante e muito interessante

    • Se alguém conectar llm a uma conta de corretora, isso é menos burrice do bot e mais burrice da pessoa

    • Toda ferramenta pode ser usada de forma indevida

  • Para quem usa llm, recomendo Gtk-llm-chat
    É fruto de uma enorme quantidade de trabalho
    Oferece integração do utilitário de linha de comando llm com o desktop, ícone na bandeja e uma janela de chat elegante
    A versão 3.0.0 foi lançada recentemente com pacotes para os 3 principais sistemas operacionais de desktop

    • Interessante
      Fico curioso sobre como você usa isso para coisas além de um chat comum
  • Este é realmente o timing perfeito
    Tenho experimentado várias coisas no terminal (Warp) ultimamente, e embora eu goste da ideia de introduzir agentes, tenho certa resistência ao modelo estilo Cursor de “confie em nós com seus prompts/chamadas de LLM (e pague por isso)”
    Então eu só queria um agente de terminal simples, baseado em CLI, para compensar minhas limitações com shell
    Estou bem ciente de que esse tipo de ferramenta tem um alto risco de virar uma footgun
    Mas a combinação de ferramenta de terminal + llm parece muito próxima do ideal por ser extremamente leve
    Fico curioso se há suporte a algo como os outros produtos de “agente”, em que quando o llm faz uma chamada de ferramenta como rm -rf ./*, ele pede aprovação com algo tipo “pressione Y para aprovar”
    Se isso existir, parece uma boa forma de impedir que o LLM manipule meu terminal livremente e de criar alguma camada de proteção

    • Imagino que o modo padrão do Codex CLI funcione assim
      Se você executar sem a flag --full-auto, ele pede aprovação toda vez
  • Estou mantendo com bastante afinco um plugin zsh/omz de autocomplete por tab para o llm, mas a velocidade com que novos recursos são lançados é tão alta que não está sendo fácil acompanhar
    Felizmente, o comando abaixo implementou automaticamente cerca de 90%

    llm -f README.md -f llm.plugin.zsh -f completions/_llm -f https://simonwillison.net/2025/May/27/llm-tools/ "implement tab completions for the new tool plugins feature"
    

    O repositório do meu plugin está aqui
    A estrutura é um pouco complexa porque quero cobrir o máximo possível de opções diferentes
    Ficaria muito grato por qualquer feedback

    • É impressionante que isso já não seja ficção científica, e sim realidade
      As gerações futuras provavelmente vão achar curioso como conseguíamos construir qualquer coisa
      É a mesma sensação que temos ao imaginar como os programadores em assembly trabalhavam
  • O GPT-4.1 é um modelo realmente poderoso, de saída estruturada a chamada de ferramentas
    Nos últimos 2 anos, um LLM fez quase todo o meu trabalho repetitivo do dia a dia
    É uma combinação de modelo barata e de alto desempenho, então eu sempre o escolho como modelo padrão

    • Sinceramente, o GPT-4.1 mini me impressionou muito
      Depois de mexer com tudo via API, ele é absurdamente barato e realmente resolve a maior parte das coisas
      Para programação eu uso o4-mini; fora isso, 4.1-mini normalmente já basta
      Um caso divertido que usei hoje
      llm -f https://raw.githubusercontent.com/BenjaminAster/CSS-Minecraft/… \
        -s 'explain all the tricks used by this CSS'
      
      Passei para o GPT-4.1 mini um excelente código de demonstração de CSS Minecraft, sem nenhum comentário, para que ele explicasse
      Demo relacionada fonte
      A resposta do GPT-4.1 mini foi realmente excelente
      Ele apontou corretamente até truques difíceis, como “Este CSS implementa uma interface 3D interativa em estilo voxel com técnicas CSS de ponta e mínimo JavaScript”
      Explicação completa
      3.813 tokens de entrada, 1.291 tokens de saída
      Cálculo: cerca de 0,3591 centavo de dólar, ou seja, pouco mais de um terço de 1 centavo
  • As ferramentas do Simon são realmente incríveis
    Eu as uso todos os dias
    Graças à composição com pipes e à troca fácil de modelos (com suporte tanto a locais quanto remotos, como ollama), o trabalho fica muito mais fácil

  • Muito legal
    Pelo que eu sei, o llama.cpp também suporta ferramentas, mas ainda não encontrei como fazer isso funcionar no llm
    Fico me perguntando se dá para resolver adicionando algo em extra-openai-models.yaml

    • Isso provavelmente exigiria mudanças em llm-gguf ou llm-llama-server
      ... testei e a segunda opção funciona
      brew install llama.cpp
      llama-server --jinja -hf unsloth/gemma-3-4b-it-GGUF:Q4_K_XL
      
      E em outra janela
      llm install llm-llama-server
      llm -m llama-server-tools -T llm_time 'what time is it?' --td
      
      Resumi tudo aqui
  • Muito grato por este release
    Considero esta biblioteca uma peça central que realmente abre todas as possibilidades dos LLMs além das limitações e restrições dos clientes existentes
    Desde o lançamento da versão alpha 0.26, venho tentando criar um plugin que interaja com servidores MCP, mas está parecendo um pouco difícil
    Consegui ao menos conectar para buscar e usar ferramentas dinamicamente, mas ainda não resolvi a parte de passar parâmetros

    • Eu também fiz alguns experimentos com MCP hoje de manhã
      Tentei ao máximo montar um demo simples de plugin, mas não foi uma experiência fácil
      A biblioteca oficial de Python para MCP exige coisas como execução com asyncio, conexão com o servidor e introspecção das ferramentas disponíveis
  • Um recurso esperado há muito tempo
    Eu imaginava que seria algo implementado com base em MCP ou OpenAPI, mas esse formato atual talvez seja bem mais simples e flexível
    Também parece que não seria difícil implementar isso como plugin