3 points par GN⁺ 2025-05-28 | 1 commentaires | Partager sur WhatsApp
  • 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/-T permet d’enregistrer et d’utiliser des outils fournis par des plugins installés
  • Passage de code Python en ligne de commande : l’option --functions permet 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 .chain pour 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

  1. Installer ou mettre à niveau LLM vers la dernière version

  2. Enregistrer une clé API, par exemple OpenAI :

    llm keys set openai
    # Saisir la clé API
    
  3. 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
    • --td est l’option de sortie de débogage des outils, qui permet de voir le processus d’appel et le contenu de la réponse
  4. Changer de modèle :

    llm models default gpt-4.1-mini
    
    • Plusieurs modèles sont pris en charge en option (-m o4-mini, etc.)
  5. 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

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 --functions permet 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

 
GN⁺ 2025-05-28
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

        $ git find out if abcdefg is a descendent of hijklmnop 
      

      Une commande effectivement utilisée dans l’un de ces commentaires

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

      À l’origine, c’était

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

      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

    • Intéressant
      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

    • Le mode par défaut de Codex CLI fonctionne probablement comme ça
      Si tu ne le lances pas avec le flag --full-auto, il demande une confirmation à chaque fois
  • Je 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

    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"
    

    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

    • C’est fou de voir que ce niveau de chose n’est plus de la science-fiction mais la réalité
      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

    • Honnêtement, GPT-4.1 mini m’a vraiment impressionné
      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
      llm -f https://raw.githubusercontent.com/BenjaminAster/CSS-Minecraft/… \
        -s 'explain all the tricks used by this CSS'
      
      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

    • Cela nécessitera probablement des changements dans llm-gguf ou llm-llama-server
      ... après quelques essais, la deuxième méthode fonctionne
      brew install llama.cpp
      llama-server --jinja -hf unsloth/gemma-3-4b-it-GGUF:Q4_K_XL
      
      Puis, dans une autre fenêtre
      llm install llm-llama-server
      llm -m llama-server-tools -T llm_time 'what time is it?' --td
      
      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

    • Moi aussi, j’ai fait quelques expérimentations avec MCP ce matin
      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