Как я научил ИИ-агента будить себя по таймеру

Как я научил ИИ-агента будить себя по таймеру
Содержание

Любой агент по умолчанию реактивен: ответил — и ждёт. Я захотел, чтобы мой opencode сам просыпался по расписанию, продолжал работу без напоминаний и даже перезапускался без моего участия. Рассказываю, как это устроено, какие грабли встретились и как они решились.

Зачем агенту проактивность

У меня есть список задач (я называю его «фронт работ»), и я хочу, чтобы агент не стоял в ожидании, а сам двигался по этому списку: что-то делал, проверял, отчитывался. Ровно так работают дорогие «автономные» агенты — но мне не нужен облачный сервис за сотни долларов, мне нужно на планшете.

Механика: плагин, который будит сессию

opencode умеет плагины на TypeScript. Плагин слушает события: когда сессия завершила работу (session.idle), он запоминает её id. А по таймеру вызывает встроенный метод отправки сообщения в эту сессию. Сообщение попадает в живой диалог — и агент его видит, «просыпается».

Получается будильник для ассистента: каждые N минут он получает пинок «проверь, что ты что-то делаешь», продолжает работу и отчитывается голосом.

Три вида напоминаний

Плагин вырос до трёх типов:

  • Одноразовые — «через 10 минут напомни проверить почту».
  • Периодические — «каждые 5 минут проверяй, что я что-то делаю».
  • Стартовые — «когда opencode запустится, сразу продолжай работу над списком задач» (чтобы не ждать команду после перезапуска).

Плюс управление: посмотреть список, отменить одно, отменить все.

Сессионные и глобальные

Одноразовое напоминание чаще всего ставит сама сессия — «напомни мне про X». По умолчанию доставка идёт в последнюю активную сессию. Но можно указать и конкретную: тогда напоминание придёт именно туда, даже если сейчас активна другая сессия. Это удобно, когда сессий несколько и каждая работает над своим.

Главный грабли: напоминания «сгорали» при простое

Самое коварное выяснилось не сразу. Если сессия простаивает (никто ничего не пишет), событие завершения работы не наступает — и плагин не знал, куда доставлять. Одноразовые напоминания тихо удалялись как «доставленные», хотя на самом деле никуда не попадали. А периодические просто тикали впустую.

Лечится просто: если активной сессии нет, плагин сам ищет последнюю активную через список сессий и доставляет туда. Теперь напоминание не теряется даже при полном простое.

Подтверждение с эскалацией

Бывает, напоминание важное — «проверь, что я не зациклился». Для таких есть режим подтверждения: после доставки напоминание не исчезает, а ждёт, пока агент подтвердит его специальной командой. Если за N минут подтверждения нет — приходит системное уведомление. Так «будильник» не замолкает, а достукивается.

Агент, который перезапускает сам себя

Плагин обновляется только при старте opencode. Раньше каждое обновление требовало «перезапусти меня». Теперь есть внешний супервизор: он запускает opencode и, если видит специальный файл-маркер, поднимает его заново. Агент сам создаёт маркер, убивает себя — супервизор подхватывает и стартует заново, с теми же параметрами. Полный цикл самообслуживания.

А если opencode закрыт?

Если процесс вообще не запущен, плагин не работает. Для этого живёт отдельный фоновый демон — но работает он строго как запасной: доставляет уведомления только когда opencode выключен. Пока агент жив, напоминаниями занимается плагин, и демон не вмешивается. Так нет конкуренции за одно и то же напоминание.

Итог

Теперь мой агент — не пассивный собеседник, а исполнитель: сам следит за списком задач, сам будит себя по расписанию, сам отчитывается и сам перезапускается. Напоминания не теряются, важные требуют подтверждения, а уведомления работают даже когда агент спит. Всё это — плагин на TypeScript и пара скриптов, без облачных сервисов. Эффект ощутимый: меньше ручной работы, больше «само, по плану».

Комментарии

Пока нет комментариев.

Войдите, чтобы комментировать.