
Sechzig Container auf einem Server
Eine Bare-Metal-Box führt Dutzende bis Hunderte von Hoody-Containern aus. KSM und BTRFS-Dedup machen die Marginalkosten nahezu null.
Du willst ein Panel aus Modellen, das denselben Input prüft. Fünf Container, fünf verschiedene Anbieter, fünf Meinungen. Das Orchestrierungs-Framework erfindet dafür normalerweise hundert Zeilen Koordinationscode. Du schreibst sie nicht – jeder Agent bekommt seinen eigenen Pipe-Pfad, und der Judge holt alle fünf parallel per curl ab.
Jeder Agent läuft im eigenen Container mit seinem eigenen Modell-Handle. Jeder streamt sein Urteil in seinen eigenen Pipe-Pfad. Der Judge-Prozess holt alle fünf Pfade parallel per curl ab – die Pipe hält jedes Urteil bereit, bis der Judge sich verbindet, dann fließen die Bytes durch. Kein Message-Bus, kein Orchestrator-Framework, kein Callback-Graph.
Fünf Container booten parallel, jeder mit einem anderen Modell-Handle. Der Judge POSTet den Prompt gleichzeitig an den Agent-Endpoint jedes Containers.
Während das Modell denkt, leitet der Agent sein Urteil per PUT in pipe/agent-N. Die Pipe hält die Bytes – keine Festplatte, kein Broker – bis sie jemand per curl abruft.
GET pipe/agent-1 bis pipe/agent-5 mit je einem curl. Die Pipe leitet die Bytes jedes Agenten an den Judge weiter, sobald beide Enden verbunden sind.
Der Judge liest JSON aus jedem Pfad, zählt die Stimmen und gibt die Mehrheit zurück. Fünf Container, je ein HTTP-Pfad, kein SDK dazwischen.
#!/usr/bin/env bash
set -euo pipefail
PROMPT='review this PR for security issues'
AGENTS=(claude-sonnet gpt-4o gemini llama mixtral)
BASE=https://pipe.hoody.com/api/v1/pipe
# Each container streams its verdict into its own path.
# Five paths fan-in to one judge — no broker, no SDK.
for i in "$[!AGENTS[@]]"; do
N=$((i + 1))
curl -s -X POST "https://agent-$N.hoody.com/v1/run" \
-d "[\"prompt\": \"$PROMPT\", \"sink\": \"$BASE/agent-$N\"]" &
done
# Read all five verdicts in parallel.
VERDICTS=()
for i in 1 2 3 4 5; do
VERDICTS+=("$(curl -s "$BASE/agent-$i")")
done
wait
# Tally — majority wins.
printf '%s\n' "$[VERDICTS[@]]" \
| jq -r .verdict \
| sort | uniq -c | sort -rn | head -1PUT schiebt jedes Urteil hoch. GET zieht jedes herunter. Die Pipe ist die Leitung – Bytes wandern vom Agenten zum Judge, sobald beide verbunden sind, mit Backpressure pro Pfad. Um einen sechsten Agenten hinzuzufügen, bootest du einen sechsten Container und ergänzt eine sechste Zeile in der Schleife.
Der Mechanismus ist eine einzige Form – fünf Container, fünf Pfade, ein Judge – aber der Wert liest sich anders, je nachdem, wogegen du gerade ankämpfst.
Du brauchst kein Orchestrierungs-Framework, um einen Prompt an fünf APIs zu schicken und die Antworten zu mitteln. Eine Bash-Schleife mit fünf curls erledigt das schon. Das Agent-Ensemble waren immer fünf HTTP-Calls im Trenchcoat.
Agent hinzufügen: noch ein Container, noch ein Pipe-Pfad, eine weitere Zeile im Parallel-Fetch des Judges. Einen entfernen: Container killen, Zeile löschen. Es gibt nichts neu zu konfigurieren – kein Message-Bus, kein Callback-Graph, keine Schema-Migration.
Günstige Modelle streamen zuerst; teure laufen nur durch, wenn der Konsens unklar ist. Weil jeder Agent ein eigener Container mit eigener Pipe ist, kannst du das Panel kurzschließen, sobald drei übereinstimmen – kein gemeinsamer State, kein Abort-RPC, einfach die Pipes schließen.
Jeder Agent bekommt einen Pfad. Der Pfad ist die Leitung.
Fünf Modellanbieter, fünf Container, fünf HTTP-Pfade – und ein Judge, der zwanzig Zeilen Bash ist. Das Orchestrierungs-Framework hat immer so getan, als gäbe es HTTP nicht.
Der Judge liest jeden Pfad, zählt die Stimmen und gibt die Mehrheit zurück. Um einen Agenten hinzuzufügen, bootest du einen Container und ergänzt einen Pfad. Es gibt keinen Message-Bus, der neu konfiguriert werden müsste.
Jedes Framework hier liefert seinen eigenen „Agent“-Begriff plus eine herstellerspezifische Art, wie ein Agent mit einem anderen redet. Die Pipe schrumpft diese Oberfläche auf HTTP zusammen – ein Pfad pro Agent, curl in beide Richtungen.
Du brauchst keinen Orchestrator. Du brauchst fünf Container und fünf Pipe-Pfade. Der Judge ist zwanzig Zeilen Bash.