sidebar_position: 16 title: "Persistent Goals" description: "Set a standing goal and let Hermes keep working across turns until it's done. Our take on the Ralph loop." lang: ru


Постоянные цели (/goal)

/goal дает Гермесу постоянную цель, которая сохраняется в разные ходы. После каждого хода облегченная модель судьи проверяет, удовлетворена ли цель последним ответом ассистента. В противном случае Hermes автоматически отправляет приглашение на продолжение обратно в тот же сеанс и продолжает работать — до тех пор, пока цель не будет достигнута, вы не приостановите или не очистите ее, или пока не закончится бюджет хода.

Это наш подход к циклу Ральфа, вдохновленный /goal [Codex CLI 0.128.0] Эриком Траутом (OpenAI). Основная идея — сохранять цель на протяжении всего хода и не останавливаться, пока она не будет достигнута — принадлежит им. Реализация здесь независима и адаптирована к архитектуре Hermes.

Когда это использовать

Используйте /goal для задач, в которых вы хотите, чтобы Hermes выполнял итерацию самостоятельно, без повторного запроса на каждом шагу:

Задачи, в которых агент делает один оборот и останавливается, не нуждаются в /goal. Задачи, где в противном случае вам пришлось бы трижды сказать «продолжай», — вот где это сияет.

Быстрый старт

/goal Fix every failing test in tests/hermes_cli/ and make sure scripts/run_tests.sh passes for that directory

Что вы увидите:

  1. Цель принята⊙ Goal set (20-turn budget): <your goal>
  2. Ход 1 — Гермес начинает работать так, как будто вы отправили цель как обычное сообщение.
  3. Судья бежит — после хода судья-модель решает done или continue.
  4. При необходимости срабатывает цикл — если continue, вы увидите ↻ Continuing toward goal (1/20): <judge's reason>, и Hermes автоматически выполнит следующий шаг.
  5. Завершается — в конечном итоге вы увидите либо ✓ Goal achieved: <reason>, либо ⏸ Goal paused — N/20 turns used.

Команды

Команда Что он делает
/goal <text> Установите (или замените) постоянную цель. Сразу начинается первый поворот, поэтому вам не нужно отправлять отдельное сообщение.
/goal или /goal status Показать текущую цель, ее статус и использованные ходы.
/goal pause Остановите цикл автопродолжения, не очищая цель.
/goal resume Возобновите цикл (сбрасывает счетчик ходов обратно в ноль).
/goal clear Полностью отбросьте цель.

Работает одинаково на CLI и на каждой платформе шлюза (Telegram, Discord, Slack, Matrix, Signal, WhatsApp, SMS, iMessage, Webhook, сервер API и веб-панель).

Подробности поведения

Судья

После каждого хода Гермес вызывает вспомогательную модель с помощью:

Судья намеренно консервативен: он отмечает цель done только тогда, когда ответ явно подтверждает, что цель достигнута, когда окончательный результат явно получен или когда цель недостижима/блокирована (расценивается как ВЫПОЛНЕНО с причиной блокировки, чтобы мы не сжигали бюджет на невыполнимые задачи).

Семантика аварийного открытия

Если судья ошибается (сбой в сети, неверный ответ, недоступный дополнительный клиент), Hermes рассматривает вердикт как continue — сломанный судья никогда не тормозит прогресс. Бюджет оборота – это настоящая поддержка.

Свернуть бюджет

По умолчанию — 20 повторных ходов (goals.max_turns в config.yaml). Когда бюджет исчерпан, Hermes автоматически делает паузу и сообщает вам, как действовать дальше:

⏸ Goal paused — 20/20 turns used. Use /goal resume to keep going, or /goal clear to stop.

/goal resume сбрасывает счетчик на ноль, так что вы можете продолжать работу по частям.

Сообщения пользователя всегда вытесняются

Любое реальное сообщение, которое вы отправляете, пока цель активна, имеет приоритет над циклом продолжения. В CLI ваше сообщение попадает в _pending_input перед продолжением в очереди; на шлюзе он проходит через FIFO адаптера таким же образом. Судья снова бежит после вашего хода — поэтому, если ваше сообщение достигает цели, судья поймает его и остановится.

Безопасность на середине пути (шлюз)

Пока агент уже запущен, запуск /goal status, /goal pause и /goal clear безопасен — они касаются только состояния плоскости управления и не прерывают текущий ход. Установка новой цели в середине пробега (/goal <new text>) отклоняется с сообщением, в котором вам предлагается сначала /stop, поэтому старое продолжение не может соревноваться с новым.

