# MobileGym++

English  ·  主页  ·  智能体代码  ·  数据集  ·  模型  ·  打开手机

Apache 2.0 215 题 63 个客户端

## 排行榜 215 道题。只点屏幕和可调工具用的是同一批题、同一份初始状态、同一套检查器。分数是做完的百分比。平均步数只填论文图里画出来的那些行,空着表示这篇论文没有给这一行的步数。星号是论文里标明由作者复现的结果。
模型 只点屏幕 可调工具
成功率 ↑ 平均步数 ↓ 成功率 ↑ 平均步数 ↓
开放权重
UI-Venus-1.5-8B 19.5*— 16.3*—
GUI-Owl-1.5-8B 13.0*33.9 12.6*34.6
GUI-Owl-1.5-32B 18.6*32.3 23.3*36.7
MAI-UI-8B 19.1*— 18.6*—
开放数据
OpenMobile-1-8B 13.5*— 7.0*—
Qwen3.5-9B 9.3*43.4 12.1*42.9
  OpenMobile-2-9B,只点屏幕 SFT 40.9— 41.9—
  OpenMobile-2-9B,混合 SFT 39.128.0 44.723.2
  OpenMobile-2-9B + RL 40.5— 46.5—
Qwen3.6-27B 46.5*32.0 50.7*28.6
  OpenMobile-2-27B,只点屏幕 SFT 54.9— 57.7—
  OpenMobile-2-27B,混合 SFT 55.325.0 65.619.2
  OpenMobile-2-27B + RL 57.2— 67.0—
成功率来自 OpenMobile-2 论文 Table 2。平均步数来自 Figure 5。那张总表里的闭源模型没有在这个基准上给分。

上面是只点屏幕。下面是同一道题里,点击和应用自带工具交替进行,例如 list_order 和 search_item。两条路写入同一份应用状态。

同一道题,同一份应用状态,同一套检查器。
上面一条只点屏幕。下面一条把这些手势和应用自己的工具交替使用。

