开发者必看:Open-AutoGLM API接入Python项目实战

想象一下,你正在开发一个自动化测试脚本,需要模拟用户在手机上的复杂操作流程。或者,你有一个创意,想做一个能自动帮你刷短视频、管理社交账号的智能助手。传统的方法是什么?写一堆基于坐标的点击、滑动代码,界面一变,脚本就全废了。

现在,情况变了。你只需要告诉AI:“打开小红书,搜索‘周末露营攻略’,把点赞最高的视频收藏一下。” 剩下的,AI会自己看屏幕、理解界面、规划步骤、执行操作。这听起来像科幻电影,但今天,通过智谱开源的 Open-AutoGLM 框架,我们就能在Python项目里实现它。

Open-AutoGLM,特别是其核心应用 AutoGLM-Phone,是一个专为手机端设计的AI智能体框架。它的核心能力是“看懂”和“操作”:通过视觉语言模型理解手机屏幕上的内容(图标、文字、布局),然后通过ADB(Android调试桥)自动执行点击、输入、滑动等操作。整个过程,你只需要用最自然的语言下达指令。

本文将带你从零开始,完成Open-AutoGLM API的接入,并编写一个完整的Python控制端,让你亲手体验让AI接管手机的魔力。我们会涵盖环境搭建、设备连接、核心API调用以及一个实战项目。

1. 项目核心:理解Open-AutoGLM Phone Agent

在写代码之前,我们先搞清楚我们要用的工具到底是什么。这能帮你更好地理解后续的每一步操作。

1.1 它是什么?能做什么?

简单说,Phone Agent是一个基于大模型的“手机遥控器”。但它不是简单的录屏回放,而是一个有“眼睛”和“大脑”的智能体。

  • 眼睛(多模态理解):它能“看到”你的手机屏幕截图,并理解上面的所有元素。比如,它能识别出哪个是“微信”图标,哪个是“搜索框”,哪段文字是“登录按钮”。
  • 大脑(意图解析与规划):它能听懂你的自然语言指令。当你说“给我妈妈微信转账100元”,它会分解成:打开微信 -> 进入聊天框 -> 点击加号 -> 点击转账 -> 输入金额 -> 点击确认。
  • 手(自动化执行):通过ADB,它能把大脑规划出的步骤,转化成真实的屏幕点击、文字输入和滑动操作,在真机或模拟器上执行。

一个典型的工作流如下

  1. :下达指令 “打开抖音,搜索搞笑视频并点赞第一个。”
  2. Phone Agent
    • 解析:理解你要打开“抖音”App,进行“搜索”,关键词是“搞笑视频”,然后对结果进行“点赞”。
    • 感知:通过ADB获取当前手机屏幕截图。
    • 规划:判断当前屏幕。如果在桌面,就点击抖音图标;如果在抖音内,就找到搜索框点击,输入文字...
    • 执行:通过ADB发送一系列点击、输入命令,完成整个流程。

1.2 技术架构速览

对于开发者,了解其架构有助于调试:

  • 服务端:运行着强大的视觉语言模型(如 autoglm-phone-9b)。它接收屏幕截图和用户指令,输出下一步的操作规划(如 tap(500, 800) 点击坐标)。通常部署在GPU服务器上。
  • 客户端(本文重点):你的Python程序。负责通过ADB连接手机、截图、将截图和指令发送给服务端、接收操作规划、并通过ADB执行。
  • 通信桥梁:ADB。它既是获取屏幕画面的“摄像头”,也是执行操作的“机械手”。

接下来,我们开始动手搭建。

2. 环境准备:客户端与真机连接

我们的战斗将在本地电脑(Windows/Mac)上打响,目标是控制一台安卓手机。云端服务端的部署假设已经完成(通常由运维同事或通过云服务提供),我们拥有一个可访问的API地址,例如 http://your-server-ip:8800/v1

2.1 硬件与基础软件

请确保准备好以下“装备”:

  • 一台电脑:Windows 10/11 或 macOS均可。
  • Python环境:推荐使用Python 3.10或更高版本。建议使用condavenv创建独立的虚拟环境,避免包冲突。
  • 一部安卓手机:系统版本Android 7.0以上。备用选择:可以使用Android模拟器(如夜神、雷电模拟器),设置步骤类似。
  • ADB工具包:这是与手机通信的核心工具。

