Vom AI-Coding-Agenten erzeugten Spaghetticode bereinigen und Token-Kosten senken
Ich habe einem Agenten das Programmieren überlassen, und plötzlich explodierte der Code auf eine Million Zeilen, während die API-Rechnung in die Höhe schoss. Dieser Artikel handelt davon, wie man das wieder in den Griff bekommt.
Beschädigte Codebasis aufräumen
Doppelter Code, den ein Agent in einer Endlosschleife erzeugt hat, lässt sich in 30 Minuten löschen. Dazu verwendet man knip und jscpd.
Erstelle eine knip.json im Projektstammverzeichnis und trage die Einstiegspunkte ein. Führe im Terminal npx knip aus, um Geisterpakete zu finden, die der Agent hinterlassen hat. Führe anschließend npx jscpd ./src -t 1 aus, um durch Copy-Paste vervielfachte Funktionsblöcke zu identifizieren.
In einem Monorepo mit 158 Dateien lässt sich unnötiger Code auf einen Schlag entfernen. Öffne danach die biome.json, aktiviere die Regel noUnusedVariables und sorge dafür, dass kein Dead Code mehr hineingelangt.
Token-Kosten mit Sandboxes begrenzen
Wenn man dem Agenten jedes Mal den gesamten Code vorwirft, verdampfen die Token. Man muss eine Repo-Map-Struktur im Aider-Stil anwenden, um nur die Datei zu isolieren, an der gerade gearbeitet wird.
Mit der Option --map-tokens 1024 lassen sich die Token für das Verstehen der Repository-Struktur selbst in Projekten mit über 1.000 Dateien unter 2.000 Token halten.
Um Kostenobergrenzen festzulegen, ist LiteLLM Proxy die Lösung. Konfiguriere litellm_config.yaml und begrenze die maximale Anzahl von Schleifen pro Sitzung auf 15. Wenn du das Kostenlimit auf 2,50 Dollar einstellst, bricht der Proxy den Aufruf ab, sobald der Agent das Limit überschreitet.
Den Agenten durch deklarative Tests kontrollieren
Es hat keinen Sinn, lange Prompts auf Malaiisch zu verfassen. Man muss dem Agenten zuerst fehlschlagende Unit-Tests vorwerfen, damit er keinen Unsinn macht.
Laut der Studie zu SWE-bench Verified sank die Rücksprungrate von 6,08 Prozent auf 1,82 Prozent und die Problemlösungsrate stieg von 24 Prozent auf 32 Prozent, wenn zuerst Unit-Test-Fälle injiziert wurden.
Erstelle zuerst eine fehlschlagende Testdatei und weise den Agenten an, nur den Implementierungsteil zu schreiben, der diesen Test besteht.
Auch das Validierungsskript sollte automatisiert werden. Erstelle eine Datei namens local_verifier.sh und füge nacheinander die Befehle npx tsc --noEmit, npx biome check ./src und npx vitest run ein. Selbst wenn der Agent darauf beharrt, den Code fertiggestellt zu haben, wird der Commit verhindert, wenn der Exit-Code dieses Skripts nicht 0 ist.
Ein hybrider Workflow mit menschlicher Intervention
Der vom Agenten erstellte Code wird in Pull Requests aufgeteilt und von Menschen überprüft.
Überprüfe, ob die Anzahl der modifizierten Zeilen 200 überschritten hat, ob seltsame Pakete zu package.json hinzugefügt wurden oder ob Fehler einfach mit @ts-ignore übertüncht wurden. Wenn du Husky und lint-staged kombinierst, wird doppelter Code zum Zeitpunkt des Commits sofort blockiert, sobald er 2 Prozent übersteigt.
Bei der Aufteilung der Arbeit geht man in 3 Schritten vor. Das Top-Modell teilt die Arbeit auf und erstellt eine TODO.md. Danach implementiert ein kosteneffizientes Modell jedes Element. Schließlich überprüft ein Senior-Developer den Git-Diff. Mit dieser Struktur lassen sich im Vergleich zum Einsatz eines einzigen Frontier-Modells über 70 Prozent der Kosten einsparen.