ChatGPT-Tagebuch, Teil 3 Projekt LLM-generierter Browser – Crunch Time
Anbieter zum Thema
Die Reise zum Python-Browser mit ChatGPT als Co-Programmierer hat rasant begonnen, sich dann etwas in Details verloren. Der Schlussspurt hat etwas von beidem, mit ungewissem Ziel.

Ein kurzer Blick zurück: Ziel des Projekts war ein Python-basierter Browser mit einigen wenigen Basis-Features. Im ersten Teil ging es recht flott voran. Nach der Wahl von wxPython als GUI-Bibliothek ließ sich schnell ein Minimal-Browser bewundern, der URLs korrekt aufrufen und rendern konnte.
Im zweiten Teil folgten Chronik und Tabs – erstere ohne ernsthafte Probleme, letztere erst nach einer stundenlangen Trial-and-Error-Fahrt durch düstere Welten voller Fehlermeldungen. Das nächste Feature sollte nun vor allem dem Tabbed-Browsing-Vorbild folgen. Allerdings mit noch mehr Ärger und weniger Erfolg.
Feature: Session
Meine Ansprüche erschienen mir eigentlich nicht sonderlich groß: Geöffnete Tabs sollten beim Schließen des Browsers gespeichert und beim Start wiederhergestellt werden. Außerdem sollten Cookies persistent sein.
Auf die vielen Details möchte ich dieses Mal verzichten, das ewige Hin und Her zwischen Fehlermeldungen, abgebrochenen Antworten und vergessenem Code ließ sich im zweiten Teil bereits ausführlich bewundern.
Mit einer optimistischen Anfrage traktierte ich ChatGPT:
Okay, it works! Can you add a session feature that can manage cookies and the history?
Selbstgefällig wie immer erwiderte ChatGPT daraufhin: „Certainly! Adding a session feature …“. Zunächst läuft zwar der Browser, von der neuen Funktionalität ist aber nichts zu sehen. Dafür sind die Navigations-Buttons für die Chronik verschwunden. Also müssen die zunächst wiederhergestellt werden, was auf Anhieb funktioniert.
Einige Versuche später startet der Browser zwar immer noch mit einem leeren Tab, aber siehe da: Über den Zurück-Button wird tatsächlich die URL der letzten Session geladen. Cookies und Tabs werden aber immer noch nicht berücksichtigt. Dutzende Versuche später folgt, was folgen muss: Ich übergebe ChatGPT den letzten funktionierenden Code, frage nach einem neuen Versuch und endlich werden Tabs wiederhergestellt.
Die Session-Daten werden dabei in einer lokalen Pickle-Datei gespeichert. Allerdings: Anfangs wurden nur die Tabs wiederhergestellt, nicht aber die Seiten darin – freilich ziemlich nutzlos. Ein halbes Stündchen später werden nun auch die URLs in den wiederhergestellten Tabs geladen.
Wichtig: Dieses Verhalten ist ziemlich typisch für ChatGPT und wurde auch schon in Teil 2 thematisiert. Die KI nimmt Dinge sehr wörtlich und kleinteilig. Für Menschen ergibt ein wiederhergestellter Tab ohne geladene URL keinen Sinn, ChatGPT wiederum kann dieses Minimum an Transferleistung schlicht nicht erbringen. Wenn der User sagt „Tab wiederherstlelen“, wird genau das erledigt und sonst nichts. Diese Erkenntnis hilft durchaus beim Formulieren von Prompts!
Von persistenten Cookies muss ich mich leider verabschieden. ChatGPT möchte sie zunächst als Dictionary verarbeiten, dann als Listenobjekte, über die Request-Bibliothek, einen Cookie-Store und und und. Aber mehr als eine nutzlose Datei namens „cookies.txt“ mit drei Kommentarzeilen kommt nicht dabei heraus, bei jedem Aufruf wollen die Cookie-Banner erneut meine Geduld testen. Nach zwei Stunden Keksgebrösel gebe ich auf.
Zu lernen gibt es aber auch hier etwas: ChatGPT ging beim Cookie-Feature offenbar davon aus, dass wxPython (genauer: wx.html2) eine Klasse „CookieStore“ beinhalte. Dass dem nicht so ist, hat die KI erst nach Übergabe einer Fehlermeldung „verstanden“ und einen alternativen Weg probiert.
Generell kommt es erstaunlich häufig vor, dass ChatGPT den verwendeten Bibliotheken Funktionen unterstellt, die gar nicht existieren. Menschliche Helfer würden tendenziell „vermuten“, dass sich eine Funktion XY in einer Bibliothek findet, die KI ist sich hingegen super sicher.
Feature: Tab-Titel
Bislang heißen alle Tabs schlicht „New Tab“. Ein erster Verbesserungsversuch läuft auf die beiden Titel „New Tab“ für neue Tabs und „Loading…“ für über die Chronik wiederhergestellte Tabs hinaus. Nun, dann bitte ich ChatGPT eben, die Tabs nach der „netloc“ (NEtwork LOcation) der URLs zu benennen – und zwar nach dem Laden der URLs (damit die netloc überhaupt zur Verfügung steht). Nicht die hübscheste Lösung, aber ziemlich konkret und wohl deswegen funktioniert es auch relativ fix.
Feature: Statusleiste
Meine Ansprüche sinken: Die Statusleiste soll eigentlich nur die Ziel-URLs von Links zeigen, wenn der Mauszeiger darüber liegt (Mouseover- bzw. Hover-Effekt). Sollte simpel sein, aber ChatGPT scheint mittlerweile im Kleines-bockiges-Kind-Modus angelangt: Nach ersten Fehlermeldungen meint die KI, das Modul müsse „StatusBar“ heißen, nicht „status_bar“ – kommt der Bitte nach Korrektur aber ein halbes Dutzendmal nicht nach, werkelt stattdessen an den gar nicht betroffenen Tab-Titeln und ignoriert meine Hilfeschreie.
Also versuche ich es mit kindgerechter Ansprache und bitte ganz konkret darum, status_bar nach StatusBar zu ändern. Aber der Trotz gewinnt: ChatGPT korrigiert den Fehler, baut einen neuen ein und letztlich verbleibe ich mit einer Statusleiste, die zwar existiert, aber nichts beinhaltet – eine Dreiviertelstunde Prompting für die Katz.
Feature: Favoriten
Ein letztes Feature, eine letzte Anfrage:
Add a feature to save urls as favorites and to open favorites. the favorites should be presented as a simple list in a tab.
Fällt Ihnen auf, dass ich mittlerweile auf Höflichkeitsfloskeln und korrekte Syntax verzichte? Ja, das entspricht meiner Verfassung, langsam hören nämlich sowohl Fortschritt als auch Spaß an der Sache auf. ChatGPTs ständiger Optimismus nervt nun schon vor dem eigentlichen Code:
„Certainly! Here's an updated version of the code that includes a feature to save URLs as favorites and open them from a simple list displayed in a tab:“
Möglich, dass der neue Code irgendwas tut – aber da es keinerlei Buttons oder Menüpunkte gibt, um irgendetwas als Favoriten zu markieren, bleibt das im Dunkeln. Ein paar weitere ChatGPT-typische Manierismen später (kein Button-Code, Attribut „favorites_tab“ statt „favorites“) steht dann doch tasächlich eine Art Basisversion von Favoriten.
Über das Menü „Favorites“ lässt sich die URL im aktuellen Tab als Favorit speichern und im Favorites-Tab dann per Doppelklick öffnen. Allerdings hagelt es Fehler und Fehlermeldungen. Teils können Tabs nicht geschlossen werden, weil der Tab-Index intern nicht verwaltet wird, der Favoriten-Tab wird beim Start eines Favoriten umbenannt, je nach Tab-Bestückung lässt sich der Browser nicht schließen und so weiter und so fort.
Und damit soll es dann auch gewesen sein mit meinem Browser-Experiment – mit vielleicht ernüchterndem Endprodukt, aber einer Menge gelernter Lektionen bezüglich Python, GUI-Bibliotheken, Entwicklung allgmein, Browser und natürlich ChatGPT. Die Zusammenfassung, Learnings und mein persönliches Fazit lesen Sie im letzten Teil der Serie.
Hier möchte ich mit einer weiteren kleinen Lektion bezüglich „Wie tickt ChatGPT?“ schließen: Ich habe eben den Tab-Index erwähnt. In echten Browsern sind Tabs über einen Index ansprechbar, können hinzugefügt und entfernt werden. Dafür braucht es eine gewisse Logik – und spätestens an der Stelle wird es für ChatGPT zumindest schwierig.
Das Aufrufen und Rendern einer URL in einem Tab in einem Fenster ist eine ziemlich abgeschlossene Aufgabe: Fenster zeichnen, Tab zeichnen, übergebene URL abrufen, erhaltenen HTML-Code rendern – kein großes Problem für die KI mit entsprechender Bibliothek. Verwaltungslogik hingegen ist nicht als fertiges Modul verfügbar und der Bedarf an Intelligenz und Kreativität (!) wird größer – und von Artificial Creativity sind wir noch ziemlich weit entfernt.
(ID:49576167)