00:00:00Einer der einfachsten Wege, eure KI-Agenten leistungsfähiger zu machen, ist, ihnen einfach
00:00:03Zugriff auf Bash zu geben – aber das kann etwas komplex sein. Man braucht eine echte Shell, ein Dateisystem,
00:00:09Server und Container, also insgesamt eine Menge Infrastruktur. Zumindest war das bisher so.
00:00:13Aber was, wenn ich euch sage, dass es einfacher geht? Man kann tatsächlich eine TypeScript-Implementierung
00:00:18von Bash verwenden. Ich weiß, das klingt vielleicht etwas verrückt, aber glaubt mir, das ist super cool
00:00:22und kann euch sogar Geld sparen. Ich zeige euch, wie.
00:00:30Das hier ist ein neues Package namens “justbash”. In der Readme steht: “Simulierte
00:00:34Bash-Umgebung mit einem In-Memory-virtuellen Dateisystem, geschrieben in TypeScript. Dies ist
00:00:38für KI-Agenten konzipiert, die eine sichere, isolierte Bash-Umgebung benötigen.”
00:00:42Bevor ich euch zeige, wie ihr das mit euren KI-Agenten verknüpft, um ihnen
00:00:45mehr Möglichkeiten zu geben, möchte ich euch kurz den Code zeigen, damit ihr versteht,
00:00:48wie das Ganze funktioniert. Hier starte ich eine neue Bash-Umgebung aus dem justbash-Package,
00:00:53und darin können wir unsere Bash-Befehle ausführen. Wir nutzen env.exec und hier führe ich
00:00:57einfach den Bash-Befehl “echo hello” aus und speichere das in einer Datei namens
00:01:01greeting.txt. In der nächsten Zeile führe ich erneut exec in derselben Umgebung aus,
00:01:06um diese greeting.txt-Datei zu lesen. Wie ihr seht, können wir den
00:01:10Standard-Output des Ergebnisses ausgeben lassen, ebenso den Exit-Code und die Umgebungsvariablen.
00:01:14Wenn ich das starte, sieht man, dass die Datei erfolgreich geschrieben und auch
00:01:18gelesen wurde. Wir erhalten den Exit-Code 0 und die Umgebungsvariablen in unserer simulierten
00:01:22Bash-Shell. Wichtig ist hierbei: Wie gesagt, es ist nur eine simulierte
00:01:26Bash-Shell, also im Grunde eine TypeScript-Version dieser Bash-Befehle.
00:01:30Sie ist nicht mit einer echten Shell verbunden, sondern wandelt den Befehl,
00:01:34den wir hier eingeben, in TypeScript um und führt ihn aus. Diese Datei greeting.txt
00:01:39existiert also auf keinem echten Dateisystem, sondern in einem virtuellen In-Memory-System – obwohl
00:01:44es Optionen gibt, falls man doch ein echtes anbinden möchte. Vereinfacht gesagt,
00:01:47nimmt das Tool den Bash-Befehl aus der exec-Funktion,
00:01:51wandelt ihn in eine JavaScript-Funktion um und führt diese aus. Das bedeutet,
00:01:55dass keine echte Shell benötigt wird. Das sieht man auch hier in der Codebasis: Wenn ich “echo” in
00:01:59exec eingebe, wird eigentlich diese JavaScript-Funktion ausgeführt. Wir sehen hier die Logik,
00:02:03um die Flags des echo-Befehls in JavaScript zu interpretieren,
00:02:08und dann wird einfach das ausgegeben, was nach “echo” steht. Hier unten
00:02:11wird dann ein Objekt mit dem Standard-Output, dem Standard-Error
00:02:15und einem Exit-Code zurückgegeben. Falls ihr glaubt, dass das unmöglich
00:02:19alle Bash-Grundlagen abdecken kann: Hier ist eine Liste aller
00:02:23unterstützten Befehle, und es sind wirklich viele. Es gibt cat, copy, awk,
00:02:27base64 und sogar Fortgeschrittenes zur Datenverarbeitung wie jq, Python 3 und SQLite. Man kann
00:02:33sogar Netzwerkanfragen mit curl machen – man legt eine Whitelist fest, damit es sicher bleibt.
00:02:36Es gibt auch Shell-Features wie Pipes, Redirections und Command Chaining.
00:02:41Im Grunde bietet es alles, was eine einfache Bash-Shell kann. Ihr seht also,
00:02:45das Package ist echt cool und funktionsreich. Aber ihr fragt euch wahrscheinlich immer noch,
00:02:48warum man eine Bash-Implementierung in TypeScript braucht und wie das Agenten hilft,
00:02:53Geld zu sparen. Um das zu beantworten, zeige ich euch einen Anwendungsfall in einer einfachen Chat-App.
00:02:57Nehmen wir an, ich möchte in dieser Chat-App über diese JSON-Datei sprechen. Sie
00:03:02enthält massenhaft Datensätze, und ich möchte die KI bitten, bestimmte Infos
00:03:06daraus zu finden oder Felder zu analysieren. Wie ihr seht, ist das eine riesige Datei.
00:03:11Ein einfacher, aber definitiv falscher Weg wäre es, den gesamten Inhalt
00:03:15der Datei direkt in den Prompt zu kopieren. Ich nutze hier das AI SDK und GPT 5.2.
00:03:19Wenn wir diesen Agenten bitten, einen speziellen Datensatz zu finden,
00:03:24antwortet der Assistent – und ich kann bestätigen, dass es stimmt, da diese großen
00:03:28Modelle gut darin sind, Werte aus ihrem großen Kontext abzurufen.
00:03:33Das Problem: Es hat 133.000 Token verbraucht. Außerdem scheitert es,
00:03:39wenn man komplexere Fragen stellt, etwa zur Datenmanipulation oder zu bestimmten Datenbereichen.
00:03:43Wie gesagt, das ist offensichtlich nicht der richtige Weg. Eine andere Methode,
00:03:48die ihr vielleicht schon probiert habt, ist RAG oder dem Agenten eine Sandbox
00:03:51zu geben, damit er Bash-Befehle ausführen und die Daten so verarbeiten kann.
00:03:56Aber das Problem dabei ist, dass man wieder viel Infrastruktur braucht.
00:04:00Stattdessen simulieren wir das jetzt einfach mit justbash. Mit dem AI SDK
00:04:05kann man das bash-tool-Package verwenden, das auf justbash aufbaut.
00:04:09Das erlaubt uns, in unserem API-Endpunkt für den Chat ein neues Bash-Tool zu erstellen
00:04:13und alle Dateien zu übergeben, die in der simulierten Bash-Umgebung sein sollen.
00:04:17In meinem Fall ist das die große JSON-Datei von vorhin. Dann lege ich den Zielpfad fest,
00:04:21wo diese Dateien landen sollen – also in einem simulierten /workspace-Verzeichnis.
00:04:26Danach müssen wir im Stream unseres AI SDKs nur noch das Bash-Tool
00:04:31einbinden (bashTool.bash). Ich habe dem Agenten auch einige Instruktionen
00:04:34mitgegeben, die man im node_modules-Ordner findet. Das sind einfach Vorgaben,
00:04:39die vom Package bereitgestellt werden, damit der KI-Agent versteht, wie er das Bash-Tool nutzt.
00:04:42Mit diesem einfachen Setup stellen wir dem Assistenten nun dieselbe Frage:
00:04:46Er soll eine Information aus der JSON-Datei holen. Anstatt seinen eigenen Kontext
00:04:50zu nutzen und die Nadel im Heuhaufen zu suchen, führt er nun Bash-Befehle aus.
00:04:54Aber wie gesagt, das passiert in unserer simulierten TypeScript-Umgebung.
00:04:58In diesem Fall hat er einen jq-Befehl versucht, was wohl zu einem Fehler führte.
00:05:02Danach hat er einen head-Befehl genutzt, um die Dateistruktur zu sehen.
00:05:06So hat er das korrekte Format für jq gefunden und uns die Antwort geliefert. Ja, wir haben
00:05:10zwar dasselbe Ergebnis und es hat vielleicht einen Moment länger gedauert,
00:05:15aber der entscheidende Punkt ist: Es hat nur 6.000 Input-Token verbraucht,
00:05:19während die andere Methode 133.000 benötigte. Das ist ein viel besserer Weg für große Kontexte.
00:05:24Und das ist nicht der einzige Vorteil. Es wird noch mächtiger, wenn man
00:05:28tiefere Fragen zu den Daten stellt. Wenn ich zum Beispiel frage, wie viele Datensätze
00:05:33zwischen 1000 und 2500 das Feld metadata.active auf true haben,
00:05:37kann der Agent einfach einen Bash-Befehl ausführen und uns sofort die Antwort geben.
00:05:41Hätte man das in der anderen Version versucht, hätte es erstens extrem viel Kontext gekostet
00:05:45und zweitens wahrscheinlich eine falsche, geschätzte Antwort geliefert. Das hier ist viel präziser,
00:05:49weil man dem Agenten quasi vollen Zugriff auf eine Bash-Shell gibt –
00:05:53auch wenn er sie technisch gesehen gar nicht hat. Es ist ein simpler, kostenloser Mehrwert,
00:05:57um Agenten ohne zusätzliche Infrastruktur mächtiger zu machen. Und genau das
00:06:01liebe ich daran. Ich hoffe, ich konnte euch einen guten Anwendungsfall zeigen,
00:06:05aber glaubt mir, es gibt noch viel mehr. Wie wir gesehen haben, funktionieren auch Python-,
00:06:10SQL- und curl-Befehle, und man kann es sogar an ein echtes Dateisystem anbinden.
00:06:14Schreibt mir eure Meinung zu justbash in die Kommentare. Vergesst nicht zu abonnieren
00:06:18und wie immer: Wir sehen uns im nächsten Video!