历史选型调研 / 周报附件

运行底座附录 A:ndclaw 成本与延迟

历史版本 6c911d40

来源:docs/reports/2026-09-21-AI助手运行底座重评/附录A-ndclaw运行时成本与延迟考古.md

附录 A:ndclaw 运行时(agent-hub-daemon)成本与延迟考古

只读代码考古,对象为本机 ~/AI-Hub-Project/agent-hub-daemon/(master,最后提交 0c6fe66,2026-08-20)及 agent-hub/、agent-hub-docs/;未修改任何文件。仓库事实一律写「相对 ~/AI-Hub-Project/ 的路径:行号」。定价来自 AWS 中国区官网,访问日期 2026-09-21。每条结论标【事实】/【推断】/【待验证】。

一页结论

  1. 【事实】ndclaw 运行时部署在 AWS 中国(宁夏)区 cn-northwest-1(agent-hub-daemon/cdk.json:5),每个 Web 会话一个 ECS Fargate ARM64 容器,OpenClaw 引擎默认 1 vCPU/2 GiB(cdk.json:34-35),claude-code 引擎 2 vCPU/4 GiB(cdk.json:36-37;栈内兜底值才是 0.5/1,stacks/agent_task_claude_code_stack.py:81-82)。
  2. 【事实】固定常驻的部分与用户数无关:1 个 NAT、9 个接口型 VPC Endpoint × 2 AZ、1 个公网 ALB、Router Fargate(2 副本)、LLM Proxy Fargate(prod 4 副本)、channel-watcher(1 副本)、预热池 spare 个空容器。随并发会话线性增长的只有 agent 容器本身(外加每会话的 ENI、EFS 目录、日志)。
  3. 【事实】按 AWS 中国官网价,0.5 vCPU/1 GiB 的 ARM 容器每小时 ¥0.13,整月常驻 ¥93;ndclaw 实际用的 1 vCPU/2 GiB 是 ¥0.26/小时、整月 ¥187。这个数与 agent-hub-docs 里「watcher 常驻 ~¥50-100/月」的估算相符。
  4. 【推断】一次「聊 5 分钟就走」的会话实际计费 约 36 分钟(冷启动 ~0.7 分钟 + 聊天 5 分钟 + 空闲等待 30 分钟 + 扫描粒度 0~1 分钟),86% 的计费时长在空转,单次 ¥0.08~¥0.31(按规格)。而且 OpenClaw 网关每 30 s 向客户端广播 tick 帧,Router 对任何上游帧都刷新活跃时间,只要浏览器标签页不关,容器永远不会被判空闲,计费无上限。
  5. 【推断】100 个月活、每人每天 3 次短对话,agent 容器的可变成本约 ¥300~¥1,400/月(人均 ¥3~¥14),标签页常开会推到 ¥2,000 以上。「人均 100 元/月」不是可变成本能算出来的数。
  6. 【推断】白晨口述的「运维约 1 万元/月」更可能由固定成本 × 环境数构成:单环境固定部分约 ¥1,900~¥2,300/月(其中接口型 Endpoint 就 ¥1,134,NAT ¥266),daemon 有 dev/test/pressure/beta/prod 五套环境。仓库里没有任何账单、容量或月活数据能印证或反驳这个口述。
  7. 【事实】首响延迟以 README 实测为准:冷路径「点击 → 第一个字」约 60 s(拿到 wsUrl 42 s + 首轮 TTFT 18 s),预热池路径 约 25 s(6 s + 18 s),第二轮起 TTFT 3~7 s。18 s 的首轮 TTFT 来自 OpenClaw 进程内懒初始化,预热池帮不上;daemon 团队试过「claim 后先跑一次假对话」并已回退。claude-code 引擎没有单独的延迟数据。
  8. 【事实】A2A 路径(agent-hub 调专家)冷启动首次调用实测 约 200 s(预算 300 s),热态单轮数秒到数十秒,流式帧间隔最大 32~36 s,建议读超时 ≥ 600 s。
  9. 【推断】要把这套运行时用于 C 端大量短对话,可做的改动只有三类:缩短空闲回收、扩大预热池、共享常驻容器。前两类不改变成本形状与 18 s 首轮 TTFT 的下限;第三类等于放弃「每会话一沙箱」——而这正是 daemon 的全部设计理由(EFS 按会话隔离、STS 作用域凭据、POSIX uid 隔离、单用户 OpenClaw 配置)。
  10. 【推断】对陈洁最站得住的论点不是「贵」而是**「形状不匹配」**:短对话付 30 分钟空转、首响 25~60 s、前端绑死 OpenClaw 私有 WS 协议;模型延迟(Ark 首 token ~5.5 s)两条路都一样,不应算在 daemon 头上。
  11. 【待验证】本文定价只有 AWS 中国官网一个一手来源(中英文两版页面数值一致),第二独立来源因搜索配额耗尽未取得;预热池 spare 的实际取值、各环境是否真的都在跑、是否共用 VPC 都不在仓库里,要问 daemon 运维。

逐题回答

1. 基础设施清单:一次用户会话涉及什么,哪些固定、哪些线性

区域与账号【事实】:region: cn-northwest-1(agent-hub-daemon/cdk.json:5;cdk.context.json 的可用区键也是 account=112399848821:region=cn-northwest-1)。README 开头说明中国区没有 Bedrock/AgentCore,所以运行时落在 ECS on Fargate(agent-hub-daemon/README.md:3-7)。

栈清单(agent-hub-daemon/app.py:56-291 依次组装):

栈 组件与规格 定义位置 固定/线性
AgentdVpc VPC 10.20.0.0/16,2 AZ,1 个 NAT 网关;接口型 Endpoint 9 个(ECR API、ECR Docker、Secrets Manager、CloudWatch Logs、Monitoring、STS、ECS、ECS Agent、ECS Telemetry),S3/DynamoDB 网关型 Endpoint(免费);VPC Flow Log 只记 REJECT stacks/vpc_stack.py:83-94(NAT)、:127-144(接口型)、:146-154(网关型) 固定
AgentdSecurity KMS CMK、Secrets Manager(网关 token、每 plan 一条、每用户自存 key) stacks/security_stack.py;README:48-50 固定(用户 key 条数随用户增长)
AgentdData DynamoDB 单表 agentd-identity,按需计费+PITR+CMK;S3 用户文件桶(KMS、版本化、365 天过期);EFS 加密、通用模式、弹性吞吐、30 天转 IA stacks/data_stack.py:44-56、:59-82、:92-103 DDB/EFS 存储随会话数增长,基线固定
AgentdEcs ECS 集群,Container Insights 开启;Cloud Map 私有命名空间 stacks/ecs_stack.py:33-45 固定
AgentdBuild ECR 仓库 ×5+CodeBuild stacks/build_stack.py:60-100 固定
AgentdRouter 公网 ALB(idle 4000 s,监听 18443 TLS);Router Fargate ARM64 0.5 vCPU/1 GiB,副本数 context router_service_desired_count(cdk.json:16 为 2;部署脚本 prod 2、其他 1) stacks/router_service_stack.py:50-54、:82-88、:146-204;scripts/deploy-env.sh:91-95 固定
AgentdAgentTask 每会话一个 Fargate ARM64 任务,规格读 context agent_task_cpu/agent_task_memory_mb(栈内兜底 1024/2048;cdk.json:34-35 也是 1024/2048),临时盘 21 GiB(cdk.json:38),容器健康检查 start_period 300 s,挂 EFS 卷 stacks/agent_task_stack.py:60-62、:364-371、:375-377、:493、:497 线性
AgentdAgentTaskClaudeCode claude-code 引擎平行 TaskDef,栈内兜底 512/1024,cdk.json:36-37 覆盖为 2048/4096,start_period 90 s stacks/agent_task_claude_code_stack.py:81-83、:206-212、:283 线性
AgentdLlmProxy 私网 Fargate ARM64 0.5 vCPU/1 GiB,栈内默认 2 副本;部署脚本 prod 4、非 prod 1 stacks/llm_proxy_stack.py:58-60、:216-222、:271;scripts/deploy-env.sh:105-110 固定
AgentdApi API Gateway HTTP API + 十余个 Lambda(uc_authorizer、web_api、admin_api、files_api、cs_api、mcp_api、skill_api、workspace_provisioner 等,内存 128~1024 MB) stacks/api_stack.py:208-1274 按调用计费,量小
AgentdPool EventBridge 每 60 s 触发 pool-sweeper Lambda(256 MB,180 s 超时)维持预热池 stacks/pool_stack.py:140-154 固定(spare 个容器常驻)
AgentdCron/Watcher EventBridge Scheduler+cron Lambda;channel-watcher Fargate 0.5/1 × 1 stacks/cron_stack.py;stacks/watcher_stack.py:53-55、:124-129 固定
AgentdUsageTracker/Observability 订阅 ECS 任务状态变更的 Lambda;CloudWatch 仪表盘与告警 stacks/usage_tracker_stack.py、stacks/observability_stack.py 固定

