news 2026/4/18 12:06:06

Open-AutoGLM Python API调用示例,开发更灵活

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Open-AutoGLM Python API调用示例,开发更灵活

Open-AutoGLM Python API调用示例,开发更灵活

在手机操作自动化领域,开发者长期面临一个核心矛盾:既要实现精准的界面理解与动作执行,又希望拥有足够的编程自由度来适配复杂业务逻辑。命令行工具虽开箱即用,但难以嵌入现有系统;而真正可编程的接口,往往文档简略、示例匮乏、调试困难。Open-AutoGLM 的 Python API 正是为解决这一痛点而生——它不是简单的封装,而是一套面向工程落地的控制层抽象。本文不讲“怎么连上手机”,而是聚焦于“如何用代码把它变成你系统里一个可调度、可监控、可扩展的智能模块”。我们将从零开始,用真实可运行的 Python 脚本,演示如何连接设备、发送指令、处理响应、捕获中间状态,并构建一个具备错误恢复能力的轻量级任务调度器。

1. 为什么需要 Python API?不只是“能用”,而是“好用”

很多开发者第一次接触 Open-AutoGLM,会直接使用main.py命令行方式运行任务。这种方式简单直接,但存在几个实际工程中无法回避的问题:

  • 无法集成:你的业务系统是 Flask 或 FastAPI 服务?命令行脚本无法作为子模块被调用。
  • 状态不可控:你不知道 AI 是在第几步卡住,还是模型返回了模糊指令,还是 ADB 执行失败。所有日志混在一起,排查成本高。
  • 缺乏灵活性:想让 AI 先截图分析当前页面,再决定下一步?想在点击前加个条件判断?命令行模式做不到。
  • 难以测试:没法对单个函数做单元测试,也没法模拟网络延迟或设备断连等异常场景。

Python API 的价值,正在于把整个 Phone Agent 的能力,拆解成一组职责清晰、边界明确、可组合的函数和类。它让你从“使用者”变成“协作者”,可以精确地告诉 AI:“看这张图,告诉我当前页面有没有‘立即支付’按钮”,而不是笼统地说“去支付订单”。

这正是本文要带你深入实践的核心:用 Python API 构建可观察、可干预、可复用的手机自动化工作流

2. 环境准备与依赖安装:轻量起步,拒绝冗余

在开始编码前,我们需要一个干净、最小化的运行环境。与部署完整服务不同,调用 Python API 只需客户端依赖,无需启动 vLLM 或配置 GPU。

2.1 创建独立虚拟环境(推荐)

# 创建并激活虚拟环境 python -m venv autoglm-env source autoglm-env/bin/activate # macOS/Linux # autoglm-env\Scripts\activate # Windows

2.2 安装核心依赖

Open-AutoGLM 的 Python SDK 并未发布到 PyPI,因此需从源码安装。我们只安装客户端所需部分,跳过服务端和模型推理相关依赖:

# 克隆仓库(仅需最新稳定版) git clone https://github.com/zai-org/Open-AutoGLM cd Open-AutoGLM # 安装核心客户端库(-e 表示可编辑安装,便于后续调试) pip install -e ".[client]"

说明[client]setup.py中定义的可选依赖组,它只包含requests,adbutils,pydantic等必要库,体积小、安装快,避免了torch,vllm等重型依赖的干扰。

2.3 验证安装

运行以下命令,确认 SDK 已正确加载:

# test_install.py from phone_agent import __version__ print(f"Open-AutoGLM client version: {__version__}") from phone_agent.adb import ADBConnection conn = ADBConnection() print("ADBConnection imported successfully.")

若输出版本号且无报错,则环境准备完成。

3. 核心 API 模块解析:从连接到执行的四层抽象

Open-AutoGLM 的 Python API 并非一个大而全的类,而是遵循“关注点分离”原则,划分为四个逻辑清晰的模块。理解它们的分工,是写出健壮代码的前提。

3.1phone_agent.adb:设备连接与底层控制

这是整个自动化链条的物理基础。它不关心 AI 在想什么,只负责“让手机动起来”。

  • ADBConnection: 连接管理器,支持 USB 和 WiFi 两种模式,提供connect(),disconnect(),enable_tcpip()等方法。
  • list_devices(): 获取当前所有已连接设备列表,返回Device对象,包含device_id,connection_type,state等属性。
  • get_device_ip(): 自动探测设备在局域网中的 IP 地址,省去手动查找步骤。

