MMSkills: Towards Multimodal Skills for General Visual Agents

Paper: arXiv:2605.13527 Code: DeepExperience/MMSkills Code reference: main @ adf6bc36 (2026-05-18)

1. Motivation (研究动机)

现有 agent skill 通常把可复用经验写成 text prompt、code snippet、execution graph 或 learned routine。这个假设在纯语言或结构化 API 场景里可行,但对 visual agent 不够:GUI / game 任务的关键不是只知道“下一步做什么”,还要知道当前屏幕是否已经进入可执行状态、哪些视觉证据说明操作成功/失败、什么时候应该停止。论文给出的典型失败是:desktop agent 知道要操作某个 dialog,却没有识别 dialog 还没 ready;game agent 知道目标,却需要视觉 cue 判断是“仍在推进”还是“已经完成”。

MMSkills 要解决的问题是:把 agent 的可复用技能从 text-only procedural knowledge 扩展为 multimodal procedural knowledge。也就是说,一个 skill 不能只是“步骤说明 + 几张截图”,而要绑定三类信息:可复用 textual procedure、状态化的 when-to-use / when-not-to-use / verification cue,以及能在 runtime 帮助识别这些状态的 multi-view keyframes。

这个问题值得研究,因为 visual agent 的可复用经验如果只能靠长 demonstration replay,会太长、太 instance-specific,也很难迁移;如果压缩成纯文本,又会 verbose but underspecified。MMSkills 的目标是在两者之间建立一个紧凑表示:保留视觉决策所需的证据,但不把完整轨迹塞进上下文,从而让 frontier VLM 和较小 VLM 都能借助外部 multimodal skill library 做更稳的 GUI / game 决策。

Figure 1 解读:这张图用 LibreOffice Calc chart creation 说明 text-only skill 的核心缺口。纯文本说明能告诉 agent 创建 chart 的大致步骤,但不一定能识别当前是否在 Sheet2、dialog 是否打开、chart title 是否已设置;MMSkills 把状态卡和 full/focus/before/after views 绑定到 procedure 上,使 branch agent 能先判断 skill 是否适用,再给 main agent 结构化 guidance。

2. Idea (核心思想)

核心 insight 是:对 general visual agent 来说,skill 的最小可复用单元不是 action list,而是“procedure + decision-relevant visual state”。MMSkills 因此把每个 skill 表示为 state-conditioned package,并在 inference 时用 temporary branch 消化视觉证据,再把压缩后的 planner guidance 交回主轨迹。

关键创新有两点:第一,用 runtime state cards 明确记录 when-to-use、when-not-to-use、visible cues、verification cues 和 available views;第二,用 branch loading 代替 direct loading,让 main agent 不直接吞下大量 reference screenshots,而是只接收 applicable / subgoal / plan / do_not_do / verify 这类结构化决策支持。

与 text-only skills(例如只在 prompt 里加入 reusable procedure)相比,MMSkills 的差异不是“多了图片”,而是图片被绑定到状态判别和完成验证上;与 demonstration replay 相比,它不是回放整条轨迹,而是把公共非测试轨迹压缩为可检索、可审计、可按需加载的 state-conditioned skill package。

3. Method (方法)

3.1 Overall framework

论文把系统拆成三个模块:Multimodal Skill Package、Skill Generator from Public Trajectories、Branch-loaded Multimodal Skills Agent。整体 runtime 可以写成:main agent 在当前视觉观察 和历史 下,要么直接行动,要么调用一个候选 skill branch: Branch 的输出是结构化 guidance: 这里的关键约束是: 只是 planning signal,最终 action 仍必须由 main agent 根据 live observation grounded 到当前屏幕。这样可以利用 reference evidence,又避免把 reference screenshot 当作坐标模板。

Figure 2 解读:左侧是 skill package 的文件结构:SKILL.md 存 textual procedure,state_cards.json 存状态条件和可加载视图,Images/ 存 full-frame、focus-crop、before/after 等 keyframes。中间是从 public non-test trajectories 生成 skill library 的五阶段 pipeline。右侧是 inference-time branch loading:main agent 看到 available skills,但只有在需要时才打开 temporary branch;branch 先做 gated view selection,再做 planner guidance,最后返回 compact JSON 给 main agent。

3.2 Multimodal Skill Package

