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 功能由以下组件协同实现:

  1. GoalManager (hermes_cli/goals.py) - 状态管理和业务逻辑
  2. SessionDB (hermes_state.py) - 持久化存储
  3. 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 状态
  • <目标描述> - 设置新的 Goal
  • pause - 暂停当前 Goal
  • resume - 恢复当前 Goal
  • clear - 清除当前 Goal

2.4 子命令处理流程

当用户输入 /goal 命令时:

  1. HermesCLI 会调用 _handle_goal_command()
  2. _handle_goal_command() 解析命令参数,提取子命令和目标描述
  3. 如果是 set 子命令,调用 GoalManager.set()
  4. 如果是 pauseresume,调用 GoalManager.pause()resume()
  5. 如果是 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                       # 清除目标

参数说明

  • 目标描述:任意文本,描述你要达成的目标
  • 子命令:可选,默认为 statuspauseresumeclear

六、Goal 的配置方式

Goal 可以通过配置文件 ~/.hermes/config.yaml 配置默认的轮数预算:

goal:
  max_turns: 20  # 默认 20 轮

示例

goal:
  max_turns: 30

6.2 Judge 判断逻辑

Judge 的实现

  1. 辅助模型:使用配置的 goal_judge 字段指定的小模型(如 deepseek-v3-flashglm-5
  2. 判断方式:解析 judge 返回的 verdict("done" 或 "continue")
  3. 超时:默认 30 秒
  4. 子目标:可选 List[str],默认为 None

Judge 提示

  • 配置文件中需要单独配置 goal_judge 字段来指定 judge 使用的辅助模型
  • timeout:默认 30 秒
  • subgoals:可选子参数,仅在配置了 goal_judge 时有效
  • parse_failures_threshold:连续解析失败阈值,默认为 False(即不启用)
  • consecutive_parse_failures_threshold:连续解析失败次数阈值,默认为 3 次

Judge 流程

  1. 从配置加载中读取 config['goal']
  2. 如果存在且状态为 active,则注入到 system prompt
  3. Goal 信息作为"北极星指标"指导所有后续对话
  4. 连续性:如果未完成,将 continuation prompt 注入下一轮对话
  5. 自动暂停:当用户发送新消息或 consecutive_parse_failures >= threshold
  6. 自动恢复:通过 /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 是一个强大的持久化任务管理功能,核心价值在于:

  1. 跨会话持久化 - Goal 在多个对话轮次间持续存在,不会因为单个会话结束而消失
  2. 行为指导 - 作为"北极星"防止对话偏离主要目标
  3. 上下文连贯 - 保持多轮对话的焦点和方向
  4. 灵活的状态管理 - 通过子命令灵活控制 Goal 生命周期
  5. 自动判断完成 - 每轮对话结束后自动用 judge 判断目标是否完成
  6. 连续性 - 如果未完成,将 continuation prompt 注入下一轮对话
  7. 自动暂停:当用户发送新消息时,会自动暂停 goal loop
  8. 自动恢复:通过 /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

← 返回博客列表