
摘要本以为让 AI 自己点界面最省事结果用本地沙箱实测同一个导出报表任务computer use 要滚 45 轮成本比补一个只读接口 两次调用贵 30 倍。根因就两条——读数据也要先看图、等待只能变轮询。三套脚本可改参数重跑文末附成本护栏和判断标准。文章目录先声明本地沙箱模拟没接真实 API任务老后台导出报表现象账单比预想的大了一个量级排查token 都烧到哪去了根因读操作等待轮询修复补只读接口 成本护栏边界computer use 什么时候反而划算错误处理与降级策略收尾参考资料先声明本地沙箱模拟没接真实 API先说清楚这篇没有真的接 OpenAI 的 computer use 跑一轮需要 API 环境我没有而是用本地沙箱把它的截图→判断→动作循环机制模拟出来按官方文档的 computer use tools 机制把让 Agent 去老后台导报表这个任务拆成阶段用脚本真实模拟每一轮的截图、轮询、重试开销再按官方价格折算成 token 账单。任务场景是我虚构的老后台但这不影响机制验证——computer use 的成本结构不取决于数据真假只取决于轮数 × 单轮 token。三个脚本都在 Node 25.8.2 里真跑了下面的轮数、token、账单都是运行结果不是拍脑袋的数。所有参数都写在脚本里你可以改参数重跑验证你自己的任务会滚成多少轮。模拟器只能验证机制不能替代真实 API 行为——真实环境里模型还会看错界面、多绕弯路实际账单大概率比模拟值更贵而不是更便宜。为什么要干这件事上一篇《Agents API 支持 computer use 了》算完账之后我总觉得纸上算和真拆一轮是两回事——点界面贵到底贵在哪得把机制拆开看才知道。拆完发现比上一篇算的还夸张。任务老后台导出报表任务很简单在一个只有界面、没有 API 的老后台里把上个月订单筛选出来导成 Excel。我的第一反应是这正好是 computer use 的用武之地啊——不用给老系统开接口让 Agent 自己点就行。理想情况下打开页面、填筛选、点查询、点导出、确认、等下载十来步就完事了比开发一个接口省事多了。现象账单比预想的大了一个量级账单看着没多少一算吓一跳。先回答最核心的问题45 轮是拍脑袋的还是跑出来的跑出来的。下面这个脚本把任务拆成阶段按 computer use 的机制逐轮模拟——每一轮就是一次截图→判断→动作异步加载没有完成回调只能每 300ms 截一张图轮询状态点偏了还要多截一张重试。为啥要看这段轮数不是结论是机制的输出——参数改一个轮数就跟着变。// 本地沙箱把点界面导报表拆成阶段模拟 computer use 的循环开销// 机制每一轮 截1张图(输入token) 判断/动作(输出token)// 异步加载没有完成回调只能每 300ms 轮询截图看状态constPOLL_MS300;// Agent 两次轮询截图的间隔constIMG_TOK1800;// 单张截图折算的输入 token图像按输入计费constOUT_TOK600;// 单轮判断动作的输出 token// 每个阶段: base顺利时截图数, waitMs异步等待时长, retry点偏重试多截的图conststages[{name:打开后台,base:1,waitMs:600,retry:1},// 首屏加载 菜单判断点偏一次{name:进报表页,base:1,waitMs:600,retry:1},// 路由切换 入口点偏一次{name:填筛选条件,base:3,waitMs:0,retry:0},// 点输入框/输入/选下拉顺利一次过{name:点查询等加载,base:1,waitMs:2700,retry:0},// 查询返回前只能轮询截图{name:点导出弹窗,base:1,waitMs:600,retry:1},// 弹窗响应 导出按钮点偏一次{name:确认导出,base:1,waitMs:400,retry:0},// 确认后生成文件{name:等下载收尾,base:1,waitMs:2700,retry:0},// 下载完成前只能轮询截图{name:核对文件,base:1,waitMs:0,retry:0},// 最后截一张确认导出来了];functionwaitShots(ms){returnms0?Math.ceil(ms/POLL_MS)1:0;}// 有异步等待才轮询constbreakdownstages.map(s{constacts.base,pollwaitShots(s.waitMs),rtys.retry;return{阶段:s.name,动作:act,等待轮询:poll,重试:rty,合计:actpollrty};});console.table(breakdown);consttotalbreakdown.reduce((s,b)sb.合计,0);constidealstages.reduce((s,st)sst.base,0);console.log(总轮数:${total}| 理想一次过:${ideal}轮 | 放大:${(total/ideal).toFixed(1)}x);console.log(输入token:${total*IMG_TOK}| 输出token:${total*OUT_TOK});运行结果Node 25.8.2 实测┌─────────┬─────────────────┬──────┬──────────┬──────┬──────┐ │ (index) │ 阶段 │ 动作 │ 等待轮询 │ 重试 │ 合计 │ ├─────────┼─────────────────┼──────┼──────────┼──────┼──────┤ │ 0 │ 打开后台 │ 1 │ 3 │ 1 │ 5 │ │ 1 │ 进报表页 │ 1 │ 3 │ 1 │ 5 │ │ 2 │ 填筛选条件 │ 3 │ 0 │ 0 │ 3 │ │ 3 │ 点查询等加载 │ 1 │ 10 │ 0 │ 11 │ │ 4 │ 点导出弹窗 │ 1 │ 3 │ 1 │ 5 │ │ 5 │ 确认导出 │ 1 │ 3 │ 0 │ 4 │ │ 6 │ 等下载收尾 │ 1 │ 10 │ 0 │ 11 │ │ 7 │ 核对文件 │ 1 │ 0 │ 0 │ 1 │ └─────────┴─────────────────┴──────┴──────────┴──────┴──────┘ 总轮数: 45 | 理想一次过: 10 轮 | 放大: 4.5x 输入token: 81000 | 输出token: 27000理想情况 10 轮每个动作截一张图就完事模拟器跑出 45 轮放大了 4.5 倍——多出来的 35 轮全是等待轮询和点偏重试。拿到轮数再看账单同一个导出任务走 computer use 和走结构化接口按同一套官方价格算差距到底多大。// 成本折算模拟器实测 45 轮 × 单轮 token × 官方价格GPT-6.1 Sol输入 2 / 输出 10 美元每百万 tokenconstROUNDS45;// 上一个脚本实测输出总轮数 45constPRICES{input:2,output:10};functioncuCost(rounds){constinputTokensrounds*1800;// 每轮一张截图constoutputTokensrounds*600;// 每轮判断动作return{rounds,inputTokens,outputTokens,totalUsd:((inputTokens/1e6)*PRICES.input(outputTokens/1e6)*PRICES.output).toFixed(3)};}functionapiCost(calls){constinputTokenscalls*1000;constoutputTokenscalls*500;return{calls,inputTokens,outputTokens,totalUsd:((inputTokens/1e6)*PRICES.input(outputTokens/1e6)*PRICES.output).toFixed(3)};}constcucuCost(ROUNDS);constapiapiCost(2);// 补只读接口后查列表 1 次 导出 1 次console.log(computer use(点界面):);console.log(JSON.stringify(cu,null,2));console.log(结构化接口(2次调用):);console.log(JSON.stringify(api,null,2));console.log(倍率: (cu.totalUsd/api.totalUsd).toFixed(1)x);运行结果Node 25.8.2 实测computer use(点界面): { rounds: 45, inputTokens: 81000, outputTokens: 27000, totalUsd: 0.432 } 结构化接口(2次调用): { calls: 2, inputTokens: 2000, outputTokens: 1000, totalUsd: 0.014 } 倍率: 30.9x三十倍。上一篇的演示参数是 45 轮对比 8 次调用9.6 倍我这个具体任务更极端——任务越简单业务上本来一两次调用就能拿完computer use 越亏它的循环不会因为你业务简单就变少界面步骤照样一步不落。顺手回答一个肯定有人问的问题单次 0.43 美元听着不多至于吗至于——这不是单次任务的事是成本结构的事。同一个任务接口版单次只要一分多而导出报表在真实业务里是每天定时跑的一天跑几百次差距就从几毛钱滚成每天几十美元的差距换成更贵的模型放得更大。单次看不出放大才看得出来。上面的成本差距用一张图看得更直接。下图把任务按复杂度分成三档简单任务就是“查列表 导出”2 次调用中、高复杂度则是接口需要更多分页调用时的外推值computer use 线同样按文中单轮真实成本做外推实测点仍是开头的 45 轮 / $0.432接口侧锚定 2 次调用 / $0.014。不同任务复杂度下成本曲线computer use vs 结构化接口简单任务中等任务复杂任务10.90.80.70.60.50.40.30.20.10单次成本(USD)交叉点远在右侧要等接口复杂到上百次调用比如分页拉取约 120 次以上结构化接口的累计成本才会追上 computer use。日常这种“一两步就能拿完”的简单任务computer use 亏出 30 倍不是单价差距而是它 45 轮的界面步骤一步都省不掉——任务越简单倍率越夸张。排查token 都烧到哪去了等等为什么是 45 轮我一开始估的理想步骤不是十来步吗把任务按阶段拆开多出来的轮数主要花在三个地方token 的去向也基本跟着这三块走45 轮循环的 token 去向模拟器 45 轮实测折算按 GPT-6.1 Sol 口径 截图(图像输入) ██████████████████████████ 81000 tok ← token量最大读也要看图 判断动作(输出) ██████████ 27000 tok单价贵5倍按成本算才是大头等待 轮询点完查询假后台接口要几秒才返回Agent 不知道什么时候加载完只能一次次截图看状态。一次等待就是好几轮循环点偏 重试筛选下拉框第一次点没弹出来它又点了一次导出按钮判断错位置又点了一次每轮循环都有三份开销截图图像 token 判断输出 token 动作输出 token把任务按阶段拆开看理想轮数和模拟器实测的轮数差得很远阶段理想一次过模拟器实测多出来的原因打开后台15首屏加载轮询 3 点偏重试 1进报表页15路由等待轮询 3 点偏重试 1填筛选条件33顺利一次过点查询 等加载111查询 2.7s 才返回只能轮询截图点导出 弹窗15弹窗响应轮询 3 点偏重试 1确认导出14生成文件等待轮询 3等下载 收尾111下载 2.7s 才完成只能轮询截图核对文件11顺利一次过合计1045理想 10 轮滚成 45 轮4.5 倍10 轮的理想滚成 45 轮。每一轮都不贵按 Sol 的价格单轮大概不到一美分但 45 轮叠起来原以为跟上一篇一样是个量级差实际直接滚成了三十倍。根因读操作等待轮询复盘下来根因是两个机制叠加都不是 Agent蠢computer use 里读数据也要先看图——筛选出结果人扫一眼就完事Agent 得截一张图把结果读进上下文。读一次就是一次带图像的输入异步任务没有完成回调——加载、下载这种异步操作computer use 收不到完成了的通知只能反复截图判断状态。等待越久轮询越多这两个机制让理想步数和实际轮数严重脱节。我估预算的时候是按打开-筛选-查询-导出-确认-下载这些阶段一路顺畅来算的默认每步一次过——真实世界里等待和出错会把它撑成四五倍。这里有个直接的教训给 computer use 任务估预算不能按理想步骤数估得按实际轮数估而实际轮数基本要翻四五倍我这套参数模拟出来是 4.5 倍。修复补只读接口 成本护栏同一任务补一个只读导出接口跟界面系列第二弹说的结构化通道一个思路成本立刻下来两次调用查列表 导出账单立刻降了一个量级上面脚本里那两组数字额外收益可鉴权、可审计、出错可重放但有些场景确实没法开接口第三方软件、权限拿不到这时候 computer use 还得用。那就得上成本护栏——跑之前先按实际轮数估预算超了就拦下来别让它闷头跑。为啥要看这段护栏的作用不是省那几毛钱是让烧爆账单这种事故不发生。// 成本护栏跑 computer use 任务前先估预算// 45 轮来自上面的沙箱模拟器实测换成你任务的轮数即可functionguard(estimatedLoops,imgTokensPerShot,thinkTokensPerStep,budgetUsd){constinputTokensestimatedLoops*imgTokensPerShot;constoutputTokensestimatedLoops*thinkTokensPerStep;constcost(inputTokens/1e6)*2(outputTokens/1e6)*10;// GPT-6.1 Solreturn{estimatedLoops,cost:cost.toFixed(3),budgetUsd,allowed:costbudgetUsd};}console.log(guard(45,1800,600,0.2));// 预算 0.2 美元console.log(guard(45,1800,600,0.5));// 预算 0.5 美元console.log(guard(45,1800,600,0.1));// 预算 0.1 美元运行结果Node 25.8.2 实测{ estimatedLoops: 45, cost: 0.432, budgetUsd: 0.2, allowed: false } { estimatedLoops: 45, cost: 0.432, budgetUsd: 0.5, allowed: true } { estimatedLoops: 45, cost: 0.432, budgetUsd: 0.1, allowed: false }45 轮的成本四毛多预算给 0.2、0.1 的直接拦掉给 0.5 的放行。真线上跑的时候预算按实际轮数估理想步骤 × 四五倍我这套参数模拟出来是 4.5 倍别按理想步骤估。边界computer use 什么时候反而划算这套账算下来computer use 也不是一无是处。反过来看有几类场景它是划算的场景为什么划算一次性任务反正只跑一次开发接口的人力成本比 token 成本贵第三方软件没有接口权限computer use 是唯一解低频只读场景偶尔用一次、只拿数据不写每次 token 成本不高不值得为它做接口判断标准跟上一篇一致这个任务会不会反复跑这个数据能不能只读拿到反复跑、能只读拿到就开接口一次性、拿不到接口再放 computer use。错误处理与降级策略前面那套成本护栏解决的是“跑之前放不放行”但任务真跑起来还有另一类问题跑到一半失败了怎么办。computer use 不像结构化接口那样有明确的错误码和重放机制它更接近“点着点着卡住了”——所以得提前想清楚哪些失败可以原地重试哪些该立刻止损降级。先说重试策略。失败要先分两类偶发失败点偏了、加载慢了一点、弹窗出来慢了半拍。这类值得重试但必须有次数上限不能同一个动作无限重试。结构性失败按钮位置变了、页面改版、筛选框根本没了。这类重试也白搭越试越烧钱应该直接降级。对应到实现上最好设“双层护栏”单步重试上限 全程最大轮数上限。单步重试解决“这一步点偏了再试几次”全程轮数上限解决“整体卡死、陷入循环”。最大轮数不能拍脑袋设一个超大值可以按任务的理想步数乘一个放大系数本文这套参数里实测是 4.5 倍再留一点余量。然后是降级顺序。跑不下去的时候按这个优先级走能转结构化接口就先转接口像导报表这种“读数据”任务本来就有只读接口可选computer use 一失败直接改调接口最稳。没有接口就转人工把当前状态、已完成到哪一步、最后一张截图、建议人工执行的动作整理出来交给人而不是让 Agent 继续盲目试探。绝不无限重试超过最大轮数或单步重试上限必须强制终止避免成本雪崩。下面是一段伪代码展示这个降级判断逻辑function runTaskWithFallback(task) { const idealSteps estimateIdealSteps(task); // 理想情况一步过需要多少步 const maxRounds idealSteps * 5; // 按放大系数设上限本篇实测约 4.5x const maxStepRetry 3; // 单步最多原地重试 3 次 let rounds 0; while (!task.done) { rounds; if (rounds maxRounds) { return fallback(task, 超过最大轮数上限); } const result computerUseStep(task); if (result.ok) continue; if (result.retryable result.stepRetry maxStepRetry) { result.stepRetry; continue; // 偶发失败原地重试 } // 重试仍然失败能开接口就降级到结构化接口 if (task.hasReadonlyApi) { return task.callApi(); // 结构化接口兜底 } return handoffToHuman(task); // 没有接口转人工处理 } return task.result; } function fallback(task, reason) { if (task.hasReadonlyApi) return task.callApi(); return handoffToHuman(task, reason); }核心就是一句允许有限重试但必须预留降级出口。computer use 最怕的不是某一步失败而是失败之后没有刹车、重复烧钱。收尾一句话总结computer use 不是不能用是每一步都在付账这件事比想象中严重——读数据要付账等加载也要付账点偏了重试还要付账。让 AI 点界面之前先把账算清楚这篇的模拟器脚本拿回去改参数就能算能开接口的补个接口真不能开接口的至少先估预算、上成本护栏。对了这篇的轮数是本地沙箱模拟器跑出来的参数都写在脚本里——你在自己的任务里改参数重跑就能验证等待轮询、点偏重试这两件事到底会把账单撑到多少倍。模拟器只能验证机制真实模型还会看错界面、多绕弯路实际账单大概率只高不低。价格按 09.29 DevDay 公告的 GPT-6.1 Sol 定价折算输入 $2 / 输出 $10 每百万 tokencomputer use 的能力和价格都在快速迭代动手之前以官方文档最新版本为准。参考资料Agents API 官方文档computer use 的上游能力入口本文“截图→判断→动作”的循环机制属于 Agents API 的 computer use 能力范围。computer use tools文中所模拟的 computer use 每一步“截图、判断、动作”的官方机制说明来源。OpenAI API 定价页09.29 DevDay 公告的 GPT-6.1 Sol 定价折算依据输入 $2 / 输出 $10 每百万 token实际动手前以官方最新版为准。