{
  "video_id": "wflNENRSUb4",
  "channel_slug": "aidotengineer",
  "channel_handle": "aidotengineer",
  "title": "The Agent Gets a Computer: Building with AI SDK v6 — Nico Albanese, Vercel",
  "duration_seconds": 4133.0,
  "url": "https://www.youtube.com/watch?v=wflNENRSUb4",
  "upload_date": "",
  "transcript": "Ich habe jetzt meine Live-Bereitstellung hier\nund kann weiterhin das Dashboard nutzen.\nMein Projekt ist\neiner von fünf Punkten auf der\nProduktions-Checkliste.\nIst das alles?  Konntest du das bekommen?\nCool.\nWir wechseln also zum\nRepository auf GitHub, indem wir auf den\ngroßen Repo-Button klicken.  Und dann werde ich mich\nvon Slack und all diesen\nDingen abmelden.  Und ich werde jetzt in ein\nTerminal springen.  Ich wechsle in ein Verzeichnis meiner Wahl, in das\nich das einfügen kann\n. Und dann klone ich es\n.  Ups, das ist es nicht.  Ich muss\nes natürlich kopieren.  Klicken Sie auf die große grüne\nCode-Schaltfläche.  Kopieren Sie den Klon und erhalten Sie die\nKlon-Demo von AIE London.\nEindrucksvoll.  Ich werde mal in dieses\nRepository springen.  Und wenn wir dann\nzur Dokumentationsseite zurückkehren, die\nSie übrigens unter nicapp.com finden, werden\nSie dann hierher weitergeleitet.\nÄhm, falls Sie die Verscell CLI nicht\ninstalliert haben, können Sie\nsie mit mpmi-g\nVerscell installieren.\nÄh, das wird Sie wahrscheinlich beim\nersten Mal zum Versall-Login weiterleiten.   Es\nwird dann dieser\nAnmeldeprozess erscheinen, den Sie bestätigen können, und anschließend\nsollten Sie angemeldet sein. Sie können\ndies mit Versel überprüfen.  Wer bin ich?   Ja\n.   Das Gute daran\nist, dass in einem kleinen Raum wie\ndiesem das WLAN kein Problem darstellen sollte.\nKonnten Sie sich einloggen?\nCool.   Ja.\nPerfekt.\nUnser IM-Team leistet hervorragende Arbeit\nmit der Versel CLI.  Ähm, ich bin ein großer Fan.  Ich\nbin zwar voreingenommen, aber ich bin ein großer Fan.\nSobald wir alles eingerichtet und eingeloggt haben, gehen wir\nin unser Repository, das wir gerade geklont haben,\nund führen Verscell link aus.  Äh, wir sagen ja, wir\nsollten es finden können, wenn Sie\nden gleichen Namen haben.  Äh, und dann wollen wir\nunsere Umgebungsvariablen abrufen.  Und\ndas sollte uns das Ergebnis liefern, das ich\nwahrscheinlich nicht zeigen sollte, ähm, aber es wird\nungültig.  Das sollte uns ein OIDC-\nToken liefern, mit dem wir uns\nsowohl beim KI-Gateway\nfür unsere Inferenz als auch bei unserer Self-Sandbox authentifizieren können.\nJa, das kommt häufig vor, denn\nintern haben wir unzählige\nTeams – ich bin, glaube ich, in sieben oder\nacht verschiedenen Versel-Teams – und daher\nkann die Authentifizierung beim richtigen Team\noder die Suche nach den Projekten manchmal eine\nHerausforderung sein. Aber wir arbeiten daran, es jedes Mal einfacher zu machen\n.\nJa, möglicherweise war da schon ein Token\nvon der\nArbeit drin.\nHübsch.\nOh, von der vers CLI.   Oh ja\n.  Ja, das gilt, wenn\nes mit\nnpm installiert ist. Dann können Sie npm install -g\nversel at latest ausführen, und das sollte\nSie auf die neueste Version bringen.  Das ist mir vor Kurzem\nauch passiert, weil wir\ndie alte Authentifizierungsmethode\nzugunsten einer neuen für ungültig erklärt haben.\nSie können auch nachsehen, welche Version Sie verwendet haben, und das\nsollte Ihnen sagen, mit welcher Version Sie\nes installiert haben.\nIch verwende pmpm anstelle von npm,\nwas das klassische, frustrierende Problem mit sich bringt,\nwelcher Paketmanager wofür zuständig ist. Konntest\ndu das Problem lösen?  Ja.\nDein Hemd gefällt mir übrigens sehr gut.\nHausgemacht.\nEs sieht sehr professionell aus.\nFür alle, die zuschauen: Es handelt sich um ein Typescript-\nShirt.  Das ist echt cool.  Typescript bis zum Tode.\nDing diesen Hügel.\nWird es gerade eingerichtet oder wird es\nneu installiert?\nGroßartig.   Ja\n.\nWelches ist der Versel-Link?\nÜbrigens, falls Sie es noch nicht mitbekommen haben: Wir haben\neine neue Landingpage veröffentlicht.  Nach\nzwei Jahren haben wir endlich meine schreckliche\nLandingpage ersetzt.  Ähm, das habe ich\ndefinitiv nicht getan.  Das sind die\nKonstruktionsingenieure in unserem Team.  Sehr, sehr\ncool.  Ähm, Live-Downloadzahlen.\nIch zeige diese Arbeit sehr gerne, weil sie\nso gut aussieht.\nAch ja, und falls Sie es noch nicht wussten: Wenn Sie\nOpen Code verwendet haben, dann basiert Open Code\nebenfalls vollständig auf dem AI SDK.  Und das ist das typischste\nDAX-Zitat aller Zeiten.\nOpen Code verwendet das AI SDK.  Äh, okay.\nWir haben alles aufgebaut.\nCool.\nDann können wir loslegen.  Als Erstes führen\nwir also den Befehl pmppm install\noder npm install aus.  Wenn du npm\nim Jahr 2026 noch verwendest, solltest du vielleicht pmpp oder bun in Betracht ziehen.  Ich\nliebe Brötchen.  Und dann können wir einfach überprüfen, ob\nes funktioniert.  Es handelt sich um eine brandneue XJS-\nApp, daher sollten keine Probleme auftreten.\nAber wenn Sie den Entwicklungsserver starten und dann\nlocalhost 3000 aufrufen, sollten Sie\nden wunderbaren, ähm, ziemlich neuen\nStartbildschirm sehen.\nIst das alles für alle eingerichtet?   Ja\n.   Toll\n.\nÄh, also wir fangen mit unserem\nAgenten an.  Wir werden einen Agenten erstellen.   Als\nErstes müssen wir\neinige Abhängigkeiten installieren, da wir\nmit JavaScript arbeiten, richtig?  Wir\nlieben es, Abhängigkeiten zu installieren.  Wir werden also\nins Terminal wechseln und den Befehl\npmppm add AI at AISDK\nreact and uh ZOD ausführen.  Keine Sorge, wir stehen ganz am\nAnfang, Sie\nverpassen also nichts.\nÄhm,\nalso, wenn Sie das Ganze am Computer mitverfolgen möchten\n, ähm, sollte ich\nes aufschreiben.  Gibt es da so etwas wie eine Tafel oder\nso?  Nein, das gibt es nicht.  Ähm, die\nSeite, auf der wir uns befinden, ist niko\nalbbanaz.comie.\nUnd damit gelangen Sie zur\nProjekteinrichtung, der Sie hier folgen können.\nUnd dann sind wir gerade erst dabei,\nden\nAgenten zu entwickeln.  Ähm, also, als Erstes, wie\nich schon sagte, entwickeln\nwir mit JavaScript.\nWir müssen also einige Abhängigkeiten installieren.\nWir werden als Nächstes das AI\nSDK installieren, und zwar dieses sehr praktische, zweizeilige\nnpm-Paket hier.  Ähm, unser React-\nAdapter, den wir uns gleich ansehen werden,\nund Zod, das wir verwenden werden, um\nein paar Schemas zu definieren, die\nwir später im Projekt verwenden werden.   Als\nich das letzte Mal einen AIE-Workshop veranstaltete, war das\nmit AISDK 4, und damals basierte alles im Wesentlichen auf\nvier Grundelementen:\nText generieren, Stream-Text generieren,\nObjekt generieren, Stream-Objekt generieren. Diese\nexistieren zwar immer noch, aber wir haben\nso viel wie möglich in die Textgenerierungsfunktionen verlagert\n.  Sie\nkönnen nun also strukturierte Ausgaben mit\nden Funktionen „Text generieren“ und „Text streamen“ erstellen.  Ähm,\naber wir haben auch daran gearbeitet,\neinen stärker objektorientierten Ansatz für die\nEntwicklung von Agenten mit dem SDK bereitzustellen.  Und ein Teil davon war,\nwie wir in unseren eigenen\nAnwendungen gesehen haben, wie sehr sie\ndadurch aufblähten, dass die gesamte LLM-\nLogik auf der Aufrufstelle enthalten war.  Sie hatten also Ihre\nAPI chat.ts und Ihren X.js Routenhandler, und\ndarin befanden sich 2.000 Codezeilen,\nweil Sie die Tools in einer\nZeile definiert und die Systemeingabeaufforderung\nin einer Zeile definiert hatten.  Und so ist ein Teil der\nSchönheit des AISDK, dass es\nleichtgewichtiges JavaScript ist.  Man kann\ndies also einmal im Code in einem Monor-Repository definieren\nund es dann überall verwenden, egal ob es sich um eine\nNext.js-App, einen einfachen BUN-\nServer oder was auch immer handelt – es ist reines\nJavaScript.  Ähm, und das war sozusagen unser\nerster Versuch in diesem Bereich, den\nwir als Loop-Agenten bezeichnen.  Nun, ähm,\nder Mastermind hinter dem KI-SDK\nist Deutscher.  Äh, und die Namensgebung ist etwas, das uns\nsehr am Herzen liegt.  Dies ist\neine unserer kürzeren APIs, aber wir finden, dass ihre Funktion\nziemlich selbsterklärend ist\n.  Es handelt sich um eine Werkzeugschleife, die einen Agenten verwendet.  Ähm, es erfüllt im Prinzip das, was der Name\nverspricht.  Um\nunseren ersten Agenten zu erstellen, müssen wir lediglich\ndieses Tool „\nloop agent“ definieren und dann ein Modell angeben.\nAlso werden wir das tun.  Wir werden\neine neue Datei namens um agent.ts\nim Ordner lib erstellen.  Und ich werde\ndas Ganze jetzt in einem Editor öffnen, damit es\nfür mich etwas einfacher ist.  Und ich werde\ndie\nSchriftgröße vergrößern, damit es jeder sehen kann.   Machen wir's.\nIst das besser?  Können wir lesen?  Ja.  Cool.\nÄhm, also wir werden jetzt die App öffnen.\nTatsächlich können wir das auf oberster Ebene machen.\nWir werden eine neue Datei erstellen, die sich\nin einem lib-Ordner befindet und\nagent.ts heißt.   Hierhin\nkopieren wir nun diesen Codeausschnitt und\nwie ich bereits erwähnt habe, importieren wir ihn in den\nLoop-Agenten, indem wir unser Modell angeben.\nDas Tolle daran ist, dass Sie, wenn Sie\ndas AISDK schon einmal verwendet haben, vielleicht diese\nSyntax gesehen haben, mit der Sie einen Provider importieren.\nSie würden also OpenAAI aus AIS importieren, wenn ich\nbei AISDKAI tippen kann,\nund dann könnten Sie angeben, dass dadurch\neine Modellanbieterinstanz erstellt wird,\nin der Sie dann eine UM-Modell-ID angeben können\n.  Eine der coolen Neuerungen, die wir\nim AI SDK 6 mitliefern, ist das Konzept\neines globalen Providers. Damit können Sie\neffektiv jeder\neinzelnen AI SDK-Funktion\nin Ihrer Anwendung einen Provider zuweisen. Standardmäßig\nist dies das AI Gateway. Durch die Angabe\neinfacher Zeichenketten können Sie auf jedes\nModell im AI Gateway zugreifen.  Wenn Sie möchten,\nkönnen Sie dies überschreiben und\nhier einen beliebigen Anbieter als globalen Anbieter verwenden.  Ähm, aber dadurch wird der\nEinstieg wirklich sehr einfach.  Also, äh, wir werden\nverwenden, was haben wir gesagt?  GPT54 mini.   Ich\nhoffe immer, solche Dinge auf dem neuesten Stand zu halten\n.  Ich habe das gestern Abend gemacht, daher\nist es ziemlich aktuell.  Äh, aber\nwahrscheinlich wird das nicht mehr der Fall sein, wenn dieses Video veröffentlicht wird\n.  Ähm, dieses Modell wird uns ...\nIch habe 54 Mini noch nicht oft benutzt.  Ich habe die Zahl\n54 schon unzählige Male benutzt.  Ähm, aber das bietet uns eine gute, relativ\ngünstige und schnelle Möglichkeit,\nunseren Agenten im Laufe der Zeit auszuprobieren.\nDies ist also unsere Agentendefinition.  Es ist schon\nüberraschend, wie klein es ist, aber es\nist buchstäblich nur dieser wiederverwendbare Agent, der\nGPT5 für Mini verwendet.  Als Nächstes müssen wir\neine Möglichkeit schaffen, unser\nModell aufzurufen, und das werden wir tun, indem wir\neinen Routen-Handler erstellen.  Das wird also\nin einem Ordner namens API liegen, der\neinen Unterordner namens Chat enthält.  Und dann\nkönnen wir mithilfe der Konventionen von NexJS\neinen Post-Handler in einer route.ts-\nDatei definieren.   Also\nnochmal, das ist eine App-API-Chat-\nRoute.ts.\nUnd einer der coolen Vorteile, um nochmal darauf zurückzukommen,\nwarum man dies anstelle\nvon einfachem Stream-Text verwenden sollte,\nist, dass wir dadurch\nunsere gesamte Agentendefinition an einem Ort behalten konnten,\nwährend wir uns\nan einem anderen Ort nur um das Streaming von diesem Agenten kümmerten\n.  Und wir haben viele der\nKomplexitäten dieses Streamings auf eine\neinzige Codezeile abstrahiert, nämlich die\nErstellung der UI-Stream-Antwort des Agenten.  Nochmals,\nfalls Sie das AI SDK schon einmal verwendet haben,\nist das, was hier passiert, buchstäblich\ndasselbe wie äh con result equals stream\ntext.  Sie haben Ihren Stream-Textaufruf und geben\ndann result.2 UI-\nNachrichtenstream-Antwort zurück.\nÄh, also ist es im Grunde dasselbe.\nÄhm, und auf Ihrem Agenten gibt es auch meine\nagent.stream-Funktion, die\nStreaming-Funktion Ihres Agenten\n.\nÄhm, das gibt uns also unsere Vorgehensweise, und ich werde das hier jetzt\nentfernen.  Äh, das gibt\nuns die Möglichkeit, unseren\nAgenten anzurufen.  Sie können sehen, dass unser Post-Handler\neinige Nachrichten entgegennimmt und\ndiese zusammen mit unserem Agenten weiterleitet.  Und\njetzt müssen wir tatsächlich eine Seite\nund einen Client erstellen, um diesen\nAgenten oder Endpunkt aufzurufen.  Wir können also\nunsere Homepage (page.tsx) aufrufen und den Inhalt\ndurch den hier vorhandenen Text ersetzen.\nUnd was wir hier haben, ist äh der\nberüchtigte Now Use Chat Hook, der\ntatsächlich die erste Komponente des SDK war,\nals wir ihn vor etwa drei\nJahren auf den Markt brachten.  Ähm, und das verwaltet\nunseren gesamten Nachrichtenstatus und hilft uns dann dabei,\ndiese Nachrichten an unseren Routenhandler zu senden\n.  Wir haben also strukturierte\nNachrichten, die unseren\nNachrichtenspeicher bilden werden.  Heute liegt alles in der Verantwortung des Kunden\n.  Ähm, Fehler und die Funktion zum Senden von Nachrichten\n.  Wir prüfen, ob ein\nFehler vorliegt. Andernfalls durchlaufen wir in unserem Markup\nin der Benutzeroberfläche die\nNachrichten in unserem Nachrichtenstatus und anschließend\nfür jede Nachricht die\neinzelnen Bestandteile. Haben Sie das AI\nSDK schon einmal verwendet? Ist dies das erste Mal? Okay, also ja, ja, ja, ja, ja, ja, ja, ja, ja, ja, dann sehen Sie es zum ersten Mal.\nOkay, super. Die\nmeisten von Ihnen kennen das wahrscheinlich schon, also\nkann ich das schnell erklären. Ja, so\nrendern wir auf dem Client.\nJetzt können wir pmpp rundev ausführen\nund sollten nun in der Lage sein, „Hallo“ zu\nsagen und eine\nAntwort zu erhalten.  Wir haben also unseren Chatbot\noder, wie wir besser sagen sollten, unseren Agenten – es ist 2026, äh, bereit\nzum Einsatz.  Das erste und\ngrundlegendste, was wir an\nunserem Agenten aktualisieren möchten, ist die Änderung seines\nVerhaltens.  Eine sehr grundlegende Methode hierfür\nist die Änderung der Systemaufforderung\noder der Anweisungen. Dies können Sie\nmit dem AI SDK in Ihrer Agentendefinition tun,\nindem Sie einen Parameter namens „instructions“ übergeben\n.  Das können Sie hier tun.  Ich\nkann sagen: Reagiere wie ein Cowboy.  Ähm, und\nwenn ich jetzt zu unserem Agenten zurückgehe und „\nHallo“ sage, sollten wir uns mit „Hallo Partner“ begrüßen.  Wie\nkann ich Ihnen heute helfen?  mit einem netten Cowboy-\nEmoji.  Ähm, das knüpft an das an, was\nich\nCasper ganz am Anfang gesagt habe.  Äh, was\nich heute eigentlich tun wollte, ist, zu\nvermitteln, was meiner Meinung nach die\nwichtigsten Bausteine ​​für die Entwicklung von Agenten\nim Jahr 2026 sind, nämlich eine Agentenlaufzeitumgebung, die\neine Möglichkeit bietet, Ihr Harness\neffektiv aufzubauen.  Wie also handhabt man die\nSchleife?  Wie wird der Kontext innerhalb\nder Schleife verwaltet?  So etwas in der Art.  äh, die\nTools selbst, die Sie an\ndiese Laufzeitumgebung übergeben.  Und schließlich noch ein\nComputer oder eine Art Sandbox-\nDateisystem, damit der Agent\ninnerhalb seiner Laufzeit Zustände speichern oder Code ausführen kann\n.  Äh, wir nennen die Läufe die\nArbeitssitzungen, an denen es\narbeitet.  Und das hier ist sozusagen einer der\nBausteine, die Bauanleitung.  Ich\nglaube, viele Leute haben die Idee der\nSystemabfrage als\netwas für 2023 abgetan, als wir\nwirklich angefangen haben, aber wir werden heute sehen, wie\nwir die Anweisungen\nzusammen mit diesen beiden anderen Komponenten nutzen werden, um wirklich\ndas Beste aus einem Agenten herauszuholen und\nsein Verhalten zu beeinflussen.  Das\nist also der Ausgangspunkt.  Damit\nhaben wir unseren Basisagenten erstellt.\nAls Erstes werden wir etwas tun, was, glaube ich,\nviele Leute auch tun wollen:\ndem Agenten die Möglichkeit geben, auf irgendeine\nWeise mehr Kontextinformationen einzubinden.  Eine\ngrundlegende Sache, die wir heute schon tun können, weil\nwir keinen überzeugenden Anwendungsfall haben, ist einfach die Integration der\nWebsuche.  Um das zu tun,\nspringen wir\nzurück zum Terminal.  Äh, ich werde\nmeinen Entwicklungsserver hier stoppen und\ndiesen Befehl „pmppm add AI SDK OpenAI“ ausführen.\nUnd der Grund, warum wir den\nOpenAI-Provider hinzufügen werden, ist, um\ndie Werkzeugdefinition für etwas zu erhalten, das als\nProvider-Tool bezeichnet wird.  Es gibt im\nWesentlichen drei Arten von Werkzeugen.  Es gibt\nspezielle Werkzeuge, und ich kann\ndas hier tatsächlich finden, weil es\nmir sehr hilft.  Es gibt also drei\nArten von Werkzeugen.  Sie verfügen über maßgeschneiderte Werkzeuge, also\nWerkzeuge, die Sie\nselbst definieren.  Sie geben eine Beschreibung,\nein Eingabeschema und\neine Ausführungsfunktion an.  Dies\ngibt dem Agenten im Grunde die Möglichkeit,\njede beliebige Funktion auszuführen,\ndie Sie ihm basierend auf dem\nKontext des Gesprächs zuweisen möchten.  Äh, dann\nhaben wir anbieterdefinierte Tools.  Die sind ja\nrecht interessant.  Dies sind Werkzeuge, deren\neffektive Nutzung ein LLM-Anbieter seinen Modellen in der Regel nachträglich beibringt.\nAnthropic hat also so etwas wie ein Bash-Tool, dessen\nNutzung – zusammen mit all dem subventionierten Cloud-Code –\nsie\nviel besser zu beherrschen lernen.  Ähm, sie haben auch ein\nTool für die Computernutzung.\nDie Idee dahinter ist also, festzulegen, was der\nAgent tun soll, wenn er die Funktion aufruft. Dabei wurde aber auch\nsehr viel Wert auf die\nBeschreibung und das Eingabeschema gelegt, um\nsicherzustellen, dass der Agent die Funktion auch wirklich effektiv\naufruft.  Der letzte Typ ist „vom\nAnbieter ausgeführt“, und das sind Tools,\ndie in der\nInfrastruktur des LLM-Anbieters vorhanden sind.  Das\nklassische Beispiel hierfür ist die Websuche, genauer gesagt ein\nWebsuchtool.  Anthropic verfügt auch über eine\nWebsuchfunktion.  Sie\nstellen weder das Tool selbst noch die Vorgehensweise\nbei dessen Aufruf bereit, sondern ermöglichen es\ndem LM-\nAnbieter gewissermaßen, es zu verwenden.  Und wenn\nder Agent sich entscheidet, es zu verwenden, wird er\nes buchstäblich auf seinem Server ausführen,\ndas Ergebnis des Tools dem Nachrichtenstatus hinzufügen\nund Ihnen alles zurücksenden\n.  Das wirklich Schöne daran ist also,\ndass wir keinen weiteren\nCode schreiben müssen, es ist bereits standardmäßig enthalten.  Der\nNachteil dieser vom Anbieter ausgeführten\nTools ist, dass man offensichtlich an einen\neinzigen Anbieter gebunden ist.  Aber für heute, für diese\nDemo, ist das kein so großes Problem und\nerlaubt uns, recht schnell voranzukommen.  Äh, und\nwas passiert also, wenn wir\nhier den OpenAI-Provider importieren?\nWir verwenden ihn im Grunde nur, um\nunsere Anfrage, die letztendlich an OpenAI geht, zu erweitern und das\nOpt-in-\nFlag hinzuzufügen, z. B.: „Ich möchte das Web-Suchtool\neinbeziehen.“  Ähm, das\nwerden wir also in unsere Definition,\nunsere Agentendefinition, aufnehmen.  Und Sie werden sehen, dass wir auch\nunsere Anweisungen entfernen.  Und das war's eigentlich schon\nfür uns.\nIch muss auch noch den Entwicklungsserver starten,\nppm rundev, aber jetzt kann ich\nzu meinem Agenten zurückkehren und fragen: Wann ist der\nAIE London AI Engineer Summit London? Ich\nglaube, so heißt das. Dann folgt\neine lange Pause und eine schreckliche Benutzeroberfläche, aber\nschließlich sollte unsere Antwort\nhier eintreffen. Unsere erweiterten Kontakte\nsind ein nutzloser Bot, wenn man so will, in der alten,\narchaischen Sprache.  Ähm, aber unser Agent\nhat jetzt die Möglichkeit,\nrelevante Kontextinformationen über die Websuche abzurufen und einzubinden.  Und\nes gibt ein paar coole Dinge, die wir\nhier machen können.  Äh, wenn man ein Objekt an dieses ähm ...\nUnd so\nkönnen Sie sagen: Ich benutze einfach den äh\nSprachserver, um mir hier ein bisschen helfen zu lassen.  Aber ich\nkann sagen, dass wir in London sind.\nÄh, und das ermöglicht es Ihnen vielleicht, herauszufinden,\nwann der AI Engineer Summit stattfindet?  Wir\nschließen London also nicht ein und werden dadurch theoretisch\nstärker auf London ausgerichtet sein.  Ja, bitte schön\n.  Dieser zusätzliche Kontext bzw.\ndiese Parameter werden nun also\nan OpenAI in der Anfrage übergeben, die\nletztendlich an OpenAI gesendet wird.\nÄh, das ist ja cool! Wir haben jetzt eine Möglichkeit,\nunseren Kontext zu erweitern, und wir haben\nunserem Agenten sein erstes Werkzeug zur Verfügung gestellt.\nÄhm, aber das Problem ist, dass wir, wenn wir\ndas nochmal zeigen – wann ist denn der AI Engineer\nSummit? – ihr habt das doch schon gesehen.  Äh, ich\nglaube, was habe ich getan?  Wenn es um KI geht,\nist derzeit nichts in\nder Benutzeroberfläche sichtbar.  Der Benutzer hat also keine Ahnung,\nwas vor sich geht, und der Agent durchläuft gerade\nmehrere Schritte\nund ruft ein Tool auf.  Was wir also\neigentlich tun wollen, ist,\nunseren Markup-Code in dieser\npage.tsx-Datei zu rendern.\nWir möchten für verschiedene Zwecke rendern,\näh, wir möchten\nbeschreiben, was in der\nBenutzeroberfläche gerendert werden soll, wenn verschiedene Tools verwendet werden,\ninsbesondere wenn unser Tool Websuche verwendet wird.\nAlso, wir könnten hier reingehen und „\ncase“ sagen, und dann folgt das AI SDK\ndieser Konvention, dass man ein Präfix von „\ntool“ angibt und dann den\nNamen des Tools.  Wir würden also zu unserem\nAgenten gehen und dort sehen, dass es sich um eine Websuche handelt.\nWir würden also sagen: „Tool Websuche“ und dann\ndefinieren wir hier eine Art Auszeichnungssprache, zum Beispiel: „\ndiv\nWebsuche“.\nMein Gott, ich tippe schon wieder! Ich habe seit Monaten nicht mehr getippt\n.  Und Sie können jetzt sehen, dass unser\nAgent die Websuche aufgerufen hat.  Ähm, aber dieser\nProzess ist furchtbar.  Was wäre, wenn wir beispielsweise\nsehen wollten, was der p-Wert ist\n?  Hier wird wahrscheinlich eine Anfrage gesendet, die\njedoch als unbekannt typisiert ist\n.  Das ist hässlich.  Das wollen wir nicht\ntun.  Ähm, also hier werde ich das alles\nlöschen.  Deshalb habe ich\nes abgetippt, und es steht nicht auf der Seite.  Hier werden\nwir eine weitere\nwirklich großartige Komponente des AI SDK nutzen, nämlich das von\nuns entwickelte End-to-End-Typisierungssystem.  Die grundlegende Annahme, die\njeder Entscheidung im Bereich der KI-SDK-API zugrunde liegt,\nist, dass wir die\nAgentendefinition als die Quelle der\nWahrheit haben wollen, von der alles andere erbt\nund abgeleitet wird.  Deshalb verbringen wir viel\nZeit damit, bei den Tool-Aufrufen in der UI-\nBibliothek sicherzustellen, dass alles\nreibungslos abläuft.  Äh, und wo wir anfangen müssen,\nist die atomare\nZustandseinheit unserer Anwendung, nämlich\ndie Nachricht.  Ähm, und so können wir eine\ntypisierte Nachricht erhalten, indem wir diesen Typ-Helper verwenden, um die\nAgenten-UI-Nachricht abzuleiten.  Äh, also\nkehren wir zu unserer\nAgentendefinition zurück und übergeben den Typ unseres\nAgenten.  Diese Agenten-UI-Nachricht ist nun\nvollständig typsicher, basierend auf den von\nuns übergebenen Tools.  Ähm, und wenn wir jetzt\nzum Routen-Handler gehen, können wir\nden Routen-Handler aktualisieren, um anzuzeigen, dass\ndie eingehenden Nachrichten\nvon unserem benutzerdefinierten UI-Nachrichtentyp sind.  Aber am\nwichtigsten ist, dass wir jetzt zur\nSeite zurückkehren und „Chat verwenden“ eingeben können, während\nmeine Agenten-UI-Nachricht angezeigt wird.\nUnd was Sie also bemerken werden, sobald Sie\ndas getan haben und das aus unserer\nLib-Agent-Datei importiert wurde.  Wenn wir also wieder nach unten scrollen\nund die verschiedenen Teiletypen überprüfen\n, werden wir sehen, dass wir\nhier jetzt unser Web-Suchtool haben sollten.  Und wenn Sie\nhier reingehen und nach\nden Eingabe- und Ausgabetypen suchen, werden Sie sehen,\ndass sie typisiert sind, was sehr cool ist.\nIch werde Sie also nicht damit langweilen,\nspontan eine Komponente zu entwerfen und zu erstellen, da ich überhaupt nicht designen kann\n.  Ähm, und ich glaube, keiner von uns entwirft heutzutage noch irgendetwas von\nHand.\nAber wenn wir einen Schritt zurückgehen, werden Sie sehen, dass wir jetzt\neine schöne Komponente für unsere\nWebsuche haben.  Und wir können das\nnoch einmal versuchen und sagen: Wer ist Nico Alanz?  Tut mir leid, das war etwas\negoistisch.  Aber, ähm, jetzt können Sie\nsehen, dass unsere Komponente diesen ausstehenden\nStatus hat, was in der Zeile wirklich cool ist.  Äh, und\nwas kommt als Nächstes?  Das hat\nunseren Kontext erweitert.  Nun zu dem, was\nich für die interessanteste\nKomponente halte, die auch 2026 noch relevant sein wird: die\nBereitstellung eines Computers mit\neiner Sandbox für unseren Agenten zur Interaktion.  Um kurz\ninnezuhalten: Wir haben gesehen, wie sich das\nintern richtig durchgesetzt hat. Wir\nhaben einen Agenten namens DZero, der\nZugriff auf all unsere Chat-\nDaten hat, über die wir sprechen, und der\nZugriff auf so ziemlich das gesamte Versel-\nBackend, unser gesamtes Admin-Panel,\nganz Salesforce und all diese\nDinge hat.  Äh, und die Idee dabei war, dass\nunser Leiter der Datenabteilung, der wollte, dass unser System durch das ständige Taggen\nin allen möglichen Umgebungen zerstört wurde,\neinen\nErsatz-Slackbot wollte, der all das kann\nund gleichzeitig sein Team beim Skalieren unterstützt\n.  Und es gab einen wirklich interessanten\nPunkt, an dem es von der Idee, einen\nAgenten mit all diesen\nTools zu haben, der vielleicht fünf oder zehn davon gleichzeitig nutzt\nund eine etwas halluzinatorische Antwort zurückgibt, zu dem Punkt überging, an dem\ner ein Dateisystem und\nAnweisungen hinzufügte, die besagten: Okay, für\njede einzelne Arbeit, für jede Sitzung,\ndie Sie durchführen, gibt es eine Art Notizblock\nim Dateisystem, in dem Sie\neinen ersten Plan speichern, der als\nReferenz dafür dient, was\nSie in jedem Schritt genau tun sollten, und\ndann gibt es ein Verzeichnis für\nIhre Recherchen, in dem Sie alles sammeln.\nUnd dort geschahen zwei Dinge\n.  Zum einen, so als ob der\nAgent tatsächlich\nAufgaben vollständig durchgearbeitet hätte,\nweil die\nDinge nicht einfach in\ndiesem wahnsinnig langen Kontextfenster übereinander geschichtet wurden, wo\ndas ursprüngliche Geschehen verworfen wurde\n.  Wie in den\nAnweisungen beschrieben, sollte man diese Plandatei erstellen,\nund in dieser Plandatei stand ganz\noben das Ziel, und direkt\ndarunter die Anweisungen: „Folgen Sie\ndieser Plandatei genau und haken Sie die Punkte ab,\nwährend Sie sie erledigen.“ Und plötzlich\nhat man dieses faszinierende Ding, bei dem der\nAgent liest, sich einarbeitet und sich Schritt für Schritt daran\nerinnert: „\nOkay, das ist mein Ziel“, und so\nbleibt er besser auf Kurs, und am\nEnde erhält man dieses wirklich großartige Artefakt,\ndas genau zeigt, was der Agent getan hat und\nwelche Arbeit darin steckte.  Und so war es sozusagen dieses\nemergente Verhalten, das wir\nbeobachteten, bei dem die\nKombination dieses Dateisystems, egal ob es sich um\neinen kompletten Computer oder nur ein virtuelles\nDateisystem handelte, sehr, sehr gut funktionierte.\nWir haben das jetzt also bei so ziemlich\njedem Agenten beobachtet, den wir intern entwickeln.\nWir haben einen Agenten für das GTM-Team.  Äh,\nwir haben einen Agenten, wie gesagt, den Datenagenten\n.  Ähm, wir haben einen Kundendienstmitarbeiter,\nder die Anzahl unserer Kundendiensttickets\num etwa 90 % reduziert hat, wobei ich glaube, dass 95 % der\nLeute tatsächlich \"\nDanke, danke\" gesagt haben, was wir\nvorher noch nie erlebt haben.  Alle diese Systeme basieren auf einem solchen\ndateisystemgestützten Agentenansatz\n.  Und genau das\nwollte ich heute präsentieren.  Ähm, wir werden\nfür diese Versel-Sandbox ein Verscell-Produkt verwenden,\nund ich habe\nim Laufe der Jahre schon viel mit verschiedenen Sandboxes gebaut\n.  Und es gibt da etwas richtig Cooles,\ndas gerade erst auf den Markt kommt und sich noch in der Beta-Phase befindet.\nEs heißt Sandboxes, genauer gesagt\npersistente Sandboxes, und ich glaube, ich habe\nsie hier oben.  Äh, und genau das werden\nwir\nheute nutzen.  Eines der Probleme, die man\ngenerell mit Sandboxes hat, ist, dass sie,\nsofern man sie nicht auf dem eigenen Computer verwendet, im\nGrunde genommen ephemer sind, richtig?\nOb ein Anbieter nun eine Sandbox anbietet,\ndie 30 Tage oder nur fünf Stunden laufen kann – am\nEnde ist alles erledigt.  Und so überlegten wir,\nwie wir\ndiese Herausforderungen bewältigen könnten.  Und das Team entwickelte schließlich\ndieses wirklich\ncoole Konzept, dass jede Sandbox einen\nNamen hat und dass jede Sandbox\nSitzungen haben kann, wobei Sitzungen einfach Instanzen\ndieses zugrunde liegenden Sandbox-Elements sind, das wir so\nnennen können.  Und jedes Mal, wenn Sie in\nIhrem Produkt oder in Ihrem Code\neine Sandbox verwenden möchten, referenzieren Sie diese über ihren Namen.\nIm Hintergrund prüft Verscell dann\nentweder, ob\nfür diese Sitzung eine aktive Instanz existiert und leitet Sie dorthin weiter,\noder es wird optimistisch eine neue Instanz gestartet\nund Sie dorthin weitergeleitet.\nIn Ihrem Code vereinfachen Sie also die gesamte\nLebenszyklusverwaltung der Frage: Läuft mein Computer? Auf\nwelchen Computer soll ich verweisen?\nIch habe geschrieben, dass wir es zeigen werden, wenn ich am Ende Zeit habe,\netwas, woran ich gearbeitet habe, nämlich\nein komplettes\nLebenszyklusmanagementsystem, bei dem ich\nbuchstäblich\nnach jeder einzelnen Anfrage das gesamte Dateisystem gelöscht und\ndann in einem Blob gespeichert und dann ein\nneues gestartet habe. Es war schrecklich, und das hier\nist einfach so viel einfacher.  Wir werden\nheute also zu folgendem Punkt kommen:\nIch hasse es, das Bild der offenen Klaue zu verwerfen,\naber wir werden einen\nspeziellen Computer haben, auf den wir bei\njeder\neinzelnen Anfrage zurückgreifen können.  Und im Hintergrund wird Folgendes\npassieren: Verscell\nwird das System nach einer gewissen\nZeit der Inaktivität herunterfahren, aber es wird ein\nSnapshot des Dateisystems erstellt.  Der Zustand\nbleibt also gleich, und bei\nnachfolgenden Anfragen wird ein\nneuer Zustand mit diesem gespeicherten Zustand erstellt.\nEs fühlt sich also im Grunde wie genau\ndieselbe Maschine an, was wirklich cool ist.  Ähm,\ndas befindet sich momentan noch in der Beta-Phase.  Äh, aber ich\nnutze es schon sehr oft und es funktioniert\nwirklich sehr gut, und wir haben noch viel\nmehr in der Pipeline.  Als Erstes werden wir also\nspringen.  Gibt es bis jetzt irgendwelche Fragen\n?\nJa, natürlich.   Ja\n.   Ja\n, super.  Ähm, also die Frage, weil\nich nicht weiß, ob das Mikrofon es aufnimmt, ist:\nSenden Sie für jede Agentenanfrage die gesamte\nHistorie?\nIch glaube, das ist die Standardeinstellung\nbeim Chat.  Ja.  Das ist also die\nStandardeinstellung, die sich hier befindet.  Bei\njeder einzelnen Anfrage mit der Funktion \"Nachricht senden\" wird\ndie gesamte Nachrichtenhistorie des jeweiligen\nPfades an Ihren\nAgenten gesendet.  Ähm, jetzt werden Sie immer\nsenden wollen, oder\ndas ist eine gewagte Behauptung.  Äh, Ihr\nNachrichtenverlauf ist Ihr Kontext,\nrichtig?  Gehen Sie in diese Angelegenheit mit Ihrem\nAgenten.  Und deshalb will es immer\netwas\nGrößeres sein, richtig?  Sie können so viel von Ihrem\nKonversationsverlauf speichern, wie Sie möchten,\naber all diese\nNachrichten jedes Mal per E-Mail zu senden, ist nicht wirklich\netwas, was Sie tun werden.  Das\nklassische Vorgehen besteht also darin, hier nur die\naktuellste Nachricht zu senden.  Und das können Sie\nin Ihrem Client mit äh\nprepare machen.  Ich glaube, es steht in der...\nIch programmiere nicht mehr, deshalb kann ich mich nicht mehr an\nden Namen erinnern.  Äh, es befindet sich\nwahrscheinlich im Transportmittel, das ist neu.\nUnd dann haben wir äh hier drin, wo ist es denn nun?\nOh, wir importieren nichts von KI\naus KI.  Äh, ich zeige es Ihnen nur ganz\nkurz.  Eigentlich\nsollte ich es Ihnen einfach in der\nDokumentation zeigen.  Das ist sogar noch besser.  Ich weiß nicht, warum\nich das alles hier überhaupt tippe.  Im\nPrinzip werden wir hier Folgendes tun: Sie\nkönnen festlegen, dass nur die neueste\nNachricht gesendet wird, dann rufen Sie alle\nNachrichten auf dem Server in Ihrem\nEndpunkt ab, fügen diese zusammen und\nsenden sie an das Modell.  Aber ich\nglaube, dass du dich eher auf den\nKontext konzentrierst,\nrichtig?  Sie möchten\ndem Modell keine alten, irrelevanten Daten senden,\nrichtig?  so etwas wie Kontext-Engineering, also das\nAussortieren von Inhalten und das Entfernen von\nDingen.  Gehst\ndu dorthin oder\nja?  Ähm, da wird es dann\nschwieriger.\nMit dem\nSDK ist es einfacher, aber es erfordert Kompromisse und\nEntscheidungen seitens des Entwicklers,\ndie wir vom Framework aus nicht unbedingt vorgeben\n.  Es gibt also ein paar\nVorgehensweisen, die Sie hier anwenden können.  Sie\nbasieren alle oder die meisten von ihnen\nbasieren auf der Verwendung von zwei Dingen.  Zum einen\ngeschieht im Hintergrund unseres Endpunkts Folgendes:\nWir nehmen unsere UI-Nachrichten\nund verwenden eine Funktion namens „\nconvert to model\nmessages“, die viele\nUI-\nspezifische Informationen wie Zeitstempel, IDs und ähnliches entfernt\n.  Aber auch unter der\nHaube kann man das, glaube ich, so definieren, dass\nbestimmte Dinge ignoriert werden, Datenteile\nin andere Strukturen umgewandelt werden, um den\nKontext der eingehenden Daten zu verändern. Im\nAllgemeinen besitzt man also die Kontrolle über die\neingehenden Nachrichten. Wenn man also\nNachrichten mappen und durchlaufen möchte, z. B. mit der Meldung „\nm.artsinccludes“,\nwie funktioniert das, wenn es ein Tool gibt, das man\nmit diesem Namen aufruft? Dann wird die Eingabe erst richtig interessant.   Um\nwelchen Typ handelt es sich hier?  Im Prinzip\nkönnen Sie das durchgehen und definieren, zum Beispiel so, dass\nich diesen Toolaufruf entfernen möchte\n.  Das kannst du auf jeden Fall machen.  Die\nVorgehensweise, die wir bei\ngrößeren Codebasen beobachten, besteht darin,\neine Funktion zu verwenden, die wir preparestep genannt haben\n.  Und das alles geschieht, bevor wir\nalles berücksichtigen, was\nbei unserer vorherigen Websuche passiert ist.  Es funktioniert\nwie ein Agent; wir senden eine Nachricht, die\neine neue Assistentennachricht auslöst.  Im ersten\nSchritt dieser Assistentennachricht wurde eine\nWebsuche aufgerufen und anschließend zurückgesendet. Im\nGrunde hat die Agentenlaufzeit den gesamten\nKontext erfasst und dann entschieden, was als\nNächstes zu tun ist.  Und es hätte\nwieder die Websuche nutzen können, den\nComputer, was auch immer, aber jeder\ndieser Schritte ist wie ein einzelner Schritt.\nMit dem AI SDK können Sie sich einklinken. Es\ngibt eine Callback-Funktion, die vor\njedem einzelnen Schritt ausgeführt wird und\nIhnen ermöglicht, alle Parameter des\njeweiligen Schritts zu ändern.  Was bekommt\nman also hier drin?  Sie erhalten Informationen zu den\nNachrichten, dem Kontext, dem\nverwendeten Modell, der Schrittnummer und allen weiteren\nSchrittdaten, also was\npassiert ist.  Und hier kann man dann\nbuchstäblich jeden dieser Parameter der obersten Ebene zurückgeben\n.  Man könnte also einen\nvöllig anderen Nachrichtenstatus zurückgeben, zum Beispiel\nwenn die\nSchrittnummer größer als 20 ist; dann\nkönnte man im Grunde einfach erfassen, wo sie sich befindet.\nDies sind die aktuell\naktiven und laufenden Nachrichten.  Man könnte sagen, die\nNachrichten werden aufgeteilt und nur die letzten\nfünf werden genommen.  Auf diese Weise haben Sie nun\nzu Beginn jedes einzelnen\nSchrittes einen gleitenden Filter, der\nnur die fünf aktuellsten\nNachrichten berücksichtigt.\nDas ist ein sehr interessantes, langes Thema, in\ndas wir uns vertiefen können, denn\nich habe darüber schon viel nachgedacht.  Äh,\nich hatte Casper vorhin erzählt, dass ich seit\nein paar Monaten an einem Codierungsagenten arbeite, und\ndass ich ihn gestern zum Laufen gebracht habe.\nIch frage mich, ob ich das\ngenaue Foto finden kann, aber er lief 104\nMinuten lang in einem einzigen Durchgang.  Äh, mal\nsehen, ob wir die genauen Daten haben,\ndamit ich Ihnen beweisen kann, dass das alles meine sind\n. Ich glaube, es war genau hier.  Ja.\nEs lief 104 Minuten, verwendete 316 Tool-Aufrufe,\nänderte 29 Dateien und nutzte nur 32 % des\num Kontextfensters von GPT54.  Ich habe hier keine\nVerdichtung aktiviert.  Und ich glaube,\ndas ist heute eine ziemlich gewagte These,\nweil jeder seine eigenen\nSysteme hat. Ich hatte zuvor\nTool-Aufrufe entfernt, die weiter oben\nin der Nachrichtenhistorie standen,\nsobald ich einen bestimmten Schwellenwert erreicht hatte, damit ich\nzwischen 40 % und 60 % des\nToken-Fensters oder des Kontextfensters blieb.  Ähm,\naber dabei tritt ein wirklich großes Problem auf:\nSie\ninvalidieren jedes Mal den Eingabecache\n.  Ähm, ich\nglaube, das ist so ein „Oh\nScheiße“.  Ja.  Na klar.  Ähm, aber\nes war wichtig, als die Token-Fenster,\nglaube ich, bei etwa 400.000 lagen.  Als ich also die\nersten Hauptmodelle erstellte,\nverwendete ich Opus mit, glaube ich, dem 400k-\nToken-Fenster und GPT53 Codeex, beide mit 400k-\nToken-Fenstern, sodass man die\n40% ziemlich schnell erreichte, aber mit diesen\nMillionen-Token-Fenstern\nsehe ich kein so großes Problem mehr.\nWas ich stattdessen dafür baue, ist eher eine Kombination aus\nzwei Dingen.  Eine umfassendere Möglichkeit wäre, dass\nich hier Unteragenten implementiert habe, worüber\nwir auch ausführlich sprechen könnten. Dabei werden\ndedizierte, weitgehend unabhängige Aufgaben vom Hauptkontextthread ausgelagert und\nanschließend beispielsweise\ntausend Tokens – die Zusammenfassung des\njeweiligen Ziels – zurückgegeben und wieder\nin den Hauptkontextthread eingebunden. Das ist also eine\neffiziente Nutzung des Kontextfensters in einer\nSitzung.  Ähm, aber auch ein\nspezielles Werkzeug zu haben.  Die Leute bei\nAMP haben das auf eine wirklich coole Art umgesetzt: Sie\ngeben dem Agenten ein Übergabetool, mit dem der\nAgent zu einem bestimmten Zeitpunkt\neine Art Kontext generieren kann, den er\nan einen völlig neuen Thread übergeben möchte. Dieser Thread\nwird dann quasi zum\nHauptthread für den Start.  Und so habe ich das Gefühl, dass, je weiter\nman in den\nBereich der Subagenten vordringen kann, dies der Fall ist, weil diese\nZusammenfassung, diese Komprimierung durch\nAgentenzusammenfassung oder durch LLM-Zusammenfassung,\nverlustbehaftet ist.  Wie Sie gesehen haben, gab es diesen\nberüchtigten Twitter-Thread von, ich glaube,\nder Leiterin der KI-Abteilung bei\nMeta AI, die eine Frau fragte, ob sie E-\nMails\nvom Vortag archivieren könne, und daraufhin wurde ihr\ngesamter Posteingang gelöscht. Sie bat darum, damit aufzuhören, aber das Programm antwortete: „\nNein,\nSie haben mich darum gebeten, ich mache weiter.“\nDer Grund dafür war, dass\nso viele E-Mails\ndurch ein ineffizientes Tool importiert worden waren.\nFüge das ein. Dadurch wurde die\nautomatische Komprimierung ausgelöst\nund die E-Mails überfluteten ihre ursprünglichen\nAnweisungen.  Und damit war ihre ursprüngliche\nAnweisung, die lautete: „Tu das nicht“, hinfällig\n.  Und genau das ist es, was mir große Sorgen bereitet:\nIch habe kein besonders gutes\nSystem.  Ob Sie nur die\nBenutzernachrichten behalten und alles andere entfernen.\nIch weiß nicht.  Aber das ist jetzt mein langer Exkurs\n.  Ich kann das noch etwas genauer ausführen\n.  Mein Hauptargument\nist, dass ich, obwohl ich\nmeinen Coding-Agenten in den letzten vier Monaten 14 Stunden am Tag\nfür jede einzelne Arbeit benutzt habe, die\nKomprimierung\nnicht als Problem für mich empfunden habe.  Ähm,\nund wie ich Ihnen vorhin schon gezeigt habe,\nhabe ich da auch eine Cache-Token-Leserate von 95 %\n.  Und das ist für mich sowohl\nin Bezug auf\nGeschwindigkeit und Leistung als auch auf die Kosten wertvoller.  Aber das ist ein\nsehr, sehr langatmiges Thema,\nund darauf können wir auch noch genauer eingehen\n.  Aber so kann\nman den\nKontext zwischen den Schritten manipulieren.  Und zu guter Letzt\nmöchte ich noch erwähnen, dass\nwir bei der Entwicklung dieser\nAPI sehr bewusst Wert auf Funktionalität gelegt haben, richtig?  Dies\nist eine Funktion, die bei jedem einzelnen\nSchritt ausgeführt wird, anstatt beispielsweise ein\nneues Nachrichtenarray zurückzugeben und\ndieses anschließend für die weiteren Schritte zu speichern.  So\nist es sehr einfach zu verstehen, denn\nes handelt sich um eine leere Funktion,\ndie bei jedem einzelnen Aufruf neu startet.\nDie hier eingehenden Nachrichten sind die\nzusammengefassten Nachrichten aus dem gesamten System.\nUnd es gibt Ihnen auch die Möglichkeit, wenn Sie\nganz am Ende durchhalten, dass\nSie am Ende die vollständige Nachrichtenhistorie erhalten\n.  Entschuldigung.  War das\nhilfreich?\nCool.  In Ordnung.  Ähm, und das ist auch gut so,\ndenn ich weiß, dass ich hier eher\ngrundlegende Dinge mache und ihr das ja\nschon benutzt habt.  Also, bitte unterbrechen Sie mich nicht\nmit solch interessanten Fragen.\nIch plaudere gerne.  Ähm, also,\njetzt kommen wir zum spaßigen Teil.  Wir haben, glaube ich,\ndie Betaversion installiert, richtig?  Äh nein, das haben wir nicht.\nWir werden also nun den\nBefehl pmppm add\nversel sandbox at beta ausführen.\nUnd dann werden wir eine neue\nBibliotheksdatei\nnamens sandbox.ts erstellen.\nUnd wie ich bereits zuvor bei\ndiesen persistenten Sandboxes erklärt habe, werden wir\neinfach eine Funktion erstellen, die\ndiese Funktionalität nutzt.  Wir übergeben also\neinen Namen, und dann wird geprüft,\nob diese Sandbox existiert.  Falls ja,\nwird dieser Wert zurückgegeben.  Andernfalls wird sie\nerstellt und diese Sandbox-\nInstanz zurückgegeben.\nÄh, das haben wir also eingerichtet.\nDas ist jetzt etwas Neues, das wahrscheinlich\nkeiner von euch je gesehen hat, wenn ihr\nAISK6 noch nie benutzt habt.  Wir haben also\nden Tool-Loop-Agenten verwendet und ihn\neinfach so aufgerufen: `pass in\nour agent pass in our messages`. Aber nur sehr\nselten ist der Kontext das Einzige, was\nin Ihrem Agenten dynamisch ist. Oft gibt es\nverschiedene strukturierte Eingaben, die das Verhalten\nIhres Agenten beeinflussen sollten. Nehmen wir zum Beispiel\neinen klassischen\nKundensupport-Agenten. Eine der wichtigsten Eingaben ist\ndie Kunden-ID und der\nKundentyp, z. B.\nUnternehmen oder Hobbykunde (bei\nVersacell). Das Verhalten des\nModells kann sich dann entsprechend ändern. Wenn\nSie ein System für\nHunderttausende von Nutzern betreiben – vielleicht sind Sie eine\nFluggesellschaft oder im Reisesektor tätig – oder im Baugewerbe (\nReisen funktionieren, nehmen\nwir das mal als Beispiel) – stellen Sie sich vor, Sie sind\nBritish Airways und haben einen Chatbot,\nmit dem Sie täglich Hunderttausende von Kunden bedienen.\nVielleicht möchten Sie einem Mitarbeiter im Kundenservice (dem sogenannten „Blue Member“)\nGPT54 mini zur Verfügung stellen.  Für\nGold-Mitglieder empfiehlt sich hingegen ein GPT54\nPro oder etwas Ähnliches.  Dies sind\nstrukturierte Eingaben, die\ndas Verhalten grundlegend verändern und erweitern\n.  Und die Art und Weise, wie wir\ndas früher gemacht haben, war so etwas wie funktionaler Stil.\nMan würde sagen, man erstellt einen Agenten, und man hätte eine\nArt Eingabe, die das Verhalten\nändern würde. Man hätte hier seine Eingabe, die\nletztendlich das\nVerhalten ändern würde, und man verwendet if-Anweisungen\nund all das. Wir haben das gesehen\nund dachten, dass dies\neinige Leute online frustriert, was mir nicht\nbewusst war. Das sind\nAnrufoptionen, sie ändern die Art und Weise, wie das Modell funktioniert. Es sind\nOptionen, die man beim Anruf übergibt und die das Verhalten des Modells beeinflussen. Und diese Optionen\nlassen sich über\nein Anrufoptionsschema definieren, das\nman an die Agentendefinition übergibt.\nIch werde also den gesamten Code\nhierher kopieren.  Und ich werde vielleicht einiges davon weglassen,\ndamit es leichter zu erkennen ist.  Dann werden\nwir das wohl abschließen und uns\nnur noch auf das Call-Option-Schema konzentrieren.\nWir wollen also, dass unser Agent, der\nwie dieser Agent mit einem Computer funktionieren soll,\nbei jedem Aufruf eine Sandbox einbindet\nund\nmit dieser Sandbox interagiert.  Wir\ndefinieren also ein zod-Objekt für unsere\nerwarteten Aufrufoptionen und es wird eine\nInstanz unserer Sandbox-Klasse aus der\nVersel-Sandbox sein.\nWir können dieses Aufrufoptionsschema dann\nin unsere Tool-Loop-\nAgentendefinition einfügen.\nUnd wenn wir unseren Weg gehen,\nkönnen Sie in der Stream-Antwort unserer Agenten-Erstellungs-UI sehen\n, dass es einen Optionsschlüssel gibt.  Und\ndarin haben wir nun dieses typsichere\nOptionsobjekt, das wir übergeben müssen.\nMan sieht, dass hier ein Fehler auftritt.  Unsere\nOptionen setzen eine Testumgebung voraus.\nHallo.   Keine\nSorge.  Ich wusste nicht, dass du das hast.\nOkay.  Ja.  Ja.  Ähm,\nwir haben also unser Call-Option-Schema.  Jetzt müssen\nwir tatsächlich etwas\nmit unseren Anrufoptionen anfangen.  Und was wir\nhier tun werden, das wird jetzt noch\nnicht besonders viel Sinn ergeben\n, aber das wird sich im Laufe der Zeit ändern.  Wir\nmöchten, dass unsere Sandbox\ninnerhalb unserer Agentenlaufzeit für jedes Tool verfügbar ist\n.  Und wir werden das\nmit einem etwas komplexeren Begriff tun, der hier als\nKontext bezeichnet wird, und zwar\ninnerhalb der AI SDK Agent Runtime.\nDer Kontext ist insofern\nähnlich, als er eher dem React-Kontext als dem\nAgentenkontext entspricht.  Wenn Sie also\nmit dem React-Kontext vertraut sind, haben Sie einen Provider,\nund jede Komponente innerhalb dieses verschachtelten\nKomponentenbaums kann auf beliebige\nWerte innerhalb dieses Providers zugreifen.\nDie Grundidee ist also, dass Sie\nbeliebige\nDaten, Variablen, Funktionen oder was auch immer\nan dieses Objekt übergeben können und dann\nin der Laufzeit Ihres Tools\nin den Ausführungsfunktionen darauf zugreifen können.\nWir legen also fest, dass unser\nAgent nun erwartet, dass bei jeder Nutzung eine Sandbox geladen wird\n.  Und dann wird\nbeim ersten Aufruf diese\nVorbereitungsfunktion ausgeführt.  Es wird nur\neinmal ausgeführt, und zwar beim ersten Aufruf unseres Agenten\n.  Und dann wird diese\nSandbox aus den Aufrufoptionen entfernt und\nin unseren Laufzeitkontext eingefügt.  Dieser\nLaufzeitzustand, der über Agentenaufrufe hinweg besteht\n.\nEntschuldigung, das betrifft nicht die Auswirkungen auf\nden gesamten Agentenlauf innerhalb aller\nSchritte.  Das ist also die wichtigste\nSache.  Ähm, und ich weiß, das ist im Moment\neine Menge.  Wir werden es gleich sehen\n.  Das wird viel sinnvoller sein.\nÄhm, weil wir unser\nerstes Werkzeug definieren werden.\nWir werden also ein Tool\nnamens „tools“ in einer Datei namens tools.tcs definieren,\nund zwar ein Bash-Tool.\nWir sind mittlerweile der festen Überzeugung, dass Bash alles ist, was\nman braucht.  In vielen Fällen sind diese Agenten\nwirklich sehr gut im Schreiben von Bash-\nBefehlen.  Und deshalb werden wir für diese\ngesamte Sitzung nur\ndieses eine Tool Bash verwenden, das\nalles für uns erledigen wird.  Wie definiert man also\nein Tool mit einem SDK?  Ihr habt\nASK alle schon einmal benutzt, aber es besteht aus drei\nKomponenten.  Die Beschreibung ist extrem wichtig, man kann\nes gar nicht genug betonen.  Dies ist es, was\ndas Modell verwendet, um zu entscheiden, ob\nIhr Werkzeug eingesetzt wird, und es kann auch Einfluss darauf haben, wie\nIhr Werkzeug eingesetzt wird.  Dann das Eingabeschema – das\nist offensichtlich das, was das Tool\nzum Ausführen benötigt.  Und dann haben wir die\nAusführungsfunktion. Dies ist der Code,\nder jedes Mal ausgeführt wird, wenn\nder Agent ihn verwendet.  Und nun wird deutlich,\nwo der Kontext ins Spiel kommt. Es handelt sich um ein\nArgument des zweiten\nArguments der execute-Funktion, das\nSie in Ihrem Tool zur Laufzeit abrufen können, um auf jeden beliebigen\nLaufzeitzustand zuzugreifen und dann Befehle auszuführen.  Das Besondere an\nIhrem Tool ist also, dass es quasi völlig\nunabhängig von dem\nAgenten ist, mit dem es interagiert, aber\ndiese Eingabe erwartet und sie dann\nverwenden kann.  Und wir haben ein cooles Update für\nAISDK7 in der Pipeline, das tatsächlich eine Typisierung für\nden Kontext hinzufügt und den\nHauptkontext auf dem Agenten der obersten Ebene typisiert.  Wenn\nSie also ein Tool einbinden, das\neine Art Kontext erwartet, wird\nin Ihrer Agentendefinition ein Fehler ausgelöst, der\nbesagt, dass Sie\ndies bereitstellen müssen, was wirklich cool ist.  Ähm,\nund das ist eine direkte Folge davon, dass ich\nLars drei Monate lang genervt habe, weil ich\ndieses Schnittmuster ständig benutze.  Ähm, aber im\nHintergrund läuft es so ab, dass wir\nbuchstäblich die Sandbox\naus dem Kontext herausziehen, unseren vom\nAgenten generierten Bash-Befehl ausführen und\ndann alle\nFehler und den Exit-Code zurückgeben.\nWir könnten also einen Schritt zurückgehen und uns wieder an unseren\nAgenten wenden, der meines Wissens nach nicht aktiv ist.\nWir starten also PND dev\nund könnten beispielsweise sagen: run ls run ls-la.\nNein.\nWarum sind wir es nicht?  Oh, sehen Sie, es funktioniert nicht.\nÄh, weil wir die\nSandbox natürlich nicht bereitgestellt haben.  Ähm, wenn ich die\nAnweisungen befolgt hätte, hätte ich das gewusst.\nÄh, der nächste Schritt, und zwar sind es\nzwei ziemlich wichtige Schritte.\nErstens müssen wir tatsächlich unsere... Ich war viel zu voreilig\n.  Wir müssen unserem\nAgenten unser Werkzeug geben.  Wir\nkehren also zu unserer\nAgentendefinition zurück.  Ich werde einfach alles ersetzen\n.  Und Sie werden sehen, dass wir jetzt in Zeile 21\nunser Bash-Tool übergeben, das wir\ngerade erstellt haben.  Und dann, was am wichtigsten ist,\nmüssen wir unseren Routen-\nHandler aktualisieren, um die besagte Sandbox zu erhalten und sie\nan den Agentenlauf zu übergeben.  Und das werden wir nun\nmit unserer\nzuvor erstellten Hilfsfunktion tun.  Erstellen oder Abrufen einer\nSandbox unter Angabe eines Sandbox-Namens.\nDies ist also nur eine zufällige ID in\neiner Anwendung.  Diese Namen wären\nwahrscheinlich mit dem Namen eines Benutzers oder einer\nSitzung verknüpft.  Und so entsteht eine Art\npersistente Sandbox, die Sie\nüber mehrere Aufrufe hinweg verwenden können.  Also, wir haben\nhier unsere Sandbox, die Sie sehen können, und dann\nübergeben wir sie an unsere Call-Optionen.  Sehen Sie,\nwenn Sie das nicht übergeben würden,\nwürden wir einen Fehler erhalten, weil es\ndurchgängig typsicher ist, und wer liebt nicht\ndurchgängige Typsicherheit?\nAls Letztes sollten wir Folgendes tun: Es\nfunktioniert zwar sofort,\naber Sie müssen natürlich warten, und\nSie sehen nicht das Terminal, sondern die\nBefehle, die in einer Zeile ausgeführt werden.  Wir\nkönnen also tatsächlich eine Komponente für unser\nBash-Tool definieren, was wir hier tun werden, indem wir\neinen Fall für tool-bash bereitstellen.\nIch werde also zurück zur vorherigen\nSeite springen.  Ich kopiere das jetzt rein und wir\nkönnen uns das dann nochmal ansehen.  Bevor wir das hatten, hatten\nwir also, was gerendert werden sollte, wenn das\nModell einen Text generiert oder\nder Benutzer einen Text hat.  Was soll\nin der Benutzeroberfläche angezeigt werden, wenn das Modell die Websuche nutzt\n?  Und schließlich, was\nin der Benutzeroberfläche gerendert werden soll, wenn das Modell\nBash verwendet.  Äh, und das hier habe ich natürlich nicht selbst\nerstellt, denn es sieht gut aus und ähm,\nes funktioniert auch.  Wir können also sagen: run ls-la.\nUnd jetzt sollten wir unser hochgefahrenes Terminal sehen\n.  Der Befehl wird ausgeführt\nund wir erhalten die Rückmeldung, dass wir uns in einer\nVersail-Sandbox befinden.\nDas ist also so, äh, ich weiß, das ist\nheute nur ein kleiner Schritt für uns, aber ein riesiger Sprung für unseren Agenten, der\ndas jetzt nutzen kann.  Aber Sie werden es\nmerken, und ich komme dann wieder auf Anweisungen und\nVerhalten zurück.  Wenn ich fragen würde: „Was siehst du?“   Der\nAgent ist völlig ahnungslos.  Es weiß nun,\ndass es ein Bash-Tool besitzt,\nweiß aber nicht wirklich, wann, wie und\nwofür es dieses Tool verwenden soll.  Ähm, und an diesem Punkt\nkönnten wir buchstäblich sagen, wir könnten\nhier in die Anweisungen für unsere Agenten einsteigen\nund sagen: Sie sind ein Agent mit einem\nComputer.  Der Zugriff ist über Bash möglich.  Wenn\nder Benutzer fragt, was Sie sehen können, verwenden Sie ls oder\netwas Ähnliches.  Das ist eine\nschreckliche Systemabfrage, aber man kann sich fragen\n: Was sehen Sie?  Natürlich wird er\nden Computer jetzt etwas\nmehr nutzen.  Ähm, das ist im Moment nicht besonders\nhilfreich.  Ich denke, der nächste logische\nSchritt beim Zugriff auf ein\nDateisystem ist, dass man darin speichert, oder?\nÄhm, und der nächste, ziemlich naheliegende Schritt für die\nSpeicherung von Daten mit einem Agenten ist der Speicher.\nIch glaube, viele Menschen machen sich Gedanken darüber, was\ndie ideale Erinnerung ausmacht.  Und meine\ngewagte These ist, dass der Speicher eine Datei ist,\ndie Sie in Ihrer Sandbox speichern, und dass Sie eine Art\ndeterministischen\nCode haben, um diese Datei abzurufen, sie\nin die Systemeingabeaufforderung einzufügen und dann\nmöglicherweise eine Art\nStruktur in Ihrem Dateisystem für\nverschiedene Speichertypen zu haben.  Sie haben also so etwas wie\neine\nDatei namens corememories.mmd, die bei jedem\nSemester gesendet wird, und darin befinden sich wahrscheinlich einige\nInformationen, zum Beispiel zum Durchsuchen des\nGesprächsverlaufs.  Es ist in\nconversations.jsonl\noder so ähnlich gespeichert.  Der springende Punkt ist aber, dass\ndas Dateisystem zu dieser\nSpielwiese, dieser Umgebung wird, in der Sie\nviele dieser Informationen strukturiert speichern können\n.  Und das Schöne daran ist, dass\ndiese Agenten so gut darin sind,\nBash-Befehle zu generieren, dass sie Dinge\nwie find, ls, gp, glob und\nall diese Dinge verwenden können.  Ähm, als\nletztes werden wir uns\nhier mit dem\nKonzept des persistenten Speichers beschäftigen.  Also,\näh, ich werde das jetzt schnell hier reinkopieren\n.\nIch erklärte die Grundidee dessen, worüber ich\nnachgedacht hatte, nämlich dass wir\neine Datei in unserem Dateisystem namens\nmemories.mmd anlegen sollten.\nDer Agent weiß dann, dass er\ndort neue Erinnerungen einfügen muss, und dann führen wir\ndiesen Vorbereitungsaufruf durch, der\neinmal vor jedem Agentenlauf ausgeführt wird.\nLass uns diese Datei holen und sie dann mit etwas Kontext\nin die Systemeingabeaufforderung und die\nAnweisungen einfügen\n.  Das ist also, was ich\nhier mache.  Ich hole die Erinnerungen, MD.  Ich\nerhalte die Zeichenkette selbst und\nhabe außerdem die Anweisungen von vorher.\nSie sind ein Codierungsagent mit Zugriff auf einen\nComputer.  Sie besitzen eine memories.mmd-Datei,\ndie Sie lesen und beschreiben können.  Sie\nsollten alle vom Benutzer mitgeteilten Fakten immer\nzu memories.mmd hinzufügen.  Und wenn wir\nhier irgendwelche Erinnerungen haben, dann sind es eure\nErinnerungen.  Ansonsten noch keine Erinnerungen.\nUnd wir könnten sogar so etwas sagen wie: Nein,\neigentlich ist das in Ordnung.  Wir können so vorgehen\n.  Und nun könnte ich sagen: Hey, mein\nName ist Nico.  Das sind zwar wieder mal ziemlich\ndumme Beispiele, aber wir werden uns den\nAnfang ansehen.  Der Benutzername ist\nNico.  Und wenn ich jetzt die Seite aktualisiere und \"Hallo\" sage\n,\nwerden wir sehen, dass es ein Verhalten zeigt,\ndas wir nicht wollen, nämlich dass es eine Art\nwillkürliche Begrüßung hinzufügt, z. B. \"Benutzer wurde\nmit \"Hallo\" begrüßt\"\n.  Aber man kann sehen, dass es trotzdem so war,\nals ob Nico im\nDateisystem vorhanden wäre.  Und ich könnte hier zum Beispiel sagen: „Berichtet\nnicht alles, sondern\nhaltet nur wichtige Erinnerungen fest.“   Da haben Sie\nvollkommen recht.\nWichtige Fakten, die der Benutzer teilt,\ndokumentieren nur wichtige Erinnerungen.  Versuchen wir es.\nSehen Sie, das erklärt, was\nbei den meisten Agenten schief läuft: Ich selbst als\nenglischer Muttersprachler\nschreibe oft widersprüchliche Anweisungen, die ein\nAgent dann natürlich sehr\nwörtlich nimmt.  Also sage ich hallo und hoffentlich hat es jetzt wieder geklappt\n.  Sie sehen also, dass\ndies so viel ist, das ist auch so etwas wie\nein dümmeres Modell, äh, oder\nnein, wir sind auf GPT54 umgestiegen.  Also,\nich würde nicht einmal sagen, dass man\nkeine Grüße austauschen sollte.  Und das ist schlecht,\ndenn offensichtlich ist das wie beim\nrosa Elefanten.  Man\nmöchte ja eigentlich kein Verhalten erwähnen, das man nicht möchte,\nweil dadurch\nParameter aktiviert werden und wir nicht genau wissen, was das System tut\n.  Aber mal\nsehen.\nVerdammt,\necht jetzt.  Äh, das tut es also nicht. Ja,\ngenau.  Die Tatsache, dass\nmeine Erinnerungen ausgelöscht wurden.  Äh, also lasst uns\nsie löschen.\nOkay, super.  Entfernen wir also das. Nun, ich\nmeine, das ist sozusagen der\nlustige Teil beim Bauen dieses Systems:\nWir versuchen buchstäblich, diese Art\nvon Maschine dazu zu bringen, diesen persistenten Zustand zu verwenden.\nUnd Sie werden sehen, dass ich das – nachdem ich\nso viel mit Sandboxes gearbeitet habe – wirklich cool finde,\ndass wir nur diese ID, diesen\nNamen haben und dieser Zustand erhalten bleibt, egal ob er\naktiv ist\noder nicht.\nIch habe zuvor\nan einigen Eingabeaufforderungen gearbeitet, um\ndas Speichersystem zu verbessern.  Man könnte also\nsehen, dass triviale Interaktionen\nwie Begrüßungs- und Smalltalk oder Informationen,\ndie sich aus der Codebasis\nselbst ableiten lassen, nicht gespeichert werden.  Wir werden das also kopieren\nund sehen, wie es sich verhält.  Ähm, und jetzt,\nwenn wir „Hallo“ sagen, habe ich\nhier auch noch Systemabfragen hinzugefügt, um\nes etwas neugieriger zu gestalten.  Also, so ähnlich wie eine\noffene Klausel, zum Beispiel beim Onboarding, wo es um die Frage „\nWie heißen Sie?“ geht?  Machst du das so wie: „\nHallo, ich bin Nico.“  Ähm, und jetzt wird der\nBenutzername hinzugefügt.  Was machst du?  Ich beschäftige mich mit der Frage:\nWarum tue ich das?  Ich arbeite bei\nVerscell am AI SDK.  Ich weiß nicht, warum ich\nheute so viel getippt habe.  Äh, also fügen wir das jetzt hinzu\nund wenn ich in einen\nneuen Chat gehe, heißt es: Hallo.  Als ob wir eine Erinnerung hätten,\ndie über diese Zustände hinweg erhalten geblieben ist.  Eine\nweitere wirklich coole Sache, die Sie mit\nHilfe der\nhier vorhandenen Bash-Umgebung tun können, ist die\nVerwendung einer Funktion, die bereits in der\nUmgebung vorhanden ist und in der der Agent\nbereits sehr gut ist: das Generieren\nund Ausführen von Code.  Ein\nklassisches Phänomen, das man beobachten kann und das meiner\nMeinung nach der Grund dafür ist, warum Open Cloud so spannend war\nund warum Agents in\ndiesem Jahr so ​​richtig durchgestartet sind, ist die Idee, dass Agents sich\nselbst modifizieren oder erweitern. Dabei geht es\nweniger um die Modifizierung an\nsich selbst, sondern vielmehr darum,\neine Feedbackschleife in der\nUmgebung zu schaffen, in der sie Code ausführen,\ndie Ausgabe auswerten und darauf aufbauen können.\nIch denke, das ist auch der Grund, warum das\nCodieren so natürlich geworden ist – der\nerste Bereich, in dem das wirklich rasant zugenommen hat,\nist, dass wir Compiler und\nTypüberprüfer haben.  Es ist, als wäre es die\nperfekte Umgebung für diese Art von Welleneffekt\n.  Ähm, aber\nich habe hier noch etwas anderes hinzugefügt, nämlich\ndem Agenten mitzuteilen, ob es\nwiederholbare Aufgaben gibt, z. B. ein Python-\nSkript daraus zu erstellen und dieses\nPython-Skript oder die Beschreibung\ndavon in das Ende unserer Memories MD einzufügen\nund das als eine Art Kern zu verwenden oder\num zu entscheiden, was als nächstes zu tun ist.  Wenn\nder Benutzer Sie also bittet, das Wetter abzurufen,\nerstellen Sie ein Wetterskript.  Und falls der Benutzer\nerneut nach dem Wetter fragt, verwenden Sie das\nSkript, auf das Sie bereits Zugriff haben.\nUnd das ist so, als wären dies die\nBausteine ​​dieses Agenten, der lernt und im Laufe der Zeit immer weiter auf sich\nselbst aufbaut.\nUnd so können wir es versuchen.  Wir können sehen,\nwie es sich entwickeln wird.  Ähm, wir sagen: Informieren Sie sich über das\nWetter in London.  Äh, benutze Python.  Ich\nmeine, ich werde das\nhier jetzt ein bisschen erzwingen, da wir ja nur eine\nDemo machen.  Äh, und wir werden sehen, was passiert.\nAlso, es wird hier etwas Python-Code geschrieben,\nund wir werden sehen, dass es die\nWetterdaten abgerufen und diese nun zu\nunserem Speicher-MD hinzugefügt hat,\nund das ist ziemlich cool.  Das war alles nur ein\neinziger Durchlauf eines Assistenten mit Bash, und\njetzt gibt es dieses Tool, um\ndas Wetter abzurufen.  Jetzt könnten wir also das\nWetter von NSF sehen.\nVersuchen wir es.  Wird es funktionieren?  Und schau mal, es wurde\nverwendet, es ist nicht minus 11, äh,\nweil es aus irgendeinem Grund Quebec Kanada bekommen hat\n.  Wir müssen es\netwas abändern.   Ja\n.  Tu dies.   Tu dies\n.  Hoppla.  Ich habe\nhier wahrscheinlich alles kaputt gemacht.  Ähm, fantastisch.  Es hat\ntatsächlich funktioniert.  Okay, also es sind 12\nGrad Celsius.  Aber Sie können jetzt sehen, dass\nwir das hier haben, ähm, das bevorzuge ich.  Siehst du,\ndas ist cool.  Je mehr es\nfragt, desto mehr entwickelt es sich\nselbst und desto mehr lernt es\ndarüber, was mir gefällt.  Und jetzt\nist dieser Computer wie der\npersönliche Spielplatz und Arbeitsbereich meines Agenten, damit er\nmir bei allem helfen kann.  Das\nwar also die Grundlage für das, was ich\nheute besprechen wollte.  Okay.  Was ich\nIhnen zeigen wollte, ist Folgendes: Ich habe\nein sehr komplexes Agentensystem auf Basis genau\ndieser Muster entwickelt, die ich jetzt\njeden Tag verwende, um meine Arbeit zu erledigen.  Ähm, also\nich wollte – ich meine, Werbung dafür machen, dass das heute\nspäter erscheint.  Daran werde ich mich halten\n.  Und das ist im Prinzip so etwas wie\nCursor-Hintergrundagenten, aber\nunter Verwendung der Konzepte, die wir heute besprochen haben.\nnutzt das AI SDK, verwendet genau dieses Muster,\nverwendet das AI Gateway für Inferenz, verwendet einen\nWorkflow, sodass es unendlich lange laufen kann und\njeder der Schritte dauerhaft ist.  Jeder\nLLM-Schritt ist also einem persistenten\nWorkflow-Schritt zugeordnet, und wenn ein Schritt fehlschlägt, wird er so lange\nwiederholt, bis\nein Ergebnis erzielt wird.  Ähm,\nund ja, das knüpft auch an das an, worüber\nwir vorhin mit den\nUnteragenten gesprochen haben.  Ich kann also jede neue\nSitzung erstellen und sagen: „Ja, wir müssen sie\nbeenden. Ich bin sowieso fertig. Das hier ist eher eine Angeberei\n.“  Aber ich starte einen\nUnteragenten, um dieses Projekt zu erkunden,\nund nachdem es erstellt wurde, ist es etwas\nlangsam, da es sich um meinen Hotspot handelt.   Ich\nmöchte Ihnen veranschaulichen, dass dieses\nMuster\nauf ein ziemlich großes System skaliert. Und um\nIhnen zu zeigen, wie es verwendet wird, sehen Sie hier, wie ein\nSubagent gestartet wird, der\nim Hintergrund läuft. Er wird\nvon 23 Personen bei\nVersall genutzt. Ich habe in\nden\nletzten ein bis zwei Monaten dreieinhalb Milliarden Token darüber abgewickelt.  Auf diese Cash-Read-\nRatio, von der ich Ihnen erzählt habe, bin ich sehr stolz\n.  90 91%\nuh verantwortlich für\nfast 350 PRs, wobei dies nicht\nalle abgeschlossenen PRs einschließt.  Ähm,\nja, und Sie werden sehen, dass dies,\nwenn wir hierher zurückgehen, wiederaufnehmbare\nStreams hat, und unser Unteragent, Sie können sehen, hat\nall diese Dinge außerhalb des\nHauptthreads gesucht, 30.000 Tokens verwendet, aber\nam Ende nur etwa 500 zurückgegeben.  Damit\nbleiben wir im Bereich von buchstäblich 7.000\nTokens für den Haupt-Like-Agent-Thread.\nJa,\nund hoffentlich erscheint es noch heute\n.\nIch stehe euch natürlich zur Verfügung, falls ihr\nnach unserem Rauswurf noch Fragen habt\n.  Ähm, ja.",
  "transcript_chars": 61916,
  "ingested_at": "2026-05-12T22:57:00.093326+00:00",
  "source": "channel",
  "yt_meta": {
    "view_count": 893,
    "like_count": 28,
    "channel_id": "UCLKPca3kwwd-B59HNr-_lvA",
    "categories": [
      "Science & Technology"
    ],
    "tags": [
      "ai",
      "ai engineer",
      "ai engineering",
      "software development",
      "tech",
      "startups",
      "software architecture",
      "machine learning"
    ]
  }
}