☰
Mac mini 上运行 GUI Agent:Mano-P 实测全流程指南
2026/10/2 13:48:24 网站建设 项目流程

最近在捣鼓 GUI Agent 的时候,发现大家伙都在云主机上用这套东西,很少有人提 Mac mini。我一个朋友说“Mac mini 这种低功耗小盒子,跑跑服务还行,跑 AI 操作界面?怕不是要卡死”。实测下来并不是这样,M系列芯片的 Mac mini 跑 GUI Agent 反而有个天然优势:系统本身带原生画面渲染,没有虚拟机那层转发损耗,写出来的点击坐标和真实屏幕完全对齐。我这几天把一个叫 Mano-P 的开源 GUI Agent 框架完整跑了一遍,从装环境到让它真正代替我点击鼠标、敲键盘、建文件夹、截图,整个过程挺顺畅,也踩了不少坑。这篇文章就把每一步怎么走、为什么这样走、坑在哪里都记录下来,想在自己电脑上玩 Agent 的朋友可以直接照着抄。

1. 为什么要让 Mac mini 跑 GUI Agent

1.1 什么是 GUI Agent,能做什么

先解释清楚概念。GUI Agent 不是聊天机器人那种“答你一嘴就结束”的玩法,它是一个能够看到屏幕、理解界面内容、然后像人一样操作鼠标键盘的程序。简单说,你把一个任务用自然语言告诉它,比如“在桌面新建一个叫 test 的文件夹,并截图给我看”,它会自己移动鼠标到 Finder 桌面区域,右键选择新建文件夹,输入名称,最后调起截图工具完成操作。整个过程不需要你写一堆 AppleScript 或者 Automator 流程,全都是模型以视觉理解为基础,自主决定下一步点哪里。

Mano-P 就是这样一个面向 macOS 的轻量级 GUI Agent 项目。它不需要额外接入复杂的机器人硬件,也没有依赖云端的虚拟桌面系统,直接跑在你自己的图形会话里。它本质上是给视觉语言模型加了一套“行动接口”,让模型不仅能描述图像,还能输出动作指令,比如 click(450, 320) 或 type(text)。也就是把“我看到什么”变成“我要怎么操作”的桥梁。

相较于传统脚本自动化,GUI Agent 最吸引人的地方是抗界面变化。以前写死坐标的脚本,只要窗口挪个位置就直接崩;而基于视觉的 Agent 会重新读取屏幕内容,找到目标按钮当前的坐标再点击。所以它适合做那种“临时性、需要判断、界面会变”的任务,而不是稳定的批量流水线。

1.2 为什么选 Mac mini 做宿主环境

很多人习惯用云主机跑 Agent,Virtual Desktop 环境是虚拟的,分辨率、缩放比例和真实显示器有很大差异。Agent 截图出来的画面比例可能与实际鼠标坐标系统不一致,最后点击全偏。Mac mini 作为实体机,显示器虽然可能没接,但系统还保持图形会话,Graphic Agent 拿到的截图、鼠标坐标都是完全一致的,这一点跑自动化时太重要了。

另外 Mac mini 的功耗很低。我拿入门款来跑,待机几瓦,满载也就三四十瓦,开一个晚上做实验,电费完全可以忽略。相比那些动辄 200W 的台式机,它更适合 24 小时挂着跑 GUI Agent,当作家庭自动化控制中心。

M4 芯片的统一内存架构也让“本地跑一个小视觉模型 + Agent 脚本”这件事变得可行。我实测在 16GB 内存的版本上,同时开着一个 7B 参数的量化模型和 Agent 调度脚本,内存占用大概 10GB 左右,没有出现明显卡顿。如果使用 API 服务做推理,那内存压力就更小了,只要脚本本身和截图处理不爆内存就行。

1.3 Mano-P 项目概览

