Tutorial · Automatisierung

jev-ultrafast: der Browser-Agent, der in 7,1 Sekunden einen Flug findet

Ein Satz als Auftrag, zehn Klicks, Trefferliste. Hier steht, warum der Browser-Agent von browser-use so schnell ist, wie du ihn in zehn Minuten aufsetzt und wie du deine Claude-Anmeldung statt eines zweiten API-Keys nutzt.

G
Georg Kinzel
23. September 2026

Ein Satz als Auftrag: „Find one-way flights from Zurich to London on September 20, 2026, for one adult in economy. Stop when matching flight options are visible.” Danach 7,1 Sekunden, und auf Google Flights steht die Trefferliste. Kein Skript für die Seite, keine vorbereiteten Feldwerte. Der Agent hat sich jeden Klick selbst ausgesucht.

Das Repo dazu heißt jev-ultrafast, kommt vom browser-use-Team und ist am 16. September online gegangen. Eine Woche später lag es bei über 17.000 Sternen auf GitHub. Der Artikel erklärt, was in den 7,1 Sekunden passiert, warum das so schnell geht und wie du es bei dir zum Laufen bringst.

Wenn du Jev noch gar nicht kennst: das Modell schreibt keinen Text, es wählt aus vorgegebenen Optionen. Die Grundlagen stehen im Einstiegsartikel.

Was in den 7,1 Sekunden passiert

Die Zahlen kommen aus dem Messprotokoll des Repos. Der aufgezeichnete Lauf brauchte 7,073 Sekunden vom ersten Modellaufruf bis zur bestätigten Trefferliste. Darin stecken:

Die Klickfolge selbst ist unspektakulär. Erst „Round trip” anklicken, dann „One way” wählen, „Zurich” ins Abflugfeld tippen, den Vorschlag „Zürich, Switzerland” nehmen, dasselbe für London, Datumsfeld öffnen, den 20. September anklicken, „Done”, „Search”, warten. Jeder dieser Schritte war eine eigene Entscheidung des Modells.

Die Vorversion desselben Repos brauchte für dieselbe Aufgabe im Median 9,45 Sekunden und schickte 1.092 Befehle an den Browser. Die aktuelle Version kommt mit 101 aus. Das sind drei Wiederholungen einer Aufgabe auf einem Rechner, kein allgemeiner Benchmark, das schreibt das Team selbst dazu.

Warum das so schnell ist

Der übliche Browser-Agent macht vor jedem Klick einen Screenshot, schickt ihn an ein großes Sprachmodell und wartet, bis das einen Absatz Text geschrieben hat. Das dauert pro Schritt Sekunden und verbrennt Tausende Token.

jev-ultrafast geht anders vor. Jede Webseite hat ein DOM, das ist eine Art Inhaltsverzeichnis mit allen Buttons, Feldern und Überschriften. Daraus liest der Agent in einem einzigen Browser-Aufruf die sichtbaren Bedienelemente und macht eine nummerierte Liste:

[12] combobox  Change ticket type · Round trip
[15] combobox  Where from?        · leer
[16] combobox  Where to?          · leer
[17] textbox   Departure          · leer
[19] button    Search for flights

Diese Liste bekommt Jev, zusammen mit dem Auftrag. Jev antwortet mit einer Wahrscheinlichkeit pro Element. Kein Satz, keine Begründung, nur Aktion und Element, beides in einer Anfrage. Ein Screenshot wird im normalen Betrieb gar nicht gemacht.

Erst wenn die gewählte Aktion „Text eintippen” heißt, springt ein Sprachmodell ein und liefert den Wert. Im aufgezeichneten Lauf war das „Zurich” nach 581 Millisekunden und „London” nach 346 Millisekunden. Das ist das einzige Mal, dass ein Modell Text erzeugt.

Bei mir sah das am 23. September so aus, ich hatte den Inspector offen und konnte den Wahrscheinlichkeiten zuschauen:

SchrittJev wähltWahrscheinlichkeit
1„Round trip” anklicken87 %
2„One way”72 %
4„Zürich, Switzerland”95 %
6„London, United Kingdom”87 %

