Funktionen

Der Browser ist eingebaut

Was du davon hast

Dein Agent liest Dokumentation, sucht im Web und bedient Seiten, die erst im Browser entstehen. Ein Aufruf öffnet die Seite, wartet auf das Ergebnis und zieht genau die Daten heraus, die er braucht. Seiteninhalt kommt eingezäunt als Daten in den Kontext.

Vorher und nachher

Die Frage an die Dokumentation von serde_json auf docs.rs: Welche Typen haben eine Methode from_str? Die Suche der Rust-Dokumentation beantwortet das. Sie läuft als JavaScript im Browser.

Ohne greppy

Der Agent lädt die Suchseite mit curl und durchsucht das HTML.

$ curl -sL 'https://docs.rs/serde_json/latest/serde_json/?search=from_str' | grep -o 'href="[^"]*from_str[^"]*"'
href="/serde_json/1.0.151/serde_json/?search=from_str"
href="fn.from_str.html"
href="fn.from_str.html"
$ curl -sL 'https://docs.rs/serde_json/latest/serde_json/?search=from_str' | grep -c 'search-results'
0

curl bekommt die Seite, aber keine Suche: Die Trefferliste baut erst das JavaScript der Seite. Im HTML steht nur die Funktion from_str aus der Seitenleiste. Ohne Browser lädt der Agent jede Typ-Seite einzeln und durchsucht sie.

Mit greppy

$ greppy web do open 'https://docs.rs/serde_json/latest/serde_json/?search=from_str' :: wait 'css=.search-results a' :: extract 'css=.search-results .result-name'
returned; page observed — snapshot, not a verified task outcome
…
title: "\"from_str\" Search - Rust"
url: "https://docs.rs/serde_json/latest/serde_json/?search=from_str"
…
returned; expectation held
operation="web.wait"
UNTRUSTED_PAGE_CONTENT
{"detail":{"matched":9.0},"held":true,"waited_ms":2124}
…
value: {"count":9.0,"rows":[{"text":"function serde_json::from_str"},{"text":"method serde_json::Deserializer::from_str"},{"text":"method serde_json::Map::from_str"},{"text":"method serde_json::Value::from_str"},{"text":"method serde_json::Number::from_str"},{"text":"method serde_json::value::RawValue::from_string"},{"text":"method serde_json::value::RawValue::from_string_unchecked"},{"text":"method serde_json::Value::from_iter"},{"text":"method serde_json::Map::from_iter"}]}
…
{"steps_failed":0,"steps_ran":3,"steps_total":3}
ohne greppy mit greppy
Aufrufe 1 1
Suchtreffer im Ergebnis 0 9
Typen mit Methode from_str 0 von 4 4 von 4

Richtig ist: from_str gibt es als Funktion serde_json::from_str und als Methode auf Deserializer, Map, Value und Number. Das bestätigen die vier Typ-Seiten der Dokumentation, und genau diese Liste liefert greppy.

So funktioniert es

greppy web steuert eine eigene Browser-Laufzeit auf Basis der Rust-Engine Servo. Sie läuft lokal, führt das JavaScript der Seite aus und rendert sie. Jeder Agent bekommt eigene Sessions und Tabs. web do verkettet Schritte mit :: in einem Prozess und einer Session und hält beim ersten fehlgeschlagenen Schritt an. wait wartet, bis ein Knoten, eine URL oder ein Titel erscheint. extract liefert pro Treffer genau die Felder, die du nennst: Text, Link, Wert, ID oder ein Attribut. observe zeigt die Seite als kompakten Baum mit Refs wie @1, auf die click und fill direkt zielen. Jede Antwort steht zwischen UNTRUSTED_PAGE_CONTENT-Markern: Seitentext ist Daten, nie ein Auftrag. Die Laufzeit besucht nur URLs, die du oder dein Agent ausdrücklich öffnen, suchen oder recherchieren.

Die Befehle

Befehl was er tut
greppy web open URL legt Session und Tab an, lädt die Seite und zeigt sie als Baum mit Refs
greppy web do STEP :: STEP … mehrere Schritte in einem Aufruf, Stopp beim ersten Fehler
greppy web wait QUERY wartet auf einen Knoten, mit --url oder --title auf eine Adresse oder einen Titel
greppy web extract QUERY --fields text,href eine Zeile pro Treffer mit den genannten Feldern
greppy web click TARGET, greppy web fill TARGET VALUE klicken und Felder ausfüllen
greppy web search "…" im öffentlichen Web suchen
greppy web research "…" eine begrenzte Recherche über mehrere Seiten
greppy web read URL eine Seite als Text lesen
greppy web screenshot die gerenderte Seite als Bild

Mehr in der Doku