Mano-P 的结构并不复杂,主要有四个模块:截图采集模块、视觉理解模块、动作执行模块、以及任务调度模块。截图采集负责高频抓取当前屏幕并做必要的裁剪缩放;视觉理解模块负责把截图喂给模型,让模型输出下一步操作;动作执行模块负责把模型输出的指令翻译成真实的鼠标键盘事件;任务调度模块则维护任务队列、终止条件、安全护栏。

它的依赖也比较主流:Python 3.9 以上,PyTorch、OpenCV、PyAutoGUI、以及一个可用的模型接口。Mano-P 支持通过 API 调用付费模型,也支持使用本地 Ollama 等方式加载开源模型。默认的配置文件里写了一些推荐的模型名称,比如多模态类模型你能用 qwen-vl 或者 llama3.2-vision,但我试下来感觉还是要根据任务复杂度调整。

需要提前说明,Mano-P 目前的维护频率不算高,更像是一个展示“macOS 也能玩 GUI Agent”的原型项目。不过正因为代码短小精悍,很好改,适合想深入研究 Agent 的读者。如果你是想要一个开箱即用、周边完善的产品,那还需要再找找商业方案。这并不影响我们把它跑起来,当成学习示范、或者日常轻量自动化的工具,已经完全够用。

2. 环境准备:先把地基打牢

2.1 系统要求与 Homebrew、Python 安装

我的实测环境是 macOS Sequoia 15.3,M4 芯片。理论上只要是 Apple Silicon 的 Mac mini,系统在 Monterey 以上应该问题不大。Intel 版我没有专门验证,但如果你编译依赖时遇到指令集问题,大概率是环境差异导致。

第一步先把 Homebrew 装上。虽然 Mano-P 不一定非要 Homebrew,但后面装 Python、Git、一些图像库都要用到,一劳永逸。Homebrew 的安装命令其实大家都背得出来,但为了避免版本问题,我建议先检查一下官方安装脚本的完整性,然后执行:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Apple Silicon 机器安装完 Homebrew 后,要记得把路径加到 shell 环境变量中。这一步很多新手会漏掉,导致后面 brew 命令找不到:

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)"

然后安装 Python。苹果系统虽然自带 Python3,但版本可能较老,且直接装在系统里容易把环境弄得乱七八糟。还是用 Homebrew 管理最干净:

brew install python@3.11

顺手安装 Git 和 wget,下载东西和克隆代码用得到:

brew install git wget

安装完成后检查一下版本,确认自己是不是在正确的环境里:

python3 --version git --version

2.2 正确配置 Git 环境

Git 装好后,无论是克隆 Mano-P 仓库还是以后提交修改,都需要配置用户信息。不配置也能克隆,但考虑到你可能想把配置改一改再 commit 回去,建议提前设置:

git config --global user.name "你的昵称" git config --global user.email "你的邮箱" git config --global init.defaultBranch main

注意这里有个小细节,Git 默认分支名在旧版本里是 master,新建仓库时会有一个不太友好的提示。把默认分支设为 main 看起来舒服,后面也避免分支名混淆。

需要克隆的仓库地址可以在 GitHub 搜索 Mano-P 找到。我这里以你拿到的仓库实际地址为准,假设是:

git clone https://github.com/example/mano-p.git cd mano-p

克隆后最好先看一眼 README,因为项目更新很快,作者可能已经调整了目录结构和启动方式,不要盲信网上的旧教程。

2.3 创建独立的 Python 隔离环境

这一步是血泪教训。之前我图省事直接 pip install 到系统 Python,结果装某个图像处理库时,把系统自带的库给覆盖了,导致系统有些工具异常。后来全面改用虚拟环境,再也没出过这类问题。

用 Python 自带的 venv 就能很好隔离依赖,如果想管理多个 Python 版本,也可以用 miniconda。venv 的方式最简单:

cd mano-p python3 -m venv .venv source .venv/bin/activate

