3 Punkte von GN⁺ 2025-05-28 | 1 Kommentare | Auf WhatsApp teilen
  • In LLM 0.26 wurden verschiedene Tool-Ausführungsfunktionen hinzugefügt, sodass mehrere LLM-Modelle wie OpenAI, Anthropic, Gemini und Ollama Tools nutzen können, die als Python-Funktionen oder Plugins implementiert sind
  • Über die Kommandozeile oder die Python-API lassen sich Tools direkt installieren oder als Funktionen übergeben, was Erweiterbarkeit und Flexibilität deutlich verbessert
  • Mit Tool-Plugins lassen sich dem Modell Mathematikberechnungen, JavaScript-Ausführung, SQL-Abfragen und die Anbindung externer Dienste einfach hinzufügen
  • Alle wichtigen LLM-Anbieter und lokale Modelle übernehmen zunehmend das Muster des Tool-Calling, und auch LLM 0.26 integriert es auf standardisierte Weise
  • Als künftige Pläne und Entwicklungsrichtungen werden Unterstützung für den MCP-Standard, der Ausbau des Plugin-Ökosystems und verbesserte Tool-Ausführungslogs diskutiert

LLM 0.26: Unterstützung für die Tool-Ausführung mit Large Language Models im Terminal

Mit Stand vom 27. Mai 2025 wurde LLM 0.26 veröffentlicht. Diese Version bringt die größte Veränderung seit dem Start des LLM-Projekts mit sich: Unterstützung für Tools. Damit können verschiedene LLM-Modelle wie OpenAI, Anthropic, Gemini und Ollama über das CLI-Tool und die Python-Bibliothek von LLM auf beliebige Tools zugreifen, die sich als Python-Funktionen ausdrücken lassen.

Wichtige Funktionen und Änderungen

  • Tools in Plugins installieren und laden: Mit der Option --tool/-T lassen sich Tools über installierte Plugins registrieren und verwenden
  • Python-Code über die Kommandozeile übergeben: Mit der Option --functions kann Python-Funktionscode direkt übergeben werden, um Tools zu nutzen
  • Tool-Unterstützung auch in der Python-API: Durch Übergabe von tools=[Funktionsname] an die Methode .chain lassen sich Tools einfach anbinden
  • Unterstützung für synchrone und asynchrone Kontexte: Tool-Aufrufe sind sowohl in Sync- als auch in Async-Situationen möglich

Beispiele für die Tool-Nutzung

Vorbereitung

  1. Installation oder Upgrade auf die neueste LLM-Version erforderlich

  2. API-Key für OpenAI usw. registrieren:

    llm keys set openai
    # API-Key eingeben
    
  3. Beispiel für die erste Tool-Ausführung:

    llm --tool llm_version "What version?" --td
    
    • llm_version ist ein einfaches mitgeliefertes Demo-Tool
    • --td ist die Option für Tool-Debug-Ausgabe, mit der sich der Tool-Aufruf und die Antwort prüfen lassen
  4. Modell wechseln:

    llm models default gpt-4.1-mini
    
    • Optional werden verschiedene Modelle unterstützt (-m o4-mini usw.)
  5. Integriertes Zeit-Tool aufrufen:

    llm --tool llm_time "What time is it?" --td -m o4-mini
    
    • Gibt Uhrzeit und Zeitzoneninformationen detailliert aus

Unterstützung für verschiedene Modelle und Plugins

  • In verschiedenen LLM-Modellumgebungen wie Anthropic Claude 4, Google Gemini 2.5 Flash und Ollama Qwen3:4b funktioniert dieselbe Tool-Schnittstelle
  • Beispielbefehle:
    llm install llm-anthropic -U
    llm keys set anthropic
    llm --tool llm_version "What version?" --td -m claude-4-sonnet
    

Mathematische Operationen und Code-Ausführung

  • Die Schwächen von LLMs bei Mathematik lassen sich mit Python-Tools ausgleichen
  • Das Plugin llm-tools-simpleeval unterstützt sichere arithmetische Operationen
    llm install llm-tools-simpleeval
    llm -T simpleeval
    llm -T simple_eval 'Calculate 1234 * 4346 / 32414 and square root it' --td
    
    • Falls sqrt() nicht unterstützt wird, kann stattdessen ** 0.5 verwendet werden, was Flexibilität bei der Code-Ausführung bietet

Einführung in Tool-Plugins

  • [llm-tools-simpleeval]: Arithmetik und einfache Ausdrucksberechnung
  • [llm-tools-quickjs]: Tool mit QuickJS-JavaScript-Sandbox-Interpreter
  • [llm-tools-sqlite]: Schreibgeschützte SQL-Abfragen auf lokale SQLite-Datenbanken
  • [llm-tools-datasette]: Unterstützung für SQL-Abfragen an entfernte Datasette-Instanzen

