2026年6月24日 2 分钟阅读

AI Agent 跑全自动循环时,遇到需要人判断的步骤怎么办?Ask-a-Human 实战指南,让 Agent 一个呼叫就找到你

tinyash 0 条评论

你跑着 30 个全自动 Agent 在循环里。部署、测试、数据清洗、代码审查——它们各司其职,99% 的时间不需要你。但总有那 1% 的情况:一个 Agent 在部署前要确认环境变量,另一个在犹豫该走分支 A 还是分支 B,还有一个发现了一个它不能单独决定的异常。

它们卡住了。你没有收到任何通知。直到第二天早上你才发现,它们等了你一整夜。

为什么这是个真问题

全自动 Agent 循环的核心理念是「无人值守」。但你很快会发现一个不可能三角:自主性越高的 Agent,越需要偶尔的人工判断。不是 Agent 能力不够,而是有些决策天然需要人类上下文——安全审批、方向选择、成本权衡。

传统方案只有三种:

方案问题
Agent 直接执行高风险操作安全审计过不了,出事后无法追责
Agent 遇到不确定就放弃循环效率 = 0,浪费大量 API 调用
自己搭一个通知系统开发成本高,涉及短信/推送/E2E 加密,复杂度远超预期

Ask-a-Human:30 秒接入的 Agent 传呼机

Ask-a-Human 是一个开源的 MCP(Model Context Protocol)服务端,它做的事情很简单:让 AI Agent 能像打电话一样找到你。Agent 调用 request_approval 工具时,你的手机收到推送通知。你点一下「批准」或「拒绝」或输入一段文字,Agent 立即收到结果,继续执行。

整个过程端到端加密,中继服务器看不到任何消息内容。没有账号注册,没有 API Key,没有数据库——只有一个 npm 包和一行配置。

30 秒安装

零安装。零账号。零配置。

在你的 MCP 客户端配置文件中加入一行(以 Cursor 为例的 ~/.cursor/mcp.json):

{
  "mcpServers": {
    "ask-a-human": {
      "command": "npx",
      "args": ["-y", "@askahuman/mcp", "serve"]
    }
  }
}

重启 Agent 即可。首次调用 request_approval 时,终端会打印一个配对码,并且自动打开本地页面显示它。打开手机浏览器访问 ask-a-human.ai/app,将页面添加到主屏幕(PWA),输入配对码,就完成了。

从配置到配对,全程不超过 30 秒。

实战场景一:部署审批——Agent 部署前等你点头

最直接的使用场景:Agent 在自动部署流程中,遇到生产环境变更时暂停并请求审批。

假设你的 Claude Code Agent 在 CI 中自动运行,当它检测到需要修改生产数据库 schema 时:

request_approval({
  title: "生产数据库 Schema 变更",
  summary: "需要在 `users` 表添加 `preferences` JSONB 列,
           涉及 3 张表的外键更新。变更脚本已验证通过。",
  category: "deploy",
  response_kind: "yesno",
  expires_in_s: 300
})

你的手机立即收到推送。点击后看到卡片:标题「生产数据库 Schema 变更」,内容详细描述了变更范围和影响。点「批准」,Agent 收到 { approved: true },继续执行。点「拒绝」,Agent 收到 { approved: false },进入回滚流程。

expires_in_s: 300 设置了 5 分钟超时——如果不操作,审批自动超时,Agent 将按超时逻辑处理(默认视为拒绝)。

实战场景二:多选项决策——Agent 拿不定方向

有时候不是简单的「行或不行」,而是多个方案选一个。Agent 可以让你在三四个选项中做选择。

request_approval({
  title: "数据库迁移方案",
  summary: "检测到当前 MySQL 5.7 即将 EOL,请选择迁移方向:
  
  选项 A:原地升级到 MySQL 8.0
    - 最少代码改动
    - 预计停机 30 分钟
  
  选项 B:迁移到 Aurora Serverless v3
    - 自动扩缩容,运维更省心
    - 预计停机 2 小时 + 两周适配
  
  选项 C:迁移到 Supabase (PostgreSQL)
    - 长期成本最优
    - 需要重写全部 SQL 查询",
  category: "data",
  response_kind: "choice",
  options: ["A: MySQL 8.0", "B: Aurora Serverless", "C: Supabase"],
  expires_in_s: 3600
})

你收到卡片后浏览三个选项,点选一个,Agent 收到你的选择,自动执行对应方案。整个过程不需要你 SSH 到服务器,不需要翻聊天记录,甚至在通勤路上就能完成决策。

实战场景三:人工输入——Agent 需要你提供信息

有些场景 Agent 需要的不是「批准」而是「输入」。比如它需要你提供一个 API Key、选择一个日期、或填写一段评审意见。

request_approval({
  title: "提供上游 OAuth 凭据",
  summary: "新集成的支付网关需要 OAuth client secret。
           该凭据不会保存到代码中,仅用于首次握手。",
  category: "access",
  response_kind: "text",
  placeholder: "输入 client_secret...",
  max_len: 256,
  expires_in_s: 600
})

输入框收到你的凭据后,Agent 在内存中使用一次即丢弃,不会写入日志或磁盘。

自托管中继

如果你的 Agent 运行在内网,或者你不想使用公共中继,可以自托管:

git clone https://github.com/askahuman/askahuman.git
cd askahuman

然后在 MCP 配置中加上自托管地址:

{
  "mcpServers": {
    "ask-a-human": {
      "command": "npx",
      "args": ["-y", "@askahuman/mcp", "serve", "--relay", "wss://your-relay.com/ws"]
    }
  }
}

安全设计

Ask-a-Human 的安全模型很简洁:

  • 配对协议:使用 Magic-Wormhole 风格的 SPAKE2 密钥交换。配对的 10 位短码在本地生成,不经过网络传输,中继服务器无法获取
  • 传输加密:每条消息使用 NaCl secretbox 加密。中继只看到 base64(nonce∥ciphertext),无法读取内容、决策或消息方向
  • 无持久化存储:没有数据库。消息只在内存中路由,转发后即丢弃
  • 拒绝不可伪造:任何失败、超时或拒绝都不会被误报为「已批准」——Agent 收到的结果在加密层就确定了

目前项目在 GitHub 上有 askahuman/askahuman 仓库,MIT 许可,代码量不大,审查起来也很轻松。

最佳实践

  1. 为高风险操作设置超时:部署和财务相关的审批建议设置 expires_in_s,避免 Agent 无限等待
  2. 善用 category 标记:deploy / cash / data / access 分类让你在手机上看到通知时就知道紧急程度和类型
  3. 定义 response_kind 严格匹配场景:二选一用 yesno,多选用 choice,需要输入用 text——不要一律用 text 让 Agent 自行解析
  4. 结合 Agent 的 fallback 逻辑:审批被拒或超时时,Agent 应该知道后备方案,而不是直接崩溃
  5. 只在真正需要时才调用:每多一次人工介入就多一分延迟。把 request_approval 包在条件判断里——只在置信度低于阈值或操作达到风险等级时才触发

总结

Ask-a-Human 解决的是全自动 Agent 循环中一个看似微小但实际非常关键的缺口:当 Agent 需要「人」的时候,怎么才能真的找到人。它不试图提高 Agent 的自主性,而是提供了一个优雅的退路——让人类在最合适的时机介入,介入完后立即退场。

用作者的话说:「100 个 Agent,1 个人,一次一个呼叫。」如果你也在跑自动化的 Agent 循环,这可能是你今天花 30 秒做的最有价值的配置。

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。