激活后,终端提示符前面会出现 (.venv) 前缀,表示当前在这个隔离环境里。之后所有 pip 安装都会装到这个虚拟环境的目录下,不会污染系统环境。

如果你更习惯 conda,也可以:

conda create -n mano python=3.11 -y conda activate mano

两种方式效果差不多,选一个就行。这里我推荐新手用 venv,少装一个工具,路径也更容易理解。

2.4 安装项目依赖与常见坑

Mano-P 一般会提供 requirements.txt 文件,列出全部依赖。安装命令很简单:

pip install -r requirements.txt

但真实情况往往没有这么顺利。第一个坑是 PyAutoGUI 在 macOS 上依赖 Quartz 相关库,如果缺少系统头文件,会编译失败。此时需要先安装一些系统依赖:

brew install libpng libtiff libjpeg openexr

第二个坑是 OpenCV 的安装体积大、耗时长。在 Apple Silicon 上,直接 pip 安装 opencv-python 没问题,但如果你遇到 “cp39-cp39-macosx_14_0_arm64” 之类的轮子不存在,可以换个版本试试:

pip install opencv-python==4.9.0.80

第三个坑是 torch 相关依赖。如果你要用本地模型推理,安装 torch 要特别注意选择支持 MPS 的版本。如果只是用 API 模式,可以不用装全家桶,把 requirements.txt 里的 torch 注释掉,能省不少磁盘空间。

依赖装完,验证一下关键库能不能正常导入:

python -c "import cv2, pyautogui, PIL; print('ok')"

如果没报错,说明环境基本打通。

3. Mano-P 核心配置:从模型到权限

3.1 配置文件里每个参数的含义

Mano-P 使用 YAML 作为配置文件,通常位于 config/config.yaml。打开后,会有几块内容:model、path、action、limit。

model 区块最关键:

model: provider: openai_compatible base_url: "http://localhost:11434/v1" api_key: "ollama" model_name: "qwen2.5vl:7b" temperature: 0.2 max_tokens: 512

provider 指定模型服务类型,我用的是 OpenAI 兼容接口。base_url 是模型服务地址,如果本地跑 Ollama 就是上面的地址;如果使用云厂商服务,就填对应的 API endpoint。api_key 可以填随便一串字符,只要服务端不校验就行。model_name 是模型名,你本地通过 Ollama 拉取的模型叫什么,就填什么。temperature 设低一点,0.1 到 0.3 之间比较合适,能减少随机动作;max_tokens 不要太高,因为 Agent 一次动作输出通常几百 token 就够。

path 区块定义截图保存位置和临时文件目录:

path: screenshot_dir: "./screenshots" cache_dir: "./cache"

action 区块定义动作执行参数:

action: mouse_delay: 0.2 keyboard_delay: 0.1 confirm_before_execute: false

这里有个值得留意的细节:confirm_before_execute 如果设成 true,每个动作执行前都会问你“是否执行”,这对调试和演示很友好,但真正的自动化任务会变得十分繁琐,建议平时设为 false,只在第一次试跑或排查问题时打开。

limit 区块是安全护栏:

limit: max_steps: 30 timeout: 300

max_steps 限制 Agent 最多执行多少步动作,防止模型陷入死循环;timeout 是任务总超时秒数。这两个参数建议设置得保守一些,我一开始设 max_steps: 500,结果模型在某一步不断尝试失败,一直重复点击同一个位置,差点把窗口点没了。

3.2 首次运行需要授权的 macOS 权限

这是最容易卡住的环节。macOS 对程序控制鼠标键盘、读取屏幕内容有严格的权限控制。如果你在终端里启动 Mano-P,那么你的终端 App 需要拥有两个权限:辅助功能和屏幕录制。

在系统设置里打开“隐私与安全性”,找到“辅助功能”和“屏幕录制”,分别把你的终端程序加进去。注意不是加 Python 进程,而是加终端本身。我第一次就误加了 Python 解释器,结果权限不生效。

