
1 つのサーバーで 60 のコンテナ
1 つのベアメタルボックスで数十から数百の Hoody コンテナを実行。KSM と BTRFS のデデュプでマージナルコストはほぼゼロ。
同じ入力をモデルパネルでレビューさせたい。5 つのコンテナ、5 つの異なるプロバイダー、5 つの意見。オーケストレーションフレームワークなら通常、これを連携させるために 100 行ものコードを発明します。それを書く必要はありません — 各エージェントが独自のパイプパスを持ち、ジャッジが 5 つすべてを並列で curl します。
各エージェントは、それぞれのモデルハンドルを持つ独自のコンテナで動作します。それぞれが判定を独自のパイプパスにストリーミング。ジャッジプロセスが 5 つすべてのパスを並列で curl します — パイプはジャッジが接続するまで各判定を保持し、その後バイトをストリームで通します。メッセージバスも、オーケストレーターフレームワークも、コールバックグラフもありません。
5 つのコンテナがそれぞれ異なるモデルハンドルで並列に起動します。ジャッジは各コンテナのエージェントエンドポイントに同時にプロンプトを POST します。
モデルが思考している間、エージェントは PUT で判定を pipe/agent-N に流し込みます。パイプはバイトを保持します — ディスクなし、ブローカーなし — 誰かが curl で取り出すまで。
GET pipe/agent-1 から pipe/agent-5 までを各 1 つの curl で取得します。両端が接続するとすぐに、パイプは各エージェントのバイトをジャッジにルーティングします。
ジャッジは各パスから JSON を読み取り、票を数え、多数派を返します。5 つのコンテナ、それぞれ 1 つの HTTP パス、間に SDK はありません。
#!/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 が各判定を押し上げます。GET がそれぞれを引き下ろします。パイプはワイヤーです — 両端が接続するとすぐにバイトがエージェントからジャッジへ移動し、バックプレッシャーはパス単位で処理されます。6 つ目のエージェントを追加するには、6 つ目のコンテナを起動し、ループに 6 行目を追加します。
メカニズムは 1 つの形 — 5 つのコンテナ、5 つのパス、1 人のジャッジ — ですが、何を打ち破ろうとしているかによって価値の読み方が変わります。
5 つの API にプロンプトを送って答えを平均化するのに、オーケストレーションフレームワークは必要ありません。5 つの curl を並べた bash ループですでに実現できます。エージェントアンサンブルは常にトレンチコートを着た 5 つの HTTP コールでした。
エージェントを追加: もう 1 つのコンテナ、もう 1 つのパイプパス、ジャッジの並列フェッチにもう 1 行。1 つ削除: コンテナを停止し、行を削除します。再構成するものは何もありません — メッセージバスも、コールバックグラフも、スキーママイグレーションもありません。
安価なモデルが先にストリーミングし、高価なモデルはコンセンサスが不明確なときだけ完了します。各エージェントは独自のパイプを持つ別々のコンテナなので、3 つが一致した瞬間にパネルをショートサーキットできます — 共有状態も、abort RPC も不要、ただパイプを閉じるだけです。
各エージェントにパスがあります。パスがワイヤーです。
5 つのモデルプロバイダー、5 つのコンテナ、5 つの HTTP パス — そしてジャッジは bash の 20 行です。オーケストレーションフレームワークは常に HTTP が存在しないふりをしていました。
ジャッジは各パスを読み、票を数え、多数派を返します。エージェントを追加するには、コンテナを起動してパスを追加するだけです。再構成するメッセージバスはありません。
ここに挙げるすべてのフレームワークは独自の「エージェント」概念と、エージェント同士で会話するベンダー固有の方法を出荷しています。パイプはその表面を HTTP に折り畳みます — エージェントごとに 1 つのパス、双方向の curl。
オーケストレーターは必要ありません。必要なのは 5 つのコンテナと 5 つのパイプパスです。ジャッジは bash の 20 行です。