关键洞察:这个模块的设计理念是“连接即对象”。一旦conn.connect("192.168.1.100:5555")成功,后续所有操作都基于这个conn实例,无需反复传参,代码更简洁。

3.2phone_agent.llm:大模型通信与指令编排

这是 AI 的“大脑”接口。它将复杂的 HTTP 请求、JSON Schema、流式响应等细节封装起来,让你只需关注“我要问什么”和“我想要什么”。

  • LLMClient: 核心客户端,初始化时指定base_urlmodel_name
  • chat_completion(): 同步调用,接收messages列表(符合 OpenAI 格式),返回结构化响应。
  • stream_chat_completion(): 异步流式调用,适用于长任务或需要实时反馈的场景。

关键洞察messages不是简单的一句字符串。它是一个对话历史数组,你可以预置系统提示词(System Message)来约束 AI 行为,例如:“你是一个严谨的手机操作助手,所有操作前必须确认目标元素是否存在。”

3.3phone_agent.agent:任务规划与执行引擎

这是最核心、也最具特色的模块。它将 LLM 的“思考”与 ADB 的“行动”串联起来,形成一个闭环。

  • PhoneAgent: 主代理类,初始化时注入adb_connllm_client
  • run_task(): 主入口方法,接收自然语言指令,自动执行“截图 → 分析 → 规划 → 执行 → 验证”的全流程。
  • step_by_step(): 分步执行模式,返回每一步的详细信息(截图路径、AI 决策、ADB 命令、执行结果),用于深度调试。

关键洞察PhoneAgent不是黑盒。它的run_task()方法内部,就是对step_by_step()的循环调用。这意味着,你可以完全绕过run_task(),自己编写循环逻辑,实现比默认流程更精细的控制。

3.4phone_agent.utils:实用工具与辅助函数

提供一系列提升开发体验的“胶水”函数。

  • capture_screenshot(): 快速截取当前屏幕并保存为本地文件,方便人工复核。
  • wait_for_element(): 基于 OCR 或 UI 层级等待特定文本或控件出现,解决“页面加载慢导致点击失败”的经典问题。
  • parse_action_response(): 将 LLM 返回的 JSON 字符串,安全地解析为Action对象(含type,x,y,text等字段)。

关键洞察:这些工具函数的存在,意味着你不必从零开始写轮子。例如,wait_for_element("登录")一行代码,就替代了手写while not find_text("登录"): time.sleep(1)的繁琐逻辑。

4. 实战:构建一个可重试、可监控的任务执行器

现在,我们将综合运用以上模块,编写一个生产环境中真正可用的任务执行器。它将具备三个关键能力:自动重试失败步骤、记录每一步的详细日志、并在关键节点进行人工确认。

4.1 初始化连接与客户端

# task_executor.py import logging import time from pathlib import Path from phone_agent.adb import ADBConnection, list_devices from phone_agent.llm import LLMClient from phone_agent.agent import PhoneAgent from phone_agent.utils import capture_screenshot, wait_for_element # 配置日志 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[logging.StreamHandler()] ) logger = logging.getLogger(__name__) # 1. 连接设备 conn = ADBConnection() # 尝试连接 WiFi 设备(请替换为你的设备IP) success, msg = conn.connect("192.168.1.100:5555") if not success: logger.error(f"ADB 连接失败: {msg}") exit(1) logger.info(f"ADB 连接成功: {msg}") # 2. 初始化 LLM 客户端(以 ModelScope 为例) llm_client = LLMClient( base_url="https://api-inference.modelscope.cn/v1", model_name="ZhipuAI/AutoGLM-Phone-9B", api_key="your_modelscope_api_key_here" # 请替换为你的实际 API Key ) # 3. 创建 PhoneAgent 实例 agent = PhoneAgent(adb_conn=conn, llm_client=llm_client)

4.2 编写带重试机制的执行函数

