宏
智能体每执行一个手势都要调用一次大模型,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` 是坐标框,[左, 上, 右, 下],归一化的屏幕 # 坐标。对象写真实屏幕文字时,按钮挪位后点按会跟着文字走;图标写一句描述。 - 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 会列出每个宏的运行次数,据此确认宏有没有正常执行。