Beispiel:

llm install llm-tools-datasette
llm -T 'Datasette("https://datasette.io/content";)' --td "What has the most stars?"
  • Ein Plugin in Toolbox-Form, das sich über Argumente wie URLs konfigurieren lässt
  • Bei falscher Spaltenangabe erkennt das System Tool-Fehler und versucht es erneut → Schema abrufen → korrekte Query erzeugen, was die adaptive Fähigkeit des LLM belegt

Tools direkt mit Python-Code definieren

  • Über die Option --functions lässt sich in der Kommandozeile eine beliebige Python-Funktion übergeben und sofort in ein Tool umwandeln
  • Beispiel:
    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'
    
    • Damit lässt sich ein einfaches Websuche-Tool umsetzen
    • Wichtig ist, dem Modell über den System Prompt eine Richtung für die Tool-Nutzung vorzugeben

Integrierte Nutzung als Python-Bibliothek

  • LLM unterstützt sowohl CLI als auch Python-API
  • Die Methode .chain() automatisiert die gesamte Abfolge von der Erkennung einer Tool-Aufrufanfrage über die Ausführung bis zur Einbindung des Ergebnisses
  • Beispiel:
    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)
    
  • Auch asynchrone Funktionen (async def) werden unterstützt und können parallel ausgeführt werden
  • Toolbox-Plugins lassen sich ebenfalls unverändert in der Form tools=[Datasette(...)] anbinden

Entwicklung des Tool-Paradigmas

  • Das Tool-Calling-Muster wurde nach seiner Einführung etwa im ReAcT-Paper von 2022 von allen wichtigen LLM-Anbietern und lokalen Modellen übernommen
  • Je nach API wird eine vereinheitlichte Form unter Bezeichnungen wie „Function calling“ oder „Tool-Nutzung“ verwendet
  • Auch Ollama und llama.cpp haben bereits Tool-Unterstützung ergänzt und die Funktionen erweitert

Hintergründe aus Entwicklung und Betrieb

  • Im LLM-Projekt war schon lange klar, dass Unterstützung für Tool-Integration nötig ist, doch die Gestaltung einer Abstraktionsschicht über verschiedene Modelle hinweg war schwierig
  • Mit der fortschreitenden Standardisierung der Tool-Muster zwischen den Anbietern wurde eine integrierte Implementierung in LLM 0.26 möglich
  • Auf dem Workshop der PyCon US 2025 wurde die praktische Nutzung demonstriert

Beziehung zu „Agenten“

  • Der Begriff „Agenten“ ist weiterhin umstritten, doch im aktuellen LLM-Ökosystem standardisiert sich ein Modell in Form von „Tools in the loop“
  • LLM 0.26 ist auch für die Entwicklung von Agenten gut geeignet
  • Für die Zukunft wird aktiv an Templates für die Plugin-Entwicklung, Verbesserungs-Issues und der Dokumentation fortgeschrittener Plugins gearbeitet

Unterstützung für das Model Context Protocol (MCP) geplant

  • MCP entwickelt sich schnell zu einem neuen Standardprotokoll, über das LLMs auf Tools zugreifen
  • Innerhalb der letzten acht Tage wurde es auch in APIs großer Anbieter wie OpenAI, Anthropic und Mistral schnell übernommen
  • Künftig soll LLM als MCP-Client dienen, um sich einfach mit verschiedenen MCP-Servern zu verbinden

Community und Erweiterung

  • Für Diskussionen über Plugins, Tool-Entwicklung und den Ausbau des Ökosystems rund um das LLM-Projekt wird eine Discord-Community betrieben
  • Es wird betont, dass die Möglichkeiten toolbasierter LLM-Nutzung im Open-Source-Ökosystem praktisch unbegrenzt sind

Auf diese Weise entwickelt sich LLM 0.26 zu einer universellen und erweiterbaren Plattform für Tool-Integration, die sich mit allen wichtigen LLM-Modellen verbinden lässt. Dass sich der Einsatzbereich von Sprachmodellen durch Tools stark ausweiten lässt, macht es zu einem sehr bedeutenden Werkzeug für Entwickler und IT-Praktiker.