每个 MMSkill 被定义为: 其中 是 compact descriptor, 是 reusable textual procedure, 是 runtime state cards, 是与 state cards 对齐的 keyframe bundles。一个 pair 对应一个 decision-relevant procedural state:procedure 告诉 agent 工作流,state card 告诉它何时适用/不适用,keyframes 让这个状态在 runtime 可识别。

Runtime state card 不是普通 image caption,而是 agent-facing state node: 其中 when_to_use / when_not_to_use 负责适用性判断,visible_cues 指出要看哪些视觉证据,verification_cue 定义进度或完成检查,available_views 说明 branch 可以加载哪些 reference views。

Keyframe bundle 的视图集合为: full_frame 保留全局上下文,focus_crop 定位局部视觉 cue,before/after 表达转移和完成验证。text-only skill 是退化形式 ;MMSkills 的增量是把 decision condition 和 visual evidence 一起纳入可复用单元。

3.3 Skill Generator from Public Trajectories

Generator 输入 public, non-evaluation trajectories: 其中 是任务指令, 是视觉观察, 是执行动作。给定 domain 的 trajectory pool ,meta-skill-guided Generator 写成: 论文的 generation pipeline 是五阶段:

  • Phase 0 task embedding and clustering:把 task instructions 和 trajectory metadata embed 后聚类,得到语义集中的 workflow clusters。
  • Phase 1 cluster-level skill planning:LLM agent 为每个 cluster 提出 atomic skills,明确 workflow boundary、completion condition、covered task ids。
  • Phase 2 skill merging:去重、合并并泛化 cluster-level skill plans;拒绝过宽的 umbrella skills。
  • Phase 3 text-first drafting:先不读图,选择 reference tasks,草拟 descriptor 、procedure 和 planned state cards。
  • Phase 4 image grounding and audit:读取 selected keyframes,ground focus regions,构造 multi-view bundles,并用 meta-skill quality gates 审计最终 package。

对一个 merged skill ,最终化过程为: 直觉上,这个设计不想保存原始 demonstration,而是只保存“诊断性状态”:哪些状态要识别,哪些视觉 cue 说明应该继续/跳过/验证完成。这样比 demonstration replay 更短,也比 text-only procedure 更可执行。

论文公式与 released code 实现差异:论文描述了完整 Phase 0–4 的 trajectory-to-skill Generator;main@adf6bc36 的公开 repo 主要释放 runtime layer、OSWorld integration、task-to-skill mappings、代表性 skill library 和 agent adapter。可核验代码覆盖 branch-loaded runtime、state-card / image loading 和 evaluation runner,但没有完整复现论文中所有 Generator 阶段的训练/生成 launcher。

3.4 Branch-loaded Multimodal Skills Agent

直接把 MMSkill 全量塞进 main context 会有两个问题:state cards + multi-view images 带来上下文压力;reference screenshots 可能把 agent 锚定到旧 UI,而不是 live environment。Branch loading 把“skill-environment grounding”移到临时 branch 中。

Stage 1: gated view selection. 当 main agent 请求 时,branch 先选择相关 state cards 和 view types: 如果 textual procedure 和 state cards 已足够, 可以为空;否则 branch 只加载必要的 full/focus/before/after views。

Stage 2: branch planning. Branch 再把 live state 与 selected evidence 对齐,输出: Main agent 不机械执行 ,而是把它当成下一步 grounded action 的 planner prior。

Figure 5 解读:Appendix prompt surface 展示了 main agent、Stage-1 selector、Stage-2 planner 的职责隔离。Main agent 可以选择 act / wait / done / load skill;Stage 1 只能返回要不要加载视觉 evidence 以及加载哪些 state views;Stage 2 不能执行 GUI action,只能返回结构化 planner JSON。这个隔离是 MMSkills 避免“reference image 直接污染主轨迹”的关键。

3.5 Runtime algorithm and source-grounded pseudocode

论文 Appendix D 的 Algorithm 1 可概括为:先按 instruction 做 candidate skill pre-recall;每一步观察当前 screenshot;main agent 决定直接 action 还是请求 skill;若请求 skill,就进入 Stage-1 view selection 和 Stage-2 planner branch;最后 main agent 根据 branch guidance 选择 grounded action。

Code reference: main @ adf6bc36 (2026-05-18) — pseudocode and mapping based on this commit

