Endlich gelöst: zwei Stunden Testen für die richtige Headless-Konstellation der Antigravity CLI
Ich wollte Googles Antigravity CLI (agy) headless in eine Auto-Execution-Pipeline einbinden. Die Idee war simpel: pro Run ein gezielt ausgewähltes Modell über --model, alles non-interaktiv über -p/--print, Ausgabe einsammeln, weiterverarbeiten. Der erste Aufruf sah harmlos aus:
agy -p --model "gemini-3.1-pro" "Reply with ONLY your exact model name."
Die Antwort: Gemini 3.5 Flash. Also der Default — nicht das Modell, das ich angefordert hatte. Egal welchen String ich in --model schrieb, agy fiel jedes Mal auf das Standardmodell zurück. Kein Fehler, keine Warnung, nichts. Zwei Stunden später kannte ich den Grund, und er steht in keiner Doku. Der Reihe nach.
Schritt 1: Die Modellnamen sind keine Slugs
Mein erster Verdacht: falscher Modellname. agy models brachte Klarheit — und eine Überraschung. Die CLI listet Modelle als Display-Namen mit Reasoning-Level in Klammern, nicht als technische Slugs:
agy models
# Gemini 3.5 Flash (Medium)
# Gemini 3.5 Flash (High)
# Gemini 3.5 Flash (Low)
# Gemini 3.1 Pro (Low)
# Gemini 3.1 Pro (High)
# Claude Sonnet 4.6 (Thinking)
# Claude Opus 4.6 (Thinking)
# GPT-OSS 120B (Medium)
Wichtig: Es gibt kein separates --effort- oder --reasoning-Flag. Der Reasoning-Level ist Teil des Modell-Strings. Meine Slug-Varianten — gemini-3.1-pro, :high, -high — führten alle zum Fallback. Nur der exakte Display-Name mit Klammer wurde im interaktiven Modus übernommen, sichtbar an der Statuszeile unten rechts. Schon das ist nirgends sauber dokumentiert.
Schritt 2: Frag das Modell nicht, wer es ist
Mit dem korrekten Namen bewaffnet, der nächste Headless-Test:
agy -p --model "Gemini 3.1 Pro (High)" "Reply with ONLY your exact model name."
Antwort: I’m running on the GPT-OSS 120B (Medium) model. Das war auf zwei Ebenen lehrreich. Erstens: --model wurde wieder ignoriert — der Default war diesmal offenbar ein anderer, aber jedenfalls nicht mein angefordertes Modell. Zweitens, und das ist die eigentliche Falle: Der Self-Report eines Modells ist als Identitätsbeweis wertlos. Modelle kennen ihren exakten Namen oft nicht zuverlässig und raten anhand von System-Prompt oder Training. Wer headless arbeitet, kann sich darauf nicht verlassen.
Self-Report taugt nicht als Identitätsbeweis
Verlässlich ist nur die Statuszeile im interaktiven Modus oder ein Log-Check auf den echten API-Call: --log-file setzen und auf streamGenerate bzw. den Modellnamen greppen. Was das Modell über sich selbst sagt, ist Rauschen.
Schritt 3: Es ist die Reihenfolge der Flags
Der Durchbruch kam beim stumpfen Durchprobieren: Ich vertauschte die Flags am selben Modell. Und plötzlich stimmte das Ergebnis. Das ist der Moment, in dem die Reihenfolge klickt — und alles vorher zur Fußnote macht.
# FALSCH — fällt still auf den Default zurück:
agy -p --model "Gemini 3.1 Pro (High)" "Reply with ONLY your exact model name."
# RICHTIG — verwendet das angeforderte Modell:
agy --model "Gemini 3.1 Pro (High)" -p "Reply with ONLY your exact model name."
--model muss vor -p stehen. Steht -p zuerst, schluckt der Print-Modus die nachfolgende Modellangabe und fällt still auf den Default zurück — Exit-Code 0, keine Meldung. Ich habe das über alle acht Modelle der Liste gegengeprüft: Sobald --model vor -p steht, kommt jedes Mal das korrekte Ergebnis zurück.
Das funktionierende Muster
Die Konstellation, die ich jetzt in der Pipeline fahre, ist genau eine Zeile:
agy --model "<Display-Name (Level)>" -p "<prompt>"
Konkret, für drei der Modelle:
agy --model "Gemini 3.1 Pro (High)" -p "..."
agy --model "Claude Opus 4.6 (Thinking)" -p "..."
agy --model "GPT-OSS 120B (Medium)" -p "..."
Drei Stolperfallen, die mich sonst noch erwischt hätten
Mit der Flag-Reihenfolge ist das Hauptproblem gelöst, aber für unbeaufsichtigte Runs gibt es drei weitere Punkte, die ich gleich mit eingeplant habe.
- Non-TTY-stdout-Drop. In Pipes, Subprozessen oder CI kann
agy -pdie Antwort still verschlucken — Exit-Code 0, aber leerer stdout (dokumentiert als GitHub Issue #76). Weragyals Subprocess captured, braucht ein Pseudo-TTY:script -qfc 'agy --model "..." -p "..."' /dev/null. - Namens-Stabilität. Die Display-Strings können sich zwischen
agy-Versionen ändern. Statt Namen hart zu verdrahten, parse ich vor jedem Run einmalagy modelsund ziehe den passenden String dynamisch. - API-Key-Pfade.
GEMINI_API_KEYwird in manchen Pfaden ignoriert. Für CI setze ichANTIGRAVITY_TOKENbzw.ANTIGRAVITY_API_KEY.
Fazit
Die zentrale, nirgends dokumentierte Regel: --model vor -p. Dazu drei Leitplanken — Display-Name mit Klammer statt Slug, Log statt Self-Report, Pseudo-TTY gegen den stdout-Drop. Damit läuft agy bei mir headless zuverlässig. Der Sinn der ganzen Fummelei: agy ist nur eine Engine in einer Multi-Modell-Pipeline, die mehrere KI-Coding-Tools headless laufen lässt und ihre Ergebnisse gegeneinander antreten lässt. Die OpenAI-Modelle habe ich bewusst ausgeklammert; die teste ich separat und reiche das Ergebnis nach.
Entdecke mehr
Tokens sparen mit Claude: 6 Prinzipien, mit denen Experten doppelt so schnell arbeiten
Wie ich meine CLAUDE.md von Stilrichtlinie auf Token-Budget umgestellt habe — 6 Prinzipien für weniger Kosten, weniger Wartezeit und ehrlicheres Reporting.
GlossarAider
Aider ist ein quelloffener KI-Pair-Programmer für die Kommandozeile, der Code direkt im Git-Repository editiert und jede Änderung automatisch committet.
LexikonKI-Coding-Tools im Vergleich
Cursor, Windsurf, Claude Code, GitHub Copilot, Continue.dev, Aider im Vergleich. Mit Tabelle und Entscheidungshilfe für vier typische Workflows.