Mon outil CLI LLM peut désormais exécuter des outils depuis du code Python ou des plugins
(simonwillison.net)- LLM 0.26 ajoute diverses fonctions d’exécution d’outils, permettant à plusieurs modèles LLM comme OpenAI, Anthropic, Gemini ou Ollama d’utiliser des outils implémentés sous forme de fonctions Python ou de plugins
- Depuis la ligne de commande ou l’API Python, il est possible d’installer directement des outils ou de les passer comme fonctions, ce qui améliore fortement l’extensibilité et la flexibilité
- Grâce aux plugins d’outils, il devient facile d’ajouter au modèle des fonctionnalités comme le calcul mathématique, l’exécution de JavaScript, les requêtes SQL ou l’intégration à des services externes
- Le schéma d’appel d’outils se généralise chez tous les grands fournisseurs de LLM ainsi que sur les modèles locaux, et LLM 0.26 l’intègre lui aussi de manière standardisée
- Parmi les projets et évolutions à venir figurent la prise en charge du standard MCP, l’élargissement de l’écosystème de développement de plugins et l’amélioration des journaux d’exécution des outils
LLM 0.26 : prise en charge de l’exécution d’outils avec les grands modèles de langage dans le terminal
Au 27 mai 2025, la version LLM 0.26 est disponible. Il s’agit du plus grand changement depuis le lancement du projet LLM, avec l’ajout du support des outils. Désormais, différents modèles LLM comme OpenAI, Anthropic, Gemini ou Ollama peuvent être reliés à l’outil CLI et à la bibliothèque Python de LLM pour accéder à n’importe quel outil pouvant être exprimé comme une fonction Python.
Fonctionnalités et changements principaux
- Installation et chargement d’outils via des plugins : l’option
--tool/-Tpermet d’enregistrer et d’utiliser des outils fournis par des plugins installés - Passage de code Python en ligne de commande : l’option
--functionspermet de transmettre directement du code de fonctions Python pour utiliser des outils - Prise en charge des outils aussi dans l’API Python : il suffit de passer
tools=[nom_de_fonction]à la méthode.chainpour connecter facilement un outil - Prise en charge des contextes synchrones et asynchrones : les appels d’outils sont possibles dans les deux cas, sync comme async
Exemples d’utilisation des outils
Préparation
-
Installer ou mettre à niveau LLM vers la dernière version
-
Enregistrer une clé API, par exemple OpenAI :
llm keys set openai # Saisir la clé API -
Premier exemple d’exécution d’un outil :
llm --tool llm_version "What version?" --td- llm_version est un outil de démonstration simple fourni par défaut
--tdest l’option de sortie de débogage des outils, qui permet de voir le processus d’appel et le contenu de la réponse
-
Changer de modèle :
llm models default gpt-4.1-mini- Plusieurs modèles sont pris en charge en option (
-m o4-mini, etc.)
- Plusieurs modèles sont pris en charge en option (
-
Appel de l’outil de temps intégré :
llm --tool llm_time "What time is it?" --td -m o4-mini- Affiche en détail l’heure et le fuseau horaire
Prise en charge de différents modèles et plugins
- La même interface d’outils fonctionne dans plusieurs environnements de modèles LLM, notamment Anthropic Claude 4, Google Gemini 2.5 Flash et Ollama Qwen3:4b
- Exemple de commandes :
llm install llm-anthropic -U llm keys set anthropic llm --tool llm_version "What version?" --td -m claude-4-sonnet
Calculs mathématiques et exécution de code
- Il est possible de compenser les limites des LLM en mathématiques grâce à des outils Python
- Le plugin llm-tools-simpleeval permet des opérations arithmétiques sûres
llm install llm-tools-simpleeval llm -T simpleeval llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td- Si
sqrt()n’est pas pris en charge, il peut être remplacé par** 0.5, ce qui apporte de la souplesse dans l’exécution de code
- Si
Présentation des plugins d’outils
- [llm-tools-simpleeval] : calcul arithmétique et expressions simples
- [llm-tools-quickjs] : outil d’interpréteur JavaScript sandbox QuickJS
- [llm-tools-sqlite] : requêtes SQL en lecture seule sur des bases SQLite locales
- [llm-tools-datasette] : prise en charge de l’exécution de requêtes SQL sur des instances Datasette distantes
Exemple :
llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content")' --td "What has the most stars?"
- Comme plugin de type toolbox, il peut être configuré via des arguments comme une URL
- Si une mauvaise colonne est indiquée, le système peut détecter l’erreur d’outil et réessayer → consulter le schéma → générer la bonne requête, ce qui démontre les capacités adaptatives du LLM
Définir directement un outil en code Python
- Depuis la ligne de commande, l’option
--functionspermet de transmettre n’importe quelle fonction Python et de la transformer immédiatement en outil - Exemple :
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'- Il est possible d’implémenter facilement un petit outil de recherche web
- Il est important d’orienter le modèle sur la manière d’utiliser l’outil via le system prompt
Intégration avec la bibliothèque Python
- LLM prend en charge à la fois la CLI et l’API Python
- La méthode
.chain()automatise toute la séquence : détection d’une demande d’appel d’outil → exécution → intégration du résultat - Exemple :
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) - Les fonctions asynchrones (
async def) sont aussi prises en charge, ce qui permet une exécution concurrente - Les plugins de type toolbox peuvent également être connectés tels quels avec
tools=[Datasette(...)]
Évolution du paradigme des outils
- Le schéma d’appel d’outils a été présenté notamment dans l’article ReAcT de 2022, puis adopté par tous les grands fournisseurs de LLM et les modèles locaux
- Selon les API, il prend des noms variés comme "Function calling" ou "utilisation d’outils", mais repose sur une forme unifiée
- Ollama, llama.cpp et d’autres ont eux aussi déjà ajouté la prise en charge des outils et continuent d’étendre ces fonctionnalités
Coulisses du développement et de l’exploitation
- Le projet LLM savait depuis longtemps qu’un support de l’intégration d’outils était nécessaire, mais la conception d’une couche d’abstraction entre modèles très différents était difficile
- À mesure que la standardisation du schéma d’outils a progressé entre fournisseurs, une implémentation unifiée est devenue possible dans LLM 0.26
- Le fonctionnement a été démontré dans des cas d’usage concrets lors d’un workshop à PyCon US 2025
Relation avec les « agents »
- Le terme « agent » reste discuté, mais dans l’écosystème actuel des LLM, le modèle « tool in the loop » tend à se standardiser
- LLM 0.26 constitue aussi une implémentation adaptée au développement d’agents
- Les travaux autour de modèles de plugins, d’issues d’amélioration et de documentation pour des plugins avancés progressent activement
Prise en charge à venir du Model Context Protocol (MCP)
- Le MCP s’impose rapidement comme un nouveau protocole standard permettant aux LLM d’accéder à des outils
- Au cours des 8 derniers jours, il a aussi été adopté rapidement dans les API de grands fournisseurs comme OpenAI, Anthropic et Mistral
- À l’avenir, le projet prévoit de faire de LLM un client MCP afin de l’intégrer facilement à divers serveurs MCP
Communauté et extension
- Une communauté Discord est animée pour discuter des plugins du projet LLM, du développement d’outils et de l’extension de l’écosystème
- Dans l’écosystème open source, les possibilités d’usage des LLM basés sur des outils sont soulignées comme pratiquement illimitées
De cette manière, LLM 0.26 est en train de devenir une plateforme d’intégration d’outils généraliste et extensible, compatible avec tous les principaux modèles LLM. En élargissant considérablement le champ d’usage des modèles de langage via les outils, il s’agit d’un outil particulièrement significatif pour les développeurs et les professionnels de l’IT.
1 commentaires
Commentaires Hacker News
J’ai un moteur de rendu Markdown en streaming que j’ai moi-même conçu pour cet outil
Plus de détails sur Streamdown
Il y a aussi quelque chose d’utile à consulter ici
J’ai également créé moi-même un outil tmux appelé llmehelp, construit au-dessus de llm de Simon
C’est devenu un outil indispensable que j’utilise tous les jours
Cette bibliothèque a l’air vraiment excellente
Je me dis qu’il serait bien d’avoir un hook permettant aux plugins de contrôler directement l’affichage du contenu
J’ai ouvert un ticket à ce sujet ici
J’y ai inclus quelques options de design, mais je ne suis pas encore convaincu à 100 %
J’aimerais vraiment avoir des retours
J’avais aussi oublié un autre élément
Cette fois, c’est un plugin ZSH construit sur llm
Il utilise zle pour traduire d’un coup l’anglais en commandes shell
Il s’agit de Zummoner
C’est un outil qui a complètement changé ma vie
Par exemple, une commande que j’ai créée aujourd’hui
Une commande effectivement utilisée dans l’un de ces commentaires
À l’origine, c’était
J’envoie le buffer à openrouter avec mon fidèle raccourci ctrl-x x, et en moins d’une seconde il revient avec la bonne syntaxe
Génial
J’ai moi aussi essayé de créer des moteurs de rendu Markdown en streaming dans plusieurs langages pour afficher rapidement la sortie des LLM en streaming
Je pensais être le seul, donc ça fait plaisir à voir
Intéressant, je vais certainement essayer
Moi, j’utilise llm avec bat pour la coloration syntaxique
C’est exactement le genre de fonctionnalité que je voulais
Merci
Ce type d’outil augmente énormément le risque de footgun (se mettre soi-même en danger)
La documentation met bien en garde contre les prompt injections, mais en pratique les dégâts dus à une erreur de l’utilisateur me semblent encore plus probables
Par exemple, si on donne à l’outil accès à un compte de courtage, on peut automatiser le trading
Même sans prompt injection, rien n’empêche le bot de faire des transactions stupides
Documentation de référence
Le risque d’accident avec ce genre de chose est vraiment énorme
Dès qu’on connecte des outils à un LLM, il peut agir à notre place via des appels authentifiés, et cela ouvre la porte à énormément de situations imprévues
On l’a vu récemment avec le cas GitHub MCP, entre autres article lié
J’ai d’ailleurs mis un gros avertissement sur les risques dans la documentation, et je n’ai pas du tout publié de plugin d’outil initial pouvant causer des pertes réelles
C’est pour ça que mon sandbox QuickJS et mon plugin SQLite sont strictement en lecture seule
Cela dit, tout ce domaine est extrêmement fascinant
Si quelqu’un branche llm sur un compte de courtage, le problème n’est pas tant que le bot soit stupide que la personne elle-même
Tout outil peut être mal utilisé
À ceux qui utilisent llm, je recommande Gtk-llm-chat
C’est le fruit d’un énorme travail
Il fournit une intégration du CLI llm avec le bureau, une icône dans la barre système et une interface de chat propre
La version 3.0.0 est sortie récemment avec des paquets pour les trois principaux OS de bureau
Je me demande comment tu l’utilises pour autre chose que du chat classique
Le timing est vraiment parfait
En ce moment, j’expérimente diverses choses dans le terminal (Warp), et j’aime bien l’idée d’ajouter un agent, mais l’approche à la Cursor du type « faites-nous confiance pour vos prompts/appels LLM (et payez au passage) » me rebute un peu
J’avais donc besoin d’un agent de terminal simple, basé sur un CLI, juste pour compenser mes lacunes en shell
Je suis parfaitement conscient que ce genre d’outil comporte un gros risque de footgun
Mais la combinaison outil terminal + llm me semble tellement légère que j’en attends beaucoup
Je me demande si, comme certains autres produits « agent », cela permet de demander une approbation à chaque appel d’outil du style
rm -rf ./*avec un « appuyez sur Y pour autoriser »Si c’est le cas, cela pourrait empêcher le LLM de manipuler librement mon terminal et fournir un minimum de garde-fous
Si tu ne le lances pas avec le flag
--full-auto, il demande une confirmation à chaque foisJe maintiens activement un plugin zsh/omz pour l’autocomplétion par tabulation de LLM, mais le rythme de sortie des nouvelles fonctionnalités est tellement rapide qu’il est difficile de suivre
Heureusement, la commande ci-dessous m’automatise 90 % du travail
Mon dépôt de plugin est ici
La structure est un peu complexe parce que j’essaie de couvrir autant d’options que possible
Je serais vraiment reconnaissant pour tout retour
Les générations futures se demanderont sûrement comment nous faisions pour construire quoi que ce soit
Un peu comme nous avons du mal à imaginer comment travaillaient les programmeurs assembleur
GPT-4.1 est un modèle vraiment puissant, de la sortie structurée jusqu’à l’appel d’outils
Depuis deux ans, les LLM gèrent presque toutes mes tâches répétitives du quotidien
C’est une combinaison de prix et de performances si bonne que c’est toujours mon modèle par défaut
Après avoir tout essayé via l’API, c’est ridiculement bon marché tout en réussissant réellement la plupart des tâches
Pour le code, j’utilise o4-mini, et pour le reste, 4.1-mini suffit généralement
Un cas amusant utilisé aujourd’hui J’ai envoyé à GPT-4.1 mini ce superbe code de démo CSS Minecraft sans le moindre commentaire pour qu’il l’explique
Source de la démo ici
La réponse de GPT-4.1 mini était vraiment excellente
Il a correctement relevé des techniques difficiles, par exemple : « Ce CSS met en œuvre une interface 3D interactive de style voxel avec des techniques CSS de pointe et un minimum de JavaScript »
Explication complète
3 813 tokens en entrée, 1 291 tokens en sortie
Calcul du coût : environ 0,3591 centime, soit à peine un tiers d’un centime
L’outil de Simon est vraiment formidable
Je l’utilise tous les jours
Grâce aux combinaisons de pipes et à la facilité pour changer de modèle (local ou distant, y compris ollama), le travail devient beaucoup plus simple
C’est vraiment très impressionnant
À ma connaissance, llama.cpp prend aussi en charge les outils, mais je n’ai pas encore trouvé comment l’intégrer dans llm
Je me demande si cela peut se résoudre en ajoutant quelque chose à extra-openai-models.yaml
... après quelques essais, la deuxième méthode fonctionne Puis, dans une autre fenêtre J’ai résumé cela ici
Un grand merci pour cette release
Je pense que cette bibliothèque est un composant clé qui ouvre pleinement le potentiel des LLM au-delà des limites et contraintes des clients existants
Depuis la sortie de la version alpha 0.26, j’essaie de créer un plugin qui interagit avec un serveur MCP, mais cela me paraît assez difficile
Pour l’instant, j’ai réussi à le connecter afin de récupérer et utiliser dynamiquement des outils, mais je n’ai pas encore résolu le passage des paramètres
J’ai essayé au maximum de produire une petite démo de plugin, mais ce n’était pas simple
La bibliothèque Python officielle mcp demande de gérer l’exécution asyncio, la connexion au serveur et l’introspection des outils disponibles
Une fonctionnalité attendue depuis très longtemps
Je pensais que ce serait implémenté via mcp ou openapi, mais cette approche est peut-être bien plus simple et plus flexible
J’ai l’impression que ce ne serait pas non plus très difficile à implémenter comme plugin