1. 从5亿视频到可训练轨迹:GUI Agent评测到底卡在哪
GUI Agent 这个词最近一年被反复提起,但真正动手跑过评测的人都知道,最折磨人的不是模型本身,而是"数据从哪来"和"评测怎么统一"。小米 AI 团队这次在 ICML 2026 入选的 Video2GUI 工作,给出了一个很实在的答案:互联网上 5 亿条教程视频里,藏着海量操作示范,问题是怎么把它们变成带任务指令、动作时间戳和屏幕坐标的结构化轨迹。
我先把这套逻辑拆开讲清楚。Video2GUI 用的是"元信息粗筛 + 视频内容细筛"两阶段流水线,从 5 亿条视频里筛出 420 万条高质量教程,再用多模态大模型把视频转成结构化轨迹,最终产出 WildGUI 数据集——1270 万条轨迹、1.245 亿张截图,覆盖 1500 余个应用与网站、五大平台。这个规模目前是开源 GUI 预训练数据集里最大的。
效果层面,MiMo-VL-7B 用 WildGUI 预训练后,在 OSWorld-G 上拿到 67.6 分,超过 Qwen3-VL-32B 与 Seed1.5-VL;在 ScreenSpot-Pro 上准确率从 41.2 提升到 56.9,提升接近 38%。更关键的是 scaling 实验显示,性能随预训练 token 数增加持续提升,扩展到 200B Token 时仍未饱和。
但这里有个现实问题:数据集再大,评测环节如果各跑各的,结论就没法横向比较。GUIEvalKit 就是冲着这个痛点来的——集成五大主流基准,支持 30 多个模型的统一离线评测与半在线评测,还提出了决策级评估框架,把评估从"执行正确率"提升到"行为分布模式"。
对我们这些想复现评测流程的人来说,真正的门槛在于:多模态 Agent 评测往往要同时调用视觉理解、动作规划、函数调用多个环节,每个环节可能对接不同的模型服务。如果每个模型都要单独配 Key、单独改 Base URL,脚本会变得非常难维护。这正是 TaoToken 统一 Key 能派上用场的地方——用一套凭证跑通多模型对比,把精力留给评测逻辑本身。
下面我会从接入配置开始,一步步带你搭出一个可复现的 GUI 任务评测脚本,并给出成功率与 Token 消耗的对比验证动作。
2. TaoToken 前置:统一 Key 接入多模态评测的准备工作
在动手写评测脚本之前,先把 TaoToken 这边的准备工作做完。核心思路很简单:你不需要为每个模型单独申请账号、单独管理密钥,而是用一套统一的 Key 和 Base URL,通过切换 Model ID 来调用不同模型。这对 GUI Agent 评测特别友好,因为评测本身就要横向对比多个模型。
先明确三个必须对齐的参数,我把它整理成表格,方便你对照:
| 参数项 | 取值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 所有请求的统一入口,不要加 UTM 后缀 |
| API Key | 在控制台生成 | 形如sk-开头的一串字符,妥善保存 |
| Model ID | 按需切换 | 例如多模态理解模型、推理模型分别对应不同 ID |
第一步,打开控制台创建 API Key。地址是https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,登录后在 API Keys 页面点新建,复制生成的 Key。这里提醒一句:Key 只在创建时完整显示一次,建议立刻存到本地环境变量里,别直接写死在脚本中。
第二步,确认你要评测的模型 ID。GUI Agent 评测通常需要两类模型:一类负责看懂屏幕截图(多模态理解),一类负责规划动作序列(推理)。你可以在模型对话页面先手动试一下目标模型是否能正常响应,地址是https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。在对话框里发一张界面截图加一句"描述这个界面上有哪些可点击元素",看返回是否合理。
第三步,如果你打算长期跑评测、甚至把 Agent 接入到持续集成流程里,建议了解一下 Coding Plan。它更适合需要稳定调用、批量跑任务的场景,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。对于只是偶尔跑一次对比评测的情况,按量调用就够了。
第四步,把接入文档过一遍,重点看请求格式和错误码说明。文档地址是https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。GUI 评测里最常见的坑是图片编码格式不对、或者 messages 结构里 image_url 字段位置放错,文档里都有示例。
准备工作做完后,你手上应该有三样东西:一个可用的 API Key、一个确认能响应的 Model ID、以及本地配好的环境变量。接下来进入配置环节。
3. 可复制配置:settings.json 与评测脚本骨架
这一节给你可以直接复制的配置片段。我按两种常见形态来写:一种是给支持配置文件读取的工具用(比如 Claude Code 风格的 settings.json),一种是给 Python 评测脚本用的环境变量与请求骨架。
先看 settings.json 形态。如果你用的是支持自定义 Base URL 的编码工具,把下面这段填进去,注意路径和字段名要与工具要求一致:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_AUTH_TOKEN": "sk-你的Key", "ANTHROPIC_MODEL": "你的多模态模型ID" } }这里三件套必须齐全:Base URL 指向https://taotoken.net/api,Key 填你生成的凭证,Model ID 填目标模型。少任何一个都会在请求时报错。如果你用的是 Codex 风格的auth.json,结构类似,把对应字段替换成 Base URL、Key、Model ID 即可。
再看 Python 评测脚本的骨架。GUI 评测的核心是把截图和任务指令一起发给模型,让它输出动作序列,然后跟标注轨迹对比。下面是一个最小可运行示例:
import os import base64 import requests BASE_URL = "https://taotoken.net/api" API_KEY = os.environ["TAOTOKEN_API_KEY"] MODEL_ID = os.environ.get("EVAL_MODEL_ID", "你的多模态模型ID") def encode_image(path): with open(path, "rb") as f: return base64.b64encode(f.read()).decode("utf-8") def ask_agent(screenshot_path, instruction): payload = { "model": MODEL_ID, "messages": [ { "role": "user", "content": [ {"type": "text", "text": instruction}, { "type": "image_url", "image_url": { "url": f"data:image/png;base64,{encode_image(screenshot_path)}" } } ] } ], "max_tokens": 1024 } headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } resp = requests.post(f"{BASE_URL}/v1/messages", json=payload, headers=headers, timeout=60) resp.raise_for_status() return resp.json() if __name__ == "__main__": result = ask_agent("screen_001.png", "描述界面元素并给出下一步点击坐标") print(result)这段代码里有两个细节值得注意。第一,图片用 base64 内联,格式是data:image/png;base64,前缀加编码串,这是多模态接口最常见的传图方式。第二,max_tokens别设太小,GUI 任务的动作序列往往比较长,设 1024 是保守值,复杂任务可以调到 2048。
如果你要跑多模型对比,把MODEL_ID做成循环变量即可,Key 和 Base URL 保持不变。这就是统一 Key 的价值——切换模型只改一个字符串,不用重新配凭证。
配置完成后,先别急着跑全量评测,用单张截图验证一次请求是否通。下一节讲怎么验证。
4. 验证请求与成功结果:单图跑通再上批量
配置写完,第一步是验证请求链路是否通。我建议用一张简单的界面截图先跑单次调用,确认返回结构符合预期,再上批量评测。
运行上一节的脚本,把screen_001.png换成你本地任意一张界面截图。如果一切正常,你会看到类似这样的返回结构:
{ "id": "msg_xxx", "type": "message", "role": "assistant", "content": [ { "type": "text", "text": "界面上方有搜索框,中部是卡片列表,右下角有悬浮按钮..." } ], "usage": { "input_tokens": 1280, "output_tokens": 156 } }重点看两个地方:content里是否有合理的文本描述,usage里是否返回了 token 计数。后者是后面做 Token 消耗对比的基础。
单图跑通后,进入批量评测。GUI 任务成功率的核心计算方式是:模型输出的动作序列与标注轨迹在关键动作上匹配的比例。你可以先做一个简化版——只比对最终点击坐标是否落在标注区域内:
def is_hit(predicted_xy, ground_truth_box, tolerance=20): x, y = predicted_xy x1, y1, x2, y2 = ground_truth_box return (x1 - tolerance) <= x <= (x2 + tolerance) and (y1 - tolerance) <= y <= (y2 + tolerance)把一批任务跑完后,统计命中率就是成功率。同时把每次调用的input_tokens + output_tokens累加,得到总 Token 消耗。这样你就能得到一张对比表:
| 模型 | 任务成功率 | 总 Token 消耗 | 平均单任务 Token |
|---|---|---|---|
| 模型 A | 56.9% | 1,240,000 | 1240 |
| 模型 B | 41.2% | 1,890,000 | 1890 |
这张表就是复现"小模型反超大模型"评测流程的关键产出。你会发现,有些参数量更小的模型,在 GUI 任务上不仅成功率高,Token 消耗还更低——这跟 VeriTime 论文里"推理 Token 消耗平均降低 71%"的结论方向一致。
验证阶段还有一个动作值得做:固定随机种子,重复跑三次,看成功率波动范围。如果波动超过 5 个百分点,说明评测样本量不够,需要扩大任务集。
5. 本篇常见错排查:401、local proxy failed 与 reading choices
跑评测脚本时,报错基本集中在几个固定位置。我把最常见的几类整理出来,对照着排查能省不少时间。
第一类是 401 认证失败。典型报错长这样:
{ "error": { "type": "authentication_error", "message": "Invalid API key provided" } }原因通常是 Key 没读到、或者环境变量名写错。检查os.environ["TAOTOKEN_API_KEY"]是否真的取到了值,可以在脚本开头加一行print(API_KEY[:8])确认前缀。另外注意 Key 前后不要有空格,复制时容易带上换行符。
第二类是local proxy failed或连接超时。这类报错通常跟本地网络环境有关,检查你的请求是否被本地某些设置拦截。最直接的办法是用 curl 单独测一次:
curl -X POST https://taotoken.net/api/v1/messages \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"你的模型ID","messages":[{"role":"user","content":"hi"}],"max_tokens":32}'如果 curl 能通而 Python 不通,问题在脚本的请求库配置;如果 curl 也不通,检查 Base URL 是否写成了带路径的完整地址。
第三类是reading choices相关报错,通常出现在你按 OpenAI 格式解析返回、但实际接口返回的是另一种结构时。比如你写了resp["choices"][0]["message"]["content"],但返回里根本没有choices字段。解决办法是先打印完整返回体,看清楚结构再取字段。多模态接口的返回结构跟纯文本接口不完全一样,别想当然套用。
第四类是 OAuth 相关报错。如果你用的是某些需要 OAuth 流程的工具,报错信息里会出现OAuth token expired或invalid_grant。这类问题跟 API Key 模式不同,需要重新走授权流程。如果你只是想快速跑评测,建议直接用 API Key 模式,省去 OAuth 的复杂度。
第五类是图片编码报错,报错信息里会出现invalid image或unsupported format。检查两点:图片是否真的存在且可读,base64 前缀是否写成了data:image/png;base64,(注意逗号不能少)。
排查完这些,脚本基本就能稳定跑了。如果还有问题,接入文档里有更完整的错误码对照表。
6. 语义一致 CTA:把评测流程固化下来
跑通一次评测不难,难的是把流程固化下来,让它可重复、可对比、可追溯。我的建议是把三件事写进你的评测仓库:固定的任务集、固定的评测脚本、固定的配置模板。
配置模板就用第 3 节那份 settings.json 或环境变量清单,Base URL 固定为https://taotoken.net/api,Key 从环境变量读,Model ID 作为唯一变量。这样每次换模型评测,只需要改一个字符串,其他都不动。
如果你要长期跑 GUI Agent 评测,甚至把评测接入到模型迭代流程里,Coding Plan 会更合适,地址是https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。它适合需要稳定批量调用的场景,不用每次担心额度问题。
需要新建或轮换 Key 的时候,回到控制台操作:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。接入细节和字段说明以文档为准:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=。
最后留一个实用技巧:在评测脚本里加一个日志文件,把每次调用的模型 ID、任务 ID、成功率、Token 消耗都写进去。跑上几十轮之后,你就能画出成功率随模型迭代的变化曲线,这比单次评测结果有说服力得多。GUI Agent 的评测本来就是个持续过程,把数据攒下来,结论自然就出来了。