前言
本文记录了在 Vivo Pad3 上部署 Hermes Agent 的全过程。以步骤操作为主,附带踩坑记录。前置条件:
·平板:安装 Termux(推荐 F-Droid 版本),开启开发者选项 + USB 调试
·电脑:装有 ADB(可从 Android Studio 或 vivo 办公套件获得),USB 数据线
没有任何基础的读者可以先在电脑上安装hermes,再让它参考本文操作以完成安装。
ADB 是什么?从哪来?
ADB(Android Debug Bridge)是 Android 开发者工具,用于电脑与 Android 设备通信。
电脑上有两个来源的 ADB:
来源 | 路径 |
Android Studio | D:\AS\SDK\platform-tools\adb.exe |
vivo 办公套件 | D:\Applications\vivopc\pcsuite\adb\adb.exe |
两者功能完全相同。本文使用 Android Studio 自带的 ADB。如果命令找不到,用全路径执行。
第一步: ADB 连接平板
平板开启 USB 调试,插线,电脑上验证:
# 查看连接设备 adb devices # 输出示例:401ECN04G400000device # 查看设备信息 adb shell getprop ro.product.model# PA2455 = Vivo Pad3 adb shell uname -m# aarch64
⚠ 注意:如果 adb 命令找不到,使用全路径
/c/Users/<你的用户名称>/AppData/Local/Android/Sdk/platform-tools/adb.exe
或 vivo 办公套件目录下的 adb。
踩坑:MSYS2 路径转换
如果在 Git Bash 中执行 `adb shell /data/...` 报错 `C:/Program: inaccessible`,是 Git Bash 将 Unix 路径自动转换为 Windows 路径导致的。把整个 shell 命令用双引号包起来即可:
adbshell"/data/data/com.termux/files/usr/bin/python3 --version"
第二步: Termux 环境检查
确认 Termux 运行中,并检查基础环境:
# 检查进程 adb shell ps -A | grep termux # 使用 run-as 进入 Termux 用户执行命令(绕过 Android 沙箱) # 注意:Termux 的二进制文件在 /data/data/com.termux/files/usr/bin/ adb shell run-as com.termux \ /data/data/com.termux/files/usr/bin/python3 --version # 检查 git adb shell run-as com.termux \ /data/data/com.termux/files/usr/bin/git --version # 检查 pip adb shell run-as com.termux \ /data/data/com.termux/files/usr/bin/pip list
如果 git/python 未安装,在平板的 Termux 中执行:
pkg update && pkg install-y python git openssh rust
⚠ 注意:关键:`run-as com.termux` 是电脑访问 Termux 的唯一方式,Android 不会让外部进程直接读取应用私有目录。
第三步: SSH 通道搭建
ADB shell 执行长时间命令容易超时,SSH 更稳定。
3.1 生成密钥(电脑端)
ssh-keygen-ted25519-f~/.ssh/id_hermes_android-N""-C"pc-to-android"
3.2 部署公钥到平板
先获取公钥内容:
cat~/.ssh/id_hermes_android.pub# 输出:ssh-ed25519 AAAAC3NzaC1lZ... pc-to-android
将公钥写入平板 authorized_keys:
adbshellrun-ascom.termuxsh-c \ "echo 'ssh-ed25519 AAAAC3NzaC1lZ... pc-to-android' \ >> /data/data/com.termux/files/home/.ssh/authorized_keys"
3.3 启动 SSH 服务
# 启动 sshd(默认端口 8022) adb shell run-as com.termux \ /data/data/com.termux/files/usr/bin/sshd # 验证 adb shell run-as com.termux ps -A | grep sshd
3.4 ADB 端口转发
由于路由器可能开启 AP 隔离(设备间无法通过 WiFi 互访),使用 ADB 转发绕过:
adbforwardtcp:2222tcp:8022# 测试 SSH 连接 ssh -i ~/.ssh/id_hermes_android -p 2222 \ -o StrictHostKeyChecking=accept-new localhost # 连接后运行命令验证 ssh -i ~/.ssh/id_hermes_android -p 2222 localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && echo SSH_OK && whoami"
第四步: 安装 Hermes 依赖
所有命令通过 SSH 在电脑端执行,目标为平板。
4.1 克隆源码
# 如未克隆 ssh -i ~/.ssh/id_hermes_android -p 2222 localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && git clone https://github.com/nousresearch/hermes-agent.git \ ~/.hermes/hermes-agent" # 如已克隆则拉取最新 ssh -i ~/.ssh/id_hermes_android -p 2222 localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && cd ~/.hermes/hermes-agent && git pull"
4.2 安装纯 Python 依赖
ssh-i~/.ssh/id_hermes_android-p2222localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && pip install rich Markdown jinja2 requests tenacity croniter \ prompt_toolkit ruamel.yaml fire httpx \ fastapi pathspec ptyprocess uvicorn websockets"
4.3 安装 Rust 依赖(编译 jiter + pydantic-core)
这两个包需要从源码编译,ARM 平板耗时 5-15 分钟。必须用后台方式运行,避免 SSH 超时:
ssh-f-i~/.ssh/id_hermes_android-p2222localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ CARGO_HOME=/data/data/com.termux/files/home/.cargo \ && nohup pip install \ \"openai==2.24.0\" \"pydantic==2.13.4\" \"PyJWT[crypto]==2.12.1\" \ \"croniter==6.0.0\" \"requests==2.33.0\" \"rich==14.3.3\" \ \"ruamel.yaml==0.18.17\" \ > ~/hermes_install.log 2>&1 &"
等待后检查日志:
ssh-i~/.ssh/id_hermes_android-p2222localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && tail -20 ~/hermes_install.log"
确认输出包含 `Successfully built pydantic-core jiter`。
踩坑:uvloop 编译失败
`uvicorn[standard]` 依赖 `uvloop`,该包在 Android 上无法编译。安装 `uvicorn`(不带 standard 后缀)并单独安装 `websockets` 即可。
踩坑:版本号不匹配
Hermes 需要精确版本依赖(`包名==X.Y.Z`)。如果先用 `pip install 包名` 装到最新版,必须重新指定精确版本降级。四条关键命令汇总:
# Rust 包(后台编译)pipinstall"pydantic==2.13.4"# 精确版本纯 Python 包pipinstall"openai==2.24.0""PyJWT[crypto]==2.12.1" \ "croniter==6.0.0""requests==2.33.0""rich==14.3.3" \ "ruamel.yaml==0.18.17"# 其他必要包pipinstallfastapipathspecptyprocessuvicornwebsockets
第五步: Hermes 配置
5.1 创建 config.yaml
ssh-i~/.ssh/id_hermes_android-p2222localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && cat > ~/.hermes/config.yaml << \"EOF\" _config_version: 25 model: default: deepseek-v4-flash provider: deepseek max_tokens: 16384 agent: clarify_timeout: 600 max_turns: 90 terminal: backend: local persistent_shell: true toolsets: - hermes-cli memory: memory_enabled: true approvals: mode: manual EOF"
5.2 配置 API 密钥
ssh-i~/.ssh/id_hermes_android-p2222localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && echo 'DEEPSEEK_API_KEY=*** > ~/.hermes/.env \ && chmod 600 ~/.hermes/.env"
5.3 验证安装
# 检查版本 ssh -i ~/.ssh/id_hermes_android -p 2222 localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && hermes --version" # 检查模块导入 ssh -i ~/.ssh/id_hermes_android -p 2222 localhost \ "export PATH=/data/data/com.termux/files/usr/bin:\$PATH \ && cd ~/.hermes/hermes-agent \ && python3 -c \"from hermes_cli.main import main; print(\'OK\')\""
第六步: 启动 Hermes
在平板的 Termux 中运行:
hermes
附录:踩坑汇总
# | 问题 | 原因 | 解决方案 |
1 | adb 命令找不到 | SDK 路径不在 PATH 中 | 用全路径或加到 PATH |
2 | Termux 命令 Permission denied | Android 应用沙箱 | 使用 run-as com.termux |
3 | MSYS2 路径转换错误 | Git Bash 自动转路径 | 命令外层加双引号 |
4 | SSH 连接超时 | 路由器 AP 隔离 | ADB 端口转发代替直连 |
5 | Rust 包编译超时 | ARM 编译慢 + SSH 断开 | ssh -f + nohup 后台运行 |
6 | uvloop 编译失败 | Android 不支持 | 装 uvicorn 不加 standard |
7 | 版本号不匹配 | pip 装了最新版 | 指定 ==X.Y.Z 重新装 |