还有一个容易忽略的点:如果你是从终端里用 sudo 或类似方式提权运行,权限应用的对象可能不是你的终端 App,而是系统终端这样的进程。最好就用普通用户权限去跑,不要 sudo。

添加权限后,需要退出终端再重新打开一次,权限才会真正加载到新的进程里。验证权限是否生效,可以运行一个小测试:

python -c "import pyautogui; pyautogui.moveTo(100, 100, duration=0.5)"

如果鼠标真的移动到屏幕左上角附近,说明辅助功能权限没问题。屏幕录制权限则可以通过截图验证:

python -c "import pyautogui; pyautogui.screenshot('test.png')"

如果生成的 test.png 是纯黑或者只有桌面壁纸没有窗口内容,那屏幕录制权限没打开,需要重新检查。

3.3 选择合适的后端模型

Mano-P 依赖模型来理解截图并输出动作。这里有两个大方向:本地模型和云 API。

本地模型我试过 qwen2.5vl 的 7B 量化版本,在 M4 Mac mini 上单次推理时间大概 3 到 5 秒,能正确识别桌面图标和 Finder 窗口,但对复杂的菜单项识别有些吃力。还有 llama3.2-vision,稍有不同,但对中文界面的理解不如前者。如果你主要操作中文软件,建议优先试试 qwen 系列的视觉模型。

云 API 模式响应快,通常 1 到 2 秒就能返回结果,识别精度也更高,但需要联网。我这里只提供思路,因为每个人使用的服务不一样。

我目前最推荐的方式是:先把本地 Ollama 跑起来,装上一个小模型,把整个流程调通后再根据效果决定是不是要换更强大的模型。因为本地模型响应虽慢一些,但没有额外费用,而且不依赖网络,适合长期实验。

3.4 目录结构和运行入口

Mano-P 的目录结构不算复杂,核心文件包括:

  • main.py:任务入口
  • agent/core.py:Agent 循环逻辑
  • agent/action.py:动作执行层
  • agent/vision.py:截图与图像处理
  • config/config.yaml:配置文件
  • requirements.txt:依赖列表

理解这几个文件的关系有助于排查问题。vision 负责拿屏幕数据,core 负责把截图给模型并解析回复,action 负责执行鼠标键盘。如果某个环节出现异常,可以直接进入对应文件查看日志输出。

启动任务通常有两种模式。一种是单任务模式,在命令行直接指定任务文本:

python main.py --task "在桌面文件夹创建一个名为 AgentTest 的文件夹" --config config/config.yaml

另一种是交互式模式,进入一个循环里,手动输入任务,适合连续测试:

python main.py --interactive

第一次建议用交互式模式,因为可以在每一步暂停,观察模型的思考和动作,更容易理解整套机制。

4. 实战:让 Agent 完成一个真实任务

4.1 任务设计:在 Finder 中新建文件夹并截图

我设计了一个非常简单但能测试全套能力的任务:“在桌面新建一个名为 AgentTest 的文件夹,然后保存一张截图到当前目录”。

为什么选这个任务?因为新建文件夹需要右键菜单交互或者键盘快捷键,依赖 Finder 的上下文,不是单纯的“移动到某个绝对坐标就行”。Agent 需要先识别桌面区域,找到空白处,然后调出右键菜单,再点击“新建文件夹”,再输入名字。这能同时考察视觉理解、菜单导航、文本输入和截图能力。

准备阶段先打开 Finder,确保桌面可见,不要有其他窗口挡在桌面图标上。如果桌面本身堆满了文件,建议清一下,或者专门开一个全屏的 Finder 窗口作为测试区域,这样模型更容易识别。

开始运行交互式模式:

python main.py --interactive

然后输入任务文字:在桌面上新建一个名为 AgentTest 的文件夹,然后截图。

4.2 启动 Agent 并观察执行轨迹

