Mein LLM-CLI-Tool kann jetzt Tools aus Python-Code oder Plugins ausführen
(simonwillison.net)- 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/-Tlassen sich Tools über installierte Plugins registrieren und verwenden - Python-Code über die Kommandozeile übergeben: Mit der Option
--functionskann 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.chainlassen 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
-
Installation oder Upgrade auf die neueste LLM-Version erforderlich
-
API-Key für OpenAI usw. registrieren:
llm keys set openai # API-Key eingeben -
Beispiel für die erste Tool-Ausführung:
llm --tool llm_version "What version?" --td- llm_version ist ein einfaches mitgeliefertes Demo-Tool
--tdist die Option für Tool-Debug-Ausgabe, mit der sich der Tool-Aufruf und die Antwort prüfen lassen
-
Modell wechseln:
llm models default gpt-4.1-mini- Optional werden verschiedene Modelle unterstützt (
-m o4-miniusw.)
- Optional werden verschiedene Modelle unterstützt (
-
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.5verwendet werden, was Flexibilität bei der Code-Ausführung bietet
- Falls
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
--functionslä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
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
Ein Befehl, den ich tatsächlich in einem dieser Kommentare verwendet habe
Ursprünglich war es
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
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
Wenn man es ohne das Flag
--full-autoausführt, wird jedes Mal um Bestätigung gebetenIch 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
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
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
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 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
... ich habe ein wenig experimentiert, und die zweite Methode funktioniert Und in einem separaten Fenster 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 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