移动智能体要完成的是商业应用上的真实流程:订一段行程、付一笔订单、把一个应用里的值带到另一个应用里。这些流程很长,该被检查的是应用自己的记录变了没有。 **MobileGym++** 是一部在浏览器里运行的手机,因此这些流程可以重置、重放,也可以并行跑很多部。它在 [MobileGym](https://arxiv.org/abs/2605.26114) 上继续做了 35 个新的商业风格应用,补上了明确的跨应用机制,并试验了一种新的用法:应用在图形界面旁边,把自己的一部分功能暴露成工具。智能体看到的是屏幕像素,没有无障碍树,也不能直接读取业务状态。整机状态可以完整序列化,所以每一次训练或评测都能从同一份快照开始。 这个仓库就是这部手机,加上在它上面的 **MobileGym++ Bench**:215 道题,每题由程序检查应用状态。训练轨迹、安卓模拟器里的应用,以及发布的模型,在 [OpenMobile2](https://github.com/OpenMobile2/OpenMobile2-Code)。 ## 两条路,一份状态 计算机使用正在走出「只会点界面」。MobileGym++ 把这件事做到手机上。这里的工具不是事后接上去的外部接口。每个工具都是对本应用自己对象的一次结构化查询或写入,改的是点击和输入也会改的那份持久状态。像 `search_item` 这样的调用,和点进同一页面的那些点击,写的是同一份存储。因此只点屏幕和可调工具共用题目、初始状态和检查器,变的只是路径。 这样的工具有 300 多个,分布在 50 多个应用里,包括时钟、笔记这类系统客户端。工具只在对应应用位于前台时提供。基准里的每一题仍然可以只靠图形界面做完。 | | 只点屏幕 | 可调工具 | | --- | --- | --- | | 参数 | `--mode gui_only` | `--mode hybrid` | | 智能体能做的 | 在截图上点击、输入、滑动 | 同样的手势,再加上前台应用的工具 | | 检查的是 | 做完之后的应用状态 | 同一份应用状态 | ## 这部手机 手机里装了 **63** 个客户端:这次新做的 **35** 个,加上从 MobileGym 留下来的 **28** 个。其中 **47** 个是商业风格应用,**16** 个是系统客户端。覆盖出行、购物、财务、内容、社交、办公和本地生活。

应用覆盖。上面的模拟器手机是 63 个应用,就是这个仓库。下面的安卓模拟器是 62 个应用,不在这个仓库里。每一格代表两个应用。圆点表示该应用暴露了自带工具。

上面那部是这个仓库。下面那部是随 OpenMobile2 发布的安卓模拟器,那些应用不在这次克隆里。每一格代表两个应用。圆点表示该应用暴露了自带工具。 每个客户端保管自己的业务对象,例如订单、账单、行程、消息,并随着操作变化。剪贴板、应用间分享、支付跳转和媒体选择把它们连起来,所以一条流程可以离开一个应用,写进另一个应用。整机可以做成快照再恢复,训练回合和评测因此从同一处出发。 新客户端里,中位水平是 37 条路由、166 个可交互动作、86 次页面跳转,从首页出发的中位深度是 3。和仍留在这部手机上的 12 个 MobileGym 业务应用比,新客户端的可交互动作是 1.48 倍,页面跳转是 1.91 倍。
客户端名单 **商业。** 支付宝、淘宝、淘宝闪购、京东、拼多多、闲鱼、唯品会、苏宁易购、eBay、卡皮记账。 **本地生活。** 美团外卖、大众点评、携程旅行、去哪儿旅行、滴滴出行、铁路 12306、地图、菜鸟、瑞幸咖啡。 **社交和内容。** 微信、小红书、微博、哔哩哔哩、豆瓣、Reddit、X、微信读书、番茄免费小说、喜马拉雅、播客、网易云音乐、Spotify、腾讯视频、优酷视频、猫眼。 **工作和日常。** Slack、腾讯会议、Google 云端硬盘、邮件、滴答清单、flomo、倒数日、番茄 ToDo、小日常、BOSS 直聘、百词斩、Keep、美柚。 **系统,在 `system/`。** 答题卡、浏览器、计算器、计算器 2、日历、时钟、指南针、电话、文件、相册、笔记、设置、短信、主题商店。 天气和网易云音乐放在 `apps/` 里,计入系统客户端。所以磁盘上 `apps/` 是 49 个目录、`system/` 是 14 个,上面的计数是 47 和 16。两种算法都是这 63 个客户端。
## MobileGym++ Bench 这套题看的是:智能体能不能在这部手机里完成一次商业写入。单应用题要在较深的页面里找到、筛选并填对字段。跨应用题还要从另一个应用的实时状态里取出一个值,带过应用边界,写进正确的位置。题面写成用户目标,不点名控件、工具或检查器要读的字段。 一共 **215** 题,用到已安装客户端中的 **48** 个。109 题用 1 个应用,74 题用 2 个,27 题用 3 个,5 题用 4 个,因此跨应用的是 **106** 题。一道题可以同时属于多个领域,右图的领域次数会重叠,加起来不是 215。

MobileGym++ Bench:按应用数分为 109、74、27、5,以及会重叠的领域次数。

每一题是一条用户目标、一份绑定的初始状态,以及一个读取应用状态前后差的检查器。检查器不看轨迹,不看截图,也不另请模型打分。只点屏幕和可调工具用同一批题、同一批初始状态、同一套检查。报告的指标是成功率。 题面、稳定 id 和说明在 [`bench_env/benchmark/official.json`](bench_env/benchmark/official.json)。 ### 和其他环境怎么比 下表里的「商业应用」与论文用的是同一种算法:MobileGym++ 的 35 是这次新做的应用。手机里同时还留着更早的客户端,可安装的一共 63 个。 | 环境 | 平台 | 商业应用 | 题目 | 跨应用 | 图形界面 | 应用自带工具 | 可重置 | | --- | --- | ---: | ---: | --- | --- | --- | --- | | AppWorld | API | 9 | 750 | 有 | — | — | 有 | | AndroidLab | 模拟器 | 5 | 138 | — | 有 | — | — | | AndroidWorld | 模拟器 | 0 | 116 | 有 | 有 | — | — | | SPA-Bench | 真机 | 58 | 340 | 有 | 有 | — | — | | MobileWorld | 模拟器 | 4 | 201 | 有 | 有 | — | — | | MobileGym | 模拟器 | 12 | 416 | 有限 | 有 | — | 有 | | **MobileGym++** | **模拟器** | **35** | **215** | **有** | **有** | **有** | **有** | ## 目录 | 路径 | 是什么 | | --- | --- | | `apps/` | 商业风格客户端,以及天气和网易云音乐 | | `system/` | 系统客户端:时钟、笔记、日历、文件、设置,以及其他 | | `os/` | 设备外壳:桌面、状态栏、文件、剪贴板、通知 | | `app_tools/` | 应用自带工具的 schema 和处理函数 | | `bench_env/benchmark/` | 215 题和 `run.sh` | | `bench_env/task/` | 题目的初始化和检查器 | | `docs/getting-started.md` | 从刚克隆到跑完一道题 | 想用产品,就打开手机。想给模型打分,就看 `bench_env/benchmark/`。 ## 1. 起手机 需要 Node.js 22 或更新版本。手机只需要这一条命令。终端不要关,浏览器打开 。 ```bash git clone https://github.com/OpenMobile2/MobileGym-plusplus.git cd MobileGym-plusplus zsh scripts/start_phone.sh ``` 脚本第一次会安装 Node 依赖,并从 `https://cdn.mobilegym.dev` 加载壁纸,和线上那部手机是同一处。215 道题不需要地图、天气或助手的密钥。 ## 2. 用你的模型打分 需要 Python 3.11 或更新版本。另开一个终端,在仓库根目录先装一次检查器: ```bash python3 -m pip install -r bench_env/requirements.txt python3 -m playwright install chromium ``` 然后把手机和你自己的、兼容 OpenAI `/v1` 的模型接上: ```bash zsh bench_env/benchmark/run.sh \ --mode hybrid \ --env-url http://127.0.0.1:3000 \ --model-base-url http://HOST:PORT/v1 \ --model-name YourModel \ --model-api-key "$OPENAI_API_KEY" \ --output-dir runs/bench-hybrid ``` `--mode gui_only` 仍是这 215 题和同一套检查器,只是关掉应用自带工具。默认协议是 `qwen35_session`:系统提示和题目只发一次,`tools` 保持 `mobile_use`,只留最近 3 张截图。模型名字会选适配:Qwen、Gemini、Kimi K3、DeepSeek 或 GLM。跑完会写下 `results.jsonl` 和 `summary.json`。 OpenMobile2-Code 也可以评这部手机。本仓库的 `scripts/start_phone.sh` 不要关,再到 `MobileGymPP/` 里跑 `eval_bench215.py`,`--mock-root` 指到本仓库,`--env-url http://127.0.0.1:3000`。它读的题单是 `bench215/official.json`。协议用 `--runtime qwen35_session`。并行很多路时,用 `scripts/server/start_nginx_gateway.sh`,做法在 [`docs/getting-started.md`](docs/getting-started.md)。上面的 Vite 是单进程。 ## 许可 代码是 Apache 2.0,见 [`LICENSE`](LICENSE)。数据条款、第三方免责声明和声明分别在 [`LICENSE-DATA`](LICENSE-DATA)、[`DISCLAIMER.md`](DISCLAIMER.md)、[`NOTICE`](NOTICE)。这些模拟应用是研究用的目标,不是它们所模仿的产品,本项目也与那些公司没有隶属关系。