安装与配置ADB(以Windows为例)

  1. 下载:从安卓开发者官网下载platform-tools包并解压,例如解压到 D:\platform-tools
  2. 配置环境变量
    • 右键点击“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
    • 在“系统变量”中找到并选中Path,点击“编辑”。
    • 点击“新建”,将你的ADB解压路径(如 D:\platform-tools)添加进去。
    • 一路点击“确定”保存。
  3. 验证:打开命令提示符(CMD)或PowerShell,输入 adb version。如果显示版本号,则配置成功。

Mac用户配置更简单: 打开终端(Terminal),如果你把platform-tools解压到了Downloads文件夹,可以临时添加路径:

export PATH=$PATH:~/Downloads/platform-tools

想让配置永久生效,可以将上面这行命令添加到 ~/.zshrc~/.bash_profile 文件中。

2.2 手机端设置

要让电脑控制手机,需要在手机上开几个“权限门”。

  1. 开启开发者模式
    • 进入手机的设置 -> 关于手机(或我的设备)。
    • 连续点击版本号7次,直到出现“您已处于开发者模式”的提示。
  2. 开启USB调试
    • 返回设置,现在你会看到新增的开发者选项
    • 进入开发者选项,找到并开启USB调试
  3. 安装ADB Keyboard(关键步骤)
    • 这是一个特殊的输入法,允许电脑通过ADB直接向手机输入文本,绕过手机自带输入法。
    • 下载 ADB Keyboard 的APK文件,传输到手机并安装。
    • 安装后,进入手机设置 -> 系统 -> 语言与输入法 -> 虚拟键盘 -> 管理键盘,开启ADB Keyboard
    • 然后,在语言与输入法默认输入法中,将其切换为ADB Keyboard

3. 部署控制端代码

环境就绪,现在来部署我们真正的“指挥官”——Open-AutoGLM的客户端代码。

打开你的终端或命令行,执行以下命令:

# 1. 克隆官方代码仓库到本地
git clone https://github.com/zai-org/Open-AutoGLM
cd Open-AutoGLM

# 2. 安装项目依赖包
# 使用国内镜像源可以加速下载
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 3. 以“可编辑”模式安装当前项目,方便后续修改和调试
pip install -e .

这几行命令会下载所有必要的Python库,包括与ADB交互的、处理图像的、以及调用API的库。

4. 连接你的安卓设备

代码有了,现在让它和手机“握手”。连接方式有两种:USB直连WiFi无线连接。无线连接在真机自动化时更方便。

4.1 USB连接(最简单)

用数据线将手机连接到电脑。在终端执行:

adb devices

你会看到类似以下的输出:

List of devices attached
abcdef123456    device

这个 abcdef123456 就是你的设备ID。如果显示的是 unauthorized,请在手机弹出的“允许USB调试吗?”对话框中点击“确定”。

4.2 WiFi连接(更灵活)

如果你想摆脱线缆束缚,可以设置无线连接:

# 步骤1:先用USB线连接一次,开启手机的TCP/IP监听模式
adb tcpip 5555
# 看到 `restarting in TCP mode port: 5555` 表示成功

# 步骤2:断开USB线,查看手机的IP地址(通常在设置->关于手机->状态信息里)
# 假设你的手机IP是 192.168.1.100

# 步骤3:通过WiFi连接
adb connect 192.168.1.100:5555
# 成功会显示 `connected to 192.168.1.100:5555`

# 再次验证
adb devices
# 此时应该能看到一个通过 `192.168.1.100:5555` 连接的设备

注意:手机和电脑必须在同一个局域网(WiFi)下。

5. 启动AI代理:两种实战方式

激动人心的时刻到了!我们将用两种方式给AI下命令:命令行快速测试Python API集成开发

5.1 方式一:命令行快速运行

在项目根目录(Open-AutoGLM)下,打开终端。这是一个完整的命令示例:

python main.py \
  --device-id "192.168.1.100:5555" \
  --base-url "http://your-server-ip:8800/v1" \
  --model "autoglm-phone-9b" \
  "打开抖音,搜索抖音号为'dycwo11nt61d'的博主并关注他!"

参数解释

  • --device-id:填写你通过 adb devices 看到的设备ID或IP地址。
  • --base-url:替换为你部署好的云端模型API地址。
  • --model:指定要使用的模型名称,与服务器端启动的模型一致。
  • 最后的字符串:就是你用自然语言下达的指令。

运行后,你会看到终端开始打印日志,同时你的手机会像被一个隐形人操作一样,自动亮屏、解锁(如果未设密码)、打开抖音、执行搜索和关注。第一次看到这个过程,会感觉非常奇妙。

