Open-AutoGLM如何扩展?自定义动作模块开发指南
Open-AutoGLM – 智谱开源的手机端AI Agent框架。它基于视觉语言模型,结合 ADB(Android Debug Bridge)实现对安卓设备的自动化控制,让用户可以通过自然语言指令驱动手机完成复杂任务。无论是打开应用、搜索内容,还是执行多步操作,系统都能自动解析意图、理解界面并规划执行路径。
AutoGLM-Phone 是一个以多模态方式理解屏幕内容的 AI 手机智能助理框架。用户只需输入如“打开小红书搜美食”这样的自然语言指令,模型即可自动识别当前界面状态、判断下一步操作,并通过 ADB 发送点击、滑动、输入等指令完成全流程。Phone Agent 在此基础上进一步增强了安全机制和远程调试能力,支持敏感操作确认与人工接管,适用于验证码登录等需干预场景。同时,借助 WiFi 连接下的远程 ADB 调试功能,开发者可以脱离物理连接,在任意网络环境下进行测试与部署。
本文将重点介绍如何在 Open-AutoGLM 框架中扩展自定义动作模块,帮助开发者根据业务需求添加专属功能,提升 Agent 的智能化水平和适用范围。
1. 理解 Open-AutoGLM 的核心架构
要实现自定义动作扩展,首先需要了解整个系统的运行流程和关键组件构成。
1.1 核心工作流
当用户输入一条自然语言指令后,系统会经历以下几个阶段:
- 指令解析:使用大语言模型提取用户的意图和目标对象。
- 屏幕感知:通过截图获取当前手机界面,交由视觉语言模型分析 UI 元素及其语义。
- 动作规划:结合历史上下文和当前状态,推理出下一步应执行的操作类型(如点击、输入、滑动)。
- 动作执行:调用 ADB 接口完成具体操作,并更新环境状态。
- 结果反馈:再次截图验证执行效果,决定是否继续或结束。
这个闭环过程构成了 Phone Agent 的自主决策能力。
1.2 动作执行层的设计
所有操作最终都由ActionExecutor统一调度。该模块接收来自规划器的动作指令(Action),并通过 ADB 实现真实设备控制。目前内置的动作类型包括:
Tap(x, y):在指定坐标点击InputText(text):输入文本Swipe(start_x, start_y, end_x, end_y):滑动操作Back():返回键Home():回到主屏
这些基础动作虽然覆盖了大部分交互场景,但在实际应用中往往需要更高级的行为封装,比如“跳转到某个应用首页”、“检查是否已登录”等。这就引出了我们今天的核心主题——如何开发自定义动作模块。
2. 自定义动作模块开发实践
为了增强 Agent 的语义理解和任务抽象能力,我们可以将一系列低级操作组合成一个可复用的“宏动作”,并注册为新的动作类型。
2.1 创建自定义动作类
假设我们需要实现一个名为OpenAppToSpecificPage的动作,用于打开某 App 并导航至特定页面(例如微信的“发现”页)。我们可以按以下步骤进行开发。
首先,在项目目录下创建新文件:
open_autoglm/actions/custom/open_app_to_page.py然后定义动作类:
from typing import Dict, Any from phone_agent.action import Action, register_action @register_action( name="open_app_to_specific_page", description="启动指定应用并导航到目标页面。参数: package_name (str), page_name (str)", params={ "package_name": {"type": "string", "description": "应用包名,如 com.tencent.mm"}, "page_name": {"type": "string", "description": "目标页面名称,如 '发现', '我'"} } ) class OpenAppToSpecificPage(Action): def __init__(self, package_name: str, page_name: str): self.package_name = package_name self.page_name = page_name def execute(self, adb_connector) -> Dict[str, Any]: # 启动应用 adb_connector.shell(f"am start -n {self.package_name}/.ui.LauncherUI") # 等待界面加载 import time time.sleep(3) # 根据 page_name 执行不同导航逻辑 if self.page_name == "发现": # 假设“发现”位于第二个 tab adb_connector.tap(540, 1800) elif self.page_name == "我": # “我”在第四个 tab adb_connector.tap(810, 1800) else: return {"success": False, "error": f"不支持的页面: {self.page_name}"} return {"success": True, "message": f"已进入 {self.page_name} 页面"}2.2 注册动作并启用
为了让系统识别这个新动作,必须确保其被正确导入。可以在open_autoglm/actions/__init__.py中添加:
from .custom.open_app_to_page import OpenAppToSpecificPage或者更推荐的方式是使用插件式加载机制,在配置文件中声明模块路径。
2.3 配置 LLM 动作选择策略
为了让大模型知道何时调用这个新动作,我们需要更新提示词模板中的可用动作列表。
编辑prompts/action_selection_prompt.txt,加入:
- open_app_to_specific_page: 启动指定应用并跳转到特定页面。适合快速进入深层功能。 参数说明: - package_name: 应用包名(必填) - page_name: 目标页面名称,仅支持 '发现' 或 '我'(必填)这样,当用户说“打开微信去发现页”时,LLM 就有可能生成对应的 action 调用。
3. 高级技巧:带条件判断的复合动作
真正的智能体现在对环境的感知与响应。我们可以让自定义动作具备“观察-判断-执行”的能力。
3.1 示例:带登录检测的自动打卡
设想我们要实现一个“企业微信自动打卡”动作,但前提是用户已经登录。我们可以编写如下逻辑:
@register_action( name="ewechat_auto_checkin", description="在企业微信中完成上班打卡,若未登录则提示人工介入", params={} ) class EWeChatCheckIn(Action): def execute(self, adb_connector) -> Dict[str, Any]: # 启动企业微信 adb_connector.shell("am start -n com.tencent.wework/.launch.WwMainActivity") time.sleep(3) # 截图 + OCR 判断是否在登录页 screenshot_path = adb_connector.screenshot() ocr_result = self._ocr(screenshot_path) if "手机号登录" in ocr_result or "密码" in ocr_result: return { "success": False, "requires_human": True, "message": "检测到未登录状态,请手动完成登录后再试" } # 导航到工作台 adb_connector.tap(540, 1600) time.sleep(2) # 查找“打卡”按钮并点击 if self._find_and_tap_element(adb_connector, "打卡"): time.sleep(2) # 再次确认是否打卡成功 if "今日已打卡" in self._ocr(adb_connector.screenshot()): return {"success": True, "message": "打卡成功"} else: return {"success": False, "message": "打卡失败,请检查网络"} else: return {"success": False, "message": "未找到打卡入口"} def _ocr(self, image_path): # 可集成 EasyOCR 或 PaddleOCR import easyocr reader = easyocr.Reader(['ch_sim']) result = reader.readtext(image_path, detail=0) return " ".join(result) def _find_and_tap_element(self, adb_connector, text): # 简化版 UI 元素查找(实际可用 accessibility service 增强) ocr_text = self._ocr(adb_connector.screenshot()) if text in ocr_text: # 这里可结合 layout 分析定位坐标 adb_connector.tap(540, 900) # 示例坐标 return True return False这类动作不仅能执行操作,还能主动识别异常状态并请求人工协助,极大提升了系统的鲁棒性。
4. 调试与测试你的自定义动作
开发完成后,必须经过充分测试才能投入生产。
4.1 单元测试示例
建议为每个自定义动作编写独立测试脚本:
# tests/test_open_app_action.py from open_autoglm.actions.custom.open_app_to_page import OpenAppToSpecificPage def test_open_wechat_discover(): action = OpenAppToSpecificPage(package_name="com.tencent.mm", page_name="发现") result = action.execute(adb_connector=mock_connector) # mock connector assert result["success"] is True4.2 日志监控
在execute()方法中加入详细日志输出,便于排查问题:
import logging logger = logging.getLogger(__name__) def execute(self, adb_connector): logger.info(f"正在启动应用: {self.package_name}") ...4.3 使用远程调试模式验证
利用 Open-AutoGLM 支持的远程 ADB 能力,可在真实设备上实时观察动作执行过程:
python main.py \ --device-id 192.168.1.105:5555 \ --base-url http://your-server-ip:8800/v1 \ "请打开微信并进入发现页面"观察终端输出及手机行为是否符合预期。
5. 最佳实践与注意事项
5.1 命名规范清晰
动作名称应简洁明确,避免歧义。推荐格式:verb_object_purpose,例如:
scroll_to_bottom_of_feedcheck_if_logged_insubmit_form_with_data
5.2 参数设计合理
尽量减少必填参数数量,提供默认值或智能推断机制。例如可通过 NLP 自动补全常见 app 的包名映射:
APP_PACKAGE_MAP = { "微信": "com.tencent.mm", "抖音": "com.ss.android.ugc.aweme", "小红书": "com.xingin.xhs" }5.3 错误处理完善
任何外部依赖(ADB、OCR、网络)都可能失败,务必做好异常捕获:
try: adb_connector.tap(x, y) except Exception as e: return {"success": False, "error": str(e), "retryable": True}5.4 安全边界把控
涉及隐私或高风险操作(如支付、删除数据)时,必须设置确认机制:
return { "success": False, "requires_confirmation": True, "dangerous_action": "delete_account", "impact": "此操作将永久删除账户" }6. 总结
Open-AutoGLM 提供了一个高度可扩展的手机端 AI Agent 架构,其模块化设计使得开发者能够轻松地注入领域知识和定制专属能力。通过开发自定义动作模块,我们可以将重复性高、规则性强的任务封装成智能行为单元,显著提升 Agent 的实用性与泛化能力。
从简单的“打开应用”到复杂的“条件判断+多步执行+人工协同”,自定义动作的本质是赋予 AI 更高层次的认知能力。未来,随着更多开发者参与生态建设,我们将看到越来越多垂直场景下的智能自动化解决方案涌现。
掌握这项技能,意味着你不仅是在使用一个工具,更是在构建属于自己的 AI 助理大脑。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。