def resolve_candidate_skills(task, domain, resolver, top_k=6):
    """Based on mm_agents/task_skill_resolver.py."""
    mapped = resolver.lookup_domain_or_global_mapping(domain, task.id)
    ranked = resolver.select_top_skills(mapped, top_k=top_k)
    skill_names = []
    for entry in ranked:
        skill_dir = resolver.resolve_skill_directory_name(entry)
        if skill_dir is not None:
            skill_names.append(skill_dir)
    return skill_names
def load_mmskill_package(skill_loader, skill_name):
    """Based on mm_agents/skill_loader.py and _mm_skill_adapter_base.py."""
    text = skill_loader.load_skill_content(skill_name)          # SKILL.md / procedure
    bundles = skill_loader.load_state_bundles(skill_name, runtime=True)
    if bundles is None:
        cards = skill_loader.load_state_cards(skill_name, runtime=True)
    else:
        cards = None
    return {"procedure": text, "state_bundles": bundles, "state_cards": cards}
def select_state_views(llm, loader, skill_name, live_obs, history, procedure, state_bundles):
    """Reflects MMSkillAgent Stage-1 plus SkillLoader.load_selected_state_views."""
    request = llm.return_one_load_state_views_call(
        screenshot=live_obs,
        history=history,
        procedure=procedure,
        state_bundle_previews=state_bundles,
    )
    # request is JSON: visual_reference_needed, why_not_text_only, requests[{state_id, views, reason}]
    selected, missing = loader.load_selected_state_views(
        skill_name,
        request.get("requests", []),
        runtime=True,
    )
    if missing:
        raise ValueError("requested state_id/view_type cannot be resolved")
    return selected
def plan_branch(llm, live_obs, history, procedure, selected_state_views):
    """Reflects MMSkillAgent Stage-2 planner summary parser."""
    summary = llm.return_one_json_block(
        screenshot=live_obs,
        history=history,
        procedure=procedure,
        selected_state_views=selected_state_views,
        required_keys=[
            "skill_applicability", "subgoal", "plan", "do_not_do",
            "fallback_if_no_progress", "expected_state", "completion_scope",
        ],
    )
    assert summary["skill_applicability"] in {"effective", "ineffective", "uncertain"}
    return summary
def branch_loaded_agent_step(main_agent, branch_llm, loader, obs, history, candidate_skills):
    """Runtime form of Algorithm 1 and _MMSkillAdapterBase._run_skill_branch."""
    decision = main_agent.choose_action_or_load_skill(obs, history, candidate_skills)
    if decision.kind == "action":
        return decision.action
 
    skill = load_mmskill_package(loader, decision.skill_name)
    selected_views = []
    if main_agent.skill_mode == "multimodal":
        selected_views = select_state_views(
            branch_llm, loader, decision.skill_name, obs, history,
            skill["procedure"], skill["state_bundles"] or skill["state_cards"],
        )
    guidance = plan_branch(branch_llm, obs, history, skill["procedure"], selected_views)
    return main_agent.ground_action_from_live_screen(obs, history, guidance)

3.6 Code-to-paper mapping

Code reference: main @ adf6bc36 (2026-05-18)

Paper ConceptSource FileKey Class/Function
Branch-loaded multimodal runtimemm_agents/mm_skill_agent.py, mm_agents/_mm_skill_adapter_base.pyMMSkillAgent, _build_branch_view_selection_*, _build_branch_planner_*, _run_skill_branch
Skill package parsing and state bundlesmm_agents/skill_loader.pySkillLoader.load_skill_content, load_state_bundles, load_state_cards, load_selected_state_views, resolve_state_view_requests
Candidate skill pre-recall / task mappingmm_agents/task_skill_resolver.py, task_skill_mappings/TaskSkillResolver.resolve_task_skills, _select_top_skills, resolve_task_skill_names
Text-only ablation pathmm_agents/general_text_skill_agent.pytext-only skill branch / inline-context variants used for ablation
OSWorld evaluation runnerosworld_integration/run.py, osworld_integration/lib_run_single.py--agent_type mm_skill, --skill_mode multimodal, run_single_example
Released skill library formatskills_library/*/*/SKILL.md, runtime_state_cards.json, state_cards.json, Images/
Product-neutral adapteragent_integrations/mmskills-agent-adapter/search / download / inspect scripts for external agent products

4. Experimental Setup (实验设置)

