Zum Hauptinhalt springen
Zurück zum Blog
Agent-Flutter — Das Problem
BuildingInPublicFlutter + AI

Agent-Flutter — Das Problem

Ulrich Diedrichsen
Ulrich Diedrichsen
8 Min. Lesezeit

Letzte Woche saß ich mal wieder bis spät in die Nacht vor meinem Laptop und starrte auf eine Flutter-App. Nicht weil ich noch Bugs fixen musste oder Features implementieren wollte – nein, ich wollte einem AI-Agent beibringen, wie er mit dieser verdam

AI-Agents und GUIs: Warum niemand über das echte Problem spricht

Einleitung

Letzte Woche saß ich mal wieder bis spät in die Nacht vor meinem Laptop und starrte auf eine Flutter-App. Nicht weil ich noch Bugs fixen musste oder Features implementieren wollte – nein, ich wollte einem AI-Agent beibringen, wie er mit dieser verdammten GUI umgehen soll. Spoiler: Es war frustrierend.

Überall liest man von AI-Agents. Twitter ist voll davon, LinkedIn explodiert vor lauter "AI-Agent this, AI-Agent that" Posts, und auf jeder zweiten Tech-Konferenz wird über die Zukunft der autonomen Software gesprochen. Aber mal ehrlich – hat schon mal jemand versucht, einen AI-Agent dazu zu bringen, eine echte App zu bedienen? Ich meine nicht ChatGPT, der dir beim Texten hilft, oder einen Bot, der Code generiert. Ich rede von echten Buttons, Navigation, Formularen, Listen, komplexen UI-Komponenten.

Das ist genau das Problem, mit dem ich mich seit Wochen herumschlage. Und je tiefer ich in die Materie einsteige, desto klarer wird mir: Wir alle reden über AI-Agents, aber niemand spricht über das fundamentale Problem der GUI-Steuerung. Es ist, als würden wir über selbstfahrende Autos sprechen, aber niemand erwähnt, dass sie noch keine Straßenschilder lesen können.

Das Problem im Detail

Stell dir vor, du willst einem AI-Agent beibringen, eine ganz normale E-Commerce-App zu bedienen. Klingt simpel, oder? Der Agent soll sich anmelden, nach einem Produkt suchen, es in den Warenkorb legen und zur Kasse gehen. Das macht jeder von uns täglich mit dutzenden Apps, ohne groß darüber nachzudenken.

Aber hier fängt das Drama an: Wie erklärst du einem AI-Agent, wo sich der "Anmelden"-Button befindet? Wie soll er verstehen, dass das kleine Icon oben rechts das Menü öffnet? Wie kann er zwischen einem "Hinzufügen"-Button und einem "Kaufen"-Button unterscheiden, wenn beide grün sind und fast identisch aussehen?

Das Problem ist viel komplexer, als die meisten von uns zunächst denken. In der Web-Entwicklung haben wir wenigstens noch das DOM – eine strukturierte Hierarchie von Elementen, die man theoretisch analysieren kann. Bei nativen Apps? Vergiss es. Da ist alles ein großer Canvas mit Pixeln drauf. Kein Semantic Markup, keine Accessibility-Labels (wenn der Entwickler sie nicht explizit hinzugefügt hat), keine strukturierten Daten.

Flutter macht das Ganze noch interessanter. Alles wird gerendert, und die Widget-Hierarchie ist zur Laufzeit komplett anders als das, was du siehst. Ein Container kann ein Button sein, ein GestureDetector kann ein Link sein, und ein Stack kann alles Mögliche übereinander stapeln. Für einen Menschen ist das kein Problem – wir erkennen Patterns, verstehen visuelle Hinweise, kennen UI-Konventionen. Für einen AI-Agent ist das wie ein Puzzle ohne Anleitung.

Das Absurde ist: Wir haben eine ganze Industrie, die sich um "AI-first" Apps dreht, aber gleichzeitig bauen wir diese Apps so, dass kein AI-Agent sie bedienen kann. Es ist, als würden wir Häuser für Roboter bauen, aber alle Türklinken in 3 Meter Höhe montieren.

Meine Analyse

Nach wochenlanger Recherche und unzähligen Experiments bin ich zu ein paar ernüchternden Erkenntnissen gekommen. Das größte Problem ist nicht technischer Natur – es ist konzeptionell.