一次会话的链路【事实】(README.md:187-256):浏览器 → API Gateway → uc_authorizer Lambda → web_api Lambda(查 DynamoDB,命中 RUNNING 任务则 reused;否则先抢预热池 claimed,再 RunTask 走 started,轮询 /ping 直到 OpenClaw 真 ready)→ 返回 wsUrl → 浏览器 WSS → ALB → Router Fargate(验 HMAC、查任务私网 IP)→ 反代到 agent 容器 :8080 → bridge 反代到容器内 OpenClaw :18789 → OpenClaw 直连 AI Gateway(经 LLM Proxy/NAT 出网)。

线性部分的细目【推断】:每个活动会话除容器 vCPU/内存秒之外,还带一个 ENI(私网 /22 子网 × 2 AZ 容量约 2,000 个 IP)、一个 EFS 子目录 /workspaces/<ns>/<sid>/.openclaw(README:273-275)、一条 CloudWatch 日志流、每 30 s 一次 DynamoDB 写(活跃时间刷新)。cdk.json:42-43 还有硬上限:每用户 1 个任务、全局 200 个任务。

2. 预热池与空闲回收

spare 语义【事实】:DynamoDB POOLCONFIG/CONFIG.spare 表示要维持的「无用户」预热任务数,按引擎各一份(openclaw 与 claude-code 独立,lambda/pool_sweeper/index.py:257-258;app.py:213-229 注释)。读取时缺省为 0,即默认关闭(shared/agentd_shared/tasks.py:894-899);管理接口限定 spare∈[0,50](README:780)。

补偿逻辑【事实】(lambda/pool_sweeper/index.py:152-184、:187-226):每轮先清死行、清卡住的 claiming,把 /pool-ready 返回 200 的 warming 提升为 ready;然后 deficit = spare − (ready + warming),为正就 RunTask 补齐,为负就先停 warming 再停最老的 ready。warming 超过 300 s 未就绪即停掉作废(:42;stacks/pool_stack.py:86)。EventBridge 固定 60 s 触发,intervalSeconds < 60 时在一次 Lambda 内连跑 60/interval 轮(:8-18)。

预热容器是否计费空转【事实+推断】:池容器是不带 USER_ID/PLANS_JSON 的 RunTask,bridge 进入 POOL 模式,不启动 OpenClaw,只监听 HTTP 等 /claim(bridge/app/server.js:119-130、:3392;README:675-677)。Fargate 按「请求的 vCPU 与内存」从拉镜像起按秒计费直到任务终止(AWS 官网定价页原文),与容器内有没有跑进程无关——所以预热容器按全价空转:每个 1 vCPU/2 GiB 的池位每月 ¥187。被认领后 sweeper 下一轮立即补一个,池位数恒为 spare。仓库里没有任何环境 spare 的实际取值(它是 DDB 里的一行,scripts/manage-pool.sh 只提供读写)【待验证】。

空闲回收判定【事实】:Router 内协程每 TASK_SWEEP_INTERVAL_SECONDS(60 s)扫一次 WEBSESS#*/TASK,now − lastActivityMs > 1800 s 就 stop_task 并删行(router/app/task_manager.py:31-32、:157-194;README:314-329)。例外是 keepalive 白名单/时间窗,仅对 openclaw 引擎,默认为空即不生效(task_manager.py:33-45、:132-146)。lastActivityMs 缺失时回退到 createdAt(:165)。

哪些帧刷新活跃时间【事实】:

由此得到的重要推断【推断,待在真实环境抓帧验证】:OpenClaw 网关维护定时器每 30 s 向所有已连接客户端广播 tick 保活事件(二手来源:dev.to 对 OpenClaw 网关源码的解读,startGatewayMaintenanceTimers 中 tick: broadcast "tick" every 30s;官方协议文档提到握手返回 policy.tickIntervalMs)。bridge 与 Router 都是原样反代,upstream_to_client 对帧不做过滤,因此只要浏览器保持 WS 连接,容器每 30 s 就被判定为活跃,1800 s 空闲计时只在 WS 断开后才真正开始。前端 ai-hub-webui 没有「空闲即断 WS」的逻辑,15 分钟 CLAW_IDLE_THRESHOLD 只是开始每 15 s 用 HTTP 探测实例是否已休眠(ai-hub-webui/src/hooks/useClawChat.ts:431-432、:1141-1173;src/config/env.ts:51,53)。

3. 冷启动与首响

README「冷启动延迟优化」节数据表原样摘录【事实】(agent-hub-daemon/README.md:548-568):

三条路径对比。started 是真冷路径;claimed 走预热池;reused 是同用户已有 task 还活着(~0.3 s,略去不展开)。

阶段 改动前 started(冷) claimed(池)
stop_task API ~40 ms ~40 ms —
RunTask API ~700 ms ~700 ms —
ECS ENI attach + 调度 ~10 s ~10 s —
ECR 镜像 pull(~200 MB) ~9 s ~12 s(镜像多 18 MB) —
容器启动 + bridge HTTP listen ~6 s ~6 s —
OpenClaw 启动 → gateway ready ~150–180 s ~3 s ~5 s(claim 时触发)
/ping 语义 仅 bridge listen 即 200 等 openclawReady 才 200 同左
waitForPort 轮询间隔 — ~0 s 500 ms(从 3 s 改过来,省 ~5 s)
/claim 全链路(web_api → bridge → ready) — — ~5–6 s
用户拿到 wsUrl(Session bootstrap) ~31 s(但后台 OpenClaw 还没好) ~42 s ~6 s ⚡
首轮 TTFT(claim/cold 都适用) 首条消息可能 hang/失败 ~18 s(见下节) ~18 s(同)
第二轮之后 TTFT 3–7 s 3–7 s 3–7 s

净收益:

  • 单次点击 → 第一个字:从 ~3 分钟缩短到 ~60 秒(冷)/ ~25 秒(池)
  • 不再有 hang;预热池吸收高峰时能把 Session bootstrap 压到秒级

首轮 TTFT 为什么是 18 s【事实】(README:688-716):分段日志显示 chat.send 后 run start → prompt start 静默 11.7 s,是 OpenClaw 进程内的懒初始化(acpx runtime、bedrock-mantle 探测在中国区必失败要等超时、web_search 回退、插件命令注册),再加 Ark 首 token ~5.5 s。README 明说「这段懒初始化发生在 OpenClaw 进程内,和容器生命周期正交——所以 warm pool 也帮不了」。第二轮 3~7 s 就是 Ark 那 5.5 s ± 抖动,即模型侧延迟,与运行时无关。

试过并放弃的方案【事实】(README:718-746):claim 后先发一条假 chat.send 把懒初始化跑掉——净时间不变,只是把 18 s 从「发消息后」挪到「claim 阶段」,Session bootstrap 从 6 s 涨到 25~30 s,代码已回退;「池 warming 期间就跑 lazy init」需要占位 plan 与两套 openclaw.json,有上下文泄露风险,评估后没做。