4.1 Datasets / benchmarks and scale

  • OSWorld:360 GUI test cases;应用分布包括 Chrome、GIMP、LibreOffice Calc / Impress / Writer、Multi-app、OS、Thunderbird、VLC、VS Code。
  • macOSWorld:143 test cases;File management 29、Media 12、Productivity 35、System/interface 29、System apps 38。
  • VAB-Minecraft:来自 VisualAgentBench 的 Minecraft visual-agent benchmark;evaluation 使用 official test set,skill source 使用 official training set,二者 disjoint。
  • Super Mario Bros / LMGame-Bench:从多个 source cases 生成技能,最终 evaluation 使用 4 个 held-out cases。

Skill source 方面,GUI skills 来自 OpenCUA 非测试轨迹:Ubuntu 共 4,205 trajectories(Chrome 718、Impress 605、VS Code 605、OS 497、GIMP 492、Writer 490、Thunderbird 300、Calc 298、VLC 200),macOS 共 3,157 trajectories(Productivity 1,424、System apps 768、File management 341、Media 315、System/interface 309)。论文报告的 skill package 规模为:OSWorld 247 skills / 879 state cards / 1,898 views;macOSWorld 248 skills / 522 state cards / 1,097 views;VAB-Minecraft 24 skills;Super Mario Bros 10 skills。

4.2 Baselines and model families

比较条件包括:No skillText-only skillMMSkills。Ablation 还包括 direct loading、branch loading without view selection、without state cards、without images 等变体。模型包括 Gemini 3.1 Pro、Gemini 3 Flash、Qwen3-VL-235B-A22B-Thinking、GLM-5V-Turbo、Kimi-K2.6、Qwen3-VL-8B-Instruct。

4.3 Metrics

  • OSWorld / macOSWorld:application-level 或 domain-level success rate,以及 overall success rate。
  • VAB-Minecraft:success rate 和 average score。
  • Super Mario Bros:total performance 和 total reward。
  • Skill usage dynamics:Invoked (%)、Calls/case、Steps、Step 、selected views 分布(Full / Focus / Before / After)。
  • Behavior shift:action primitive distribution、每任务低层 action 数、exact repeated actions、same-mode repeats、20-step budget normalized longest same-mode run。

4.4 Runtime / evaluation config

论文说明所有 agent 都从 visual observations 规划:GUI 用 desktop screenshots,game 用 game screenshots;OSWorld 和 macOSWorld 主要在 AWS 上用 official benchmark images / task definitions 跑 full evaluations;GUI benchmark 的最大交互预算是 20 steps。Released code 中 osworld_integration/run.py 对应配置包括:--screen_width=1920--screen_height=1080--max_steps=20--max_trajectory_length=3--agent_type 支持 general / general_text_skill / mm_skill--skill_mode 支持 text_only / multimodal--task_skill_top_k=6--skills_library_dir=skills_library。论文没有训练一个新 neural model,因此没有 LR / batch size / GPU training schedule;这里的“config”主要是 inference-time evaluation and skill-loading config。

5. Experimental Results (实验结果)

5.1 Main OSWorld results

Base modelNo skillText-onlyMMSkillsMain takeaway
Gemini 3.1 Pro44.0840.7650.11MMSkills 比 no-skill +6.03 pp;text-only 在该模型上反而低于 baseline。
Gemini 3 Flash36.6540.2747.97MMSkills 比 no-skill +11.32 pp。
Qwen3-VL-235B21.3428.5739.17MMSkills 比 no-skill +17.83 pp,说明外部视觉 procedural knowledge 对较弱/开放模型帮助更大。
GLM-5V28.7136.6138.51text-only 有帮助,但 multimodal package 进一步提升。
Kimi-K2.634.9839.6646.59MMSkills 比 no-skill +11.61 pp。
Qwen3-VL-8B-Instruct10.7814.9325.40小模型提升最明显,OSWorld +14.62 pp。

5.2 Auxiliary GUI and game results