def execute_with_retry(task_desc: str, max_retries: int = 3) -> bool: """ 执行一个自然语言任务,并在失败时自动重试 Args: task_desc: 自然语言指令,如 "打开微信,给文件传输助手发消息:测试成功" max_retries: 最大重试次数 Returns: bool: True 表示任务最终成功,False 表示彻底失败 """ for attempt in range(1, max_retries + 1): logger.info(f"开始第 {attempt} 次尝试执行任务: {task_desc}") try: # 使用分步模式,获取详细过程 steps = agent.step_by_step(task_desc, max_steps=10) # 遍历每一步,记录并检查结果 for i, step in enumerate(steps): logger.info(f" 步骤 {i+1}: {step.action.type}") logger.debug(f" 决策详情: {step.reasoning}") logger.debug(f" 执行命令: {step.action}") # 如果是截图,保存到本地便于复核 if step.screenshot_path: screenshot_file = f"screenshots/step_{i+1}_{int(time.time())}.png" Path("screenshots").mkdir(exist_ok=True) Path(step.screenshot_path).rename(screenshot_file) logger.info(f" 截图已保存至: {screenshot_file}") # 检查该步骤是否成功 if not step.success: logger.warning(f" 步骤 {i+1} 执行失败: {step.error_message}") # 失败则跳出内层循环,进入下一次重试 break else: # for 循环正常结束,说明所有步骤都成功 logger.info(f" 任务 '{task_desc}' 执行成功!共 {len(steps)} 步。") return True except Exception as e: logger.error(f" 执行过程中发生未预期异常: {e}") # 如果走到这里,说明本次尝试失败,等待后重试 if attempt < max_retries: logger.info(f" 等待 5 秒后进行第 {attempt + 1} 次重试...") time.sleep(5) logger.error(f" 任务 '{task_desc}' 经过 {max_retries} 次重试后仍失败。") return False # 示例调用 if __name__ == "__main__": # 测试一个简单任务 execute_with_retry("打开设置,搜索并进入'关于手机'页面")

4.3 添加人工确认环节(安全敏感操作)

对于支付、删除、授权等高风险操作,API 提供了confirm_action()方法,允许你在 AI 规划出动作后,由人来拍板。

def safe_execute_with_confirmation(task_desc: str) -> bool: """执行任务,但在关键操作前要求人工确认""" steps = agent.step_by_step(task_desc, max_steps=10) for i, step in enumerate(steps): logger.info(f"步骤 {i+1}: {step.action.type}") # 检测是否为高风险操作 if step.action.type in ["click", "long_press"] and "支付" in step.reasoning: logger.warning(" 检测到潜在支付操作!") logger.info(f" AI 计划点击坐标: ({step.action.x}, {step.action.y})") logger.info(f" 当前截图已保存为: {step.screenshot_path}") # 等待用户输入 confirm = input(" 是否继续执行?(y/N): ").strip().lower() if confirm != "y": logger.info(" 用户取消执行。") return False # 执行动作 result = agent.execute_action(step.action) if not result.success: logger.error(f" 执行失败: {result.error_message}") return False return True # 示例调用 # safe_execute_with_confirmation("打开支付宝,向张三转账100元")

5. 进阶技巧:超越“执行指令”,实现“理解界面”

Python API 的最大魅力,在于它让你能跳出“指令-执行”的线性思维,进入“观察-分析-决策”的智能体范式。下面两个技巧,将展示如何用几行代码,解锁更高级的能力。

5.1 技巧一:主动截图并让 AI 描述当前页面

有时,你不需要 AI 去“做”什么,而是想让它“说”出它看到了什么。这在自动化测试、UI 一致性检查中非常有用。

def describe_current_screen() -> str: """截取当前屏幕,并让 AI 用自然语言描述页面内容""" # 1. 截图 screenshot_path = capture_screenshot(conn) # 2. 构造一个专门的 prompt messages = [ { "role": "system", "content": "你是一个专业的移动应用界面分析师。请用一段话,准确、简洁地描述这张截图中显示的页面。重点说明:当前应用名称、页面标题、主要功能区域(如顶部导航栏、中部内容区、底部标签栏)、以及页面上最显眼的 3 个可交互元素(按钮、图标、文字链接)及其文字。不要编造不存在的信息。" }, { "role": "user", "content": [ {"type": "image_url", "image_url": {"url": f"file://{screenshot_path}"}}, {"type": "text", "text": "请描述这张截图。"} ] } ] # 3. 调用 LLM response = llm_client.chat_completion(messages=messages) return response.choices[0].message.content # 示例 description = describe_current_screen() print("当前页面描述:") print(description)

5.2 技巧二:基于 OCR 的精准文本定位与点击

当 UI 元素没有稳定 ID,但文字内容固定时,wait_for_element()是你的救星。它结合了设备端的dumpsys和客户端的 OCR,比单纯靠坐标点击可靠得多。

