场景:让 AI 观察与操作 Godot¶
目标:接入 Wisp Hand MCP 后,让外部 AI 能够查看 Godot 编辑器、点击运行项目、并用截图/diff 做最小行为验证。
Wisp Hand 不负责“如何操作 Godot 才正确”的规划,它只提供可验证、可追踪的基础动作原语。推荐把 Godot 场景拆成下面的闭环:
- 找到 Godot 窗口(或游戏窗口)的 selector
- 在 window scope 内截图观察
- 在明确
armed=true的 session 内执行输入 - 用
capture.diff判断动作是否生效
0) Preflight¶
确保:
hyprland_detected=truecapture_available=trueinput_available=true
1) 获取 Godot 窗口 selector¶
推荐做法:
- 手动把 Godot 切到前台(确保它是 active window)
- 调用
wisp_hand.desktop.get_active_window,读取address/class/title - 用其中一个作为后续
scope_target
实践建议:
- 优先使用
address(通常最稳定) - 如果你需要跨启动定位窗口,可用
class + title做匹配,但要接受 title 变化的可能 - 只有在诊断/排障时才用
wisp_hand.desktop.get_topology(detail=full|raw)(它更重,不建议高频调用)
2) 打开 window scope session(先 dry-run)¶
先用 dry_run=true 校验坐标映射与点击位置(尤其多显示器 + 缩放):
工具调用(示意):
wisp_hand.session.openscope_type:windowscope_target:<address 或其他 selector>armed:truedry_run:true
然后:
wisp_hand.capture.screen(target="scope")获取一张 scope 截图
如果你发现 click 会偏移,先看 坐标与缩放 的诊断流程。
必要时可以先调用 wisp_hand.desktop.get_monitors 获取 mixed-scale 映射上下文,用于解释多显示器 + 缩放导致的坐标差异。
3) 定位并点击 “Run/Play”¶
有两种路线:
路线 A:无视觉(手工坐标)¶
你可以先在截图上确定按钮位置(scope-relative layout px),然后让 AI 调 pointer.click(x,y)。
路线 B:本地视觉辅助(推荐)¶
如果启用了 Ollama 视觉:
capture.screen拿到capture_idvision.locate(capture_id, target="Run button")得到候选框- 取候选框中心点作为点击坐标(scope-relative)
注意:视觉只给候选,最终输入仍要走 scope + policy。
如果你的外部 AI 需要“看见截图内容”但不想依赖本地路径:
- 从
capture.screen的image_uri/metadata_uri得到资源 URI - 用 MCP
resources/read读取 png 与 metadata(按需拉取,避免默认把大内容塞进 tool result)
4) 等待并做截图验证¶
最小验证建议用 capture.diff:
- 动作前
capture.screen(记为 A) - 点击运行
wait(duration_ms=...)(例如 300~1500ms,取决于你的机器)- 动作后
capture.screen(记为 B) capture.diff(A, B):若changed=true且change_ratio超过你设置的阈值,则认为 UI 有变化
如果你想把“动作 + 等待 + 截图”变成一次调用,使用 wisp_hand.batch.run:
- steps:
click -> wait -> capture - 默认
return_mode=summary会裁剪逐步输出;排障时可用return_mode=full
5) 游戏窗口(新窗口/全屏)怎么处理¶
很多项目运行后会出现新的游戏窗口,或者 Godot 进入全屏。
处理方式:
- 再次读取
active_window(切到游戏窗口后) - 用新的 selector 打开新的 window scope session
- 后续验证与输入都在新的 session 内进行
6) 推荐的 agent 调用策略(token/延迟)¶
desktop.get_active_window/get_monitors/list_windows优先用于“选择 scope/窗口”,避免高频拉全量 topology。desktop.get_topology不要高频轮询:它是诊断工具(必要时再用detail=full/raw)。- 高频状态判断优先用:
capture.screen+capture.diff(更稳定、可验证、也更契合 GUI 回归)。 - 需要减少往返时,用:
batch.run把多步动作串起来。