Hermes Goal 功能详解
发布于 2026-05-15 11:02
Hermes Goal 功能详解
一、Goal 是什么?
Goal(目标)是 Hermes Agent 中的一个持久化任务管理功能,用于在多个轮次对话会话中保持一个长期目标或任务焦点。
与普通的单次对话不同,Goal 具有以下特点:
- 持久性:Goal 在多个轮次之间持续存在,不会因为单个会话结束而消失
- 指导性:Goal 可以指导 Hermes 的行为,防止偏离目标
- 连续性:Goal 可以分解为多个子目标,Hermes 会逐步推进直到目标完成
- 自动判断:当 Goal 设置后,Hermes 会在后续所有对话中记住这个目标,并围绕它来工作
核心设计理念:
- Goal 作为一个"北极星"(North Star),为多轮对话提供方向指引
- 防止 Hermes 在细碎任务上偏离主要方向
二、Goal 的核心实现机制
2.1 架构组件
Goal 功能由以下组件协同实现:
- GoalManager (
hermes_cli/goals.py) - 状态管理和业务逻辑 - SessionDB (
hermes_state.py) - 持久化存储 - Judge 机制 - 判断目标是否完成
┌─────────────────────────────────────────────────────────┐
│ Hermes 主循环 │
├─────────────────────────────────────────────────────────┤
│ 1. 用户: /goal <目标描述> │
│ 2. GoalManager.set() │
│ ├─ 写入 SessionDB (state_meta) │
│ 3. 下次会话: GoalManager.load() │
│ 4. 注入 system prompt │
│ 5. Hermes 继续工作 │
└─────────────────────────────────────────┘
2.2 GoalManager 核心职责
GoalManager 类负责每个会话的目标状态管理,主要职责包括:
- 状态管理:set, pause, resume, clear, has_goal, is_active, status_line
- 持久化:通过 SessionDB 存储 state_meta,key 为
goal:<session_id> - Judge 调用:调用 judge_goal() 方法,使用辅助模型判断目标是否完成
- 连续性:如果未完成,生成 continuation prompt 注入下一轮对话
数据结构:
@dataclass
class GoalState:
goal: str
status: str = "active" # active | paused | done | cleared
turns_used: int = 0
max_turns: int = DEFAULT_MAX_TURNS
created_at: float = 0.0
last_turn_at: float = 0.0
last_verdict: Optional[str] = None
last_reason: Optional[str] = None
paused_reason: Optional[str] = None
consecutive_parse_failures: int = 0
subgoals: List[str] = field(default_factory=list)
2.3 子命令处理
/goal 命令支持以下子命令:
- 无参数或
status- 查看当前 Goal 状态 <目标描述>- 设置新的 Goalpause- 暂停当前 Goalresume- 恢复当前 Goalclear- 清除当前 Goal
2.4 子命令处理流程
当用户输入 /goal 命令时:
- HermesCLI 会调用
_handle_goal_command() _handle_goal_command()解析命令参数,提取子命令和目标描述- 如果是
set子命令,调用GoalManager.set() - 如果是
pause或resume,调用GoalManager.pause()或resume() - 如果是
clear,调用GoalManager.clear()
三、Goal 的实现原理
3.1 存储机制
Goal 存储在 SessionDB 的 state_meta 表中,key 为 goal:<session_id>
存储位置:~/.hermes/state_meta.db(SQLite 数据库)
数据格式:JSON 序列化后的 GoalState 对象
{
"goal": "目标描述文本",
"status": "active",
"turns_used": 0,
"max_turns": 20,
"created_at": 1717345678.0,
"last_turn_at": 0.0,
"last_verdict": null,
"last_reason": null,
"paused_reason": null,
"consecutive_parse_failures": 0,
"subgoals": []
}
3.2 Judge 机制
每轮对话结束后,_maybe_continue_goal_after_turn() 方法会被调用:
- 从 自动暂停:当用户发送新消息时,会自动暂停 goal loop
- 自动恢复:连续 3 次 judge 解析失败或
consecutive_parse_failures >= parse_failures_threshold
四、Goal 的使用场景
4.1 长期项目开发
/goal 将单体应用重构为微服务架构
后续对话中,Hermes 会记住 Goal,在多轮对话中保持焦点。
当用户偏离目标时,会提醒用户回到 Goal。
示例:
用户:我们现在先处理用户服务
Hermes:[记住 Goal,继续推进用户服务拆分]
...
最终完成
/goal clear
4.2 学习和研究
/goal 掌握 Rust 语言的所有权系统并完成一个实际项目
4.3 问题排查
/goal 排查生产环境内存泄漏问题
五、Goal 的技术细节
5.1 命令解析和参数
/goal 命令的完整语法:
/goal [status] # 查看状态
/goal <目标描述> # 设置新目标
/goal pause # 暂停目标
/goal resume # 恢复目标
/goal clear # 清除目标
参数说明:
- 目标描述:任意文本,描述你要达成的目标
- 子命令:可选,默认为
status、pause、resume、clear
六、Goal 的配置方式
Goal 可以通过配置文件 ~/.hermes/config.yaml 配置默认的轮数预算:
goal:
max_turns: 20 # 默认 20 轮
示例:
goal:
max_turns: 30
6.2 Judge 判断逻辑
Judge 的实现:
- 辅助模型:使用配置的
goal_judge字段指定的小模型(如deepseek-v3-flash、glm-5) - 判断方式:解析 judge 返回的 verdict("done" 或 "continue")
- 超时:默认 30 秒
- 子目标:可选
List[str],默认为 None
Judge 提示:
- 配置文件中需要单独配置
goal_judge字段来指定 judge 使用的辅助模型 - timeout:默认 30 秒
- subgoals:可选子参数,仅在配置了
goal_judge时有效 - parse_failures_threshold:连续解析失败阈值,默认为 False(即不启用)
- consecutive_parse_failures_threshold:连续解析失败次数阈值,默认为 3 次
Judge 流程:
- 从配置加载中读取
config['goal'] - 如果存在且状态为 active,则注入到 system prompt
- Goal 信息作为"北极星指标"指导所有后续对话
- 连续性:如果未完成,将 continuation prompt 注入下一轮对话
- 自动暂停:当用户发送新消息或
consecutive_parse_failures >= threshold - 自动恢复:通过
/goal resume命令恢复。
七、与其他工具的对比
7.1 Hermes Goal vs Codex Goal
Codex Goal:
- 命令:
codex --goal <target> - 特点:
- 任务导向,执行即退出
- 不持久化
Claude Code Goal:
- 命令:
claude-code --goal <目标> - 特点:
- 项目导向,执行即约束在当前目录
- 不跨会话持久化
对比总结表:
| 特性 | Hermes Goal | Codex Goal | Claude Code Goal |
|---|---|---|---|
| 持久性 | 跨会话持续存在 | 单次会话有效 | 单次会话有效 |
| 使用方式 | /goal <目标> |
codex --goal <目标> |
claude-code --goal <目标> |
| 子命令 | status, pause, resume, clear | 无 | 无 |
| 适用场景 | 长期项目指导 | 代码生成任务 | 项目约束 |
| 实现原理 | config.yaml 配置存储 | 命令行参数 | 命令行参数 |
八、总结
Hermes Goal 是一个强大的持久化任务管理功能,核心价值在于:
- 跨会话持久化 - Goal 在多个对话轮次间持续存在,不会因为单个会话结束而消失
- 行为指导 - 作为"北极星"防止对话偏离主要目标
- 上下文连贯 - 保持多轮对话的焦点和方向
- 灵活的状态管理 - 通过子命令灵活控制 Goal 生命周期
- 自动判断完成 - 每轮对话结束后自动用 judge 判断目标是否完成
- 连续性 - 如果未完成,将 continuation prompt 注入下一轮对话
- 自动暂停:当用户发送新消息时,会自动暂停 goal loop
- 自动恢复:通过
/goal resume命令恢复。
配置方式:在 config.yaml 中设置 goal.max_turns 参数。
九、常见问题
Q1: Goal 和 TODO 有什么区别?
A:
- Goal:长期方向性指导,跨会话持久化
- TODO:临时任务清单,单会话有效
使用 todo 工具管理临时任务,使用 /goal 管理长期目标。
Q2: 什么时候应该清除 Goal?
A: 当以下情况时应该清除 Goal:
- 主要目标已经完成
- 项目方向发生重大变化
- Goal 描述不再准确
Q3: Goal 会自动完成吗?
A: Hermes 会根据对话内容判断进度,但:
- 不会自动标记完成
- 建议在里程碑达成时手动
/goal clear - 或者设置新的阶段性 Goal
← 返回博客列表