Jeder dieser Werte ist eine Entscheidung ohne einen einzigen erzeugten Satz. Deshalb dauert ein Schritt Millisekunden.

Setup in zehn Minuten

Du brauchst Python mit uv, Chrome und einen TypeSafe-Schlüssel von console.typesafe.ai. Wie du an den Schlüssel kommst, steht im Einstiegsartikel.

git clone https://github.com/browser-use/jev-ultrafast.git
cd jev-ultrafast
uv sync
cp .env.example .env

In die .env trägst du deinen TYPESAFE_API_KEY ein. Für das Text-Modell brauchst du entweder einen OpenRouter-Schlüssel als TEXT_MODEL_API_KEY, oder du nimmst den Weg im nächsten Abschnitt und sparst dir den zweiten Key.

Dann Chrome vorbereiten. Der Agent steuert deinen echten Browser, dafür muss Chrome Fernzugriff erlauben. Öffne in Chrome die Adresse chrome://inspect/#remote-debugging und schalte es dort ein. Ohne diesen Schritt meldet der Browser-Harness bei mir „DevToolsActivePort not found”. Ob die Verbindung steht, prüfst du mit:

uv run browser-harness --doctor

Jetzt der Start:

uv run jev

Im Browser öffnest du http://127.0.0.1:8766, klickst auf „Start demo” und dann auf „Run automatically”. Der Inspector zeigt die nummerierten Elemente und die Wahrscheinlichkeiten für Aktion und Ziel, während der Agent im anderen Tab klickt. Mit „Choose next” hält er vor jedem Schritt an.

Claude statt zweitem API-Key

Jev trifft die Entscheidungen, dafür bleibt der TypeSafe-Key. Für alles, was in Sprache gedacht werden muss, also den Text in den Feldern, erwartet das Repo ein zweites Sprachmodell über OpenRouter. Wenn du Claude Code sowieso bezahlst, ist das ein Key zu viel. Genau dieses zweite Modell tauscht der Shim gegen Claude. Deshalb habe ich claude-text-shim geschrieben: eine einzelne Python-Datei, die deine Claude-Code-Anmeldung als OpenAI-kompatiblen Text-Endpunkt bereitstellt. Keine Abhängigkeiten, kein Extra-Konto.

Starten in einem eigenen Terminal:

python3 claude_text_shim.py --port 8799

In der .env von jev-ultrafast dann diese drei Zeilen setzen:

TEXT_MODEL_BASE_URL=http://127.0.0.1:8799/v1
TEXT_MODEL_API_KEY=unused
TEXT_MODEL=haiku

Der Key wird vom Shim nie geprüft, die Zeile muss nur da sein, weil das Repo sie erwartet. Danach uv run jev neu starten, fertig.

Wer nach dem Setup nicht mehr ins Terminal will, nimmt den Skill aus dem Shim-Repo. Der prüft in Claude Code den Shim, die Chrome-Verbindung und das jev-ultrafast-Repo und startet dann den Auftrag.

npx skills add epictaste/claude-text-shim --skill browser-agent

Danach sagst du Claude Code in normalen Worten, was der Browser tun soll, und er kümmert sich um den Rest. Buchen oder bezahlen tut er dabei nie, die Aufträge stoppen vor allem, was sich nicht rückgängig machen lässt.

Eine Sache muss ich dazusagen. Jeder Aufruf startet im Hintergrund einen claude -p-Prozess, und das kostet Zeit. In meinem Lauf brauchte das Tippen von „Zurich” 5,9 Sekunden und „London” 5,2 Sekunden. Mit einem gehosteten Modell über OpenRouter ist es unter einer Sekunde. Die Klicks laufen weiter über Jev und bleiben schnell. Wenn dir die Gesamtzeit wichtig ist, nimm OpenRouter. Wenn dir der zweite Key lästiger ist als ein paar Sekunden, nimm den Shim.

Eigene Aufträge starten

Die Flugsuche ist nur das Beispiel. Das Repo bringt ein Skript mit, dem du eine Adresse und einen Satz gibst:

uv run --env-file .env python examples/run.py \
  --url https://en.wikipedia.org/wiki/Main_Page \
  --goal 'Find and open the Wikipedia article about Gödel’s incompleteness theorems.'