Настойчивость

Состояние цели находится в SessionDB.state_meta с ключом goal:<session_id>. Это означает, что /resume продолжится с того места, на котором вы остановились — установите цель, закройте ноутбук, вернитесь завтра, /resume, а цель по-прежнему будет стоять точно так же, как вы ее оставили (активная, приостановленная или выполненная).

Кэш подсказки

Приглашение продолжения представляет собой простое сообщение о роли пользователя, добавляемое в историю. Он не не изменяет системную подсказку, не меняет наборы инструментов и не затрагивает разговор каким-либо образом, который делает недействительным кеш подсказок Hermes. Выполнение цели из 20 ходов требует такого же кэша, как и 20 ходов обычного разговора.

Конфигурация

Добавьте в ~/.hermes/config.yaml:

goals:
  # Max continuation turns before Hermes auto-pauses and asks you to
  # /goal resume. Default 20. Lower this if you want tighter loops;
  # raise it for long-running refactors.
  max_turns: 20

Выбор модели судьи

Судья использует вспомогательное задание goal_judge. По умолчанию она соответствует вашей основной модели (см. Вспомогательные модели). Если вы хотите направить судью на дешевую и быструю модель, чтобы снизить затраты, добавьте переопределение:

auxiliary:
  goal_judge:
    provider: openrouter
    model: google/gemini-3-flash-preview

Вызов судьи небольшой (около 200 жетонов вывода) и выполняется один раз за ход, поэтому обычно подходящим решением является дешевая быстрая модель.

Пример прохождения

You: /goal Create four files /tmp/note_{1..4}.txt, one per turn, each containing its number as text

   Goal set (20-turn budget): Create four files /tmp/note_{1..4}.txt, one per turn, each containing its number as text

Hermes: Creating /tmp/note_1.txt now.
  💻 echo "1" > /tmp/note_1.txt   (0.1s)
  I've created /tmp/note_1.txt with the content "1". I'll continue with the remaining files on the next turn as you specified.

   Continuing toward goal (1/20): Only 1 of 4 files has been created; 3 files remain.

Hermes: [Continuing toward your standing goal]
  💻 echo "2" > /tmp/note_2.txt   (0.1s)
  Created /tmp/note_2.txt. Two more to go.

   Continuing toward goal (2/20): 2 of 4 files created; 2 remain.

Hermes: [Continuing toward your standing goal]
  💻 echo "3" > /tmp/note_3.txt   (0.1s)
  Created /tmp/note_3.txt.

   Continuing toward goal (3/20): 3 of 4 files created; 1 remains.

Hermes: [Continuing toward your standing goal]
  💻 echo "4" > /tmp/note_4.txt   (0.1s)
  All four files have been created: /tmp/note_1.txt through /tmp/note_4.txt, each containing its number.

   Goal achieved: All four files were created with the specified content, completing the goal.

You: _

Четыре хода, один вызов /goal, никаких подсказок «продолжать» от вас.

Когда судья ошибается

Ни один судья не идеален. Два режима отказа, на которые следует обратить внимание:

Ложноотрицательный результат — судья говорит продолжать, когда цель действительно достигнута. Бюджет хода учитывает это. Вы увидите ⏸ Goal paused и сможете /goal clear или просто отправить новое сообщение.

Ложное срабатывание — судья говорит, что дело сделано, когда работа еще осталась. Вы увидите ✓ Goal achieved, но вам виднее. Чтобы продолжить, отправьте дополнительное сообщение или более точно измените цель: /goal <more specific text>. Подсказка судейской системы намеренно консервативна, чтобы ложноположительные результаты были реже, чем ложноотрицательные.

Если вы считаете вердикт судьи неубедительным, текст причины в строке ↻ Continuing toward goal или ✓ Goal achieved точно расскажет вам, что увидел судья. Обычно этого достаточно, чтобы определить, был ли целевой текст неоднозначным или ответ модели.

Атрибуция

/goal — это вариант петли Ральфа от Hermes. Ориентированный на пользователя дизайн — сохраняйте цель на протяжении всего хода, не останавливайтесь, пока она не будет достигнута, с помощью элементов управления созданием/паузой/возобновлением/очисткой — был популяризирован и реализован в Codex CLI 0.128.0 Эриком Траутом из команды OpenAI Codex. Наша реализация независима (центральный реестр CommandDef, постоянство SessionDB.state_meta, судья вспомогательного клиента, продолжение адаптера-FIFO на стороне шлюза), но идея принадлежит им. Кредит там, где кредит причитается.