5.2 方式二:Python API集成(推荐)

对于想要集成到自家项目里的开发者,直接调用Python API是更优雅的方式。下面我们构建一个更健壮、功能更完整的控制脚本。

创建一个新文件,比如叫做 my_phone_agent.py

import time
import logging
from phone_agent.adb import ADBConnection, list_devices
from phone_agent.agent import PhoneAgent
from phone_agent.config import AgentConfig

# 设置日志,方便查看运行过程
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

class MyPhoneAssistant:
    def __init__(self, server_url, model_name):
        """
        初始化手机助手
        :param server_url: 云端模型API地址,如 "http://10.0.0.1:8800/v1"
        :param model_name: 模型名称,如 "autoglm-phone-9b"
        """
        self.config = AgentConfig(
            base_url=server_url,
            model=model_name,
            # 可以调整其他参数,如操作间隔、超时时间等
            action_interval=1.0,
            request_timeout=30
        )
        self.adb_conn = ADBConnection()
        self.agent = None
        self.device_id = None

    def connect_device(self, device_identifier):
        """
        连接设备
        :param device_identifier: 设备ID或IP地址(如 "192.168.1.100:5555")
        """
        logger.info(f"正在尝试连接设备: {device_identifier}")
        
        # 方法1:直接连接
        success, message = self.adb_conn.connect(device_identifier)
        if success:
            self.device_id = device_identifier
            logger.info(f"设备连接成功: {message}")
            return True
        else:
            # 方法2:如果直接连接失败,尝试通过USB启用TCP/IP后再连接(适用于无线连接初始化)
            logger.warning(f"直接连接失败: {message},尝试通过USB初始化...")
            # 这里假设你已通过USB连接,并知道设备ID(如通过`adb devices`获取的USB设备ID)
            usb_device_id = "abcdef123456" # 请替换为你的USB设备ID
            success_enable, _ = self.adb_conn.enable_tcpip(usb_device_id, 5555)
            if success_enable:
                time.sleep(2)
                success_connect, msg = self.adb_conn.connect(device_identifier)
                if success_connect:
                    self.device_id = device_identifier
                    logger.info(f"通过USB初始化后,无线连接成功: {msg}")
                    return True
            logger.error(f"所有连接尝试均失败")
            return False

    def list_available_devices(self):
        """列出所有可用的ADB设备"""
        devices = list_devices()
        if devices:
            logger.info("发现以下设备:")
            for dev in devices:
                logger.info(f"  - ID: {dev.device_id}, 类型: {dev.connection_type.value}")
        else:
            logger.info("未发现任何已连接的ADB设备。")
        return devices

    def initialize_agent(self):
        """初始化Phone Agent"""
        if not self.device_id:
            logger.error("请先连接设备!")
            return False
        
        logger.info(f"正在为设备 {self.device_id} 初始化AI Agent...")
        try:
            self.agent = PhoneAgent(self.device_id, self.config)
            logger.info("AI Agent初始化成功!")
            return True
        except Exception as e:
            logger.error(f"初始化Agent失败: {e}")
            return False

    def run_task(self, instruction, max_steps=20):
        """
        执行一个自然语言指令任务
        :param instruction: 自然语言指令
        :param max_steps: 最大执行步骤,防止无限循环
        """
        if not self.agent:
            logger.error("Agent未初始化!")
            return
        
        logger.info(f"开始执行指令: {instruction}")
        for step in range(max_steps):
            logger.info(f"--- 步骤 {step+1} ---")
            try:
                # 执行单步操作
                result = self.agent.step(instruction if step == 0 else None)
                
                if result.is_terminal:
                    logger.info("任务完成!")
                    break
                elif result.error:
                    logger.warning(f"步骤执行出错: {result.error}")
                    # 这里可以添加错误处理逻辑,比如重试或暂停
                    time.sleep(2)
                else:
                    logger.info(f"AI执行了操作: {result.action}")
                    
            except Exception as e:
                logger.error(f"执行过程中发生异常: {e}")
                break
        else:
            logger.warning(f"达到最大步骤限制({max_steps}),任务可能未完成。")

    def safe_shutdown(self):
        """安全关闭,断开连接"""
        if self.device_id:
            self.adb_conn.disconnect(self.device_id)
            logger.info(f"已断开设备连接: {self.device_id}")
        logger.info("手机助手已关闭。")