1 Kommentare

 
GN⁺ 2025-05-28
Hacker-News-Kommentar
  • Ich habe dafür einen selbst gebauten Streaming-Markdown-Renderer
    Mehr dazu gibt es bei Streamdown
    Außerdem ist hier noch etwas Relevantes dazu
    Ich habe auch ein tmux-Tool namens llmehelp gebaut, das auf Simons llm aufsetzt
    Ist inzwischen ein unverzichtbares Tool, das ich täglich benutze

    • Diese Bibliothek sieht wirklich großartig aus
      Ich wünschte, es gäbe einen Hook, mit dem Plugins die Anzeige des Inhalts direkt steuern können
      Dazu habe ich hier ein Issue erstellt
      Ich habe ein paar Designoptionen aufgenommen, bin mir aber noch nicht zu 100 % sicher
      Feedback wäre sehr willkommen

    • Noch etwas, das ich vergessen hatte
      Diesmal ist es ein ZSH-Plugin auf Basis von llm
      Ich nutze es mit zle, um Englisch in einem Rutsch in Shell-Befehle zu übersetzen
      Es heißt Zummoner
      Dieses Tool hat mein Leben komplett verändert
      Zum Beispiel ein Befehl, den ich heute selbst gebaut habe

        $ git find out if abcdefg is a descendent of hijklmnop 
      

      Ein Befehl, den ich tatsächlich in einem dieser Kommentare verwendet habe

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

      Ursprünglich war es

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

      Ich schicke den Buffer mit meiner bewährten Tastenkombination ctrl-x x an openrouter und bekomme ihn innerhalb einer Sekunde in korrekter Syntax zurück

    • Großartig
      Ich habe auch schon in mehreren Sprachen Streaming-Markdown-Renderer gebaut, um Streaming-Ausgaben von LLMs schnell darzustellen
      Schön zu sehen, dass ich damit nicht allein bin

    • Interessant, das werde ich definitiv ausprobieren
      Ich nutze llm zusammen mit bat für Syntax-Highlighting

    • Genau so eine Funktion wollte ich schon lange
      Danke

  • Bei solchen Tools steigt das Risiko eines footgun erheblich
    In der Dokumentation gibt es zwar einen Hinweis auf Prompt Injection, aber in der Praxis dürften selbst verursachte Fehler noch häufiger Schaden anrichten
    Wenn man einem Tool zum Beispiel Zugriff auf ein Brokerage-Konto gibt, kann es Trades automatisieren
    Selbst ohne Prompt Injection gibt es dann keine Möglichkeit, dumme Trades des Bots zu verhindern
    Referenzdokumentation

    • Das Schadenspotenzial solcher Unfälle ist wirklich enorm
      Wenn man Tools an ein LLM anschließt, das dann mit authentifizierten Aufrufen in meinem Namen handeln kann, entstehen sehr viele unerwartete Situationen
      Das konnte man zuletzt unter anderem beim GitHub-MCP-Fall sehen verwandter Artikel
      Ich habe in der Dokumentation die Risikowarnungen deutlich hervorgehoben und frühe Tool-Plugins, die tatsächlich Schaden anrichten könnten, absichtlich gar nicht veröffentlicht
      Deshalb sind mein QuickJS-Sandbox- und mein SQLite-Plugin auch ausschließlich read-only
      Trotzdem ist dieses Feld insgesamt ein sehr spannendes und faszinierendes Spektrum

    • Wenn jemand llm mit einem Brokerage-Konto verbindet, ist weniger der Bot dumm als der Mensch

    • Jedes Tool kann missbraucht werden

  • Allen, die llm verwenden, empfehle ich Gtk-llm-chat
    Da steckt unglaublich viel Arbeit drin
    Es bietet Desktop-Integration für das llm-Kommandozeilentool, ein Tray-Icon und ein aufgeräumtes Chatfenster
    Kürzlich ist Version 3.0.0 mit Paketen für die drei großen Desktop-Betriebssysteme erschienen

    • Interessant
      Ich frage mich, wofür du es außer für gewöhnliches Chatten noch verwendest
  • Das Timing ist wirklich perfekt
    Ich experimentiere in letzter Zeit im Terminal mit verschiedenen Dingen, unter anderem in Warp, und finde die Idee von Agents zwar attraktiv, aber Ansätze wie bei Cursor nach dem Muster „Vertrau einfach unseren Prompts/LLM-Aufrufen (und bezahle dafür)“ schrecken mich eher ab
    Deshalb brauchte ich einfach einen simplen CLI-basierten Terminal-Agenten, um meine begrenzten Shell-Kenntnisse auszugleichen
    Dass solche Tools ein großes footgun-Risiko haben, ist mir vollkommen klar
    Aber die Kombination aus Terminal-Tool und llm wirkt so angenehm leichtgewichtig, dass ich große Erwartungen habe
    Mich würde interessieren, ob es wie bei manchen anderen „Agent“-Produkten Unterstützung dafür gibt, dass das llm bei Tool-Aufrufen wie rm -rf ./* jedes Mal um Zustimmung bittet, etwa mit „Drücke Y zum Bestätigen“
    Damit ließe sich verhindern, dass das LLM mein Terminal eigenmächtig steuert, und es gäbe zumindest eine gewisse Schutzschicht

    • Das ist vermutlich der Standardmodus von Codex CLI
      Wenn man es ohne das Flag --full-auto ausführt, wird jedes Mal um Bestätigung gebeten
  • Ich pflege ziemlich intensiv ein zsh/omz-Plugin für Tab-Completion von LLM CLI, aber das Tempo neuer Feature-Releases ist so hoch, dass es schwer ist, mitzuhalten
    Zum Glück erledigt der folgende Befehl 90 % der Implementierung automatisch

    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"
    

    Mein Plugin-Repository ist hier
    Die Struktur ist etwas komplex, weil ich möglichst viele Optionen abdecken möchte
    Für Feedback wäre ich sehr dankbar

    • Es ist faszinierend, dass das nicht Science-Fiction, sondern echte Realität ist
      Künftige Generationen werden sich vermutlich wundern, wie wir überhaupt irgendetwas gebaut haben
      Genauso wie wir uns kaum vorstellen können, wie Assembler-Programmierer gearbeitet haben
  • GPT-4.1 ist ein wirklich starkes Modell, von strukturierten Ausgaben bis zu Tool-Aufrufen
    In den letzten zwei Jahren hat ein LLM fast alle meine alltäglichen Routineaufgaben übernommen
    Es ist eine günstige und zugleich leistungsfähige Modellkombination, deshalb wähle ich es immer als Standardmodell

    • Ehrlich gesagt bin ich von GPT-4.1 mini wirklich beeindruckt
      Nachdem ich alles Mögliche über die API ausprobiert habe, wirkt es absurd günstig und erledigt tatsächlich den Großteil der Aufgaben
      Beim Coding nutze ich o4-mini, für fast alles andere reicht meist 4.1-mini
      Ein Beispiel, das ich heute aus Spaß verwendet habe
      llm -f https://raw.githubusercontent.com/BenjaminAster/CSS-Minecraft/… \
        -s 'explain all the tricks used by this CSS'
      
      Ich habe den großartigen CSS-Minecraft-Democode ohne einen einzigen Kommentar an GPT-4.1 mini weitergereicht, damit es ihn erklärt
      Die zugehörige Demoquelle ist hier
      Was GPT-4.1 mini zurückgegeben hat, war wirklich hervorragend
      Es hat sogar schwierige Kniffe korrekt erkannt, etwa: „This CSS uses cutting-edge CSS techniques to create a 3D interactive voxel-style UI with minimal JavaScript“
      Die vollständige Erklärung
      3.813 Eingabetokens, 1.291 Ausgabetokens
      Laut Berechnung etwa 0,3591 Cent, also nur rund ein Drittel eines Cents
  • Simons Tool ist wirklich großartig
    Ich verwende es jeden Tag
    Dank der Pipe-Kombinationen und des einfachen Wechsels zwischen Modellen, sowohl lokal als auch remote wie etwa über ollama, wird die Arbeit deutlich leichter

  • Wirklich sehr cool
    Soweit ich weiß, unterstützt auch llama.cpp Tools, aber ich habe bisher keinen Weg gefunden, das in llm anzubinden
    Ich frage mich, ob sich das durch irgendeinen Eintrag in extra-openai-models.yaml lösen lässt

    • Dafür braucht es vermutlich Änderungen an llm-gguf oder llm-llama-server
      ... ich habe ein wenig experimentiert, und die zweite Methode funktioniert
      brew install llama.cpp
      llama-server --jinja -hf unsloth/gemma-3-4b-it-GGUF:Q4_K_XL
      
      Und in einem separaten Fenster
      llm install llm-llama-server
      llm -m llama-server-tools -T llm_time 'what time is it?' --td
      
      Eine Zusammenfassung dazu gibt es hier
  • Vielen Dank für dieses Release
    Ich denke, diese Bibliothek ist eine Schlüsselkomponente, die die Möglichkeiten von LLMs jenseits der Grenzen und Einschränkungen bestehender Clients vollständig öffnet
    Seit der Veröffentlichung von Version 0.26 alpha versuche ich, ein Plugin zu bauen, das mit MCP-Servern interagiert, aber es fühlt sich etwas schwierig an
    Ich habe es immerhin schon so weit gebracht, dass eine Verbindung hergestellt und Tools dynamisch geladen und verwendet werden können, aber die Übergabe von Parametern habe ich noch nicht gelöst

    • Ich selbst habe heute Morgen auch ein wenig mit MCP experimentiert
      Ich habe versucht, ein möglichst simples Plugin-Demo zu bauen, aber einfach war es nicht
      Die offizielle mcp-Python-Bibliothek verlangt Dinge wie asyncio-Ausführung, Serververbindung und Introspektion der verfügbaren Tools
  • Eine lang erwartete Wunschfunktion
    Ich hatte mit einer MCP- oder OpenAPI-basierten Implementierung gerechnet, aber der aktuelle Ansatz ist vielleicht viel einfacher und flexibler
    Es dürfte auch nicht allzu schwer sein, das als Plugin umzusetzen