Das ist der Fall aus dem Repo, im Messprotokoll lief er in 2,8 Sekunden. Mit dem Shim statt OpenRouter waren es bei mir 8,9 Sekunden, aus dem oben genannten Grund.

Für eine Firma sind das die Aufträge, die ich als erstes ausprobieren würde. Ich formuliere sie hier nur, gelaufen sind sie bei mir noch nicht:

uv run --env-file .env python examples/run.py \
  --url https://www.beispiel-lieferant.de \
  --goal 'Suche das Produkt "Roll-up Banner 85x200" und stoppe, wenn der Preis pro Stück sichtbar ist.'
uv run --env-file .env python examples/run.py \
  --url https://www.beispiel-kunde.de/kontakt \
  --goal 'Fülle das Kontaktformular mit Name "Jonas Beispiel", Firma "Agentur Nord" und der Nachricht "Bitte um Rückruf zum Angebot". Stoppe vor dem Absenden.'

Auf Englisch ist der Auftrag im Moment die sichere Wahl, darauf ist das Repo getestet. Deutsche Zielsätze habe ich noch nicht ausprobiert. Wichtig ist die Stopp-Bedingung im Satz, sonst klickt der Agent weiter, bis das Modell glaubt, fertig zu sein.

Was nicht geht

Was das Repo selbst als Grenze nennt:

Womit du anfängst

Setz das Repo auf und lass die Flugsuche einmal mit „Choose next” laufen, Schritt für Schritt. Du siehst dabei, wie das Modell zwischen den Elementen abwägt. Danach nimm eine Seite, auf der du selbst jede Woche dasselbe nachschaust, und formulier den Auftrag als einen Satz mit Stopp-Bedingung. Das ist ein Feierabend, und dann weißt du, ob das Ding für deine Fälle taugt.

Quellen

  1. browser-use/jev-ultrafast auf GitHub
  2. jev-ultrafast: Messwerte (docs/performance.md)
  3. TypeSafe Docs: Einführung in Jev
  4. TypeSafe Docs: Speculative Fan-out
  5. claude-text-shim auf GitHub
  6. TechCrunch: A new kind of AI model from a ChatGPT inventor is thrilling developers

23. September 2026. KI-Tools, Preise und Funktionen ändern sich schnell. Vor wichtigen Entscheidungen den aktuellen Stand direkt beim Anbieter prüfen.

Transparenz. Dieser Beitrag ist mit KI-Unterstützung entstanden und von mir geprüft. Genau mit diesen Workflows arbeite ich, und genau die zeige ich hier.

Klau mein System

Das Setup, mit dem KI bei mir 80 % der Arbeit übernimmt. Im kostenlosen PDF: Projekt, Anweisung und fünf Vorlagen für Angebot, Kundenmail, Nachfassen, Posts und Wochenplan. Skills folgen.

Mein System holen

Häufige Fragen

Brauche ich Programmierkenntnisse?
Nein. Du kopierst sechs Befehle ins Terminal, trägst zwei Werte in eine Datei ein und bedienst danach eine Weboberfläche. Für eigene Aufträge änderst du nur die Adresse der Seite und den Satz, der beschreibt, was passieren soll.
Läuft das in meinem normalen Chrome?
Ja, und zwar im bestehenden Profil mit deinen Logins. Du musst einmal Remote-Debugging in Chrome erlauben. Der Agent öffnet seinen eigenen Tab und schließt ihn danach wieder.
Was kostet ein Lauf?
Bei Jev zahlst du 0,042 Dollar pro Million Eingabe-Token, die Antworten sind kostenlos. Ein Flugsuche-Lauf liegt damit unter einem Cent. Dazu kommt das Text-Modell fürs Tippen, oder du nimmst dafür deine Claude-Anmeldung über den Shim und zahlst nichts extra.
Kann der Agent auch Flüge buchen oder Formulare abschicken?
Technisch klickt er jeden Button, den die Seite als Bedienelement liefert. Das Repo hält beim Flug bewusst vor der Buchung an. Für eigene Aufträge formulierst du im Zielsatz, wo er stoppen soll, und prüfst das Ergebnis selbst. DONE heißt nur, dass das Modell fertig zu sein glaubt.