其他相关数字【事实】:web_api 等任务就绪的预算 task_warmup_max_seconds 360 s(cdk.json:17),超时返回 503(README:235);webtest 页面注明「首次启动 task ~30–60 s」(README:478)。

claude-code 引擎【事实】:仓库里没有单独的延迟数据。docs/claude-code-operations.md:79-122 只描述冷启动与预热池路径(RunTask → 注入 ANTHROPIC_* → 轮询 /ping → 返回 wsUrl;池路径 /claim 注入 serviceCode 等后 spawn claude CLI),README 的表只针对 OpenClaw。可作旁证的只有健康检查 start_period 90 s(OpenClaw 是 300 s),暗示 daemon 团队预期 claude CLI 启动更快【推断】,但首轮 TTFT 无实测。

A2A 路径首条消息延迟【事实】(agent-hub/docs/a2a/):

4. 用公开定价估算

单价【事实,AWS 中国区官网,访问 2026-09-21,宁夏区】:

项目 单价
Fargate ARM,每 vCPU 小时 ¥0.21263
Fargate ARM,每 GiB 内存小时 ¥0.02335
Fargate 临时存储超出 20 GB 部分,每 GB 小时 ¥0.000738
Fargate 计费规则 从开始拉镜像到任务终止,按秒,最低 1 分钟
NAT 网关 ¥0.37/小时 + ¥0.37/GB 处理
应用负载均衡器 ALB ¥0.156/小时 + ¥0.072/LCU 小时
接口型 VPC Endpoint ¥0.0875/小时/每 AZ
在用公网 IPv4 ¥0.033/小时
EFS 标准存储 ¥2.145/GB 月(IA ¥0.200)

(a) 一个 0.5 vCPU/1 GiB 容器【事实级算术】:0.5 × 0.21263 + 1 × 0.02335 = ¥0.130/小时,整月(720 h)¥93。ndclaw 实际规格:1 vCPU/2 GiB = ¥0.259/小时、¥187/月;claude-code 的 2 vCPU/4 GiB = ¥0.519/小时、¥373/月。临时盘 21 GiB 只多 1 GB,每月 ¥0.5,忽略。旁证:agent-hub-docs/topics/im-channel-wake/2026-08-06-im-channel-wake-architecture.md:330 写「watcher 常驻 ~¥50-100/月」,watcher 正是 0.5/1 规格,与 ¥93 相符。

(b) 「聊 5 分钟然后离开」的一次会话【推断】:

段 时长 依据
冷启动(从拉镜像计费) ~0.7 min README 表:ENI 10 s + pull 12 s + 启动 6 s + OpenClaw 3 s ≈ 31 s 计费段,取整
聊天 5 min 题设
空闲等待 30 min agent_task_idle_timeout_seconds 1800(cdk.json:39)
扫描粒度 0~1 min 每 60 s 扫一次
合计 约 36 min(0.6 h) 有效利用率 5/36 ≈ 14%

单次成本:0.5/1 规格 ¥0.08;1/2 规格 ¥0.16;2/4 规格 ¥0.31。走预热池时冷启动段归零,但池位本身在别处付费。若用户只是切走标签页而不关闭,按第 2 题的 tick 推断,容器持续计费:标签页开 8 小时 = ¥2.07(1/2 规格)。

(c) 预热池 spare = N 的每月空转【推断】:N × ¥187(OpenClaw,1/2)或 N × ¥373(claude-code,2/4)。spare=1 ¥187,spare=2 ¥373,spare=5 ¥933;两个引擎各自维持则相加。sweeper Lambda 每月约 43,200 次调用,费用可忽略。

(d) 100 个月活、每人每天 3 次短对话【推断,全部假设列在后文】:

情景 假设 容器小时/月 成本(1/2 规格)
低 3 次落在同一个 15 分钟窗口内、月活跃 15 天 100 × 15 × 0.75 ≈ 1,125 ¥292
中 3 次分两个时段、月活跃 20 天 100 × 20 × 2 × 0.6 = 2,400 ¥622
高 3 次各自触发一个容器、30 天天天用 100 × 30 × 3 × 0.6 = 5,400 ¥1,399
标签页常开 每天挂 4 小时、20 天 100 × 20 × 4 = 8,000 ¥2,075

换成 0.5/1 规格全部减半,2/4 规格翻倍。附带项:EFS 每会话目录(100 用户 × 0.2 GB × ¥2.145 ≈ ¥43/月)、NAT 出网数据(文本对话每人每月 1 GB 量级 ≈ ¥37)、每 30 s 一次 DDB 写与日志(十元量级)。可变成本合计约 ¥300~¥1,500/月,人均 ¥3~¥15。

固定成本(单环境)【推断】:

项 计算 月成本
接口型 Endpoint 9 × 2 AZ × ¥0.0875 × 720 ¥1,134
NAT 网关 ¥0.37 × 720 ¥266
ALB ¥0.156 × 720 + LCU 少量 ¥115
Router Fargate 2 × ¥93(非 prod 1 副本 ¥93) ¥187
LLM Proxy Fargate prod 4 × ¥93(非 prod ¥93) ¥373
channel-watcher 1 × ¥93 ¥93
公网 IPv4 3 × ¥0.033 × 720 ¥71
小计 prod 配置 / 非 prod 配置 ¥2,239 / ¥1,865
未取价项 CloudWatch(Container Insights 已开、日志 30 天)、DynamoDB 按需、Secrets Manager 按条月费(每用户自存 key 一条)、KMS、S3、ECR、CodeBuild、Lambda、API Gateway 估 ¥200~¥800

再加预热池 N × ¥187。

与「按 token 计费的无状态服务」对比【推断】:平台的 AI 助手若作为进程内薄 harness 跑在 venture-os 自己的 FastAPI 服务里(SDP 上已付费的实例),多 100 个月活的增量基础设施约为 0~1 个副本(¥100~¥200/月量级),模型 token 费两条路完全相同(都经公司 AI Gateway),不构成差异。因此差异项就是上表:ndclaw 路线每月多付 ¥300~¥1,500 可变 +(若独立环境)¥1,900~¥2,300 固定 + 预热池;若复用 ndclaw 现有环境,则只多付可变部分,人均 ¥3~¥15。这意味着「贵」在绝对值上并不夸张,真正站得住的是成本形状:短对话为 30 分钟空转买单、1 分钟起计、标签页不关就无上限、并发峰值受 200 任务硬上限与 ENI 数约束。

5. 「月活七八十人、运维约 1 万元/月」能否印证

【事实】三个仓库里没有任何账单、Cost Explorer 导出、容量规划或月活数字。相关但不等价的线索:

【推断】把第 4 题的固定成本代入:daemon 有五套环境(README:106),若每套各有 VPC、NAT、Endpoint、ALB,固定部分 4 × ¥1,865 + ¥2,239 ≈ ¥9,700/月,再加未取价项,正好落在「约 1 万」量级;若非 owner 环境作为 VPC consumer 共用 Endpoint 与 NAT(stacks/vpc_stack.py:38 有 vpc_import_id,scripts/deploy-env.sh:78-80 注释提到「非 owner 环境自动作为 VPC consumer」),固定部分降到约 ¥4,100。无论哪种,1 万元的大头都是固定成本 × 环境数,不是 80 个用户的容器时长(80 人按「高」情景也只有 ¥1,100)。所以「人均 100 元」这个除法在方向上不成立,白晨的论证应改用形状论点。这一段是推断,要拿真实账单核对【待验证】。

6. 用于 C 端大量短对话要改什么,代价是什么