Agent 启动后会先截取一张全屏截图,保存到 screenshots 目录,然后把截图缩小并交给模型。模型返回的结构一般是这样的 JSON:

{ "thought": "用户要求创建文件夹,我需要先确保桌面可见,然后在桌面空白处点击右键,并选择新建文件夹。", "action": "right_click", "coordinates": [1280, 700], "params": {} }

Mano-P 会把这个 JSON 解析出来,然后执行对应动作。在交互模式里,它会打印出 thought 字段,你能实时看到模型的决策过程,这是调试时最好用的信息。

执行右键后,它会再截一张图,看到右键菜单的完整内容,然后定位“新建文件夹”菜单项,返回 click 动作。整个过程像一个人不断看屏幕、思考、点击,非常有意思。

我在实测里第一次就成功了,创建文件夹的路径和名字都正确。但如果你执行的时机不对,比如 Finder 还停在别的目录,Agent 可能会把文件夹建错位置。这提醒我们:不要给 Agent 模糊位置的指令,最好在任务里明确说“桌面”。

4.3 执行过程的关键日志解读与中断方式

日志输出一般包含几个阶段:

  • Screenshot taken:说明截图成功,可以看路径去检查图像。
  • Model response: ...:模型返回的原始内容,包括 thought 和 action。
  • Action executed: click at (x, y):实际点击的坐标。
  • Step count: x/max_steps:当前步骤数和上限。

当你发现模型反复执行相同的点击动作而没有进展时,说明可能陷入循环。这时可以按 Ctrl+C 中断程序。中断后,Mano-P 会保存当前截图和日志,方便你分析。

如果要自动化运行,可以在代码里加入终止条件。比如在任务完成后模型返回一个 finish 动作,Mano-P 就会退出循环。注意让 Agent 明确输出 finish 是很重要的,否则它会一直“多干点活”,可能会误操作。

4.4 性能实测:M2/M4 芯片上的表现

我在 M4 芯片上,16GB 内存,使用本地 qwen2.5vl:7b 模型,整个任务从开始到完成大约花了 35 秒。其中模型推理占了绝大部分时间,动作执行只占 5 秒左右。如果换成 API 模型,总耗时可以压缩到 15 秒以内。

我也借朋友的 M2 芯片机器跑过同样的任务,内存 8GB,加载 7B 模型比较吃力,经常出现内存交换,任务耗时翻倍。建议至少 16GB 内存,再考虑本地模型。如果只有 8GB,用 API 模式会舒服很多。

还有一个影响性能的因素是屏幕分辨率。外接 4K 显示屏时,截图文件很大,模型处理时需要把图缩小,这一步会占一点时间。如果只是跑任务,用系统默认分辨率就可以。

5. 调试与踩坑实录

5.1 权限失效导致点击无反应

最典型的问题是:明明代码执行没有报错,鼠标就是不动。排查思路是分两步。第一步,确认 pyautogui 的 moveTo 是否有效,如果鼠标连移动都不行,那多半是辅助功能权限没开。第二步,如果鼠标能移动但是点击无效,可能是屏幕录制权限问题,因为 Agent 不能确认点击后的界面状态,所以它会在自己设想的状态下继续执行,看起来就是“点了但没反应”。

解决办法:把终端进程从辅助功能和屏幕录制中移除,重启终端,然后重新添加权限。我试过几次,移除再添加通常比重启系统有效。

5.2 截图黑屏或分辨率不匹配

Mac mini 如果外接显示器正常,截图一般没问题。但如果你用的是“无头模式”——不接显示器,只听 Mac mini 自己输出,那么系统可能没有活动画面,截图会是纯黑。这时候要去系统设置的“显示器”里看看是不是分辨率异常,或者强制设置一个虚拟分辨率。

