Zurück zum Blog
·von Patrick Hofmann

Der Prozess pro Agent war nie die Grenze

Ich habe jeden Agent als eigenen Betriebssystem-Prozess laufen lassen, überwacht von einem eigenen Daemon. Aus dreizehn Agents wurden rund sechsundzwanzig langlebige Prozesse. Eine Notiz aus einem Umbau, der noch läuft — und aus der Erkenntnis, dass die Isolation, die ich dem Prozess zuschrieb, woanders saß.

OpenApeAI AgentsInfrastructureBuilding in Public

Jeder Agent war ein eigener Prozess. Ein OS-User, ein eigener Supervisor-Daemon, ein Bridge-Prozess, ein Dauer-Socket. Bei dreizehn Agents waren das rund sechsundzwanzig langlebige Prozesse, jeder mit eigener Neustart-Logik, eigener generierter Konfiguration, eigenem Log.

Das fühlte sich nach Sauberkeit an. Jeder Agent in seinem eigenen Fach, abgeschottet vom Rest. Tatsächlich war das meiste davon Overhead, der nichts abschottete.

Was der Prozess-pro-Agent gekostet hat

Der Supervisor pro Agent musste am Leben gehalten werden. Er hatte eine Neustart-Obergrenze, und wenn ein Agent oft genug schnell hintereinander abstürzte, gab der Supervisor auf und ließ ihn liegen — gestrandet, ohne dass etwas ihn zurückholte. Die Antwort darauf war nie eine bessere Supervisor-Konfiguration. Die behandelt das Symptom. Das eigentliche Problem ist, dass ein abstürzender Agent die anderen nicht mitreißen darf, und das ist eine Frage der Fehler-Isolation, nicht der Prozess-Anzahl.

Dazu kam die ganze Maschinerie drumherum: für jeden Agent eine generierte Supervisor-Konfiguration, ein Wrapper-Skript, ein eigener Daemon-Zustand, der gepflegt werden wollte. Nichts davon machte einen einzelnen Agent besser. Es war der Preis dafür, dass „ein Agent" und „ein Prozess" dasselbe sein mussten.

Was an die Stelle tritt

Statt sechsundzwanzig Prozessen ein Prozess. Der Nest hält die Agent-Sessions im selben Prozess — ein SessionHost, der eine Menge laufender Sessions verwaltet, jede Konversation in einer eigenen ThreadSession. Der SessionHost gleicht ab: welche Agents soll es geben, welche laufen gerade, und welche sind gestrandet und müssen neu gestartet werden. Dieser Abgleich ist serialisiert, damit nicht zwei davon gleichzeitig durcheinanderlaufen, und er wiederholt sich in einem Takt. Ein Agent, der scheitert, wird in seinem eigenen try/catch gefangen — er strandet allein, nicht die ganze Flotte.

Das ist dieselbe Robustheit, die ich vorher von dreizehn unabhängigen Supervisoren erwartet habe, nur an einer Stelle und direkter.

Warum das überhaupt geht

Die Frage, die sofort kommt: Wenn alle Agents in einem Prozess laufen — wo ist dann die Isolation? Vorher saßen die Geheimnisse eines Agents nur in dessen Prozess, getrennt durch den OS-User, unter dem dieser Prozess lief.

Und genau da liegt der Denkfehler, den ich gemacht hatte. Die Trennung kam nie vom Prozess. Sie kam vom OS-User und den Dateirechten. Der eigene Prozess war nur der Ort, an dem zufällig ein User-Kontext hing. Den User kann ich behalten, ohne den Dauer-Prozess zu behalten — die Isolation wandert dann an die Stelle, an der sie wirklich gebraucht wird, nämlich wenn ein Tool läuft, nicht während ein Agent nur wartet. Wie das konkret funktioniert, ist ein eigenes Thema; hier zählt nur: der Prozess war nie das, was getrennt hat.

Dass der Umbau noch läuft

Dieser Teil ist Bauzustand, und ich schreibe ihn als solchen. Der Einzelprozess-Pfad liegt hinter einem Schalter, der per Default aus ist. Im echten Betrieb läuft weiter der alte Weg mit einem Prozess pro Agent. Beide Wege existieren parallel, hinter derselben Schnittstelle, und der Code, der sie benutzt, weiß nicht, welcher gerade aktiv ist. Erst wenn der neue Pfad sich im echten Betrieb bewährt hat, wird er der Default und der alte fällt weg — es gibt keinen Tag, an dem ich alles umlege und hoffe. VERIFY: aktuellen Default-/Cutover-Stand vor Publikation bestätigen

Schluss

Ich habe einem einzelnen Agent einen ganzen Prozess gegeben, weil das nach der sauberen Grenze aussah. Die Grenze war es nie. Sie lag im OS-User, und den behalte ich. Was wegfällt, ist die Annahme, dass „ein Agent" und „ein Prozess" dasselbe sein müssen — dieselbe Annahme, die mich vorher jeden Agent sein eigenes Tooling installieren ließ. Ein Prozess kann viele halten. Ich hatte nur nie genug Agents, um zu merken, dass die Trennung woanders herkommt.