改动 作用 代价与副作用 是否放弃「每会话一沙箱」
缩短空闲回收(1800 s → 300 s) 空转计费从 30 min 降到 5 min,单次短对话成本降约 80% 5 分钟后再回来要重新走 claim/冷路径,每次都付 6~42 s bootstrap + 18 s 首轮 TTFT(懒初始化按 OpenClaw 进程计,README:714-716);tick 保活不改 Router 过滤逻辑则缩短无效;EFS 目录保留,历史无损 否
过滤 tick 等保活帧 让空闲判定只看真实业务帧 要在 ws_proxy.py 解析 OpenClaw 协议帧并区分事件类型,Router 从字节透传变成协议感知;长任务只产生上游帧的场景(README 注释 ws_proxy.py:214-217)需另设保活 否
扩大预热池 bootstrap 从 42 s 降到 6 s N × ¥187/月全价空转;只消掉 36 s bootstrap,不消 18 s 首轮 TTFT;sweeper 最快 10 s 一轮,一分钟内并发超过 spare 的部分仍走冷路径;池容器数受 200 任务上限与 ENI 数约束 否
池内预跑懒初始化 首轮 TTFT 降到 ~5 s daemon 团队评估后未做:需占位 plan 与真实 key、两套 openclaw.json、切换时防上下文泄露,「复杂度高且有安全风险」(README:741-746) 部分(池容器带真实凭据)
共享常驻容器(多用户复用一个 OpenClaw/一组进程) 消除 bootstrap 与首轮懒初始化,成本变成按副本数 与现有设计逐项冲突:EFS 按 <ns>/<sid> 隔离(README:273-275)、bridge 用 STS 作用域凭据把 S3 限到本命名空间(README:298;bridge/app/server.js:805-813)、POSIX uid 隔离(workspace_isolation_mode: posix_uid,stacks/api_stack.py:177-178)、每容器一份 openclaw.json 写死单用户 provider(README:299-301);OpenClaw 网关本身是单用户设计。等于重写 bridge 并去掉 daemon 的安全模型 是
放宽硬上限与网络容量 支撑 C 端并发 agent_task_max_total 200、每用户 1(cdk.json:42-43);每任务一个 ENI;RunTask 有 API 限速 否,但运维面扩大

【推断】结论:前四类改动保留沙箱,但成本形状(按容器时长而非按请求)与延迟下限(首轮 18 s、冷路径 60 s)不变,只是把系数调小;第五类才能得到 C 端要的「秒级首响、按请求计费」,而它恰恰放弃了 daemon 存在的理由。此外前端会绑死 OpenClaw 原生 WS 协议 {type, method, params}(README:358)与 UC MAC 鉴权链路,这一点 wiki 36 页已指出,本文不重复展开。

假设与未核实项

来源清单

仓库(本机,只读)

公开定价与文档(访问日期 2026-09-21)