Die gesamte Art, wie wir über User Interfaces nachdenken, ist auf Menschen optimiert. Wir gestalten für visuelle Erkennung, für Muskelgedächtnis, für intuitive Navigation. Wenn wir einen roten Button designen, denken wir an Warnung oder Aktion. Wenn wir ein Hamburger-Menü verwenden, gehen wir davon aus, dass der User weiß, was das bedeutet. Diese ganzen impliziten Annahmen funktionieren bei AI-Agents nicht.

Das zweite Problem ist die fehlende Standardisierung. Im Web haben wir wenigstens Semantic HTML, ARIA-Labels, und strukturierte Daten. Bei nativen Apps ist jedes Framework eine eigene Welt. Flutter hat seine Widget-Trees, React Native seine Component-Hierarchie, und native iOS/Android Apps ihre eigenen Zugänglichkeits-APIs. Es gibt keinen universellen Standard für "Hier ist ein Button, das macht er, so bedienst du ihn."

Die dritte Erkenntnis war für mich persönlich am schmerzhaftesten: Die meisten AI-Agent-Frameworks sind Spielzeug. Ich habe mir langchain, autogen, crewai und ein Dutzend andere angeschaut. Alle können toll mit Text umgehen, APIs aufrufen, und Code generieren. Aber GUI-Steuerung? Fehlanzeige. Die wenigen Tools, die es gibt, sind entweder für Web (Puppeteer, Selenium) oder greifen auf Screenshots und OCR zurück – was bei modernen, hochauflösenden, dynamischen UIs einfach nicht funktioniert.

Der vierte Punkt ist die Komplexität moderner UIs. Wir bauen heute Apps mit dynamischen Listen, Lazy Loading, Animationen, Gesten, komplexen Navigationsstacks. Ein AI-Agent müsste nicht nur verstehen, was er sieht, sondern auch vorhersagen, wie sich die UI verhalten wird, wenn er bestimmte Aktionen ausführt. Das ist wie Schach spielen, ohne die Regeln zu kennen.

Der Lösungsansatz

Nach all der Frustration habe ich angefangen, das Problem von einer anderen Seite anzugehen. Statt zu versuchen, einem AI-Agent beizubringen, GUIs wie ein Mensch zu bedienen, arbeite ich daran, GUIs so zu bauen, dass AI-Agents sie verstehen können.

Mein Ansatz basiert auf drei Säulen: Semantisches Markup, explizite Intentionen, und maschinenlesbare Navigation.

Die erste Säule ist semantisches Markup für Flutter-Widgets. Ähnlich wie HTML5 semantische Tags eingeführt hat, brauchen wir in Flutter Widgets, die ihre Absicht explizit kommunizieren. Statt eines generischen Container mit einem GestureDetector verwende ich custom Widgets wie SemanticButton, NavigationTrigger, oder ActionIndicator. Jedes Widget trägt Metadaten über seinen Zweck, seine Parameter, und seine erwarteten Outputs.

Die zweite Säule sind explizite Intentionen. Jede Benutzeraktion in der App wird mit einer klaren Intention verknüpft. "Login ausführen", "Produkt suchen", "Warenkorb anzeigen" – diese Intentionen werden als strukturierte Daten in der Widget-Hierarchie gespeichert. Ein AI-Agent kann diese Intentionen lesen und verstehen, was passiert, wenn er bestimmte Aktionen ausführt.

Die dritte Säule ist maschinenlesbare Navigation. Statt dass ein AI-Agent raten muss, wie er von Screen A zu Screen B kommt, definiere ich explizite Navigation-Maps. Diese beschreiben nicht nur den Weg, sondern auch die Voraussetzungen (eingeloggt sein, bestimmte Daten verfügbar haben) und die erwarteten Ergebnisse.

Technisch umgesetzt wird das Ganze über ein Custom-Widget-System in Flutter, das auf Annotations und einem Service-Layer basiert. Jedes semantische Widget registriert sich bei einem zentralen AgentRegistry, das die gesamte UI-Struktur und verfügbaren Aktionen für AI-Agents zugänglich macht.

Praktisches Beispiel

Um das Ganze konkreter zu machen, hier ein vereinfachtes Beispiel, wie das in der Praxis aussieht:

class ProductSearchScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AgentAnnotatedScreen(
      screenId: 'product_search',
      description: 'Suche nach Produkten',
      availableActions: ['search', 'filter', 'navigate_to_product'],
      child: Column(
        children: [
          SemanticTextField(
            agentId: 'search_input',
            intention: SearchIntention(
              type: 'product_search',
              parameters: ['query'],
              expectedResult: 'product_list_update'
            ),
            hintText: 'Produkt suchen...',
          ),
          SemanticButton(
            agentId: 'search_button',
            intention: TriggerSearchIntention(),
            label: 'Suchen',
            onPressed: () => _performSearch(),
          ),
          AgentNavigableList(
            agentId: 'product_list',
            items: products,
            itemBuilder: (product) => ProductTile(
              product: product,
              onTap: () => Navigator.push(/*...*/),
              agentMetadata: {
                'navigation_target': 'product_detail',
                'required_parameter': product.id,
              },
            ),
          ),
        ],
      ),
    );
  }
}

Das Schöne an diesem Ansatz ist, dass die App für normale User genauso funktioniert wie vorher, aber AI-Agents können jetzt die Struktur und Absichten verstehen. Der Agent weiß, dass er Text in das search_input Feld eingeben kann, den search_button drücken muss, und dann durch die product_list navigieren kann.

Lessons Learned

Die letzten Wochen waren ein Auf und Ab. Mein größter Fehler war am Anfang zu denken, dass ich einem AI-Agent einfach beibringen kann, GUIs wie ein Mensch zu verstehen. Ich habe Stunden damit verbracht, Computer Vision Modelle zu trainieren, die Buttons erkennen sollten, oder NLP-Systeme zu bauen, die aus Screenshots UI-Elemente extrahieren. Alles Bullshit.

Die Erkenntnis, dass das Problem nicht bei der AI liegt, sondern bei der Art, wie wir UIs bauen, war ein Wendepunkt. Es ist wie bei Accessibility – wenn wir von Anfang an mitdenken, dass nicht nur Menschen, sondern auch Maschinen unsere Apps bedienen sollen, dann können wir sie entsprechend gestalten.

Ein weiterer wichtiger Lernpunkt war die Komplexität des State-Managements. AI-Agents müssen nicht nur verstehen, was sie sehen, sondern auch den aktuellen Zustand der App, die History der Aktionen, und die möglichen nächsten Schritte. Das hat mich dazu gebracht, viel expliziter über State-Transitions nachzudenken.

Der schwierigste Teil war, das richtige Abstraktionslevel zu finden. Zu high-level, und der Agent kann nicht flexibel genug reagieren. Zu low-level, und er verirrt sich in Details. Die Balance zwischen expliziter Struktur und Flexibilität ist ein ständiger Balanceakt.

Was mich am meisten überrascht hat: Die Lösung macht die Apps auch für Menschen besser. Wenn du gezwungen bist, explizit über Intentionen und Navigation nachzudenken, wird deine UX automatisch durchdachter und konsistenter.

Fazit und Ausblick

AI-Agents und GUIs – das ist nicht nur ein technisches Problem, sondern ein fundamentaler Paradigmenwechsel in der Art, wie wir über User Interfaces nachdenken. Wir stehen erst am Anfang einer Entwicklung, die unsere gesamte Herangehensweise an App-Design verändern wird.

Das Agent-Flutter Projekt ist mein Versuch, eine Brücke zwischen der AI-Welt und der GUI-Welt zu bauen. Es ist noch lange nicht fertig, und ich bin mir sicher, dass viele meiner Annahmen falsch sind. Aber die ersten Experimente zeigen, dass es möglich ist, Apps zu bauen, die sowohl für Menschen als auch für AI-Agents bedienbar sind.

Die nächsten Schritte sind klar: Ich muss das Framework stabiler machen, mehr Widget-Typen unterstützen, und vor allem mit anderen Entwicklern testen. Das Problem ist zu groß für eine Person allein.

Falls ihr ähnliche Herausforderungen habt oder Interesse am Thema, lasst uns reden. Ich bin überzeugt, dass wir gemeinsam Lösungen finden können, die über meine aktuellen Ansätze hinausgehen. Die Zukunft der App-Entwicklung wird definitiv AI-Agents einschließen – die Frage ist nur, ob wir bereit sind, wenn es soweit ist.


Folge mir auf Twitter oder Bluesky für Updates.

Tags:

BuildingInPublicFlutter + AI
Ulrich Diedrichsen

Ulrich Diedrichsen

AI Product Builder & Werkstatt-Betreiber

40 Jahre Software-Entwicklung. Ex-IBM, Ex-PwC. Baut jetzt mit AI echte Produkte in Hamburg.