ModelBenchmark metricNo skillText-onlyMMSkills
Gemini 3 FlashmacOSWorld overall55.9453.8565.73
Gemini 3 FlashVAB-Minecraft success / avg score67.24 / 0.746268.96 / 0.754173.28 / 0.7884
Gemini 3 FlashSuper Mario total perf. / reward411.00 / 766.67548.00 / 912.00624.00 / 1081.33
Qwen3-VL-235BmacOSWorld overall47.5543.3651.75
Qwen3-VL-235BVAB-Minecraft success / avg score52.59 / 0.630855.17 / 0.663462.07 / 0.7114
Qwen3-VL-235BSuper Mario total perf. / reward454.50 / 955.50610.50 / 1138.25788.00 / 1514.25
GLM-5VmacOSWorld overall34.9751.7551.75
GLM-5VVAB-Minecraft success / avg score56.03 / 0.670161.20 / 0.693868.10 / 0.7495
GLM-5VSuper Mario total perf. / reward612.75 / 1191.50794.50 / 1218.00950.50 / 1384.50
Qwen3-VL-8B-InstructmacOSWorld overall6.294.906.29
Qwen3-VL-8B-InstructVAB-Minecraft success / avg score23.28 / 0.301729.31 / 0.375438.79 / 0.4668
Qwen3-VL-8B-InstructSuper Mario total perf. / reward415.25 / 928.75596.50 / 997.25764.00 / 1128.75

结果说明 MMSkills 不只适用于 Ubuntu desktop;在 macOSWorld、Minecraft、Super Mario 中也有迁移收益。尤其是 Qwen3-VL-8B-Instruct,OSWorld 从 10.78% 到 25.40%,VAB-Minecraft 从 23.28% 到 38.79%,说明显式视觉 procedural knowledge 能部分补偿较小模型的内化先验不足。

5.3 Ablations: skill content and branch loading

Figure 3 解读:Panel A 比较 skill package components:text-only branch loading 已能超过 no-skill,但去掉 state cards 或去掉 images 都会削弱完整 MMSkills,说明二者互补:state cards 负责状态判别,keyframes 负责视觉证据 grounding。Panel B 比较 loading 方式:direct-full loading 容易污染 main context;view selection 可以缓解但不够,branch loading + view selection 才是完整机制。

5.4 Skill invocation and interaction dynamics

Table 3 显示 MMSkills 被调用得更频繁,但不是简单增加 overhead:OSWorld 上 Gemini 3 Flash 的 invoked 从 text-only 41.11% 到 MMSkills 62.50%,steps 从 no-skill 13.11 降到 11.86;Qwen3-VL-235B 的 invoked 从 37.50% 到 65.28%,steps 从 15.22 降到 9.87,Step 。VAB-Minecraft 上 Gemini 3 Flash 的 steps 从 16.92 降到 13.75,Qwen3-VL-235B 从 34.74 降到 27.07。Selected views 中 focus crops 在三组设置里占主导,说明 branch 确实在按需加载局部视觉 evidence,而不是盲目加载所有截图。

5.5 Behavioral shifts

Figure 4 解读:MMSkills 的收益不只是 final success rate。它改变了 action distribution:Qwen3-VL-235B 的 click share 从 75.8% 降到 63.7%,keyboard 和 DONE 增加,说明它从 click-heavy trial-and-error 转向更结构化的输入和完成判断;exact repeated actions 从 21.8% 降到 6.2%,最长 same-mode run 也降低,表明 state cards 和 verification cues 能减少重复卡顿。

Figure 6 解读:Appendix F 把相同 behavioral analysis 扩展到 GLM-5V 和 Kimi-K2.6。方向与 Figure 4 一致:MMSkills 往往减少低价值重复动作,并让 DONE / verification-related behavior 更早出现。这个现象支持论文主张:skill package 不只是提供步骤,而是在 runtime 改变 agent 对“当前状态是否适合继续”的判断。

5.6 Representative cases

Figure 7 解读:这个 Calc case 展示 branch-loaded MMSkills 如何把 spreadsheet construction 拆成局部 subgoals,并用状态卡检查 active sheet、header ranges、chart/table progress。它说明 MMSkills 的 guidance 不是替 main agent 点击,而是给 main agent 当前屏幕下的 next grounded decision。

Figure 8 解读:Terminal / file organization case 展示了另一类视觉环境:agent 需要判断文件是否已经移动/压缩、命令结果是否符合预期。MMSkills 的 verification cue 和 before/after evidence 可以帮助 agent 少走重复检查或错误路径。

5.7 Limitations and conclusion

作者明确指出三个主要限制:依赖 source-trajectory coverage;skill generation 或 visual grounding 可能出错;branch loading 带来 extra inference cost(额外推理成本)。进一步扩展到 embodied 或 safety-critical settings 需要更强 verification 和 online skill repair。整体结论是:把 reusable skills 表示为 multimodal procedural knowledge,能在 GUI 和 game visual-agent benchmark 中稳定补充 model-internal priors,尤其对较小模型和需要视觉状态判别的任务更有价值。