【Open-AutoGLM】MacOS+Android配置、使用指南

目录

  • 一、安装
    • android环境准备
    • 部署准备工作
      • [1. 安装依赖](#1. 安装依赖)
      • [2. 配置 ADB 或 HDC](#2. 配置 ADB 或 HDC)
        • [对于 Android 设备](#对于 Android 设备)
      • [3. 启动模型服务](#3. 启动模型服务)
        • [选项 A: 使用第三方模型服务](#选项 A: 使用第三方模型服务)
        • [选项 B: 自行部署模型](#选项 B: 自行部署模型)
  • 二、运行
    • 问题1:怎么截图?
      • [1. ADB 截图函数](#1. ADB 截图函数)
      • [2. 模块导出](#2. 模块导出)
      • [3. 工厂方法](#3. 工厂方法)
      • [4. Action 处理器](#4. Action 处理器)
      • [5. Prompt 配置](#5. Prompt 配置)
      • [6. 自动截图保底逻辑](#6. 自动截图保底逻辑)
      • 使用方式
      • 调用链路

一、安装

登入官网:https://github.com/zai-org/Open-AutoGLM

android环境准备

  1. 安装 Android Studio:https://developer.android.com/studio?hl=zh-cn
    官网暂时上不去,根据这个下载platform:https://blog.csdn.net/gitblog_06766/article/details/147694542
    或者

    brew install android-platform-tools

  1. 在 Terminal 或者任何命令行工具里

    #假设解压后的目录为 ~/Downloads/platform-tools。如果不是请自行调整命令。
    export PATH=${PATH}:~/Downloads/platform-tools

  2. Android 7.0+ 或 HarmonyOS 设备,并启用 开发者模式USB调试

  • 开发者模式启用:通常启用方法是,找到 设置-关于手机-版本号 然后连续快速点击 10 次左右,直到弹出弹窗显示"开发者模式已启用"。不同手机会有些许差别,如果找不到,可以上网搜索一下教程。
  • USB 调试启用:启用开发者模式之后,会出现 设置-开发者选项-USB 调试,勾选启用
  • 部分机型在设置开发者选项以后, 可能需要重启设备才能生效. 可以测试一下: 将手机用USB数据线连接到电脑后, adb devices 查看是否有设备信息, 如果没有说明连接失败.
  1. 安装 ADB Keyboard(仅 Android 设备需要,用于文本输入)
    下载 安装包 并在对应的安卓设备中进行安装。
    注意,安装完成后还需要到 设置-输入法 或者 设置-键盘列表 中启用 ADB Keyboard 才能生效(或使用命令adb shell ime enable com.android.adbkeyboard/.AdbIMEHow-to-use)

部署准备工作

1. 安装依赖

bash 复制代码
pip install -r requirements.txt 
pip install -e .

2. 配置 ADB 或 HDC

对于 Android 设备

确认 USB数据线具有数据传输功能, 而不是仅有充电功能

确保已安装 ADB 并使用 USB数据线 连接设备:

bash 复制代码
# 检查已连接的设备
adb devices

# 输出结果应显示你的设备,如:
# List of devices attached
# emulator-5554   device

3. 启动模型服务

你可以选择自行部署模型服务,或使用第三方模型服务商。

选项 A: 使用第三方模型服务

如果你不想自行部署模型,可以使用以下已部署我们模型的第三方服务:

1. 智谱 BigModel

2. ModelScope(魔搭社区)

使用第三方服务的示例:

bash 复制代码
# 使用智谱 BigModel
python main.py --base-url https://open.bigmodel.cn/api/paas/v4 --model "autoglm-phone" --apikey "your-bigmodel-api-key" "打开美团搜索附近的火锅店"

# 使用 ModelScope
python main.py --base-url https://api-inference.modelscope.cn/v1 --model "ZhipuAI/AutoGLM-Phone-9B" --apikey "your-modelscope-api-key" "打开美团搜索附近的火锅店"
选项 B: 自行部署模型

如果你希望在本地或自己的服务器上部署模型:

  1. 按照 requirements.txtFor Model Deployment 章节自行安装推理引擎框架。

对于SGLang, 除了使用pip安装,你也可以使用官方docker:

shell 复制代码
docker pull lmsysorg/sglang:v0.5.6.post1

进入容器,执行

复制代码
pip install nvidia-cudnn-cu12==9.16.0.29

对于 vLLM,除了使用pip 安装,你也可以使用官方docker:

shell 复制代码
docker pull vllm/vllm-openai:v0.12.0

进入容器,执行

复制代码
pip install -U transformers --pre

注意: 上述步骤出现的关于 transformers 的依赖冲突可以忽略。

  1. 在对应容器或者实体机中(非容器安装)下载模型,通过 SGlang / vLLM 启动,得到 OpenAI 格式服务。这里提供一个 vLLM部署方案,请严格遵循我们提供的启动参数:
  • vLLM:
shell 复制代码
python3 -m vllm.entrypoints.openai.api_server \
 --served-model-name autoglm-phone-9b \
 --allowed-local-media-path /   \
 --mm-encoder-tp-mode data \
 --mm_processor_cache_type shm \
 --mm_processor_kwargs "{\"max_pixels\":5000000}" \
 --max-model-len 25480  \
 --chat-template-content-format string \
 --limit-mm-per-prompt "{\"image\":10}" \
 --model zai-org/AutoGLM-Phone-9B \
 --port 8000
  • SGLang:
shell 复制代码
python3 -m sglang.launch_server --model-path  zai-org/AutoGLM-Phone-9B \
        --served-model-name autoglm-phone-9b  \
        --context-length 25480  \
        --mm-enable-dp-encoder   \
        --mm-process-config '{"image":{"max_pixels":5000000}}'  \
        --port 8000
  • 该模型结构与 GLM-4.1V-9B-Thinking 相同, 关于模型部署的详细内容,你也以查看 GLM-V

    获取模型部署和使用指南。

  • 运行成功后,将可以通过 http://localhost:8000/v1 访问模型服务。 如果您在远程服务器部署模型, 使用该服务器的IP访问模型.

二、运行

问题1:怎么截图?

这是官方文档中agent的可用操作,并没有截图,或者是同时按两个按钮的操作。

操作 描述
Launch 启动应用
Tap 点击指定坐标
Type 输入文本
Swipe 滑动屏幕
Back 返回上一页
Home 返回桌面
Long Press 长按
Double Tap 双击
Wait 等待页面加载
Take_over 请求人工接管(登录/验证码等)

1. ADB 截图函数

文件 : phone_agent/adb/device.py

python 复制代码
def save_screenshot(filename: str | None = None, device_id: str | None = None) -> str:
    """
    Save a screenshot to the device's gallery.

    Args:
        filename: Optional filename (without extension). If None, uses timestamp.
        device_id: Optional ADB device ID.

    Returns:
        The path where the screenshot was saved.
    """
    import datetime

    adb_prefix = _get_adb_prefix(device_id)

    if filename is None:
        filename = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")

    save_path = f"/sdcard/Pictures/AutoGLM/{filename}.png"

    # 创建目录
    subprocess.run(
        adb_prefix + ["shell", "mkdir", "-p", "/sdcard/Pictures/AutoGLM"],
        capture_output=True,
    )

    # 截图
    subprocess.run(
        adb_prefix + ["shell", "screencap", "-p", save_path],
        capture_output=True,
    )

    # 注册到媒体库(让相册能显示)
    media_path = save_path.replace("/sdcard/", "/storage/emulated/0/")
    subprocess.run(
        adb_prefix + ["shell", "content", "insert",
                      "--uri", "content://media/external/images/media",
                      "--bind", f"_data:s:{media_path}",
                      "--bind", "mime_type:s:image/png"],
        capture_output=True,
    )

    return save_path

2. 模块导出

文件 : phone_agent/adb/__init__.py

python 复制代码
from phone_agent.adb.device import (
    ...
    save_screenshot,
    ...
)

__all__ = [
    ...
    "save_screenshot",
    ...
]

3. 工厂方法

文件 : phone_agent/device_factory.py

python 复制代码
def save_screenshot(self, filename: str | None = None, device_id: str | None = None) -> str:
    """Save screenshot to device gallery."""
    return self.module.save_screenshot(filename, device_id)

4. Action 处理器

文件 : phone_agent/actions/handler.py

python 复制代码
# 在 _get_handler 方法中注册
handlers = {
    ...
    "Screenshot": self._handle_screenshot,
}

# 处理方法
def _handle_screenshot(self, action: dict, width: int, height: int) -> ActionResult:
    """Handle screenshot save action."""
    filename = action.get("filename")
    device_factory = get_device_factory()
    save_path = device_factory.save_screenshot(filename, self.device_id)
    return ActionResult(True, False, message=f"Screenshot saved: {save_path}")

5. Prompt 配置

文件 : phone_agent/config/prompts_zh.py

复制代码
操作指令:
- do(action="Screenshot", filename="xxx")
    Screenshot是直接截取当前屏幕并保存到手机相册的操作。这是一个系统级命令,无需在界面上寻找截图按钮。
    【截图示例】用户说"搜索火锅店并截图2家",正确做法是:
    1. 搜索火锅店
    2. 点击第一家店 → do(action="Screenshot", filename="火锅店1")
    3. 返回 → 点击第二家店 → do(action="Screenshot", filename="火锅店2")
    4. finish
    错误做法:只看屏幕不执行Screenshot就finish

规则:
1. 【重要】当用户指令中包含"截图"、"截屏"、"保存屏幕"等词时,你必须执行 do(action="Screenshot") 操作。
   系统自动发送给你的屏幕图片仅供你分析使用,不会保存到手机相册。只有执行Screenshot操作才能真正保存截图。

6. 自动截图保底逻辑

文件 : phone_agent/agent.py

python 复制代码
def run(self, task: str) -> str:
    self._screenshot_taken = False  # 追踪是否执行过截图

    # ... 执行任务 ...

    if result.finished:
        self._auto_screenshot_if_needed(task)  # 任务结束时检查
        return result.message

def _auto_screenshot_if_needed(self, task: str) -> None:
    """如果用户要求截图但模型没执行,自动补一个"""
    screenshot_keywords = ["截图", "截屏", "保存屏幕", "screenshot"]
    if any(kw in task.lower() for kw in screenshot_keywords) and not self._screenshot_taken:
        device_factory = get_device_factory()
        save_path = device_factory.save_screenshot(device_id=self.agent_config.device_id)
        print(f"📸 自动截图已保存: {save_path}")

def _execute_step(self, ...):
    # ... 执行 action ...

    # 追踪 Screenshot action 是否被执行
    if action.get("action") == "Screenshot":
        self._screenshot_taken = True

使用方式

AI 主动截图
bash 复制代码
python main.py --base-url https://open.bigmodel.cn/api/paas/v4 \
  --model "autoglm-phone" \
  --apikey "your-key" \
  "打开美团搜索附近的火锅店并截图2家"

AI 会在找到每家店时执行:

复制代码
do(action="Screenshot", filename="火锅店1")
do(action="Screenshot", filename="火锅店2")
截图保存位置

截图保存到手机的:

复制代码
/sdcard/Pictures/AutoGLM/

/storage/emulated/0/Pictures/AutoGLM/,会在相册中显示为 "AutoGLM" 文件夹。

调用链路

复制代码
用户指令 "截图xxx"
       ↓
AI 模型输出 do(action="Screenshot", filename="xxx")
       ↓
handler.py - parse_action() 解析
       ↓
handler.py - _handle_screenshot() 处理
       ↓
device_factory.save_screenshot() 转发
       ↓
adb/device.py - save_screenshot() 执行 ADB 命令
       ↓
截图保存到 /sdcard/Pictures/AutoGLM/xxx.png
       ↓
注册到 MediaStore(相册可见)
相关推荐
唐叔在学习2 小时前
buildozer打包详解:细说那些我踩过的坑
android·后端·python
2501_946233892 小时前
Flutter与OpenHarmony帖子详情页面开发
android·java·flutter
冬奇Lab2 小时前
稳定性性能系列之四——异常日志机制与进程冻结:问题排查的黑匣子
android·性能优化·车载系统·bug
秋邱3 小时前
Java匿名内部类的使用场景:从语法本质到实战优化全解析
android·java·开发语言·数据库·python
Kapaseker3 小时前
凌晨两点磨锋芒 调试采坑莫慌张
android·kotlin
2501_924064113 小时前
2025年移动应用渗透测试流程方案及iOS与Android框架对比
android·ios
鹏程十八少3 小时前
Android 一套代码适配车机/手机横竖屏?看我如何用搞定小米、比亚迪、蔚来、理想、多品牌架构设计
android·前端·面试
冬奇Lab3 小时前
【Cursor进阶实战·01】Figma设计稿一键还原:Cursor + MCP让前端开发提速10倍
android·前端·后端·个人开发·figma
鹿人戛13 小时前
HarmonyOS应用开发:状态栏动画实现
android·程序员·harmonyos