Minha ferramenta CLI de LLM agora pode executar ferramentas a partir de código Python ou plugins
(simonwillison.net)- 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
-
É necessário instalar ou atualizar para a versão mais recente do LLM
-
Registrar a chave de API, como a da OpenAI:
llm keys set openai # inserir a chave da API -
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
-
Troca de modelo:
llm models default gpt-4.1-mini- Também há suporte a vários modelos por opção (
-m o4-minietc.)
- Também há suporte a vários modelos por opção (
-
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
- Caso não haja suporte a
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
--functionse 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
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
zlepara 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
Um comando que de fato usei em um destes comentários
Originalmente era
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
llmcombatpara highlight de sintaxeEu 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
llma uma conta de corretora, isso é menos burrice do bot e mais burrice da pessoaToda 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
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
Se você executar sem a flag
--full-auto, ele pede aprovação toda vezEstou 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%
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
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
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-mininormalmente já bastaUm caso divertido que usei hoje 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... testei e a segunda opção funciona E em outra janela 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
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