最近一直在折腾一件事:把 Hermes 这个开源智能体框架直接部署到手机上,让它变成一个能听懂人话、自己动手干活的 Robot Phone。折腾了大概一周,踩了不少坑,也把整个流程理顺了,今天干脆把这套部署方案和心得完整写出来,给同样想搞 AI 手机、又不想只停留在聊天阶段的朋友一个参考。
这篇内容主要解决三个问题:Hermes 到底是什么,怎么把一个 Agent 框架装进手机,以及装完之后怎么让它真正帮你发短信、拨电话、控制应用、执行自动化任务。无论你是懂 Python 的开发者,还是只会跟着教程操作的小白,只要手里有一台 Android 手机,基本都能跟着流程走完一遍。
1. 项目概述与核心思路
1.1 什么是 Hermes Agent 和 Robot Phone
Hermes 是一个面向本地优先场景设计的智能体框架,它把大语言模型、工具调用、流程编排和系统接口这几层拆开,提供了一套很轻量的机制,让模型不只能“聊天”,还能实际操作手机上的功能。所谓 Robot Phone,简单说就是让手机从被动接受指令变成主动感知和执行,像一个微型机器人那样,你说一句“帮我给老王发条消息说晚点到”,它自己完成联系人查找、短信发送、确认结果这一整套动作。
我之所以在这么多 Agent 项目里挑中 Hermes,一是因为它的核心代码足够精简,依赖也不重,适合放到手机这种资源受限的环境里跑;二是它的工具注册方式非常直白,写一个 Python 函数就能变成一个可供模型调用的工具,不用理解复杂的 Agent 协议;三是它默认不依赖任何云端服务,模型、工具、推理全部可以在本地完成,隐私和成本都更可控。
1.2 为什么强调“本地部署”而不是直接接云端 API
很多人问,手机装个客户端、把请求发到云端大模型不就完了,为什么非要在手机本地部署一套东西?关键在于“可操作性和权限”。普通聊天 App 只能调云端模型,模型没办法直接访问你手机里的短信、闹钟、文件、应用状态。Hermes 这类本地 Agent 则不同,它运行在你的设备上,可以直接通过系统接口读取和操作数据,相当于给模型装上了“手和眼睛”。
当然,本地部署也意味着算力有限,所以在架构设计上要遵循“小模型做决策、系统工具做执行、大模型按需调用”的分工。Hermes 的设计恰好朝这个方向走,底层模型可以用几百 MB 到几个 GB 的小参数模型,够理解指令就行,真正干活的是后面挂载的一堆本地工具。这也是我在选型时最看重的一点:它不是在手机上硬塞一个大模型,而是用一套轻量智能体把手机能力串起来。
2. 部署前必须搞清楚的方案选型
2.1 手机硬件与系统要求
先说结论:Android 10 以上、内存 8GB 以上的手机体验最好,6GB 内存也能跑起来,但需要把模型压到 3B 以内,并做好 Swap 扩展。我实测用的是天玑 8000 处理器的旧机型,12GB 内存,整个部署下来流畅度可用。
如果你是 iPhone,目前不建议按这个路子走。iOS 对后台进程和系统接口的限制太严格,很多操作(比如读取短信、模拟点击)根本绕不过去。与其折腾越狱,不如直接找一台闲置 Android 手机,这也是 Robot Phone 玩法的主流选择。
另外,存储空间建议至少留出 8GB 空闲。Termux、基础依赖、模型文件、日志文件等加起来很快会超过 4GB,后续如果还要接入语音识别模型,空间只会更紧张。
2.2 本地模型选型:不要盲目贪大
Hermes Agent 本身不绑定模型,只要兼容 OpenAI API 或 Ollama API 的模型都能接。在手机上跑,模型选型直接决定体验。我试过几档:
| 模型 | 参数量 | 内存占用 | 体验评价 |
|---|---|---|---|
| Qwen2.5 0.5B | 0.5B | 约 1GB | 能听懂简单指令,但复杂命令容易出错 |
| Qwen2.5 1.5B | 1.5B | 约 2.5GB | 日常控制类指令基本可用 |
| Hermes-3 Llama 3.2 3B | 3B | 约 4GB | 语义理解更好,适合做复杂流程,但发热明显 |
| 7B 以上 | 7B | 8GB+ | 手机上基本跑不动,需要云端配合 |
我的建议:如果只做短信、闹钟、天气这类结构化操作,1.5B 模型足够;如果想让对话更自然、能处理临时出现的多步指令,优先考虑 3B 版本。不要一上来就上 7B,那种“模型能力很强,但每次回复要等三十秒”的体验,用几次就劝退了。
2.3 环境路线:Termux 还是 Linux Deploy
手机端部署 Agent,本质上得有一个能跑 Python 和系统调用的 Linux 环境。目前主流有两种路线:
- Termux:不需要 root,安装方便,包管理器直接装依赖,适合大多数用户。Termux 还能配合 Termux:API 调用手机原生功能,这是我能给出最顺滑的组合。
- Linux Deploy / chroot:需要 root 或使用 proot,可以跑完整 Debian/Ubuntu 环境,兼容性更好,但配置更复杂,而且会破坏 Android 原有的应用隔离。
我最终选择的是 Termux + proot-distro 里的 Debian。我不直接跑在 Termux 原生环境,而是先装一个 Debian 容器,再在容器里部署 Hermes Agent 和 Ollama。这样最大的好处是依赖隔离,避免 Termux 里 Python 包版本和系统库互相打架。
3. 完整部署流程:从零到 Robot Phone 跑起来
3.1 第一步:准备 Termux 和基础依赖
先用 F-Droid 安装 Termux,注意千万不要用 Google Play 商店里的版本,那个早已停更,很多包都装不了。安装完成后打开 Termux,先换源再更新,这一步能省很多事:
termux-change-repo pkg update && pkg upgrade -y pkg install -y python git build-essential ffmpeg termux-api proot-distro这里有个关键词要提醒:如果你在手机上下载依赖时一直失败,多半是网络源的问题,把 Termux 的软件源切换成国内镜像即可,不用折腾网络代理。termux-api这个包特别重要,后面所有短信、电话、通知栏功能都靠它。
接着安装 proot-distro,并创建一个 Debian 容器:
proot-distro install debian proot-distro login debian进入 Debian 容器后,继续安装 Python、pip 和基础编译工具:
apt update && apt install -y python3 python3-pip git curl build-essential python3 -m pip install --upgrade pip到这里,基础环境就准备好了。整个过程约需要 15 到 30 分钟,视网络和手机性能而定。
3.2 第二步:在容器里安装 Ollama 并拉取模型
Hermes Agent 默认对接 Ollama 作为推理后端,所以需要先把 Ollama 跑起来。Ollama 官方其实不直接支持 Termux,但在 proot 的 Debian 容器里可以安装 Linux 版本。执行:
curl -fsSL https://ollama.com/install.sh | sh如果安装脚本在容器内线上不好使,也可以去 GitHub Releases 下载ollama-linux-arm64.tgz,手动解压到/usr/local并创建 systemd 服务。装完后启动 Ollama:
ollama serve &再拉取模型。以 Qwen2.5 1.5B 为例:
ollama pull qwen2.5:1.5b我建议同时拉一个 3B 模型用于复杂场景:
ollama pull llama3.2:3b模型文件默认放在 Debian 容器的/root/.ollama下,如果空间不够,可以用OLLAMA_MODELS环境变量把它指到 Termux 可读的外部存储目录,但这个操作需要额外设置权限,新手可以先不管。
3.3 第三步:安装 Hermes Agent
目前 Hermes Agent 的发布方式比较灵活,可以直接用 pip 安装,也可以从源码跑。我推荐从源码 clone,因为主分支更新快,而且你后续想加自定义工具时,直接在源码目录下写更方便:
pip install hermes-agent如果你发现 pip 上的版本比较旧,或者缺少某些插件,就改用源码部署:
git clone https://github.com/hermes-agent/hermes-agent.git cd hermes-agent pip install -r requirements.txt pip install -e .安装完成后,执行hermes --version确认能正常输出版本号。如果提示找不到命令,多半是 Python 的 Scripts 目录没加进 PATH,可以直接用python3 -m hermes.cli --version代替。
3.4 第四步:编写核心配置文件
Hermes Agent 的配置采用 YAML 格式,我用的配置文件大概是这样的:
agent: name: "Robot Phone" model: "qwen2.5:1.5b" backend: "http://127.0.0.1:11434" temperature: 0.2 max_tokens: 512 device: platform: "android" termux_api: true adb_enabled: false notification_access: true permissions: - sms - call - alarm - location - camera tools: enabled: - send_sms - make_call - set_alarm - get_weather - open_app - take_photo这里有几个参数需要解释一下。
temperature调成 0.2,是因为 Agent 执行任务时需要确定性,不能每次回复都不一样。permissions列表不是摆设,Hermes 会按这个列表去检查 Termux:API 的对应权限,没有权限的操作会直接报错。tools.enabled是真正让模型能用哪些工具的白名单。初装时建议只开两三个工具,跑通后再逐步增加,避免模型“选择困难”。
3.5 第五步:启动服务并做基本自检
启动 Hermes Agent:
hermes start或者如果你是从源码启动:
python3 -m hermes.cli start启动后日志会出现类似Listening on http://127.0.0.1:8321的提示。这就是 Agent 的本地服务端口。先在容器里用 curl 做个自检:
curl http://127.0.0.1:8321/health正常会返回{"status": "ok"}。接着做一个最简单的交互测试,问它“你好,你能做什么”,如果回复内容正常,说明 Ollama 和 Hermes 已经通了。
3.6 第六步:打通 Termux:API,让 Agent 能操作手机
这时候 Agent 还只是跑在容器里的“光杆司令”,想让它真正控制手机,需要把 Termux:API 的接口注册成 Agent 工具。Hermes 提供了现成的termux_tools插件,安装方式如下:
python3 -m hermes.plugins install termux_tools然后在配置文件的tools.enabled里加入对应工具。重启 Agent 后,执行:
hermes shell进入交互模式,输入:
帮我把手机调成振动模式如果 Agent 能返回“已调用 termux-settings set vibrate”之类的信息,说明手机外部接口打通了。如果没有反应,检查 Termux 的 API 服务是否已开启,以及是否安装了termux-api对应 App(在 F-Droid 里单独下载)。
4. 实战玩法:让 Robot Phone 真正“智能”起来
4.1 语音交互:给 Robot Phone 装个“耳朵”
只有文字交互还差点意思,Robot Phone 至少要能听懂人说话。我用的是sherpa-onnx做本地语音识别,它支持热词功能,可以自定义唤醒词“Hey Hermes”。
安装依赖:
pip install sherpa-onnx下载一个中文语音识别模型,比如sherpa-onnx-streaming-zipformer-zh-14M,然后写一个简单的 Python 脚本实时识别麦克风输入,识别到文本后通过管道传给 Hermes Agent 的 API。大致逻辑:
import sherpa_onnx import requests recognizer = sherpa_onnx.OnlineRecognizer.from_zipformer(...) for text in recognizer.stream(): requests.post("http://127.0.0.1:8321/chat", json={"message": text})这套方案在手机上跑语音识别占用约 300MB 内存,延迟在一两秒左右,可以接受。如果不想写代码,Hermes 配置里也有语音接入的示例,指向一个本地 WebSocket 服务即可。
4.2 自动发短信和拨打电话
这是最实用、也最容易出效果的功能。预先在配置里启用了send_sms和make_call工具后,直接对 Hermes 说:
给李姐发短信,内容是我马上到,让她先点菜Hermes 会先通过本地模型识别出联系人“李姐”,然后在通讯录里查找匹配项,再调用 Termux:API 的termux-sms-send发送。整个链路在日志里都能看到:
[action] resolve_contact("李姐") -> 138... [action] send_sms(to="138...", body="我马上到,让她先点菜") [action] result: success这里有个关键技巧:如果联系人里存在多个“李姐”,Agent 会通过上下文问你要哪个,你只需要回答“第二个”就行。这种多轮澄清能力是 Agent 框架相比简单自动化脚本最大的优势。
4.3 定闹钟、日程管理和天气播报
再举一个“起床助手”的例子。每天早上 7 点,Hermes 通过定时任务触发,自动获取天气接口的数据,然后播报当天的气温和出行建议,同时帮你把 7 点 10 分的闹钟设好。
配置文件里可以加一个schedule段:
schedule: - time: "07:00" task: "morning_brief" - time: "12:30" task: "weather_report"在 Hermes 里注册一个morning_brief工具函数,它依次调用天气工具、闹钟工具,并把结果合成一段语音文本。这种组合能力,本质上就是把离散的手机功能编排成一个“机器人管家”。
4.4 进阶玩法:通过 ADB 控制任意 App
Termux:API 可以触达系统级能力,但有些第三方 App 操作它做不到,比如自动刷新闻、自动打卡。这时候可以借助 ADB 来做界面级控制。原理是 Hermes Agent 通过 ADB 向 Android 系统发送模拟点击、滑动和输入事件,本质上变成了“手机上的 RPA”。
开启手机无线调试,然后在 Termux 里:
adb pair 192.168.1.10:5555 adb connect 192.168.1.10:5555再把adb_enabled设为true。之后你就能指示 Hermes 打开某个 App,然后执行一系列点击操作。不过这条路复杂且容易受界面变化影响,建议作为进阶玩法,初期还是先把手表级的工具链跑稳。
5. 踩坑实录:这些问题我提前帮你排掉
5.1 模型推理太慢,回答一次要半分钟
这是最容易遇到的问题。如果推送的是 7B 模型,在手机上基本没法用。解决思路第一个是换 1.5B 或 3B 模型;第二个是降低max_tokens,不要让模型每次都输出一长串解释;第三个是关闭系统动画特效,把手机处理器性能调度设为均衡/性能模式,减少后台限制。
我实测下来,Qwen2.5 1.5B 模型在 12GB 内存手机上的首 token 延迟大约 800ms,一句话完整输出在一两秒左右,属于可接受范围。
5.2 Ollama 进程被系统杀掉
Android 的后台管理策略对 Linux 容器进程很不友好,息屏一段时间后 Ollama 就没响应了。解决办法是使用 Termux 的 wakelock:
termux-wake-lock同时在系统设置里,把 Termux 的电池优化设为不限制,并将后台运行权限设为“允许”。如果还是被清,考虑用nohup ollama serve &启动,并把日志重定向到文件,方便排查是否被 OOM 结束。
5.3 Termux 访问不到存储和短信权限
执行termux-setup-storage后,Termux 才能访问/sdcard。短信、电话这类敏感权限需要单独在系统设置里授权给 Termux/Termux:API。如果授权后仍然提示权限不足,建议重启一次 Termux 服务,有时权限广播没有即时生效。
5.4 Hermes 依赖冲突,启动直接报错
手机环境里同时装了很多 Python 包,很容易出现依赖版本冲突。我的建议是全程在 proot 的 Debian 容器里用虚拟环境隔离:创建/opt/hermes-venv,所有安装都pip install进这个虚拟环境。虽然多几步,但能避免后期各种莫名其妙的导入错误。
5.5 模型生成结果绕来绕去不执行工具
核心原因是提示词和温度设置的问题。把temperature调到 0.2,并把系统提示词写清楚,比如:“You are a phone assistant. When you need to perform a task, always call the available tools. Never say fake actions.” Hermes 内置的默认提示词已经很完善,但如果你改过,很容易破坏格式约定。
下面是常见问题速查:
| 现象 | 最可能原因 | 解决方案 |
|---|---|---|
| curl /health 返回 404 | Hermes 还没启动完成 | 等日志出现 listening 再访问 |
| Ollama 一直在重试 | 内存不足被 OOM | 换小模型,增加 swap |
| 发短信提示无权限 | Termux:API 未授权 | 系统设置里单独授权给 Termux 应用 |
| Agent 不调用工具 | temperature 太高 | 改成 0.2,确认 tools.enabled 有该工具 |
| 语音识别无响应 | 麦克风权限没给 Termux | 系统设置里打开麦克风权限 |
| 息屏后失联 | 后台进程被杀 | 使用 termux-wake-lock,关电池优化 |
6. 扩展思路和我的真实感受
跑通之后,很多人会想继续往里面加东西。比较常见的扩展方向有:接入安卓通知监听,让 Agent 在 App 弹出消息时自动总结并播报;接入 Home Assistant,把 Robot Phone 变成智能家居语音入口;或者利用手机摄像头做视觉识别,让 Agent 能“看”到周围环境。Hermes 的工具注册机制让这些扩展都不需要改框架本身,写一个函数套一层接口就能用。
另外我也做了一个小优化:把常用指令做成“快捷短语”,比如输入“晨报”,Agent 就自动执行天气、日程、新闻三件套,省去每次说一长串。这个思路不是魔法,本质上是给 Agent 配了一套预置模板,真正处理时还是会走工具调用链路。
最后分享一条我的真实感受:手机部署 Agent 这件事,最大的障碍不是技术,而是心态。别指望一部中端手机能跑出云端大模型那种智能水平,Robot Phone 的价值在于“把手机能力用一种自然语言的方式暴露出来”。当你说“帮我关掉 WiFi 并定一个明天的闹钟”,它真的执行了的时候,那种“手机活了”的感觉,确实挺上头的。如果你手里也有一台闲置安卓机,不妨按这个流程试试,大概率你会收获一个属于你自己的 Robot Phone。