
一台服务器上运行 60 个容器
一个裸金属服务器运行数十到数百个 Hoody 容器。KSM 和 BTRFS 去重使边际成本接近零。
传统 cron 行在凌晨 2 点跑 reconcile.sh。Hoody 的 cron 行把一段 prompt POST 给 hoody-agent。调度是固定的,工作不是。边界情况不再是你要维护的分支——它们变成 agent 推理时的上下文。
五个早晨 · 五种不同的决定 · 一行 crontab
Hoody Cron 是每个容器上托管的 crontab。Hoody Agent 是同一个容器上内建的自主 agent。cron 条目用 curl 调用 agent。agent 读取日期、读取数据,再决定当天需要做什么。两端都是 HTTP——cron 在 /api/v1/cron/users/me/entries,agent 在 /api/v1/agent/tasks。中间没有任何胶水代码。
# POST /api/v1/cron/users/me/entries { "schedule": "0 7 * * *", "command": "curl -X POST $AGENT/api/v1/agent/tasks \ -d @prompt.json", "comment": "morning-reports" }
# prompt.json — the body of the POST { "description": "对账昨天的订单。如果 schema 漂移,重新映射。如果异常分数 > 3,停下并呼叫 on-call。如果今天是月末,对税务调整后的总账做月度结账。", "mode": "code" }
两次 POST,搞定。这一行 crontab 永远不再改——你维护的唯一文件就是 prompt。新的边界情况?加一句话。新的异常规则?加一句话。调度照常触发;每次触发意味着什么由 agent 自己想清楚。
agent 收到的工作形态总是相同——一个日期、一个数据集、一个目标。变化的是 agent 决定怎么处理它们。
cron 触发后 agent 启动。它检查日历——月末、节假日、财务结账。它采样数据集——schema、数据量、异常分数。它根据这些上下文挑选下一步动作,而不是依赖你六个月前写的静态 if 树。
当昨天的导出新增 refund_reason 列时,脚本会崩溃并呼你。agent 读取 schema,将其映射到旧字段,并在运行摘要里记下变化。crontab 那一行从来不需要知道。
每次运行都把 agent 决定了什么、为什么决定,回写出来。历史就是大白话——「跳过:没有新数据」、「已适配:新增退款列」、「异常:退款飙升 +412%,已呼叫 on-call」——而不是 exit code 0 / exit code 1。cron 的日志变成了一本日记。
三步——cron 触发,agent 推理,决策落地。中间那一步过去是你自己用 400 行 shell 加 17 个边界分支写出来的。现在它是一段 prompt。
Hoody Cron 运行这条条目。crontab 那一行就是一次 curl:POST /api/v1/agent/tasks,请求体里是 prompt。重试不用你写、日志接线也不用你接——cron 服务把这条条目注入系统 crontab 并跟踪运行。
agent 收到描述,打开它的工具——terminal、files、sqlite、browser、exec——然后挑一份动作计划。它可能运行、跳过、适配或呼人。挑选每天都不同。指令始终一致。
运行结束。agent POST 回一行摘要:报表已重新生成、因没有新数据跳过、因异常停下。你边吃早饭边在手机上读它。
调度没改。脚本没改。改变的是你这个人是否得起来去处理。把 agent 放进环里之后,答案几乎总是不用——并且运行历史告诉你为什么。
Hoody Cron 和 Hoody Agent 是同一个容器上的两个服务,都通过 HTTP 可达。数字来自有文档支撑的接口——不是凭空的基准。
crontab 里一行 curl,用永远。prompt 是你唯一会重写的东西——而且是在一个 JSON 文件里改,不是 crontab -e。
hoody-agent 把整套接口——terminal exec、文件读写、sqlite 查询、浏览器自动化、守护进程控制——以普通 HTTP 调用的形式开放给 agent 任务。
cron 和 agent 之间没有 SDK。POST 一个 URL,读另一个。两个服务都跑在同一个容器上,所以调用是本地网络速度。
Hoody Cron 支持标准 5 字段表达式(* * * * *)和宏(@hourly、@daily、@weekly、@monthly、@yearly)。Hoody Agent 任务创建是一次 POST /api/v1/agent/tasks;实时更新通过 /api/v1/agent/ws 推送。
cron 条目不再运行任务——它请 agent 去想清楚任务。
你过去因为 cron 只会执行文件而塞进 reconcile.sh 的那一堆东西。每一项都是一个分支、一个开关、一份配置——没有一项是调度真正需要知道的。agent 读取这一天,自己决定。
别再维护 cron 脚本。开始维护 prompt。调度照样触发;agent 自己想清楚。