自定义 Action Handler 扩展 AutoGLM 设备操作
框架内置的 10 种操作
见 10 种原子操作。如果这 10 种覆盖不了你的业务场景(比如需要"长按同时拖动"或"多点触控"),可以在 Action Handler 层扩展。
代码位置
phone_agent/actions/handler.py — 所有设备动作的执行器。框架解析模型输出的动作 JSON 后,按 action 字段路由到对应的 handler。
如何添加新操作
第一步:在 handler.py 里添加执行函数
# phone_agent/actions/handler.py
def handle_long_press_drag(device, from_point, to_point, duration_ms=500):
"""自定义操作:长按 from_point 然后拖到 to_point"""
# 这里写具体实现,调用 adb shell input swipe 或其他命令
# ...
return True
第二步:注册到动作路由表
在同一个文件里找到动作路由字典,添加新的 action 名称:
ACTION_HANDLERS = {
"Launch": handle_launch,
"Tap": handle_tap,
"Type": handle_type,
"Long Press": handle_long_press,
# ... 其他内置操作
"Long Press Drag": handle_long_press_drag, # ← 你的新操作
}
第三步:在 System Prompt 里告诉模型新操作存在
修改 phone_agent/config/prompts_zh.py(或 prompts_en.py),在"可用操作列表"部分加入:
# 在系统提示词里追加
你还可以使用以下扩展操作:
- Long Press Drag: 在 from_point 长按 duration_ms 毫秒,然后拖到 to_point(用于拖拽排序、移动元素等场景)
模型怎么"知道"用新操作
模型只能做两件事:在 System Prompt 里学到的操作 + 从历史对话里观察到的可用操作。你加了 handler 但没在 prompt 里告诉模型,它永远不会输出这个动作。
推荐做法:在 prompt 里同时给出新操作的触发场景示例,比如:
当你需要拖拽一个卡片到另一个位置时,请使用 "Long Press Drag" 操作。
示例 JSON:{"action": "Long Press Drag", "from_point": [540, 800], "to_point": [540, 300]}
注意事项
新操作必须返回同步布尔值:True 表示执行成功,False 表示失败。失败后 Agent 会尝试规划下一个动作(可能是重试、可能是换路线)。
如果新操作需要调用底层 ADB 命令,直接用 Python 的 subprocess.run 执行即可,框架没有限制。