
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
你想让一组模型来审阅同一个输入。五个容器、五个不同的提供商、五种意见。编排框架通常会发明一百行代码来协调这件事。你不用写——每个智能体拿到自己的管道路径,裁判并行 curl 这五条。
每个智能体在自己的容器中运行,使用自己的模型句柄。每个把裁决流式送进自己的管道路径。裁判进程并行 curl 这五条路径——管道为每个裁决守住,直到裁判连上,再把字节穿过去。无消息总线,无编排框架,无回调图。
五个容器并行启动,每个挂载不同的模型句柄。裁判同时 POST 提示到每个容器的智能体端点。
模型在思考时,智能体用 PUT 把裁决送进 pipe/agent-N。管道守住字节——不上磁盘、不走 broker——直到有人 curl 出来。
GET pipe/agent-1 到 pipe/agent-5,每条一个 curl。两端一连上,管道就把每个智能体的字节路由给裁判。
裁判从每条路径读 JSON,统计票数,返回多数派。五个容器,每个一条 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 把每个拉下来。管道就是这根线——两端一连上,字节就从智能体流到裁判,每条路径都有独立的反压。要加第六个智能体,启动第六个容器,再在循环里加一行。
机制是一种形状——五个容器、五条路径、一个裁判——但根据你想击败的对象,价值的读法不一样。
你不需要编排框架就能把一个提示发给五个 API、再把答案平均一下。一个 bash 循环加五个 curl 已经做到了。所谓智能体集成,向来就是五个 HTTP 调用披着风衣。
加一个智能体:再来一个容器、再来一条管道路径,在裁判的并行抓取里多加一行。下掉一个:杀掉容器,删掉那一行。没什么要重新配置的——无消息总线、无回调图、无 schema 迁移。
便宜的模型先流出;贵的只有在共识不明时才跑完。因为每个智能体是独立的容器,带着自己的管道,所以一旦三个达成一致,你就能短路评审团——无共享状态、无 abort RPC,只要把管道关掉。
每个智能体拿到一条路径。路径就是这根线。
五家模型提供商,五个容器,五条 HTTP 路径——再加一个二十行 bash 的裁判。编排框架向来在假装 HTTP 不存在。
裁判读取每条路径,统计票数,返回多数派。要加一个智能体,启动一个容器并加一条路径。没有消息总线要重配。
这里每个框架都自带一套「智能体」的概念,外加一种厂商专属的方式让一个智能体跟另一个对话。管道把这层表面塌缩到 HTTP——每个智能体一条路径,curl 双向通行。
你不需要编排器。你需要五个容器和五条管道路径。裁判是二十行 bash。