Как я научил ИИ-агента будить себя по таймеру
Содержание
Любой агент по умолчанию реактивен: ответил — и ждёт. Я захотел, чтобы мой opencode сам просыпался по расписанию, продолжал работу без напоминаний и даже перезапускался без моего участия. Рассказываю, как это устроено, какие грабли встретились и как они решились.
Зачем агенту проактивность
У меня есть список задач (я называю его «фронт работ»), и я хочу, чтобы агент не стоял в ожидании, а сам двигался по этому списку: что-то делал, проверял, отчитывался. Ровно так работают дорогие «автономные» агенты — но мне не нужен облачный сервис за сотни долларов, мне нужно на планшете.
Механика: плагин, который будит сессию
opencode умеет плагины на TypeScript. Плагин слушает события: когда сессия
завершила работу (session.idle), он запоминает её id. А по таймеру вызывает
встроенный метод отправки сообщения в эту сессию. Сообщение попадает в живой
диалог — и агент его видит, «просыпается».
Получается будильник для ассистента: каждые N минут он получает пинок «проверь, что ты что-то делаешь», продолжает работу и отчитывается голосом.
Три вида напоминаний
Плагин вырос до трёх типов:
- Одноразовые — «через 10 минут напомни проверить почту».
- Периодические — «каждые 5 минут проверяй, что я что-то делаю».
- Стартовые — «когда opencode запустится, сразу продолжай работу над списком задач» (чтобы не ждать команду после перезапуска).
Плюс управление: посмотреть список, отменить одно, отменить все.
Сессионные и глобальные
Одноразовое напоминание чаще всего ставит сама сессия — «напомни мне про X». По умолчанию доставка идёт в последнюю активную сессию. Но можно указать и конкретную: тогда напоминание придёт именно туда, даже если сейчас активна другая сессия. Это удобно, когда сессий несколько и каждая работает над своим.
Главный грабли: напоминания «сгорали» при простое
Самое коварное выяснилось не сразу. Если сессия простаивает (никто ничего не пишет), событие завершения работы не наступает — и плагин не знал, куда доставлять. Одноразовые напоминания тихо удалялись как «доставленные», хотя на самом деле никуда не попадали. А периодические просто тикали впустую.
Лечится просто: если активной сессии нет, плагин сам ищет последнюю активную через список сессий и доставляет туда. Теперь напоминание не теряется даже при полном простое.
Подтверждение с эскалацией
Бывает, напоминание важное — «проверь, что я не зациклился». Для таких есть режим подтверждения: после доставки напоминание не исчезает, а ждёт, пока агент подтвердит его специальной командой. Если за N минут подтверждения нет — приходит системное уведомление. Так «будильник» не замолкает, а достукивается.
Агент, который перезапускает сам себя
Плагин обновляется только при старте opencode. Раньше каждое обновление требовало «перезапусти меня». Теперь есть внешний супервизор: он запускает opencode и, если видит специальный файл-маркер, поднимает его заново. Агент сам создаёт маркер, убивает себя — супервизор подхватывает и стартует заново, с теми же параметрами. Полный цикл самообслуживания.
А если opencode закрыт?
Если процесс вообще не запущен, плагин не работает. Для этого живёт отдельный фоновый демон — но работает он строго как запасной: доставляет уведомления только когда opencode выключен. Пока агент жив, напоминаниями занимается плагин, и демон не вмешивается. Так нет конкуренции за одно и то же напоминание.
Итог
Теперь мой агент — не пассивный собеседник, а исполнитель: сам следит за списком задач, сам будит себя по расписанию, сам отчитывается и сам перезапускается. Напоминания не теряются, важные требуют подтверждения, а уведомления работают даже когда агент спит. Всё это — плагин на TypeScript и пара скриптов, без облачных сервисов. Эффект ощутимый: меньше ручной работы, больше «само, по плану».
Комментарии
Пока нет комментариев.
Войдите, чтобы комментировать.