# ====== 实战示例:一个自动化任务流程 ======
if __name__ == "__main__":
    # 1. 配置你的服务器和模型
    SERVER_URL = "http://your-server-ip:8800/v1"  # 务必替换成你的真实地址
    MODEL_NAME = "autoglm-phone-9b"
    DEVICE_IP = "192.168.1.100:5555"  # 替换成你的设备IP或ID
    
    assistant = MyPhoneAssistant(SERVER_URL, MODEL_NAME)
    
    try:
        # 2. 列出当前设备(可选,用于检查)
        assistant.list_available_devices()
        
        # 3. 连接设备
        if not assistant.connect_device(DEVICE_IP):
            exit("连接设备失败,程序退出。")
        
        # 4. 初始化AI Agent
        if not assistant.initialize_agent():
            exit("初始化AI Agent失败,程序退出。")
        
        # 5. 执行一系列自动化任务
        tasks = [
            "解锁手机屏幕",  # 如果屏幕有密码,这个指令可能无效,需提前手动解锁
            "打开微信",
            "找到和‘妈妈’的聊天窗口",
            "给她发一句‘我今晚回家吃饭’",
            "然后回到手机桌面",
        ]
        
        for task in tasks:
            assistant.run_task(task)
            time.sleep(2)  # 任务间稍作停顿
        
        # 6. 也可以执行一个复杂的长指令
        # complex_task = "打开小红书,搜索‘减脂餐’,点开点赞数第一的笔记,收藏它,然后截图。"
        # assistant.run_task(complex_task, max_steps=30)
        
    except KeyboardInterrupt:
        logger.info("用户中断操作。")
    except Exception as e:
        logger.error(f"程序运行出错: {e}")
    finally:
        # 7. 安全关闭
        assistant.safe_shutdown()

这个脚本提供了一个面向对象的、易于扩展的框架。你可以轻松地修改run_task方法,添加错误重试机制、结果验证(比如通过截图检查是否真的关注成功)、或者将多个任务串联成一个工作流。

6. 常见问题与排查指南

在实战中,你可能会遇到一些“坑”。这里是一些常见问题的排查思路:

  • 问题:连接被拒绝 (Connection refused)

    • 排查:检查你的--base-urlSERVER_URL是否正确。确保云服务器的防火墙放行了对应的端口(如8800)。在服务器上可以用 curl http://localhost:8800/v1 测试API是否本地可通。
  • 问题:ADB连接不稳定或掉线

    • 排查:WiFi连接容易受网络波动影响。如果进行重要自动化任务,建议使用USB连接。执行 adb kill-server 然后 adb start-server 有时能解决ADB守护进程的异常。
  • 问题:模型无响应或返回乱码

    • 排查:首先确认服务端模型是否成功启动且显存足够。检查客户端--model参数是否与服务端启动的模型名称完全一致。查看服务端日志,看是否有OOM(内存溢出)错误。
  • 问题:AI执行点击的位置不对

    • 排查:这通常是屏幕分辨率或缩放问题。确保ADB获取的屏幕分辨率与模型训练时适配的分辨率大致相符。可以尝试在AgentConfig中调整相关参数,或者更换不同分辨率的模拟器测试。
  • 问题:无法输入中文或文本

    • 排查确保手机默认输入法已切换为ADB Keyboard。这是最关键的一步。可以在连接后,手动用 adb shell input text "hello" 命令测试文本输入是否正常。

7. 总结

通过本文的实战演练,你已经掌握了将Open-AutoGLM Phone Agent集成到Python项目中的核心技能。我们从理解其“看懂屏幕、规划操作”的核心原理开始,一步步完成了环境配置、设备连接,并最终通过命令行和Python API两种方式,实现了用自然语言控制手机的自动化操作。

这个技术的想象空间巨大:

  • 自动化测试:编写自然语言用例,让AI自动遍历App功能。
  • 个人助手:自动完成每日签到、信息收集、社交账号管理等重复性手机操作。
  • 无障碍应用:帮助行动不便的用户通过语音指令操作手机。
  • RPA(机器人流程自动化):将手机操作与电脑端工作流结合,实现跨设备自动化。

目前框架仍在快速发展中,你可以关注其GitHub仓库,获取最新的功能和模型更新。最重要的建议是:多动手,多尝试。从简单的“打开设置”开始,逐步尝试更复杂的多步指令,观察AI的决策逻辑,你会对它强大的理解和规划能力有更深的体会。现在,就去创造你的第一个手机AI智能体吧!


获取更多AI镜像

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

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