# 我用 OpenClaw、Vercel 和 Supabase 搭建了一家人工智能公司——两周后,他们就能自己运营了。
**作者**: Vox
**日期**: 2026-02-06T23:23:05.000Z
**来源**: [https://x.com/Voxyz_ai/status/2019914775061270747](https://x.com/Voxyz_ai/status/2019914775061270747)
---

> 6 个 AI 代理、1 台 VPS、1 个 Supabase 数据库——从“代理可以对话”到“代理可以自主运行网站”,我花了两个星期。本文将详细介绍中间环节缺失的部分、如何弥补这些缺失,以及您可以直接借鉴使用的架构。
## 起点:你已经有了 OpenClaw。接下来该做什么?
如果你最近一直在玩人工智能代理,那么你很可能已经设置好了 OpenClaw。
它解决了一个大问题:让 Claude 可以使用工具、浏览网页、操作文件以及运行定时任务。你可以为代理分配定时任务——例如每日推文、每小时情报扫描和定期研究报告。
我也是在那里起步的。
我的项目名为 VoxYZ Agent World——6 个 AI 代理在一个像素风格的办公室里自主运营一个网站。技术栈很简单:
- OpenClaw(运行于 VPS):代理的“大脑”——运行圆桌讨论、定时任务和深度研究
- Next.js + Vercel:网站前端 + API 层
- Supabase:所有状态(提案、任务、事件、记忆)的单一真实来源
六个角色,每个角色都有一项工作:Minion 负责决策,Sage 负责分析战略,Scout 负责收集情报,Quill 负责撰写内容,Xalt 负责管理社交媒体,Observer 负责进行质量检查。
OpenClaw 的定时任务让他们每天“准时上班”。圆桌会议让他们可以讨论、投票并达成共识。
但这只是“会说”,而不是“会操作”。
代理生成的所有内容——包括推文草稿、分析报告和内容片段——都保留在 OpenClaw 的输出层。没有任何机制将其转化为实际执行,执行完成后也没有任何信息通知系统“完成”。
在“代理可以产生输出”和“代理可以端到端运行程序”之间,缺少一个完整的执行→反馈→重新触发循环。本文将探讨这个问题。
## 闭环系统是什么样子的
我们先来定义一下“闭环”,以免我们构建出错误的东西。
一个真正无人值守的代理系统需要运行以下循环:
代理人提出一个想法(提案)
↓
自动审批检查(自动批准)
↓
创建任务 + 步骤(任务 + 步骤)
↓
工人索赔并执行(工人)
↓
发出事件(Event)
↓
触发新的反应(触发/反应)
↓
返回第一步
听起来很简单?但在实践中,我遇到了三个陷阱——每一个陷阱都让系统“看起来像是在运行,但实际上却原地打转”。

## 陷阱一:两家公司争夺工作机会
我的 VPS 上运行着 OpenClaw 工作进程,它们正在认领并执行任务。与此同时,Vercel 也运行着一个心跳定时任务,名为 mission-worker,它也在尝试认领相同的任务。
双方查询同一张表,获取同一个步骤,各自独立执行。没有协调,纯粹是竞态条件。有时,双方会给同一个步骤标记冲突的状态。
修复方案 :减少一个。VPS 是唯一的执行器。Vercel 只运行轻量级控制平面(评估触发器、处理反应队列、清理卡住的任务)。
改动很小——从心跳路由中移除 runMissionWorker 调用:
// 心跳现在只做 4 件事
const triggerResult = await evaluateTriggers(sb, 4_000);
const reactionResult = await processReactionQueue(sb, 3_000);
const learningResult = await promoteInsights(sb);
const staleResult = await recoverStaleSteps(sb);
额外好处:省去了 Vercel Pro 的费用。Heartbeat 不再需要 Vercel 的 cron 任务——VPS 上的一行 crontab 代码就能搞定:
*/5 * * * * curl -s -H "授权:Bearer $KEY"https://yoursite.com/api/ops/heartbeat

## 陷阱二:触发了但无人理会
我编写了 4 个触发器:当推文爆红时自动分析,当任务失败时自动诊断,当内容发布时自动审核,当洞察成熟时自动推广。
测试过程中我注意到:触发器正确检测到了条件并创建了一个提案。但该提案一直处于待处理状态——从未成为任务,也从未生成可执行步骤。
原因:触发器直接向 ops_mission_proposals 表中插入数据,但正常的审批流程是:插入提案 → 评估并自动批准 → 如果批准,则创建任务并执行后续步骤。触发器跳过了最后两个步骤。
修复方案 :提取共享函数 createProposalAndMaybeAutoApprove。所有创建提案的路径(API、触发器、响应)都必须调用此函数。
// proposal-service.ts — 所有提案创建的单一入口点
导出异步函数 createProposalAndMaybeAutoApprove(
sb:SupabaseClient,
输入:ProposalServiceInput,// 包含来源:'api' | 'trigger' | 'reaction'
): 承诺 <ProposalServiceResult>{
// 1. 查看每日限额
// 2. 检查上限闸门(详见下文)
// 3. 插入提案
// 4. 发出事件
// 5. 评估自动批准
// 6. 如果获得批准 → 创建任务 + 步骤
// 7. 返回结果
}
更改后,触发器仅返回提案模板。评估者调用该服务:
// trigger-evaluator.ts
如果(结果已解雇 && 结果已提出){
await createProposalAndMaybeAutoApprove(sb, {
……结果提案,
来源:'触发器'
});
}
一个函数统领所有功能。所有未来的检查逻辑(速率限制、黑名单、新的上限)——只需修改一个文件。

## 陷阱三:配额已满,队列却持续增长
最隐蔽的漏洞——表面上一切正常,日志中没有任何错误,但数据库中却有越来越多的排队步骤堆积起来。
原因:推文配额已满,但提案仍在被批准,生成任务,生成排队步骤。VPS 工作进程看到配额已满,便直接跳过了这些提案——既没有认领配额,也没有标记为失败。第二天,又有一批提案到达。
修复方案 :限制门控——在提案入口点拒绝。从一开始就不要让它生成排队的步骤。
// proposal-service.ts 中的网关系统
const STEP_KIND_GATES: 记录 <string, StepKindGate>= {
write_content: checkWriteContentGate, // 检查每日内容上限
post_tweet: checkPostTweetGate, // 检查推文配额
部署:checkDeployGate,// 检查部署策略
};
每种步骤类型都有自己的审核机制。推文配额已满?提案立即被拒绝,理由明确,并发出警告事件。 没有排队的步骤,就不会出现积压。
这是 post_tweet 门:
异步函数 checkPostTweetGate(sb: SupabaseClient) {
const autopost = await getOpsPolicyJson(sb, 'x_autopost', {});
如果 (autopost.enabled === false) 返回 { ok: false, reason: 'x_autopost disabled' };
const quota = await getOpsPolicyJson(sb, 'x_daily_quota', {});
const limit = Number(quota.limit ?? 10);
const { count } = await sb
.from('ops_tweet_drafts')
.select('id', { count: 'exact', head: true })
.eq('status', 'posted')
.gte('posted_at', startOfTodayUtcIso());
如果 ((count ?? 0) >= limit) 返回 { ok: false, reason: `每日推文配额已达 (${count}/${limit})` };
返回 { ok: true };
}
关键原则: 在入口处拒绝,不要让提案堆积如山。 被拒绝的提案会被记录下来(以供审核),而不是被悄悄丢弃。

## 赋予生命:触发因素 + 反应矩阵
解决了这三个问题后,循环就能正常运行。但这个系统仅仅是一条“零差错的装配线”,而不是一个“响应迅速的团队”。
触发器
4 条内置规则——每条规则都能检测一种情况并返回一个提案模板:
条件操作冷却时间推文互动率 > 5%增长分析其爆款原因 2 小时任务失败 Sage 诊断根本原因 1 小时发布新内容观察员审核质量 2 小时洞察获得多个赞自动推广至永久记忆 4 小时
触发器仅负责检测—— 它们不会直接操作数据库,而是将提案模板传递给提案服务。 所有上限限制和自动批准逻辑都会自动应用。
冷却时间很重要。如果没有冷却时间,一条病毒式传播的推文就会触发对每个心跳周期(每5分钟一次)的分析。
反应矩阵
最有趣的部分——自发的个体间互动。
存储在 ops_policy 表中的反应矩阵:
{
“模式”:[
{ "source": "twitter-alt", "tags": ["tweet","posted"], "target": "growth",
"type": "分析", "probability": 0.3, "cooldown": 120 },
{ "source": "*", "tags": ["mission:failed"], "target": "brain",
"类型": "诊断", "概率": 1.0, "冷却时间": 60 }
]
}
Xalt 发布推文→30%概率 Growth 会分析其表现。任何任务失败→100%概率 Sage 会进行诊断。
概率不是缺陷,而是特性。100% 确定性 = 机器人。加入随机性 = 感觉更像一个真实的团队,就像“有时有人响应,有时没人响应”一样。
## 自愈能力:系统会陷入停滞状态
VPS 重启、网络故障、API 超时——步骤会卡在运行状态,但实际上没有人处理它们。
心跳包括恢复 StaleSteps:
// 30 分钟无进展 → 标记为失败 → 检查任务是否应该结束 步骤 ID);
maybeFinalizeMissionIfDone 会检查任务中的所有步骤——任何一步失败都意味着整个任务失败,所有步骤都完成则意味着任务成功。 不再存在“只要一步成功,整个任务就标记为成功”的情况。
## 完整架构
三个层级,职责明确:
- OpenClaw(VPS):思考 + 执行(大脑 + 双手)
- Vercel:批准 + 监控(控制平面)
- Supabase:所有状态(共享皮层)

## 你可以带回家什么
如果您拥有 OpenClaw + Vercel + Supabase,以下是实现闭环系统的最低可行清单:
1. 数据库表(Supabase)
您至少需要以下这些:
表用途:ops_mission_proposals 存储提案(待处理/已接受/已拒绝)ops_missions 存储任务(已批准/正在运行/已成功/已失败)ops_mission_steps 存储执行步骤(已排队/正在运行/已成功/已失败)ops_agent_events 存储事件流(所有代理操作)ops_policy 存储策略(自动批准、每日配额限制等,以 JSON 格式存储)ops_trigger_rules 存储触发规则 ops_agent_reactions 存储反应队列 ops_action_runs 存储执行日志
2. 提案服务(单文件)
将提案创建、上限设置、自动审批和任务创建一个函数。所有来源(API、触发器、响应)都会调用它。这是整个循环的核心。
3. 策略驱动配置(ops_policy 表)
不要硬编码限制。所有行为开关都存在于 ops_policy 表中:
// auto_approve:允许哪些步骤类型自动通过
{ "enabled": true, "allowed_step_kinds": ["draft_tweet","crawl","analyze","write_content"] }
// x_daily_quota:每日推文上限
{ "limit": 8 }
// worker_policy: Vercel 是否执行步骤(设置为 false 则仅 VPS)
{ "已启用": false }
无需重新部署代码即可随时调整策略。
4. 心跳(一条 API 路由 + 一行 Crontab 指令)
Vercel 上的 /api/ops/heartbeat 路由。VPS 上的 crontab 任务每 5 分钟调用一次。其内部运行:触发器评估、反应队列处理、洞察提升、过期任务清理。
5. VPS 工作人员合同
每个步骤类型都对应一个工作进程。完成一个步骤后,工作进程会调用 maybeFinalizeMissionIfDone 来检查是否应该完成整个任务。 切勿仅仅因为一个步骤完成就将整个任务标记为成功。
## 两周时间表
阶段时间完成情况基础设施现有 OpenClaw VPS + Vercel + Supabase(已设置)提案 + 审批 3 天提案 API + 自动审批 + 策略表执行引擎 2 天任务工作线程 + 8 步执行器触发器 + 反应 2 天 4 种触发器类型 + 反应矩阵循环统一 1 天提案服务 + 上限门控 + 修复三个陷阱影响系统 + 视觉效果 2 天影响重写 + 空闲行为 + Pixel Office 集成种子 + 上线半天迁移 + 种子策略 + crontab
不包括现有的基础设施, 核心闭环(提议→执行→反馈→重新触发)的布线大约需要一周时间。
## 最后想说的话
这 6 个智能体现在可以自主运行。voxyz.space 每天都在进行系统优化——调整策略、扩展触发规则、改进代理之间的协作方式。
它远非完美——智能体间的协作仍处于基础阶段,“自由意志”也主要通过基于概率的非决定论来模拟。但该系统确实能够运行,也确实不需要人为监控。
下一篇文章,我将介绍智能体如何“争论”和“说服”彼此——圆桌投票和 Sage 的记忆巩固如何将 6 个独立的 Claude 实例变成类似团队认知的东西。
如果你正在使用 OpenClaw 构建智能体系统,我很乐意与你交流经验。对于独立开发者来说,每一次交流都能帮助你避免一些陷阱。

## 相关链接
- [Vox](https://x.com/Voxyz_ai)
- [@Voxyz_ai](https://x.com/Voxyz_ai)
- [695K](https://x.com/Voxyz_ai/status/2019914775061270747/analytics)
- [https://yoursite.com/api/ops/heartbeat](https://yoursite.com/api/ops/heartbeat)
- [步骤 ID](https://step.id/)
- [voxyz.space](https://voxyz.space/)
- [升级至高级版](https://x.com/i/premium_sign_up)
- [7:23 AM · Feb 7, 2026](https://x.com/Voxyz_ai/status/2019914775061270747)
- [695.6K 浏览量](https://x.com/Voxyz_ai/status/2019914775061270747/analytics)
- [查看报价](https://x.com/Voxyz_ai/status/2019914775061270747/quotes)
---
*导出时间: 2026/2/8 19:46:25*