如果创建了虚拟屏幕,截图的尺寸可能和你鼠标坐标的参考系不一致。Mano-P 内部是将截图缩放后交给模型,但动作坐标是基于原图尺寸解析的,如果出现了 0.5 倍的缩放,点击坐标就会偏一半。我遇到的解决方案是把截图尺寸设置成跟屏幕实际逻辑分辨率一致,不要用 Retina 的物理分辨率。

5.3 依赖冲突:opencv、pyautogui 等版本问题

在安装依赖时,我遇到过一次比较麻烦的冲突:opencv-python 需要 numpy 2.x,而项目代码里的某个库只支持 numpy 1.x。最后在 requirements.txt 里固定了 numpy 版本并重新安装才解决。建议安装完依赖后直接执行一遍项目自带的自检脚本,能提前发现这类问题。

pyautogui 在 macOS 上有时会出现鼠标拖拽失效的问题,比如 dragTo 没有按照预期移动。这是 PyAutoGUI 老版本在 Catalina 后的兼容性问题,可以尝试升级到 0.9.54 以上,或者直接用 Quartz 底层接口自己写拖拽。

5.4 常见问题速查表

现象可能原因解决办法
终端提示权限不足辅助功能/屏幕录制未授权在系统设置中添加终端应用并重启终端
截图全黑屏幕无活动画面或显示器未正确连接开启虚拟显示器,或插一个 HDMI 诱骗器
点击坐标偏移截图分辨率与系统分辨率不一致将截图尺寸设置为系统逻辑分辨率
模型返回空结果本地模型服务未启动检查 Ollama 服务,确认模型已拉取
安装 opencv 失败缺少系统依赖或不支持当前 Python 版本安装 libpng/libjpeg,或降低 opencv 版本
numpy 版本冲突不同依赖要求不同 numpy 版本固定 numpy 版本并重新安装相关包
鼠标能移动但点击无效屏幕录制权限缺失或权限未刷新移除并重新添加终端权限,重启终端

6. 经验总结与下一步扩展

6.1 我的个人体会

整个流程跑通之后,我最强烈的感受是:GUI Agent 离“替人类操作电脑”这个目标已经不远了,但它依然需要人类给它清晰的任务边界。Mano-P 这个项目让我看到了一个可行的框架,特别是在 Mac mini 这种低调的硬件上,居然能跑得很顺。

如果你也是第一次尝试,我建议不要一上来就让它操作正式环境中的重要文件,可以先建一个专门的测试目录,比如在桌面新建一个 “tmp-agent-test” 文件夹,所有操作都在里面进行,避免 Agent 误删文件或者改动系统设置。还有一点,任务描述要尽量具体,不要说“整理桌面”,要说“把桌面上的所有截图文件移动到新建的 图片收集 文件夹中”。模型对模糊指令的理解能力有限,说得越清楚,成功率越高。

6.2 可以继续扩展的方向

跑通基础任务后,可以把 Mano-P 和定时任务结合起来,做成一个每天自动截图存档的工具;也可以把它当作一个测试辅助工具,让它执行 UI 自动化测试用例;甚至可以让它控制第三方剪辑软件,自动导入素材做初步剪辑。

如果想让 Agent 更加智能,可以尝试在动作执行之前增加一步规则校验。比如在 action.py 里加入坐标范围过滤,当模型输出的点击坐标离屏幕边缘过近,或者连续三次点击同一坐标时,自动暂停并询问。这种安全护栏虽然实现起来简单,但能避免很多意外。

6.3 最后分享一个小技巧

如果你打算用本地模型,记得在 Ollama 中把模型上下文长度调大一点。Mano-P 在一次任务中可能需要连续看十几张截图,如果模型上下文太小,它会忘记前面的动作,容易出现重复操作。我在 Ollama 启动时加了参数:

ollama run qwen2.5vl:7b --num-ctx 8192

这样处理后,任务的稳定性明显提升。这个小改动是我在实际操作中摸索出来的,比换一个更大的模型性价比高很多。希望你在跑 Mano-P 的时候也能用上,少走点弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询