Soixante conteneurs sur un seul serveur
Une seule machine bare-metal fait tourner des dizaines à des centaines de conteneurs Hoody. La déduplication KSM et BTRFS rend le coût marginal quasi nul.
vous voulez un panel de modèles qui review le même input. Cinq conteneurs, cinq providers différents, cinq opinions. Le framework d'orchestration invente d'habitude cent lignes pour coordonner ça. vous ne les écris pas — chaque agent reçoit son propre chemin de pipe, et le judge curl les cinq en parallèle.
Chaque agent tourne dans son propre conteneur avec sa propre handle de modèle. Chacun stream son verdict sur son propre chemin de pipe. Le process judge curl les cinq chemins en parallèle — le pipe garde chaque verdict jusqu'à ce que le judge se connecte, puis stream les octets. Pas de bus de messages, pas de framework d'orchestration, pas de graphe de callbacks.
Cinq conteneurs démarrent en parallèle, chacun avec une handle de modèle différente. Le judge POST le prompt sur chaque endpoint d'agent en même temps.
Pendant que le modèle réfléchit, l'agent pipe son verdict dans pipe/agent-N en PUT. Le pipe garde les octets — pas de disque, pas de broker — jusqu'à ce que quelqu'un les curl.
GET pipe/agent-1 jusqu'à pipe/agent-5 avec un curl chacun. Le pipe route les octets de chaque agent vers le judge dès que les deux côtés sont connectés.
Le judge lit du JSON sur chaque chemin, compte les votes, renvoie la majorité. Cinq conteneurs, un chemin HTTP chacun, aucun SDK entre eux.
#!/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 pousse chaque verdict. GET tire chacun. Le pipe est le câble — les octets vont de l'agent au judge dès que les deux sont connectés, avec backpressure gérée par chemin. Pour ajouter un sixième agent, démarre un sixième conteneur et ajoute une sixième ligne à la boucle.
Le mécanisme a une seule forme — cinq conteneurs, cinq chemins, un judge — mais sa valeur se lit différemment selon ce que vous cherchezz à éviter.
vous n'avez pas besoin d'un framework d'orchestration pour envoyer un prompt à cinq APIs et moyenner les réponses. Une boucle bash avec cinq curls le fait déjà. L'ensemble d'agents, c'était toujours cinq appels HTTP déguisés en trench-coat.
Ajouter un agent : un autre conteneur, un autre chemin de pipe, une ligne de plus dans le fetch parallèle du judge. En enlever un : tuez le conteneur, supprimez la ligne. Rien à reconfigurer — pas de bus de messages, pas de graphe de callbacks, pas de migration de schéma.
Les modèles cheap streament en premier ; les chers ne finissent que si le consensus n'est pas clair. Comme chaque agent est un conteneur séparé avec son propre pipe, vous pouvez court-circuiter le panel dès que trois sont d'accord — pas d'état partagé, pas de RPC abort, juste fermer les pipes.
Chaque agent reçoit un chemin. Le chemin est le câble.
Cinq providers de modèles, cinq conteneurs, cinq chemins HTTP — et un judge qui fait vingt lignes de bash. Le framework d'orchestration faisait toujours semblant que HTTP n'existait pas.
Le judge lit chaque chemin, compte les votes, renvoie la majorité. Pour ajouter un agent, démarrez un conteneur et ajoutez un chemin. Pas de bus de messages à reconfigurer.
Chaque framework ici embarque sa propre notion d'« agent » plus une façon vendor-spécifique pour qu'un agent parle à un autre. Le pipe collapse cette surface en HTTP — un chemin par agent, curl dans les deux sens.
vous n'avez pas besoin d'un orchestrateur. vous avez besoin de cinq conteneurs et cinq chemins de pipe. Le judge fait vingt lignes de bash.