def click_text_on_screen(text: str, timeout: int = 10) -> bool: """在屏幕上查找指定文本,并点击其所在位置""" try: # 等待文本出现(最多 timeout 秒) x, y = wait_for_element(conn, text, timeout=timeout) logger.info(f"找到文本 '{text}',坐标 ({x}, {y})") # 执行点击 result = conn.tap(x, y) if result: logger.info(f" 成功点击文本 '{text}'") return True else: logger.error(" 点击失败") return False except TimeoutError: logger.error(f" 在 {timeout} 秒内未找到文本 '{text}'") return False except Exception as e: logger.error(f" 查找/点击过程出错: {e}") return False # 示例:无论“微信”图标在屏幕哪个位置,都能点开 click_text_on_screen("微信")

6. 总结:API 是桥梁,更是杠杆

通过本文的实践,你应该已经清晰地看到:Open-AutoGLM 的 Python API,远不止是一个“调用模型的快捷方式”。它是一套经过深思熟虑的工程化接口,其设计哲学体现在三个层面:

  • 抽象合理adb,llm,agent,utils四层分离,让每个模块各司其职,降低了认知负荷。
  • 控制精细:从step_by_step()的每一步详情,到confirm_action()的人工介入点,再到wait_for_element()的智能等待,它赋予你前所未有的掌控力。
  • 扩展友好:所有核心类都采用依赖注入(Dependency Injection)设计,你可以轻松地用自定义的ADBConnection子类替换掉默认实现,或者用 Mock 对象进行单元测试。

真正的“开发更灵活”,不在于 API 能写多短的代码,而在于当你面对一个从未见过的 App、一个千奇百怪的 UI、一个必须满足的合规要求时,你能否快速、自信地写出稳定可靠的自动化逻辑。Open-AutoGLM 的 Python API,正是为此而生。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:15:23

MedGemma-X vs 传统CAD:AI影像诊断的颠覆性对比

MedGemma-X vs 传统CAD&#xff1a;AI影像诊断的颠覆性对比 1. 一场静默却深刻的范式迁移 放射科医生每天面对数百张影像&#xff0c;从肺部结节到纵隔阴影&#xff0c;从骨骼细微裂纹到软组织密度变化——这些判断背后是数十年临床经验沉淀的直觉与逻辑。而传统计算机辅助诊…

作者头像 李华
网站建设 2026/4/18 8:20:24

Z-Image中文渲染有多强?输入‘油纸伞’直接出图

Z-Image中文渲染有多强&#xff1f;输入‘油纸伞’直接出图 你有没有试过&#xff0c;在文生图工具里输入“青石板路、白墙黛瓦、细雨蒙蒙、一位穿汉服的姑娘撑着油纸伞”&#xff0c;结果生成的图里——伞是歪的&#xff0c;字是糊的&#xff0c;雨丝像毛线团&#xff0c;连“…

作者头像 李华
网站建设 2026/4/18 7:12:31

TranslateGemma模型优化:量化感知训练技术实践

TranslateGemma模型优化&#xff1a;量化感知训练技术实践 1. 引言 在AI模型部署的实际场景中&#xff0c;模型大小和推理速度往往是关键考量因素。今天我们要探讨的量化感知训练(Quantization-Aware Training, QAT)技术&#xff0c;正是解决这一痛点的有效方案。不同于传统的…

作者头像 李华
网站建设 2026/4/18 8:07:36

TouchGFX实战案例:简单按钮交互实现

以下是对您提供的博文内容进行 深度润色与结构优化后的版本 。我以一位深耕嵌入式GUI开发多年、兼具一线工程实践与教学经验的技术博主身份&#xff0c;重新组织全文逻辑&#xff0c;去除AI腔调与模板化表达&#xff0c;强化技术纵深、真实场景代入感与可复用性指导&#xff…

作者头像 李华
网站建设 2026/4/18 8:31:23

高效获取小红书原创内容:解放创作者的无水印下载工具指南

高效获取小红书原创内容&#xff1a;解放创作者的无水印下载工具指南 【免费下载链接】XHS-Downloader 免费&#xff1b;轻量&#xff1b;开源&#xff0c;基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader …

作者头像 李华
网站建设 2026/4/18 8:16:50

不用写代码!FSMN-VAD可视化界面快速体验

不用写代码&#xff01;FSMN-VAD可视化界面快速体验 你是否曾为一段长达几十分钟的会议录音发愁&#xff1f;手动听、反复拖进度条、记时间点、切音频……光是想想就头皮发麻。更别说还要把语音片段喂给ASR系统做识别前处理——静音部分不剔除&#xff0c;识别结果满屏“呃”“…

作者头像 李华