Hermes iOS Companion
我独立设计和开发的自托管 iOS 移动控制端。它连接 Mac 与 VPS 上的 Hermes Agent,让用户在 iPhone 上继续会话、查看工具执行、确认高风险操作、使用语音输入,并接收系统级任务状态。
项目概览
Hermes iOS Companion 是我为开源 Hermes Agent 独立设计和开发的移动控制端。离开运行 Agent 的电脑后,我仍可以继续会话、查看工具执行、处理安全审批、使用语音输入,并跟踪长时间任务。
它是已经部署在个人系统中的 private beta,不是普通聊天 App。我负责 iOS 客户端、交互模型、Gateway 协议集成、安全边界和 Apple 系统能力。它不是 Nous Research 官方产品。
移动控制端,而不是聊天框的缩小版
主要流程围绕 Agent 连续性组织,而不是围绕消息数量组织。会话按项目与实例分组,工具执行可检查但不会占据整个对话,审批请求则在用户决定前明确展示命令和授权范围。
这些界面来自当前 main 的 Simulator build,使用 fixture 会话、示例命令和隔离的实例名称,不包含生产 endpoint、凭证或私人会话。
问题:离开电脑后,桌面 Agent 失去了交互入口
桌面 AI Agent 可以读取文件、调用工具并执行长任务,但用户一旦离开电脑,原本的界面就不存在了。仅仅把聊天框搬到手机上并不能解决问题。移动端还需要表达执行状态、维持会话连续性、接住系统事件,并让高风险操作足够明确。
因此,产品目标不是缩小桌面端,而是识别手机上真正重要的责任:轻量输入、状态感知、处理中断,以及可信确认。
产品判断:iPhone 不运行 Agent Runtime
Hermes Runtime 继续运行在 Mac 或 VPS 上,因为那里拥有文件、工具、算力和长时间进程上下文。iPhone 只作为安全控制端发送输入,并渲染 Gateway 提供的状态。
这个边界同时降低了产品和安全复杂度。Gateway 始终是事实源。移动端即使重连、补偿状态,或错过一次瞬时事件,也不会成为任务状态的第二个权威。
架构:一个事实源,多条反馈路径
iPhone 通过 Tailscale HTTPS 访问每个 Hermes Gateway。Mac 与 VPS profile 分别保存 endpoint 身份、凭证、会话和通知路由,避免跨实例混用。请求发送到当前选择的 Gateway,SSE 提供前台进度,APNs、Widget、Live Activity 和 Dynamic Island 提供系统级状态。
SSE 与推送都是反馈层,不是互相竞争的数据库。中断或重连后,客户端以 Gateway 状态进行 reconcile,而不是假设每一个瞬时事件都已收到。
任务离开 App 后仍然可见
Share Extension 可以把 URL、文字或图片转成 Agent 输入,无法立即发送时先进入 outbox。WidgetKit 展示实例级状态,ActivityKit 与 Dynamic Island 把实时任务状态带到系统界面,原生文字选择则让长篇 Agent 输出可以继续作为工作材料使用。
这些 Simulator 素材证明系统界面能够真实渲染。真机验收另外覆盖 APNs、Face ID 或密码 App 锁、Share outbox 交付,以及 Simulator 截图无法证明的生命周期行为。
核心难点
真正困难的工作不是渲染聊天气泡,而是在网络、进程、设备和 iOS 生命周期边界之间维持信任与连续性。
- 01
不可重放 SSE 与断线恢复
把流式反馈与 Gateway 持久状态分开,再通过重连与 reconcile,避免一次中断让客户端持有错误的任务结论。
- 02
Mac 与 VPS 身份隔离
将会话、凭证、草稿、通知和深链接绑定到明确实例,切换环境时不会把上下文带入另一个系统。
- 03
敏感控制的分层确认
先明确授权范围,危险的会话级授权还需要二次确认。Face ID 或设备密码用于保护 App 重新进入与破坏性 Gateway 重启,通知点击本身不会成为授权。
- 04
离线 Share outbox
当 App 或 Gateway 不可用时持久保存 Share Extension 输入,恢复连接后再送往原本指定的实例与会话。
- 05
Push、Widget 与 Live Activity 路由
把后台事件映射到正确 profile 与任务,同时仍以 Gateway 的最终状态为准。
- 06
语音草稿与长会话交互
处理中断后的转写草稿恢复,并把滚动、自动折叠和精确文字选择当作生产力核心交互。
- 07
中英文与辅助功能
在主要流程中实现中英文、Dynamic Type、VoiceOver 结构和最小触控区域,而不是在功能完成后补做。
远程执行必须保持可理解和可控制
远程执行首先是人因问题。用户需要足够上下文做判断,但不应该被迫在手机上阅读桌面尺寸的执行轨迹。审批流程先呈现意图与授权范围,危险的会话级授权还需要额外确认。Face ID 或设备密码则分别保护 App 重新进入与破坏性 Gateway 重启。
执行期间,推理与工具调用被折叠为紧凑状态面板。细节仍可检查,但最终答案保持在执行轨迹之外,避免状态、诊断信息和结果互相争夺注意力。本案例公开的界面都来自当前 main 的安全模拟器 fixture。
验证证据
最有价值的证据是完整系统真实运行在一台 iPhone 和两个自托管环境中。自动化测试负责确定性行为,真机验收负责验证 mock 无法证明的 Apple 服务与网络条件。
- iOS 系统能力
- 在真机验证 APNs、Face ID 或密码 App 锁、Gateway 重启认证、Share Extension、Widget、Live Activity、Dynamic Island、语音输入和中英文行为。
- 中断后的连续性
- 覆盖 SSE 恢复、前后台切换、草稿恢复、离线 outbox 和实例级路由。
- 面向真实部署的边界
- 使用 Tailscale 私有连接、Keychain 凭证、fail-closed 审批和 Gateway reconcile,不把 Agent Runtime 直接暴露到公网。
已知限制与发布边界
Hermes iOS Companion 是 private beta 和已经部署的个人系统。它没有上架 App Store,也不是公开下载产品,更不是官方 Hermes App。当前配置仍假设用户拥有自托管 Hermes Gateway 与 Tailscale 网络,这适合目前的使用范围,但不是面向大众的 onboarding。
公开截图只使用 example data 与脱敏 fixture。真实 Gateway URL、API key、配对 payload、Tailscale 域名、设备 token、APNs 凭证和私人会话内容都不会出现在公开材料中。
这个项目证明了什么
Hermes iOS Companion 是我目前最完整的端到端案例。它把 AI 系统、UX 判断、原生 iOS 开发、后端协议、安全和真实部署组合成一个完整产品。
最重要的产品结论是:AI Companion 不应该模仿 Runtime,而应该把 Runtime 翻译成最少的一组移动交互,同时保留连续性、状态感知和信任。
Built independently by Prince Niu,作为开源 Hermes Agent 的 companion 设计与开发。Not an official Nous Research product。
