宏
token 成本很高。宏把一连串手势合并为一次模型调用,智能体只需重放你编写并排练过的序列,不必逐步操作手机,从而节省 token 和时间。
生成模板,再编辑宏文件:
physiclaw macros init notify-user-wechat文件夹~/.physiclaw/macros/
- README.md
- notify-user-wechat.yml
notify-user-wechat.yml
Section titled “notify-user-wechat.yml”# 这个文件是什么:录制好的手势序列,所以放在 macros/ 下。kind: macro# 这个文件使用的 pack 语法版本。schema: 1name: notify-user-wechat# 智能体只根据这一行选择宏,因此要写清楚使用场景和宏的作用。description: 用微信给用户发消息时使用。打开聊天窗口,把文本粘贴到输入框,停在发送之前。
# 设为 false 后,智能体看不到也无法调用这个宏。enabled: true
# 这个宏需要的参数。inputs: message: description: 要发送的消息文本 example: "订单已下,共 ¥30"
# 从上到下执行,每步一个动作:动词和对象,步骤需要的其他条件写在旁边。steps: - home_screen
# 点击要写明对象;`at` 是坐标框 [左, 上, 右, 下],取 0–1 的屏幕比例。 # 对象是屏幕上的文字时,点击会跟随文字移动;图标则写一句描述。 - tap: "微信图标" at: [0.62, 0.18, 0.85, 0.30]
# 等待后确认当前界面。微信停在上次离开的界面,所以标题栏可能是应用名或用户昵称。 - wait: 2 expect: {text: ["微信", "Weixin", "用户昵称"], within: top} hint: "微信没有打开,先登录再手动发送"
# `skip_when`:已在聊天界面时跳过此步;`require`:确认点击位置上是正确的那一行。 - tap: "用户昵称" at: [0.05, 0.10, 0.95, 0.20] skip_when: {text: "用户昵称", within: [0.15, 0.02, 0.85, 0.1]} require: {text: "用户昵称", within: [0.05, 0.10, 0.95, 0.20]}
- send_to_clipboard: "{message}"
# 键盘已弹起(能看到空格键)时跳过此步。 - tap: "消息输入框" at: [0.05, 0.90, 0.75, 0.96] skip_when: {text: ["space", "空格"], within: [0.25, 0.85, 0.8, 0.95]}
# 键盘弹起后,输入框会上移。 - long_press: "消息输入框(键盘弹起后)" at: [0.05, 0.56, 0.75, 0.62]
- tap: "粘贴" at: [0.10, 0.54, 0.20, 0.57] require: {text: "粘贴", within: [0.03, 0.50, 0.35, 0.62]}
# 没有发送步骤:智能体检查文本后决定是否发送。启动 MCP 服务器:
physiclaw mcp检查所有宏文件,然后在真机上重放这个宏:
physiclaw macros checkphysiclaw macros run notify-user-wechat -i message=hi宏要短小、职责单一。 需要中途判断的操作,例如确认、付款、从多个结果中选择,应交给智能体,不写进宏。
让智能体来写。 把 claude 或 codex 连接到你的 MCP 服务器,让它生成宏。
关注统计。 physiclaw macros stats 列出每个宏的计数。如果 consecutive_aborts 持续增加,说明 App 布局已变,需要重新排练并更新坐标框。