跳转到内容

宏

token 成本很高。宏把一连串手势合并为一次模型调用,智能体只需重放你编写并排练过的序列,不必逐步操作手机,从而节省 token 和时间。

生成模板,再编辑宏文件:

bash
physiclaw macros init notify-user-wechat
  • 文件夹~/.physiclaw/macros/
    • README.md
    • notify-user-wechat.yml
yaml
# 这个文件是什么:录制好的手势序列,所以放在 macros/ 下。
kind: macro
# 这个文件使用的 pack 语法版本。
schema: 1
name: 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 服务器:

bash
physiclaw mcp

检查所有宏文件,然后在真机上重放这个宏:

bash
physiclaw macros check
physiclaw macros run notify-user-wechat -i message=hi

宏要短小、职责单一。 需要中途判断的操作,例如确认、付款、从多个结果中选择,应交给智能体,不写进宏。

让智能体来写。 把 claude 或 codex 连接到你的 MCP 服务器,让它生成宏。

关注统计。 physiclaw macros stats 列出每个宏的计数。如果 consecutive_aborts 持续增加,说明 App 布局已变,需要重新排练并更新坐标框。