查看带行号的原始 Markdown(共 221 行)
1# 附录 A:ndclaw 运行时(agent-hub-daemon)成本与延迟考古
2
3> 只读代码考古,对象为本机 `~/AI-Hub-Project/agent-hub-daemon/`(master,最后提交 `0c6fe66`,2026-08-20)及 `agent-hub/`、`agent-hub-docs/`;未修改任何文件。仓库事实一律写「相对 `~/AI-Hub-Project/` 的路径:行号」。定价来自 AWS 中国区官网,访问日期 2026-09-21。每条结论标【事实】/【推断】/【待验证】。
4
5## 一页结论
6
71. 【事实】ndclaw 运行时部署在 **AWS 中国(宁夏)区 `cn-northwest-1`**(`agent-hub-daemon/cdk.json:5`),每个 Web 会话一个 **ECS Fargate ARM64 容器**,OpenClaw 引擎默认 **1 vCPU/2 GiB**(`cdk.json:34-35`),claude-code 引擎 **2 vCPU/4 GiB**(`cdk.json:36-37`;栈内兜底值才是 0.5/1,`stacks/agent_task_claude_code_stack.py:81-82`)。
82. 【事实】固定常驻的部分与用户数无关:1 个 NAT、9 个接口型 VPC Endpoint × 2 AZ、1 个公网 ALB、Router Fargate(2 副本)、LLM Proxy Fargate(prod 4 副本)、channel-watcher(1 副本)、预热池 `spare` 个空容器。随并发会话线性增长的只有 agent 容器本身(外加每会话的 ENI、EFS 目录、日志)。
93. 【事实】按 AWS 中国官网价,**0.5 vCPU/1 GiB 的 ARM 容器每小时 ¥0.13,整月常驻 ¥93**;ndclaw 实际用的 1 vCPU/2 GiB 是 **¥0.26/小时、整月 ¥187**。这个数与 `agent-hub-docs` 里「watcher 常驻 ~¥50-100/月」的估算相符。
104. 【推断】一次「聊 5 分钟就走」的会话实际计费 **约 36 分钟**(冷启动 ~0.7 分钟 + 聊天 5 分钟 + 空闲等待 30 分钟 + 扫描粒度 0~1 分钟),**86% 的计费时长在空转**,单次 ¥0.08~¥0.31(按规格)。而且 OpenClaw 网关每 30 s 向客户端广播 `tick` 帧,Router 对任何上游帧都刷新活跃时间,**只要浏览器标签页不关,容器永远不会被判空闲**,计费无上限。
115. 【推断】100 个月活、每人每天 3 次短对话,agent 容器的可变成本约 **¥300~¥1,400/月**(人均 ¥3~¥14),标签页常开会推到 ¥2,000 以上。**「人均 100 元/月」不是可变成本能算出来的数**。
126. 【推断】白晨口述的「运维约 1 万元/月」更可能由**固定成本 × 环境数**构成:单环境固定部分约 ¥1,900~¥2,300/月(其中接口型 Endpoint 就 ¥1,134,NAT ¥266),daemon 有 dev/test/pressure/beta/prod 五套环境。仓库里**没有任何账单、容量或月活数据**能印证或反驳这个口述。
137. 【事实】首响延迟以 README 实测为准:冷路径「点击 → 第一个字」**约 60 s**(拿到 wsUrl 42 s + 首轮 TTFT 18 s),预热池路径 **约 25 s**(6 s + 18 s),第二轮起 TTFT 3~7 s。18 s 的首轮 TTFT 来自 OpenClaw 进程内懒初始化,**预热池帮不上**;daemon 团队试过「claim 后先跑一次假对话」并已回退。claude-code 引擎**没有单独的延迟数据**。
148. 【事实】A2A 路径(agent-hub 调专家)冷启动首次调用实测 **约 200 s**(预算 300 s),热态单轮数秒到数十秒,流式帧间隔最大 32~36 s,建议读超时 ≥ 600 s。
159. 【推断】要把这套运行时用于 C 端大量短对话,可做的改动只有三类:缩短空闲回收、扩大预热池、共享常驻容器。前两类不改变成本形状与 18 s 首轮 TTFT 的下限;第三类等于放弃「每会话一沙箱」——而这正是 daemon 的全部设计理由(EFS 按会话隔离、STS 作用域凭据、POSIX uid 隔离、单用户 OpenClaw 配置)。
1610. 【推断】对陈洁最站得住的论点不是「贵」而是**「形状不匹配」**:短对话付 30 分钟空转、首响 25~60 s、前端绑死 OpenClaw 私有 WS 协议;模型延迟(Ark 首 token ~5.5 s)两条路都一样,不应算在 daemon 头上。
1711. 【待验证】本文定价只有 AWS 中国官网一个一手来源(中英文两版页面数值一致),第二独立来源因搜索配额耗尽未取得;预热池 `spare` 的实际取值、各环境是否真的都在跑、是否共用 VPC 都不在仓库里,要问 daemon 运维。
18
19## 逐题回答
20
21### 1. 基础设施清单:一次用户会话涉及什么,哪些固定、哪些线性
22
23**区域与账号**【事实】:`region: cn-northwest-1`(`agent-hub-daemon/cdk.json:5`;`cdk.context.json` 的可用区键也是 `account=112399848821:region=cn-northwest-1`)。README 开头说明中国区没有 Bedrock/AgentCore,所以运行时落在 ECS on Fargate(`agent-hub-daemon/README.md:3-7`)。
24
25**栈清单**(`agent-hub-daemon/app.py:56-291` 依次组装):
26
27| 栈 | 组件与规格 | 定义位置 | 固定/线性 |
28| --- | --- | --- | --- |
29| AgentdVpc | VPC `10.20.0.0/16`,2 AZ,**1 个 NAT 网关**;接口型 Endpoint **9 个**(ECR API、ECR Docker、Secrets Manager、CloudWatch Logs、Monitoring、STS、ECS、ECS Agent、ECS Telemetry),S3/DynamoDB 网关型 Endpoint(免费);VPC Flow Log 只记 REJECT | `stacks/vpc_stack.py:83-94`(NAT)、`:127-144`(接口型)、`:146-154`(网关型) | 固定 |
30| AgentdSecurity | KMS CMK、Secrets Manager(网关 token、每 plan 一条、每用户自存 key) | `stacks/security_stack.py`;README:48-50 | 固定(用户 key 条数随用户增长) |
31| AgentdData | DynamoDB 单表 `agentd-identity`,按需计费+PITR+CMK;S3 用户文件桶(KMS、版本化、365 天过期);**EFS** 加密、通用模式、弹性吞吐、30 天转 IA | `stacks/data_stack.py:44-56`、`:59-82`、`:92-103` | DDB/EFS 存储随会话数增长,基线固定 |
32| AgentdEcs | ECS 集群,**Container Insights 开启**;Cloud Map 私有命名空间 | `stacks/ecs_stack.py:33-45` | 固定 |
33| AgentdBuild | ECR 仓库 ×5+CodeBuild | `stacks/build_stack.py:60-100` | 固定 |
34| AgentdRouter | **公网 ALB**(idle 4000 s,监听 18443 TLS);Router Fargate ARM64 **0.5 vCPU/1 GiB**,副本数 context `router_service_desired_count`(`cdk.json:16` 为 2;部署脚本 prod 2、其他 1) | `stacks/router_service_stack.py:50-54`、`:82-88`、`:146-204`;`scripts/deploy-env.sh:91-95` | 固定 |
35| AgentdAgentTask | **每会话一个** Fargate ARM64 任务,规格读 context `agent_task_cpu`/`agent_task_memory_mb`(栈内兜底 1024/2048;`cdk.json:34-35` 也是 1024/2048),临时盘 21 GiB(`cdk.json:38`),容器健康检查 `start_period` 300 s,挂 EFS 卷 | `stacks/agent_task_stack.py:60-62`、`:364-371`、`:375-377`、`:493`、`:497` | **线性** |
36| AgentdAgentTaskClaudeCode | claude-code 引擎平行 TaskDef,栈内兜底 512/1024,`cdk.json:36-37` 覆盖为 **2048/4096**,`start_period` 90 s | `stacks/agent_task_claude_code_stack.py:81-83`、`:206-212`、`:283` | **线性** |
37| AgentdLlmProxy | 私网 Fargate ARM64 0.5 vCPU/1 GiB,栈内默认 2 副本;部署脚本 prod 4、非 prod 1 | `stacks/llm_proxy_stack.py:58-60`、`:216-222`、`:271`;`scripts/deploy-env.sh:105-110` | 固定 |
38| AgentdApi | API Gateway HTTP API + 十余个 Lambda(uc_authorizer、web_api、admin_api、files_api、cs_api、mcp_api、skill_api、workspace_provisioner 等,内存 128~1024 MB) | `stacks/api_stack.py:208-1274` | 按调用计费,量小 |
39| AgentdPool | EventBridge 每 60 s 触发 `pool-sweeper` Lambda(256 MB,180 s 超时)维持预热池 | `stacks/pool_stack.py:140-154` | 固定(spare 个容器常驻) |
40| AgentdCron/Watcher | EventBridge Scheduler+cron Lambda;channel-watcher Fargate 0.5/1 × 1 | `stacks/cron_stack.py`;`stacks/watcher_stack.py:53-55`、`:124-129` | 固定 |
41| AgentdUsageTracker/Observability | 订阅 ECS 任务状态变更的 Lambda;CloudWatch 仪表盘与告警 | `stacks/usage_tracker_stack.py`、`stacks/observability_stack.py` | 固定 |
42
43**一次会话的链路**【事实】(`README.md:187-256`):浏览器 → API Gateway → uc_authorizer Lambda → web_api Lambda(查 DynamoDB,命中 RUNNING 任务则 `reused`;否则先抢预热池 `claimed`,再 `RunTask` 走 `started`,轮询 `/ping` 直到 OpenClaw 真 ready)→ 返回 wsUrl → 浏览器 WSS → ALB → Router Fargate(验 HMAC、查任务私网 IP)→ 反代到 agent 容器 `:8080` → bridge 反代到容器内 OpenClaw `:18789` → OpenClaw 直连 AI Gateway(经 LLM Proxy/NAT 出网)。
44
45**线性部分的细目**【推断】:每个活动会话除容器 vCPU/内存秒之外,还带一个 ENI(私网 /22 子网 × 2 AZ 容量约 2,000 个 IP)、一个 EFS 子目录 `/workspaces/<ns>/<sid>/.openclaw`(README:273-275)、一条 CloudWatch 日志流、每 30 s 一次 DynamoDB 写(活跃时间刷新)。`cdk.json:42-43` 还有硬上限:每用户 1 个任务、全局 200 个任务。
46
47### 2. 预热池与空闲回收
48
49**`spare` 语义**【事实】:DynamoDB `POOLCONFIG/CONFIG.spare` 表示要维持的「无用户」预热任务数,**按引擎各一份**(openclaw 与 claude-code 独立,`lambda/pool_sweeper/index.py:257-258`;`app.py:213-229` 注释)。读取时缺省为 **0**,即默认关闭(`shared/agentd_shared/tasks.py:894-899`);管理接口限定 `spare∈[0,50]`(README:780)。
50
51**补偿逻辑**【事实】(`lambda/pool_sweeper/index.py:152-184`、`:187-226`):每轮先清死行、清卡住的 claiming,把 `/pool-ready` 返回 200 的 warming 提升为 ready;然后 `deficit = spare − (ready + warming)`,为正就 `RunTask` 补齐,为负就先停 warming 再停最老的 ready。warming 超过 300 s 未就绪即停掉作废(`:42`;`stacks/pool_stack.py:86`)。EventBridge 固定 60 s 触发,`intervalSeconds < 60` 时在一次 Lambda 内连跑 `60/interval` 轮(`:8-18`)。
52
53**预热容器是否计费空转**【事实+推断】:池容器是不带 USER_ID/PLANS_JSON 的 `RunTask`,bridge 进入 POOL 模式,**不启动 OpenClaw**,只监听 HTTP 等 `/claim`(`bridge/app/server.js:119-130`、`:3392`;README:675-677)。Fargate 按「请求的 vCPU 与内存」从拉镜像起按秒计费直到任务终止(AWS 官网定价页原文),与容器内有没有跑进程无关——所以**预热容器按全价空转**:每个 1 vCPU/2 GiB 的池位每月 ¥187。被认领后 sweeper 下一轮立即补一个,池位数恒为 `spare`。仓库里没有任何环境 `spare` 的实际取值(它是 DDB 里的一行,`scripts/manage-pool.sh` 只提供读写)【待验证】。
54
55**空闲回收判定**【事实】:Router 内协程每 `TASK_SWEEP_INTERVAL_SECONDS`(60 s)扫一次 `WEBSESS#*/TASK`,`now − lastActivityMs > 1800 s` 就 `stop_task` 并删行(`router/app/task_manager.py:31-32`、`:157-194`;README:314-329)。例外是 keepalive 白名单/时间窗,仅对 openclaw 引擎,默认为空即不生效(`task_manager.py:33-45`、`:132-146`)。`lastActivityMs` 缺失时回退到 `createdAt`(`:165`)。
56
57**哪些帧刷新活跃时间**【事实】:
58- 浏览器 → 上游的任何文本/二进制帧,节流 30 s(`router/app/ws_proxy.py:180-204`);
59- 上游 → 浏览器的**任何帧**,节流 30 s,注释写明是为了长任务不被中途杀掉(`ws_proxy.py:213-228`);
60- 容器内通道(99U 等)经 bridge `POST /touch`,节流 30 s(`bridge/app/server.js:290-298`、`:1322-1340`)。
61
62**由此得到的重要推断**【推断,待在真实环境抓帧验证】:OpenClaw 网关维护定时器每 30 s 向所有已连接客户端广播 `tick` 保活事件(二手来源:dev.to 对 OpenClaw 网关源码的解读,`startGatewayMaintenanceTimers` 中 `tick: broadcast "tick" every 30s`;官方协议文档提到握手返回 `policy.tickIntervalMs`)。bridge 与 Router 都是原样反代,`upstream_to_client` 对帧不做过滤,因此**只要浏览器保持 WS 连接,容器每 30 s 就被判定为活跃,1800 s 空闲计时只在 WS 断开后才真正开始**。前端 `ai-hub-webui` 没有「空闲即断 WS」的逻辑,15 分钟 `CLAW_IDLE_THRESHOLD` 只是开始每 15 s 用 HTTP 探测实例是否已休眠(`ai-hub-webui/src/hooks/useClawChat.ts:431-432`、`:1141-1173`;`src/config/env.ts:51,53`)。
63
64### 3. 冷启动与首响
65
66**README「冷启动延迟优化」节数据表原样摘录**【事实】(`agent-hub-daemon/README.md:548-568`):
67
68> 三条路径对比。`started` 是真冷路径;`claimed` 走预热池;`reused` 是同用户已有 task 还活着(~0.3 s,略去不展开)。
69>
70> | 阶段 | 改动前 | `started`(冷) | `claimed`(池) |
71> |---|---|---|---|
72> | `stop_task` API | ~40 ms | ~40 ms | — |
73> | `RunTask` API | ~700 ms | ~700 ms | — |
74> | ECS ENI attach + 调度 | ~10 s | ~10 s | — |
75> | ECR 镜像 pull(~200 MB) | ~9 s | ~12 s(镜像多 18 MB) | — |
76> | 容器启动 + bridge HTTP listen | ~6 s | ~6 s | — |
77> | **OpenClaw 启动 → gateway ready** | **~150–180 s** | **~3 s** | **~5 s(claim 时触发)** |
78> | `/ping` 语义 | 仅 bridge listen 即 200 | 等 `openclawReady` 才 200 | 同左 |
79> | `waitForPort` 轮询间隔 | — | ~0 s | **500 ms**(从 3 s 改过来,省 ~5 s) |
80> | `/claim` 全链路(web_api → bridge → ready) | — | — | ~5–6 s |
81> | 用户拿到 `wsUrl`(Session bootstrap) | ~31 s(但后台 OpenClaw 还没好) | **~42 s** | **~6 s** ⚡ |
82> | **首轮 TTFT**(claim/cold 都适用) | 首条消息可能 hang/失败 | **~18 s**(见下节) | **~18 s**(同) |
83> | 第二轮之后 TTFT | 3–7 s | 3–7 s | 3–7 s |
84>
85> **净收益**:
86> - 单次点击 → 第一个字:从 ~3 分钟缩短到 **~60 秒**(冷)/ **~25 秒**(池)
87> - 不再有 hang;预热池吸收高峰时能把 Session bootstrap 压到秒级
88
89**首轮 TTFT 为什么是 18 s**【事实】(README:688-716):分段日志显示 `chat.send` 后 `run start → prompt start` 静默 11.7 s,是 OpenClaw 进程内的懒初始化(acpx runtime、bedrock-mantle 探测在中国区必失败要等超时、web_search 回退、插件命令注册),再加 Ark 首 token ~5.5 s。README 明说「这段懒初始化发生在 OpenClaw 进程内,和容器生命周期正交——所以 warm pool 也帮不了」。**第二轮 3~7 s 就是 Ark 那 5.5 s ± 抖动**,即模型侧延迟,与运行时无关。
90
91**试过并放弃的方案**【事实】(README:718-746):claim 后先发一条假 `chat.send` 把懒初始化跑掉——净时间不变,只是把 18 s 从「发消息后」挪到「claim 阶段」,Session bootstrap 从 6 s 涨到 25~30 s,代码已回退;「池 warming 期间就跑 lazy init」需要占位 plan 与两套 openclaw.json,有上下文泄露风险,评估后没做。
92
93**其他相关数字**【事实】:web_api 等任务就绪的预算 `task_warmup_max_seconds` 360 s(`cdk.json:17`),超时返回 503(README:235);webtest 页面注明「首次启动 task ~30–60 s」(README:478)。
94
95**claude-code 引擎**【事实】:仓库里**没有**单独的延迟数据。`docs/claude-code-operations.md:79-122` 只描述冷启动与预热池路径(RunTask → 注入 ANTHROPIC_* → 轮询 `/ping` → 返回 wsUrl;池路径 `/claim` 注入 serviceCode 等后 spawn claude CLI),README 的表只针对 OpenClaw。可作旁证的只有健康检查 `start_period` 90 s(OpenClaw 是 300 s),暗示 daemon 团队预期 claude CLI 启动更快【推断】,但首轮 TTFT 无实测。
96
97**A2A 路径首条消息延迟**【事实】(`agent-hub/docs/a2a/`):
98- 协议一致性文档:`GetTask` 轮询时 `TASK_STATE_SUBMITTED` 持续约 **200 秒**(专家实例冷启动)后转 COMPLETED(`2026-08-12-a2a-protocol-conformance.md:303`);抓包脚本说明「首轮因专家冷启动约需 200 秒」(`:569`)。
99- 接入指南:「专家实例冷启动首次调用实测约 200 秒(预算上限 300 秒)。热态后单轮通常数秒到数十秒」;流式长任务帧间隔实测最大 32~36 s,中间网关 idle timeout 必须 > 40 s;HTTP 读超时建议 ≥ 600 s(`integration-guide.md:27`、`:280-290`、`:452`)。
100- 实现文档:「核心难点是专家冷启动要几分钟」,MCP 工具侧发消息后只等 90 s 就转异步(`2026-08-12-a2a-implementation.md:119-130`)。
101
102### 4. 用公开定价估算
103
104**单价**【事实,AWS 中国区官网,访问 2026-09-21,宁夏区】:
105
106| 项目 | 单价 |
107| --- | --- |
108| Fargate ARM,每 vCPU 小时 | ¥0.21263 |
109| Fargate ARM,每 GiB 内存小时 | ¥0.02335 |
110| Fargate 临时存储超出 20 GB 部分,每 GB 小时 | ¥0.000738 |
111| Fargate 计费规则 | 从开始拉镜像到任务终止,按秒,最低 1 分钟 |
112| NAT 网关 | ¥0.37/小时 + ¥0.37/GB 处理 |
113| 应用负载均衡器 ALB | ¥0.156/小时 + ¥0.072/LCU 小时 |
114| 接口型 VPC Endpoint | ¥0.0875/小时/每 AZ |
115| 在用公网 IPv4 | ¥0.033/小时 |
116| EFS 标准存储 | ¥2.145/GB 月(IA ¥0.200) |
117
118**(a) 一个 0.5 vCPU/1 GiB 容器**【事实级算术】:0.5 × 0.21263 + 1 × 0.02335 = **¥0.130/小时**,整月(720 h)**¥93**。ndclaw 实际规格:1 vCPU/2 GiB = **¥0.259/小时、¥187/月**;claude-code 的 2 vCPU/4 GiB = **¥0.519/小时、¥373/月**。临时盘 21 GiB 只多 1 GB,每月 ¥0.5,忽略。旁证:`agent-hub-docs/topics/im-channel-wake/2026-08-06-im-channel-wake-architecture.md:330` 写「watcher 常驻 ~¥50-100/月」,watcher 正是 0.5/1 规格,与 ¥93 相符。
119
120**(b) 「聊 5 分钟然后离开」的一次会话**【推断】:
121
122| 段 | 时长 | 依据 |
123| --- | --- | --- |
124| 冷启动(从拉镜像计费) | ~0.7 min | README 表:ENI 10 s + pull 12 s + 启动 6 s + OpenClaw 3 s ≈ 31 s 计费段,取整 |
125| 聊天 | 5 min | 题设 |
126| 空闲等待 | 30 min | `agent_task_idle_timeout_seconds` 1800(`cdk.json:39`) |
127| 扫描粒度 | 0~1 min | 每 60 s 扫一次 |
128| **合计** | **约 36 min(0.6 h)** | 有效利用率 5/36 ≈ 14% |
129
130单次成本:0.5/1 规格 ¥0.08;**1/2 规格 ¥0.16**;2/4 规格 ¥0.31。走预热池时冷启动段归零,但池位本身在别处付费。**若用户只是切走标签页而不关闭**,按第 2 题的 `tick` 推断,容器持续计费:标签页开 8 小时 = ¥2.07(1/2 规格)。
131
132**(c) 预热池 `spare = N` 的每月空转**【推断】:N × ¥187(OpenClaw,1/2)或 N × ¥373(claude-code,2/4)。`spare=1` ¥187,`spare=2` ¥373,`spare=5` ¥933;两个引擎各自维持则相加。sweeper Lambda 每月约 43,200 次调用,费用可忽略。
133
134**(d) 100 个月活、每人每天 3 次短对话**【推断,全部假设列在后文】:
135
136| 情景 | 假设 | 容器小时/月 | 成本(1/2 规格) |
137| --- | --- | --- | --- |
138| 低 | 3 次落在同一个 15 分钟窗口内、月活跃 15 天 | 100 × 15 × 0.75 ≈ 1,125 | **¥292** |
139| 中 | 3 次分两个时段、月活跃 20 天 | 100 × 20 × 2 × 0.6 = 2,400 | **¥622** |
140| 高 | 3 次各自触发一个容器、30 天天天用 | 100 × 30 × 3 × 0.6 = 5,400 | **¥1,399** |
141| 标签页常开 | 每天挂 4 小时、20 天 | 100 × 20 × 4 = 8,000 | **¥2,075** |
142
143换成 0.5/1 规格全部减半,2/4 规格翻倍。附带项:EFS 每会话目录(100 用户 × 0.2 GB × ¥2.145 ≈ ¥43/月)、NAT 出网数据(文本对话每人每月 1 GB 量级 ≈ ¥37)、每 30 s 一次 DDB 写与日志(十元量级)。**可变成本合计约 ¥300~¥1,500/月,人均 ¥3~¥15**。
144
145**固定成本(单环境)**【推断】:
146
147| 项 | 计算 | 月成本 |
148| --- | --- | --- |
149| 接口型 Endpoint | 9 × 2 AZ × ¥0.0875 × 720 | **¥1,134** |
150| NAT 网关 | ¥0.37 × 720 | ¥266 |
151| ALB | ¥0.156 × 720 + LCU 少量 | ¥115 |
152| Router Fargate | 2 × ¥93(非 prod 1 副本 ¥93) | ¥187 |
153| LLM Proxy Fargate | prod 4 × ¥93(非 prod ¥93) | ¥373 |
154| channel-watcher | 1 × ¥93 | ¥93 |
155| 公网 IPv4 | 3 × ¥0.033 × 720 | ¥71 |
156| **小计** | prod 配置 / 非 prod 配置 | **¥2,239 / ¥1,865** |
157| 未取价项 | CloudWatch(Container Insights 已开、日志 30 天)、DynamoDB 按需、Secrets Manager 按条月费(每用户自存 key 一条)、KMS、S3、ECR、CodeBuild、Lambda、API Gateway | 估 ¥200~¥800 |
158
159再加预热池 N × ¥187。
160
161**与「按 token 计费的无状态服务」对比**【推断】:平台的 AI 助手若作为进程内薄 harness 跑在 venture-os 自己的 FastAPI 服务里(SDP 上已付费的实例),多 100 个月活的增量基础设施约为 0~1 个副本(¥100~¥200/月量级),模型 token 费两条路**完全相同**(都经公司 AI Gateway),不构成差异。因此差异项就是上表:**ndclaw 路线每月多付 ¥300~¥1,500 可变 +(若独立环境)¥1,900~¥2,300 固定 + 预热池**;若复用 ndclaw 现有环境,则只多付可变部分,人均 ¥3~¥15。这意味着「贵」在绝对值上并不夸张,真正站得住的是**成本形状**:短对话为 30 分钟空转买单、1 分钟起计、标签页不关就无上限、并发峰值受 200 任务硬上限与 ENI 数约束。
162
163### 5. 「月活七八十人、运维约 1 万元/月」能否印证
164
165【事实】三个仓库里**没有任何账单、Cost Explorer 导出、容量规划或月活数字**。相关但不等价的线索:
166- 用量接口只记录「每用户每月容器运行时长 ms 与任务数」(README:775;`lambda/task_usage_tracker/index.py:1-22` 由 ECS 任务状态变更事件写入),数据在 DynamoDB,不在仓库。
167- 管理面有 DAU(Router 在 WS 帧上打点,`router/app/ws_proxy.py:126-140`;`lambda/admin_api/index.py:1685-1761`),**MAU 未实现**,列在待办(`docs/admin-api.md:317`、`:575`)。
168- `cdk.json:44-45` 有 `daily_token_budget: 1000000` 与 `daily_cost_budget_cny: 50`,但读取 `daily_cost_budget_usd` 的 `stacks/token_monitoring_stack.py:39` 并没有被 `app.py` 实例化,这两个键目前无效。
169- `agent-hub-docs` 的浏览器工具评估在 2026-08-02 明确写「缺 `cn-northwest-1` Fargate 真实单价比」「所有成本表述均标注为待验证」(`topics/browser-tool-enablement/2026-08-02-browser能力替代方案评估.md:297`、`:382`),说明 daemon 团队自己也没做过成本核算。
170
171【推断】把第 4 题的固定成本代入:daemon 有五套环境(README:106),若每套各有 VPC、NAT、Endpoint、ALB,固定部分 4 × ¥1,865 + ¥2,239 ≈ **¥9,700/月**,再加未取价项,正好落在「约 1 万」量级;若非 owner 环境作为 VPC consumer 共用 Endpoint 与 NAT(`stacks/vpc_stack.py:38` 有 `vpc_import_id`,`scripts/deploy-env.sh:78-80` 注释提到「非 owner 环境自动作为 VPC consumer」),固定部分降到约 ¥4,100。**无论哪种,1 万元的大头都是固定成本 × 环境数,不是 80 个用户的容器时长**(80 人按「高」情景也只有 ¥1,100)。所以「人均 100 元」这个除法在方向上不成立,白晨的论证应改用形状论点。这一段是推断,要拿真实账单核对【待验证】。
172
173### 6. 用于 C 端大量短对话要改什么,代价是什么
174
175| 改动 | 作用 | 代价与副作用 | 是否放弃「每会话一沙箱」 |
176| --- | --- | --- | --- |
177| **缩短空闲回收**(1800 s → 300 s) | 空转计费从 30 min 降到 5 min,单次短对话成本降约 80% | 5 分钟后再回来要重新走 claim/冷路径,每次都付 6~42 s bootstrap + **18 s 首轮 TTFT**(懒初始化按 OpenClaw 进程计,README:714-716);`tick` 保活不改 Router 过滤逻辑则缩短无效;EFS 目录保留,历史无损 | 否 |
178| **过滤 `tick` 等保活帧** | 让空闲判定只看真实业务帧 | 要在 `ws_proxy.py` 解析 OpenClaw 协议帧并区分事件类型,Router 从字节透传变成协议感知;长任务只产生上游帧的场景(README 注释 `ws_proxy.py:214-217`)需另设保活 | 否 |
179| **扩大预热池** | bootstrap 从 42 s 降到 6 s | N × ¥187/月全价空转;只消掉 36 s bootstrap,**不消 18 s 首轮 TTFT**;sweeper 最快 10 s 一轮,一分钟内并发超过 `spare` 的部分仍走冷路径;池容器数受 200 任务上限与 ENI 数约束 | 否 |
180| **池内预跑懒初始化** | 首轮 TTFT 降到 ~5 s | daemon 团队评估后未做:需占位 plan 与真实 key、两套 openclaw.json、切换时防上下文泄露,「复杂度高且有安全风险」(README:741-746) | 部分(池容器带真实凭据) |
181| **共享常驻容器**(多用户复用一个 OpenClaw/一组进程) | 消除 bootstrap 与首轮懒初始化,成本变成按副本数 | 与现有设计逐项冲突:EFS 按 `<ns>/<sid>` 隔离(README:273-275)、bridge 用 STS 作用域凭据把 S3 限到本命名空间(README:298;`bridge/app/server.js:805-813`)、POSIX uid 隔离(`workspace_isolation_mode: posix_uid`,`stacks/api_stack.py:177-178`)、每容器一份 openclaw.json 写死单用户 provider(README:299-301);OpenClaw 网关本身是单用户设计。等于重写 bridge 并去掉 daemon 的安全模型 | **是** |
182| **放宽硬上限与网络容量** | 支撑 C 端并发 | `agent_task_max_total` 200、每用户 1(`cdk.json:42-43`);每任务一个 ENI;`RunTask` 有 API 限速 | 否,但运维面扩大 |
183
184【推断】结论:前四类改动保留沙箱,但成本形状(按容器时长而非按请求)与延迟下限(首轮 18 s、冷路径 60 s)不变,只是把系数调小;第五类才能得到 C 端要的「秒级首响、按请求计费」,而它恰恰放弃了 daemon 存在的理由。此外前端会绑死 OpenClaw 原生 WS 协议 `{type, method, params}`(README:358)与 UC MAC 鉴权链路,这一点 wiki 36 页已指出,本文不重复展开。
185
186## 假设与未核实项
187
188- 【假设】月按 720 小时;ALB LCU 按百级并发 WS 连接忽略;NAT 数据按文本对话量级;EFS 每会话 0.2 GB。
189- 【假设】「短对话」= 5 分钟活动;三次对话的时段分布用低/中/高三档覆盖,真实分布未知。
190- 【假设】1 vCPU/2 GiB 是当前生产规格:`cdk.json` 与 README 都这么写,但 `deploy-env.sh` 允许 `AGENT_CPU`/`AGENT_MEM` 临时覆盖,实际环境可能不同。
191- 【待验证】OpenClaw `tick` 每 30 s 广播——来源是对源码的二手解读,未在 daemon 真实环境抓帧;官方协议文档只提到 `policy.tickIntervalMs`,未取到具体默认值。
192- 【待验证】各环境 `spare` 取值、五套环境是否都在运行、是否共用 VPC/NAT/Endpoint、Secrets Manager 按条月费在中国区的单价。
193- 【待验证】claude-code 引擎首响:无数据。
194- 【边界】定价第二独立来源:Tavily 配额耗尽(2026-09-21),Firecrawl 搜索只回到同一官网页面;中英文两版官网数值一致,但属同一来源。
195
196## 来源清单
197
198**仓库(本机,只读)**
199- `~/AI-Hub-Project/agent-hub-daemon/README.md`(架构 9-50、会话流程 187-256、多会话 260-285、空闲回收 314-329、冷启动优化 540-759、管理接口 761-782)
200- `~/AI-Hub-Project/agent-hub-daemon/cdk.json:5-51`
201- `~/AI-Hub-Project/agent-hub-daemon/app.py:56-291`
202- `~/AI-Hub-Project/agent-hub-daemon/stacks/`:`vpc_stack.py:83-154`、`data_stack.py:44-103`、`ecs_stack.py:33-45`、`router_service_stack.py:50-258`、`agent_task_stack.py:60-497`、`agent_task_claude_code_stack.py:81-283`、`llm_proxy_stack.py:58-271`、`watcher_stack.py:53-129`、`pool_stack.py:86-165`、`api_stack.py:177-178,208-1274`、`token_monitoring_stack.py:39`
203- `~/AI-Hub-Project/agent-hub-daemon/router/app/task_manager.py:31-45,132-194`;`router/app/ws_proxy.py:1-30,113-140,170-235`
204- `~/AI-Hub-Project/agent-hub-daemon/lambda/pool_sweeper/index.py:8-42,152-293`;`lambda/web_api/index.py:75,145-157,640-704`;`lambda/admin_api/index.py:1685-1761`;`lambda/task_usage_tracker/index.py:1-22`
205- `~/AI-Hub-Project/agent-hub-daemon/shared/agentd_shared/tasks.py:894-899`
206- `~/AI-Hub-Project/agent-hub-daemon/bridge/app/server.js:119-130,290-298,540-552,805-813,1322-1340,3392`;`bridge-cc/server.js:7-9,136-140`
207- `~/AI-Hub-Project/agent-hub-daemon/scripts/deploy-env.sh:78-110`;`scripts/manage-pool.sh:2-10`
208- `~/AI-Hub-Project/agent-hub-daemon/docs/claude-code-operations.md:60-133`;`docs/admin-api.md:317,575`
209- `~/AI-Hub-Project/agent-hub/docs/a2a/2026-08-12-a2a-protocol-conformance.md:303,569`;`docs/a2a/integration-guide.md:27,280-290,452`;`docs/a2a/2026-08-12-a2a-implementation.md:119-130`
210- `~/AI-Hub-Project/agent-hub-docs/topics/im-channel-wake/2026-08-06-im-channel-wake-architecture.md:330,399`;`topics/browser-tool-enablement/2026-08-02-browser能力替代方案评估.md:297,382`
211- `~/AI-Hub-Project/ai-hub-webui/src/hooks/useClawChat.ts:431-432,1141-1173`;`src/config/env.ts:51,53`
212
213**公开定价与文档(访问日期 2026-09-21)**
214- Amazon Fargate 定价(中国区,英文):https://www.amazonaws.cn/en/fargate/pricing/
215- Amazon Fargate 定价(中国区,中文,数值一致):https://www.amazonaws.cn/fargate/pricing/
216- Amazon VPC/NAT 网关/公网 IPv4 定价(中国区):https://www.amazonaws.cn/en/vpc/pricing/
217- Elastic Load Balancing 定价(中国区):https://www.amazonaws.cn/en/elasticloadbalancing/pricing/
218- Amazon PrivateLink 接口型 Endpoint 定价(中国区):https://www.amazonaws.cn/en/privatelink/pricing/
219- Amazon EFS 定价(中国区):https://www.amazonaws.cn/en/efs/pricing/
220- OpenClaw 网关协议文档(提到握手返回 `policy.tickIntervalMs`,事件族):https://docs.openclaw.ai/gateway/protocol
221- OpenClaw 网关源码解读(`tick` 每 30 s 广播、`dropIfSlow`,二手来源):https://dev.to/agentinternals/how-openclaw-serves-http-websocket-and-70-methods-on-a-single-port-4g10

2026 年 9 月 21—27 日工作汇报附件 · 取证日期 2026-09-28 · 原文 SHA-256:8c184f1b430645849d73336a7a3dfecf75b69a4e9d799256afb9cb8668756814