
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
你下班前启动了一个四十分钟的 agent。现在你在火车上。agent 把 trace 流到一条管道路径;你在手机上 curl 同一个 URL,看着状态信息一行行飘过。当循环结束,hoody-notifications 给你震动。两个 URL 加一次震动——无 SDK、无仪表盘、无轮询。
上面是实时 tail,下面是推送——同一部手机,同一个 agent。trace 是你瞄一眼的运行独白;推送是结束句号。你不必选择只接哪一个:两者都来自 agent,两者都落到你口袋里那部已经存在的设备上。
agent 的循环用 PUT 把每条事件发到一条路径。在火车上,你在终端 app 里 GET 同一条路径。事件发生时即落地——无五秒刷新、无"上次更新"时间戳。瞄一眼屏幕,确认 agent 还活着,把手机收起来。
外层循环结束时,agent 的最后一次调用打到 hoody-notifications,带一行总结。你的手机震动。你不必解锁——读一下横幅就知道,在到下一站之前这次跑已经完成了。
Hoody Pipe 承载实时 tail;hoody-notifications 承载那次震动。agent 把它们当作普通的 HTTP 调用——一个 PUT 和一个 POST,中间没有 SDK。
你出门前在服务器上把 agent 跑起来。在路上,手机是这条链路里唯一的客户端。agent 干所有的活;手机做所有的看。
在循环里,每一次事件——think、tool_use、result——都被 pipe 到一条路径。管道流给读它的人;如果还没人在读,这条路径会保持打开最多五分钟。
PUT https://agent-pipe.…hoody.com/api/v1/pipe/agent-trace在手机上打开终端。curl -N 这条路径。trace 落地即打印——无 SSE 管道、无 broker、无需安装 app。不想看了就关标签页。
$ curl -N https://agent-pipe.…hoody.com/api/v1/pipe/agent-trace外层循环返回时,agent POST 一行总结到 hoody-notifications。你的手机从那里收到系统推送——和日历提醒一样的震动,无需任何 app。
POST /notify ["summary":"billing-reconcile-7","body":"completed in 41:08"]两条 HTTP 路径,加上承载震动的第三条。agent 不知道你的手机存在;它只是说 HTTP。手机不知道 agent 的容器;它只是打开一个 URL。
你不会逐字读。你扫三个 token:一个想法、一次调用、一个结果。它们在动,说明 agent 还活着。它们停了,你就在下一次推送里看时间。
agent 为什么挑这个工具、它期待回什么、它可能在哪里分支。在火车上读这些,就是实时读 agent 的脑子——每条推理一行。
[think] reconcile invoices for julagent 决定调用的精确函数和参数。每次调用一行,按发出顺序排列。无 SDK 抽象、无不透明 ID——就是线路级别的请求。
[tool_use] sql.exec("SELECT …")行数、耗时、状态码——下一条 [think] 会拿来推理的东西。当外层循环完成,最终结果落到线上,hoody-notifications 给你口袋里的手机震动。
[result] 412 rows · 88 ms你的手机就是 agent 的状态栏。
无仪表盘。无 app。无下发到设备的 SDK。agent 在服务器上跑,状态在你手机上,中间只有 HTTP。你可以换车、换运营商、丢两站信号——重新连上后,下一行 [result] 接着打印。
看一个长跑的 agent,过去意味着一份 SaaS、一个仪表盘标签页或一份自定义 webhook + bot。在"我直接用手机 curl 它呢?"的拷问下,这些都没活下来。
把 trace 管道出去,把震动 POST 出去。你的手机就是 agent 的状态栏——无需 app。