跳转到内容

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

宏要短小、职责单一。 需要中途做判断的场景,比如二次确认、付款、从多个结果里挑一个,这些交给智能体,别写进宏。

让智能体来写。claudecodex 接到你的 MCP 服务上,让它替你生成宏。

关注统计。 physiclaw macros stats 会列出每个宏的运行次数,据此确认宏有没有正常执行。