
Soixante conteneurs sur un seul serveur
Une machine bare-metal exécute des dizaines à des centaines de conteneurs Hoody. La dédupplication KSM et BTRFS rend le coût marginal quasi nul.
Vous voulez un panel de modèles qui examinent la même entrée. Cinq conteneurs, cinq fournisseurs différents, cinq opinions. Le framework d'orchestration invente d'habitude une centaine de lignes pour coordonner tout ça. Vous n'en écrivez aucune — chaque agent obtient son propre chemin de pipe, et le juge fait curl sur les cinq en parallèle.
Chaque agent s'exécute dans son propre conteneur avec son propre handle de modèle. Chacun diffuse son verdict vers son propre chemin de pipe. Le processus juge fait curl sur les cinq chemins en parallèle — le pipe retient chaque verdict jusqu'à ce que le juge se connecte, puis fait passer les octets. Pas de bus de messages, pas de framework d'orchestrateur, pas de graphe de callbacks.
Cinq conteneurs démarrent en parallèle, chacun avec un handle de modèle différent. Le juge fait POST du prompt vers l'endpoint d'agent de chaque conteneur en même temps.
Pendant que le modèle réfléchit, l'agent envoie son verdict dans pipe/agent-N avec PUT. Le pipe retient les octets — pas de disque, pas de broker — jusqu'à ce que quelqu'un les retire avec curl.
GET pipe/agent-1 jusqu'à pipe/agent-5 avec un curl chacun. Le pipe achemine les octets de chaque agent vers le juge dès que les deux extrémités sont connectées.
Le juge lit le JSON sur chaque chemin, compte les votes, retourne 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 vers le haut. GET le tire vers le bas. Le pipe est le câble — les octets passent de l'agent au juge dès que les deux sont connectés, avec backpressure gérée par chemin. Pour ajouter un sixième agent, vous démarrez un sixième conteneur et ajoutez une sixième ligne à la boucle.
Le mécanisme a une seule forme — cinq conteneurs, cinq chemins, un juge — mais la valeur se lit différemment selon ce que vous cherchez à éviter.
Vous n'avez pas besoin d'un framework d'orchestration pour envoyer un prompt à cinq APIs et faire la moyenne des réponses. Une boucle bash avec cinq curl fait déjà ça. L'ensemble d'agents n'a jamais été que cinq appels HTTP déguisés.
Ajouter un agent : un autre conteneur, un autre chemin de pipe, une ligne de plus dans le fetch parallèle du juge. En supprimer un : tuez le conteneur, retirez la ligne. Il n'y a rien à reconfigurer — pas de bus de messages, pas de graphe de callbacks, pas de migration de schéma.
Les modèles bon marché diffusent en premier ; les coûteux ne terminent que si le consensus reste flou. 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 d'abandon, il suffit de fermer les pipes.
Chaque agent reçoit un chemin. Le chemin est le câble.
Cinq fournisseurs de modèles, cinq conteneurs, cinq chemins HTTP — et un juge qui tient en vingt lignes de bash. Le framework d'orchestration faisait toujours semblant que HTTP n'existait pas.
Le juge lit chaque chemin, compte les votes, retourne la majorité. Pour ajouter un agent, démarrez un conteneur et ajoutez un chemin. Il n'y a aucun bus de messages à reconfigurer.
Chaque framework ici embarque sa propre notion d'« agent » plus une façon spécifique au fournisseur pour qu'un agent parle à un autre. Le pipe ramène cette surface à 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 de cinq chemins de pipe. Le juge tient en vingt lignes de bash.