把 Agent 部署成 24 小时个人助理:以 Hermes 为例
把 Agent 部署成 24 小时个人助理:以 Hermes 为例
wwxdsg很多人想象中的个人 Agent,是一个放在微信或飞书里的聊天机器人。
问它“下午有什么安排”,它能答;让它“提醒我开会”,它会回一句“好的”。这当然比没有方便,但离一个真正有用的助理还差很远。
真正的助理不只是被动回答。它应该能在你不打开电脑时持续在线,知道今天哪些事重要,按约定提醒你,整理你交给它的资料;遇到开发任务时,它把工作交给 Codex 或 Claude Code 这类专业执行者,最后把结果和风险带回来。
我现在更愿意把它理解成一个个人工作流的控制层,而不是一个更会聊天的模型。
这篇文章以我服务器上实际运行的 Hermes 为例,但方法不依赖 Hermes。任何具备消息网关、持久服务、定时任务、技能或工具扩展能力的 Agent,都可以按同样的结构搭建。不同产品的安装命令和配置字段会变,职责划分不会变。
一、先定义你要搭的不是“全能 Agent”
一开始最危险的想法,是让一个 Agent 同时拥有全部权限:看全部聊天、写全部文档、改日程、执行终端命令、直接部署生产环境。
它听起来很自动化,实际上是把所有偶发误解、提示注入和模型失误,都放到了同一条高权限链路上。
更可靠的结构是四层:
手机消息入口(飞书 / 微信 / 其他) |
Gateway 是助理和调度员,不必亲自成为最强的编码 Agent;Codex 和 Claude Code 是技术执行者,不必全天候监听你的聊天窗口。
这个拆分带来三个好处:
- 你能随时更换底层模型或 Agent,不会把个人工作流绑死在一个产品上。
- 办公操作和开发操作各自拥有最小权限,事故半径更小。
- 你能为每类任务设置不同的确认方式,而不是靠一句“请小心”。
二、我的真实样本:为什么需要常驻服务
我在服务器上把 Hermes 作为 Gateway 运行。它不是开着一个 SSH 终端等我用,而是一个用户级 systemd 服务:网络就绪后启动,异常退出自动拉起,用户退出登录后仍保持运行。
这个实例目前已经接入飞书能力、微信通道和定时任务。飞书侧通过 lark-cli 处理日历、文档、云盘和任务;Hermes 处理消息、会话、任务调度和结果投递。Hermes 官方也把 Gateway 定义为多消息平台与定时任务的统一后台进程。Messaging Gateway
它带来一个很实际的变化:我不需要先打开某个 IDE,才能让助理开始工作。手机上发一句“明早给我列出日程和最紧急的三件事”,或者“把这份会议记录整理成待办”,入口一直都在。
但“常驻”不是“永远可靠”。在实际日志里,我遇到过微信投递限流;也见过定时任务因为试图执行任意本地代码而被安全策略拦截。这两个现象恰好说明:一个能 24 小时运行的 Agent,最重要的不是能做多少事,而是失败时是否可见、越权时是否能停下来。
三、先选消息入口:飞书优先,微信谨慎
如果你的目标是日程、文档和待办,我建议先接飞书。
它不仅是聊天入口,也是工作数据所在的位置。把飞书应用的消息权限、日历、文档、任务和云盘权限设计好之后,Agent 才能完成“看日程 -> 生成准备清单 -> 建立待办 -> 把结果发回来”这样的闭环。
以 Hermes 为例,飞书可通过 App ID、App Secret、允许用户列表和默认投递会话接入;官方配置同时提供 WebSocket 与 Webhook 两种连接方式,前者更适合大多数个人服务器场景。环境变量参考
我会这样划分渠道:
| 渠道 | 适合做什么 | 默认建议 |
|---|---|---|
| 飞书 | 日程、文档、任务、工作提醒 | 作为主入口,只允许自己的账号触发 |
| 微信 | 随手提需求、接收轻量提醒 | 作为补充入口,接受桥接风险与平台限流 |
| Web / SSH | 配置、排错、审计 | 不对日常聊天暴露 |
微信是很自然的入口,但个人微信通常需要第三方桥接,并不等于官方企业 API。不要把它写成“永不掉线”的承诺。它更适合接收提醒和发起请求;涉及改日程、读敏感文档或执行代码时,最好把确认放回飞书或一个受控的 Web 页面。
无论接哪个平台,都先做三件事:
- 配置允许用户白名单,不让陌生人可以调用你的私人权限。
- 为定时任务指定固定的私人投递会话,避免把提醒发到群聊。
- 把 Token、App Secret 和 OAuth 凭证放在权限收紧的环境文件中,不要放进 Agent 记忆、聊天消息或 Git 仓库。
Hermes 的飞书配置可以收敛成下面这类最小环境文件。真实的 App Secret 只保存在服务器上,并把文件权限收紧到运行账号可读:
# ~/.hermes/.env |
然后运行 hermes gateway setup 完成平台向导,再用允许账号发送一条消息测试。FEISHU_ALLOWED_USERS 和 FEISHU_HOME_CHANNEL 分别限制谁能触发助手、定时结果默认投递到哪里;不要为了省事设置允许所有人访问。
四、让它持续工作的最小部署
产品会迭代,安装命令也会变,所以不要迷信任何一条“一键安装”命令。以 Hermes 为例,应始终以当前官方安装页为准;安装完成后先确认版本,再完成模型、消息网关和服务托管的配置。
Hermes 最小路径
下面是我在 Linux 服务器上使用的最小路径。它是 Hermes 示例,不是其他 Agent 的通用命令;执行前应查看当前版本的官方安装说明,并始终使用独立账号而不是 root:
# 仅管理员执行一次:创建低权限运行账号并让其退出登录后继续运行 |
如果你不愿意直接执行远程安装脚本,先下载、审阅并固定对应版本再安装。这里真正的重点不是这条 curl 命令,而是后面的运行模型:专用账号、专用 HERMES_HOME、受限凭证和受管服务。
下面这份用户级 systemd 单元展示的是关键结构,不包含任何密钥:
# ~/.config/systemd/user/agent-gateway.service |
它表达的不是 Hermes 专有写法,而是一个 24 小时助理的最低运行条件:
- 服务由进程管理器托管,而不是依赖一个仍开着的终端。
- 异常退出后自动重启,日志进入
journalctl,方便追踪。 - 启用用户 linger,避免 SSH 断开或用户退出后服务一起被回收。
- 运行身份是专门的低权限用户,不是
root。
Hermes 可用 hermes gateway install 安装用户服务,并用 hermes gateway status 检查状态;其定时调度由常驻 Gateway 执行,而不是另起一套不可见的 cron。定时任务文档
部署完成后,先做三项验收:
1. 重启服务,确认它会自动恢复。 |
不要先给它几十个技能、所有工作盘权限和一个全天候的终端。先证明最小链路可靠,再扩展能力。
五、从三个低风险定时任务开始
定时任务是“聊天机器人”和“助理”的分界线,但也最容易变成垃圾消息制造机。
我建议第一周只启用三个任务,而且全部是读取、汇总、提醒,不自动写入任何系统:
| 时间 | 任务 | 输出要求 |
|---|---|---|
| 工作日 08:00 | 读取当天日程、待办和截止日 | 一条不超过 10 行的晨间简报 |
| 每晚 21:00 | 汇总未完成事项 | 只问一个最值得推进的问题 |
| 每周日 18:00 | 复盘本周日程与任务 | 给出下周计划草稿,不直接创建日程 |
Hermes 的任务可以用自然语言、间隔表达式或标准 Cron 表达式创建,也支持暂停、手动运行和删除。每次调度都在新的 Agent 会话中执行,因此任务说明必须自包含,不能写“检查那个问题”这种只对当前聊天有意义的话。Hermes Cron 指南
一个合格的定时任务提示词应该像这样:
任务:工作日晨间简报。 |
对应的 Hermes CLI 示例是:
hermes cron create "0 8 * * 1-5" \ |
先手动运行一次,确认内容、投递位置和静默策略都正确,再让它按计划执行。不要第一次就创建一个“每 5 分钟检查全部系统”的模糊任务。
这里最重要的是“只读取”和“没有变化就静默”。好的提醒是在关键节点推你一下,不是每小时向你证明它还活着。
对纯确定性的巡检,例如磁盘空间、网站 HTTP 状态、备份是否成功,不必每次都唤醒大模型。Hermes 支持无 Agent 的脚本任务,脚本只在异常时输出告警;其他 Agent 也应该尽量采用同样的设计:确定性检查交给脚本,解释和归纳才交给模型。
六、日程、文档和任务:默认“起草”,不是“替你决定”
助理最容易带来价值的场景,通常不是自动替你做决定,而是把混乱的信息变成一个可确认的草稿。
例如:
- 你把会议纪要发给它,它提取待办、负责人和截止时间,生成一个飞书任务草稿。
- 你说“下周安排一次和 A 的沟通”,它先查空闲时间,给出候选时间段和会议议题。
- 你让它整理一堆资料,它在新文档中生成目录、摘要和待确认问题,不覆盖原文。
- 它在会前半小时发送“相关文档、未决问题、上次行动项”的简短准备卡片。
这类操作应当遵守一个固定协议:
读取 -> 提案 -> 预览 -> 明确确认 -> 写入 -> 回执 |
“明确确认”不是让 Agent 猜“你应该不会介意”。它应该能对应一个可审计的动作,比如“创建这 3 个任务”“把会议改到周三 15:00”“发送这封邮件”。
飞书本身很适合承载这一层,因为日历、文档、任务和消息都在同一协作空间。Hermes 示例中用 lark-cli 扩展飞书操作,但换成其他平台时,核心仍然是同一件事:为每个写操作提供预览、确认和可追溯的结果。
七、让它协作 Codex 和 Claude Code,而不是把终端直接交出去
“让手机里的 Agent 控制 Codex 和 Claude Code”听起来很酷,但这个需求最需要克制。
正确的关系不是:
微信消息 -> Agent -> root shell -> 随便执行 |
而应该是:
消息任务 -> 助理澄清范围 -> 隔离工作区 -> 编码 Agent -> 测试与报告 -> 人工决定提交、合并、部署 |
我会让常驻 Agent 做这些开发协调工作:
- 把自然语言需求整理成范围、验收标准和风险。
- 检查仓库状态、已有任务、CI 结果和错误日志。
- 在独立分支或
git worktree创建工作区,再启动 Codex 或 Claude Code。 - 收集 diff、测试结果和待确认事项,发回手机。
- 生成 PR 描述或发布清单草稿。
而不是默认允许它做这些:
- 在主分支直接改代码或推送。
- 读取所有 SSH 私钥、环境变量或密码库。
- 连接生产环境并自行部署。
- 把外部聊天内容原样拼进 shell 命令。
一个足够实用的权限表如下:
| 操作 | 默认权限 | 升级条件 |
|---|---|---|
| 查询日程、任务、仓库状态 | 自动 | 仅限白名单用户与只读范围 |
| 生成文档、计划、代码修改建议 | 自动起草 | 输出必须可预览 |
| 创建日程、任务、文档 | 预览后确认 | 指明对象和影响范围 |
| 启动 Codex / Claude Code | 单次确认 | 隔离工作区、限定仓库和任务 |
| 提交、推送、开 PR | 单次确认 | 已展示 diff 和验证结果 |
| 合并、部署、删数据、改权限 | 默认禁止 | 人工在受控终端单独执行 |
实际服务器上的安全拦截给了我一个很好的提醒:无人值守的定时任务尝试执行任意本地代码时,被运行时策略拒绝了。它短期看像“能力不够”,长期看却是正确的默认值。自动化应该沿着预先设计的窄路径跑,而不是在无人看管时获得更大的自由。
八、记忆不是聊天记录:给助理一份可维护的工作说明
如果你希望它越用越懂你,不能只依赖聊天历史。
聊天记录会膨胀、会过期,也很难区分“你当时随口说的想法”和“以后都要遵守的工作习惯”。更好的做法是给这个个人助理维护几份短小、可审计的外部文件:
assistant/ |
这里的原则和维护项目级 Agent 记忆完全一样:事实可以根据证据更新,工作流可以在复盘后优化,但权限规则的改变必须更难。
例如,“我通常希望晚上十点后只接收紧急提醒”可以直接写入 USER.md;“以后允许 Agent 自动给所有客户发消息”则绝不应该因为一次对话就变成默认规则。
九、把失败也设计进系统
常驻 Agent 最令人不安的地方,不是它报错,而是它悄悄失效。
我的检查清单至少包括:
- Gateway 服务是否在运行,最近是否反复重启。
- 消息通道是否仍能收发,是否出现限流或鉴权失败。
- 定时任务是否按时运行、是否连续失败、结果投递到哪里。
- 哪些任务使用了模型,哪些应该改为无模型脚本,避免无意义的 token 消耗。
- 最近有哪些写操作、代码任务或权限拒绝,能否回溯原因。
不要只监控进程“活着”。消息通道可能已经断开,但进程仍然健康;定时任务可能在运行,但投递全部失败。真正需要验证的是从“任务触发”到“你收到结果”的完整链路。
每增加一种自动化,都先手动触发一次,再观察它下一次按时运行的记录。确认失败路径能通知到你,才算真的上线。
十、从一个可控闭环开始
如果今天就要搭,我建议按下面顺序推进:
- 部署一个低权限的 Gateway,只接入自己的飞书私聊。
- 完成服务自启动、自动重启和日志检查。
- 上线一个只读的晨间简报,连续观察一周。
- 增加“会议纪要 -> 待办草稿”这一条需要确认的写入工作流。
- 为 Codex 或 Claude Code 建立隔离工作区和交付模板,再允许助理单次调度。
- 最后才考虑微信、外部消息、自动运行脚本和跨服务编排。
这个顺序看起来不够炫,但每一步都能单独验证,也能单独回滚。
一个真正有用的 24 小时助理,不是深夜偷偷替你做完所有事情的黑盒。它应该像一个可靠的秘书:知道哪些信息需要提前准备,知道何时提醒,知道什么时候必须等你点头;需要调用专业执行者时,能把任务交代清楚,再把结果带回来。
Hermes 是我已经跑通的一种实现。它以后可以替换成别的 Agent,飞书也可以换成别的办公平台,Codex 和 Claude Code 也可以换成更适合你的执行者。
但只要“入口、调度、执行、权限、监控”这五层还在,你搭建的就不是一个容易失控的万能机器人,而是一套会随着你的工作习惯逐渐变顺手的个人助理系统。