Чтобы понять жизненный цикл агента DeepSeek Harness, отслеживайте наблюдаемые границы, а не отдельный сигнал состояния. DeepSeek Harness — это сторонний проект с открытым исходным кодом, находящийся на стадии предварительного просмотра. Данное руководство не описывает продукт OdiRouter, партнерские отношения, встроенную интеграцию или официальную поддержку. В нем приведено краткое изложение официальной документации проекта и репозитория, находящегося в коммите 99f6f02fecdb7dff40c3fbc9470f5907c29f74ca. Ссылка OdiRouter ведёт на домен бренда и не является свидетельством связи с проектом.
Названия и эффекты жизненного цикла могут меняться. Проверенный выпуск dsh-v0.1.0-rc.7 помечен как предварительный, а на сайте документации проект также обозначен как предварительный. Прежде чем полагаться на эти имена, сравните установленную версию с текущей схемой жизненного цикла и типами проекта.
Что в документации понимается под ходом и шагом
В архитектурной документации ход определяется как ноль или более шагов. Ход открывается до захвата первого входного сообщения и закрывается, когда не остаётся невыполненных обязательств. Шаг — это один запрос к модели и инструменты, вызываемые этим запросом.
Это различие важно на практике:
turn/startне означает, что запрос к модели уже начался.step/startпоявляется только после того, как предшаговый обработчик допускает шаг.В ходе может не быть
step/startилиstep/end, в том числе если первый предложенный шаг отклонён или его входные данные становятся пустыми.turn/endзакрывает ход. Это не результат для каждого сообщения во всей очереди агента.
Границы ходов и шагов являются устойчивыми событиями сеанса. На странице жизненного цикла факты воспроизведения относятся к session/event, а agent/* используется для координации в реальном времени, активности очереди входящих сообщений, статуса и перехвата. Используйте первую область для воспроизводимых свидетельств, а вторую — для текущей активности агента.
От работы с очередью входящих сообщений к открытому ходу
Диаграмма начинается с followup(content). Сообщение поступает в очередь входящих сообщений, агент публикует изменения очереди, а цикл управления сообщает о agent/status как о running, прежде чем зарегистрировать turn/start.
Затем цикл управления забирает ожидающие входные данные следующего шага и один поставленный в очередь запрос. Каждое забранное сообщение получает уведомление agent/inbox/claimed. Далее следует каскад обработчиков agent/pre-step.
Решение, возвращаемое обработчиком agent/pre-step, управляет предложенным шагом. Оно может допустить эти сообщения или отклонить предложенную работу. Если решение отклоняет работу, захваченная группа сообщений остаётся удалённой, а открытый ход не расходует шаг. Поэтому потребителю не следует ожидать step/start после каждой вставки в очередь входящих сообщений.
Обычный путь в рамках одного шага
Когда предварительная проверка шага допускает работу, официальная последовательность показывает следующий порядок:
Цикл управления регистрирует
step/startи добавляет допущенные входные данные какuser/message.system-prompt/assembleформирует системную инструкцию. Затемagent/requestиllm/streamвыполняют запрос к модели.Поток создаёт события
assistant/chunk, доступные черезsession/event.Успешный ответ регистрирует
assistant/message. Когда модель запрашивает инструменты, цикл управления классифицирует вызовы, регистрируетtool/call, запускает инструменты и регистрируетtool/resultпо мере готовности результатов.Шаг завершается
step/end.
Планирование инструментов зависит от режимов выполнения и барьеров, показанных на диаграмме. Не создавайте интеграцию, предполагающую, что все инструменты запускаются или завершаются в едином общем порядке.
Ошибки запроса, ещё один шаг и естественная остановка
Неустранимая внутрипоточная ошибка запроса завершает текущий шаг, а затем вызывает каскад обработчиков agent/request-error. В документации по жизненному циклу указано, что обработчик может вернуть решение о повторной попытке или сохранить исходную ошибку. В ней описан путь уплотнения, использующий этот маршрут при переполнении канонического контекста. Эта деталь не гарантирует, что каждый запрос, завершившийся неудачей, будет повторен.
Ход может продолжаться, когда работа с инструментами требует ещё одного запроса к модели или когда в очереди входящих сообщений следующего шага уже есть входные данные. Цикл управления может забрать следующую партию и начать ещё один шаг. При естественной остановке с пустой очередью входящих сообщений следующего шага диаграмма показывает последовательную контрольную точку agent/turn-stopping, затем turn/end, после чего agent/status возвращается к idle.
Отмена и значение завершения
Публичный контракт cancel(cause, options?) очищает ожидающие и управляющие сообщения в очереди входящих сообщений, если не задан keepInbox, и прерывает активный ход или работу между ходами. При использовании keepInbox активный ход всё равно прерывается, а ожидающие сообщения сохраняются для последующего хода. Если никаких активных действий не происходит, отмена не влечет за собой никаких изменений и не активирует будущую работу.
В проверенном контракте в качестве причин отмены указаны user, parent, hook и disposed. Сохраняемое в журнале событие turn/end фиксирует более общий результат { kind: 'aborted' }. Причина отмены не становится отдельным долговечным результатом лишь потому, что ход завершился.
whenIdle() ожидает состояния покоя всего агента, включая заменяющую работу, начатую до завершения наблюдаемого цикла управления. whenIdle() не подтверждает завершение или результат обработки отдельного сообщения. running может охватывать несколько последовательных ходов, поставленных в очередь, и не доказывает, что конкретный ход открыт. Автоматизация, которой необходимо связать входные данные с результатом, должна определить собственный интервал, например от долговечного подтверждения вставки сообщения в очередь входящих сообщений до следующего idle всего агента, и учитывать отмену, уничтожение и незапущенную работу.
Контрольный список реализации
Перед тем как использовать имена, относящиеся к жизненному циклу проекта, запишите версию проекта, коммит и источник типов.
Используйте
session/eventдля воспроизводимых свидетельств, аagent/*— для координации в реальном времени.Наблюдайте за
turn/startиturn/endотдельно отstep/startиstep/end.Считайте отсутствие шага после
agent/pre-stepдокументированно возможным вариантом.Определите, должна ли ожидающая работа в очереди входящих сообщений переживать отмену через
keepInbox.Не связывайте вывод ассистента или завершение только с одним
followup()лишь потому, что изменилсяagent/statusили разрешился вызовwhenIdle().
Актуальные сведения см. в документации о жизненном цикле, архитектурной документации и контракте агента. OdiRouter фигурирует здесь только через свой домен бренда, а не как доказательство связи с DeepSeek Harness.