Наша собственная статистика посещений включена всегда. Google Analytics помогает нам понять, как пользуются нашими публичными страницами (но не вашим рабочим пространством после входа), и включается только с вашего разрешения. См. нашу политику конфиденциальности.

Разделы · 16
  1. 01Задача: что должен находить 24-часовой мониторинг комментариев
  2. 02Что такое Antigravity CLI и какие четыре функции нужны для этой задачи
  3. 03Конфигурация MCP в Antigravity CLI: где лежит mcp_config.json и что в нём писать
  4. 04Один реальный цикл «запрос — ответ»: что отправляет агент и что приходит обратно
  5. 05Мониторинг комментариев на YouTube: 100 комментариев за вызов и сколько времени они охватывают
  6. 06Bilibili: только популярные комментарии и данмаку как второй сигнал
  7. 07Мониторинг в виде Skill: каркас для .agents/skills/comment-patrol/
  8. 08Предфильтр: что ловят правила по ключевым словам и что они пропускают
  9. 09Cron для Antigravity CLI: запуск agy -p через launchd, cron или systemd
  10. 10Стоимость за 24 часа: плата за API за каждый вызов, использование модели — по квоте или токенам
  11. 11Antigravity CLI и Gemini CLI: что изменить при переходе
  12. 12Ограничения: на что обратить внимание
  13. 13Что изменилось за последнее время
  14. 14FAQ
  15. 15С чего начать
  16. 16Источники

Мониторинг комментариев с Antigravity CLI: настройка и реальные данные

Запустите 24-часовой мониторинг комментариев на YouTube и Bilibili с помощью Antigravity CLI. Реальные данные: 100 комментариев охватывали период в 5 часов, а сутки работы обходятся в $0,023 за вызовы API.

Иллюстрация на светлом фоне. В воздухе парят два экрана видеоплеера, и из них в сортировочный шкаф с тремя ящиками сыплется поток карточек комментариев; левый ящик бирюзовый. За ними кольцо, переходящее от ночной луны к дневному солнцу, обозначает 24 часа. Ноутбук в левом нижнем углу показывает терминал со строками команд.

Первые 24 часа после публикации видео задают тон всему разделу комментариев. Три типа комментариев требуют скорого внимания человека: жалобы, настоящие вопросы и комментарии, которые без ответа создают впечатление равнодушия. В этом руководстве мы настраиваем мониторинг комментариев с помощью Antigravity CLI — терминального агента Google, который пришёл на смену Gemini CLI. Команда называется agy. Каждые несколько часов системный таймер запускает agy -p, агент получает новые комментарии и составляет короткий отчёт.

Данные о комментариях поступают с удалённого MCP-сервера EveryInfra. Для YouTube мы используем youtube/comments и youtube/video. Для Bilibili используем bilibili/comments, bilibili/danmaku и bilibili/video. Работу с данными мы действительно протестировали 3 ноября 2026 года с 00:17 до 01:22 по сингапурскому времени (SGT).

Мы провели три цикла мониторинга двух активно обсуждаемых видео: всего было выполнено 20 платных вызовов, а расходы на API составили $0,01137. На нашей тестовой машине Antigravity CLI не установлен. Поэтому приведённые ниже mcp_config.json, Skill и скрипт таймера — это примеры конфигурации, составленные по официальной документации. Сами мы agy не запускали.

Некоторые приведённые в этом руководстве цифры не встречаются ни в одной документации. Через 23,6 часа после публикации у видео на YouTube было 1 546 комментариев. Последние 100 комментариев — максимум за один вызов — охватывали лишь последние 5 часов. Во втором цикле, через 27 минут, новыми из этих 100 оказались только 9. На Bilibili у видео менее чем за 3 часа набралось 4 075 комментариев.

Эндпоинт комментариев вернул 3, 10 и 3 популярных комментария за три цикла. Предварительный фильтр по ключевым словам отметил 34 из 100 комментариев на YouTube, но внимания автора заслуживали только 13. При одном цикле каждые 2 часа полные сутки обходятся в $0,023 за API. Использование модели стоит около $0,103 по публичным тарифам API Gemini 3.8 Flash, причём большая часть этой суммы приходится на фиксированные расходы, связанные с промптом.

Иллюстрация: кольцевой трек с восемью маленькими тележками у станций. На каждой станции два экрана и небольшая стопка карточек с комментариями, по одной станции на цикл мониторинга. Большая тележка в центре собирает карточки в контейнер, в одном бирюзовом ящике лежат отобранные карточки, а бирюзовая пунктирная линия ведёт к карточке отчёта со столбчатой диаграммой.
Каждый цикл забирает только новые комментарии, оставляет важные и добавляет их в общий отчёт. Иллюстрация создана для этой статьи (rolldek gpt-image-2.5). Схема соответствует документации Antigravity CLI по headless-режиму

Задача: что должен находить 24-часовой мониторинг комментариев

Большинство комментариев под новым видео не требуют никакой реакции. Основная масса — эмодзи, шутки, «я первый» и болтовня фанатов. Мониторинг нужен, чтобы найти ту небольшую часть, которая требует действий, и показать её на одном экране. SMM-специалист должен прочитать отчёт с телефона за две минуты. Никто не должен листать 1 500 комментариев в YouTube Studio, чтобы найти три реальные проблемы.

Мы выбрали два видео на разных стадиях. Видео на YouTube — «GTA 6 on PC May be Coming Sooner than We Thought» от Linus Tech Tips (страница видео). Оно вышло 2 ноября в 00:45 SGT. На момент первой выгрузки с момента публикации прошло 23,6 часа; у видео было 794 104 просмотра и 1 546 комментариев.

Видео на Bilibili — первая публикация аккаунта DeepSeek Harness, вышедшая 2 ноября в 21:28 SGT (страница видео). На момент первой выгрузки с момента публикации прошло 2,9 часа; у видео было 225 698 просмотров, 4 075 комментариев и 342 данмаку. Одно видео находится в конце 24-часового окна, другое — в начале.

Строка отчётаПоле источникаПримечание
ID комментария, платформа, видеоid из youtube/comments или bilibili/comments, плюс video_idID сохраняем, имя пользователя отбрасываем
Текст (обрезан до 200 символов)textДанмаку выносятся в отдельный столбец
Временное окноYouTube отдаёт «2 hours ago», а Bilibili отдаёт время в формате ISOМетки YouTube преобразуем при выгрузке
Вовлечённостьlike_count, reply_countУ новых комментариев обычно 0
КатегорияПредфильтр в скрипте плюс проверка модельюЖалоба, вопрос, нужен ответ, прочее
Серьёзность и черновик ответаВывод модели по JSON-схемеДля записей с высоким риском черновик не составляется, их передают человеку
Анимация схемы. В пунктирной рамке вверху перечислена разовая настройка: интерактивно войти в agy, добавить EveryInfra в .agents/mcp_config.json и разрешить 3 инструмента. Шесть скруглённых карточек загораются по очереди: 1. Таймер: launchd, cron или systemd. 2. agy -p загружает Skill comment-patrol. 3. Выгрузка через 3 вызова инструментов MCP. 4. Дедупликация и фильтрация в скрипте, без токенов модели. 5. Проверка моделью с выводом по JSON-схеме. 6. Отчёт, затем проверка stderr и кода выхода. В центре показана стоимость API за цикл: $0,001668 за 3 вызова, работа модели оплачивается отдельно.

Что такое Antigravity CLI и какие четыре функции нужны для этой задачи

Многие, кто ищет «antigravity cli», до сих пор считают, что это новое название Gemini CLI. На самом деле это другой инструмент. 19 мая 2026 года Google Developers Blog объявил о переходе индивидуальных пользователей с Gemini CLI на Antigravity CLI (Google Developers Blog). В тот же день новый инструмент стал доступен всем.

С 18 июня 2026 года Gemini CLI и расширения Gemini Code Assist для IDE перестали обслуживать пользователей Google AI Pro, Ultra и бесплатного тарифа. Организации с корпоративными лицензиями Gemini Code Assist или платными API-ключами сохранили доступ. Те же сроки приводятся в обсуждении #27274 на GitHub.

В посте сказано, что разработчики переписали инструмент на Go, а команда для запуска теперь называется agy. Agent Skills, хуки, субагенты и расширения остались, но расширения теперь называются плагинами. Кроме того, CLI использует общее ядро агента с десктопным приложением Antigravity 2.0. Для этого руководства важны два факта.

Во-первых, у Antigravity CLI закрытый исходный код. В репозитории google-antigravity/antigravity-cli лежат инструкции по установке, примечания к выпускам и обсуждения, но не код. Поэтому всё поведение, описанное в этом руководстве, взято из официальной документации и примечаний к выпускам.

Во-вторых, CLI быстро меняется. API релизов GitHub показывает 20 выпусков: с 1.3.0 (2026-10-06) по 1.4.12 (2026-10-30 UTC) (примечания к выпуску 1.4.12). Промежуточные версии: 1.4.0 от 2026-10-16, 1.4.4 от 2026-10-21, 1.4.8 от 2026-10-27 и 1.4.10 от 2026-10-29. Новый выпуск выходит раз в день-два.

ВерсияДата (UTC)Изменение, важное для мониторинга по расписанию
1.2.92026-09-23Headless-режим ждёт фоновые задачи до истечения --print-timeout, но не дольше 30 минут
1.2.102026-09-24Если потоковый ответ обрывается на середине, процесс завершается с кодом 3
1.3.42026-10-13Если параметру --agent передать неизвестное имя агента, в headless-режиме процесс завершится с кодом 1
1.3.62026-10-15Headless-режим пропускает вопросы от субагентов
1.4.72026-10-24Меньше нагрузки на CPU при запусках с -p; результаты MCP до 10 КБ передаются агенту напрямую
1.4.112026-10-30В JSON-выводе появилось поле finished_reason

Прежде чем копировать примеры ниже, сверьте вывод agy --version на своей машине с документацией.

Функция для этой задачиЧто сказано в документацииИсточник (просмотрен 2026-11-03)
Headless-режим agy -pОдин промпт, вывод результата, выход. --output-format json возвращает обёртку со status и usage. --json-schema включает обязательный структурированный вывод«Headless mode»
Удалённый MCP-серверСерверы описываются в mcp_config.json. Удалённый сервер задаётся через serverUrl и headers. enabledTools открывает агенту только часть инструментовДокументация MCP, руководство по миграции
Agent SkillsSkills рабочей области лежат в .agents/skills/. Глобальные Skills лежат в ~/.gemini/skills/ или ~/.gemini/antigravity-cli/skills/«Agent skills»
Расписание/schedule работает в рамках текущего диалога. Sidecars продолжают работать в разных сессиях, но помечены как функция десктопного приложения. CLI можно запускать по системному таймеру/schedule, «Sidecars»

Конфигурация MCP в Antigravity CLI: где лежит mcp_config.json и что в нём писать

Antigravity CLI выносит MCP-серверы из основного файла настроек в mcp_config.json. Глобальный файл находится в ~/.gemini/config/mcp_config.json. Файл проекта кладётся в .agents/mcp_config.json в корне проекта (руководство по миграции, раздел «MCP config formatting changes»). Ключ адреса удалённого сервера изменился: в Gemini CLI это были url или httpUrl, теперь это serverUrl.

В документации MCP уточняется, что url тоже работает. Данные аутентификации задаются в произвольных headers. Ключ enabledTools задаёт список разрешённых инструментов, поэтому другие инструменты этого сервера агенту не видны. Для timeoutSeconds по умолчанию установлено 300 секунд на подключение и 180 секунд на каждый вызов инструмента (документация MCP, раздел «MCP configuration properties»).

Вот пример для проекта мониторинга. Поместите его в .agents/mcp_config.json:

json
{
  "mcpServers": {
    "everyinfra": {
      "serverUrl": "https://api.everyinfra.com/mcp",
      "headers": { "Authorization": "Bearer <your EveryInfra API key>" },
      "enabledTools": ["everyinfra_call_api", "everyinfra_get_job", "everyinfra_list_capabilities"],
      "timeoutSeconds": 120
    }
  }
}

За каждой строкой стоит решение. В enabledTools мы оставляем только три инструмента. В 00:22 SGT 3 ноября вызов tools/list без ключа показал 12 инструментов на MCP-сервере EveryInfra. Некоторые из них, например поиск аккаунта и тикеты поддержки, к мониторингу отношения не имеют. Лишние инструменты занимают контекст и повышают риск того, что модель выберет не тот инструмент.

Мы ставим timeoutSeconds равным 120 вместо 180. Наш самый медленный синхронный вызов занял 70,48 секунды: 50 комментариев YouTube с сортировкой по популярности. Для вызова, который может занять больше 85 секунд, добавьте в запрос "mode":"async" и опрашивайте everyinfra_get_job. Опрос бесплатный. Не повышайте таймаут раз за разом.

Больше всего внимания требует строка с API-ключом. В официальном примере конфигурации удалённого сервера Bearer YOUR_API_TOKEN прописан прямо в headers. В документации не сказано, что в headers подставляются значения переменных вида ${ENV_VAR}. В старой документации Gemini CLI подстановка $VAR_NAME и ${VAR_NAME} в заголовках поддерживалась (документация Gemini CLI по MCP).

Один пользователь Reddit сообщает, что Antigravity отправляет ${MY_VAR} как буквальную строку (обсуждение в r/google_antigravity). Пока в документации не сказано иное, считайте, что подстановки нет. Либо храните API-ключ в глобальном файле и предоставьте права на его чтение только своей учётной записи, либо оставьте файл проекта, но добавьте .agents/mcp_config.json в .gitignore. Никогда не добавляйте этот файл в репозиторий.

Второй файл отвечает за разрешения. В документации MCP сказано, что для инструмента MCP без правила по умолчанию действует «Ask», то есть каждый вызов ждёт одобрения человеком. Разрешающие правила выглядят как mcp(server/tool) или mcp(server/*) (документация MCP, раздел о разрешениях, документация по разрешениям). В headless-режиме одобрять некому. Поэтому пропишите правила заранее в ~/.gemini/antigravity-cli/settings.json:

json
{
  "permissions": {
    "allow": [
      "mcp(everyinfra/everyinfra_call_api)",
      "mcp(everyinfra/everyinfra_get_job)",
      "mcp(everyinfra/everyinfra_list_capabilities)",
      "write_file(reports/)"
    ]
  }
}

Мы не используем ни mcp(everyinfra/*), ни --dangerously-skip-permissions. Явный список разрешений с именами инструментов безопаснее правила с подстановочным знаком. Если сервер позже добавит инструмент, правило с конкретным именем на него не распространится. Ещё один пользователь Reddit столкнулся с проблемой именно на этом шаге. MCP-сервер отображался как подключённый, но агент сообщал, что не может к нему обратиться.

Помогло явное разрешение в /permissions. Тот же пользователь обнаружил, что файл конфигурации оказался в ~/.gemini/antigravity-cli/, а не в ~/.gemini/config/ (r/google_antigravity, «Antigravity CLI MCP Servers Pain»). После настройки один раз запустите CLI в интерактивном режиме. Выполните /mcp, чтобы проверить состояние сервера, а затем /permissions, чтобы проверить правила. Запускайте задачу по таймеру только после успешного прохождения обеих проверок.

Один реальный цикл «запрос — ответ»: что отправляет агент и что приходит обратно

Запустить agy мы не могли, но удалённому MCP-серверу он отправляет стандартные сообщения MCP. Сначала клиент отправляет tools/list, чтобы получить каталог инструментов, а затем по необходимости tools/call. В спецификации MCP этот транспорт называется Streamable HTTP. Клиент отправляет POST с одним сообщением JSON-RPC, а сервер отвечает JSON или потоком SSE (спецификация MCP 2026-07-28, раздел «Transports»). Поэтому мы обходимся без клиента и отправляем тот же запрос на MCP-эндпоинт EveryInfra.

Мы видим сырой ответ, который сервер отдаёт агенту. CLI ещё может изменить то, что прочитает агент. Например, в примечаниях к выпуску 1.4.7 сказано, что результаты инструментов больше 10 КБ сохраняются в файл. Этот слой мы не тестировали.

В 00:45:27 SGT 3 ноября мы отправили этот tools/call с ключом. Он запрашивает 100 последних комментариев к видео на YouTube:

json
{
  "jsonrpc": "2.0",
  "id": 7,
  "method": "tools/call",
  "params": {
    "name": "everyinfra_call_api",
    "arguments": {
      "platform": "youtube",
      "action": "comments",
      "params": {
        "url": "https://www.youtube.com/watch?v=g9IOdTisQyM",
        "sort": "newest",
        "limit": 100
      }
    }
  }
}

Сервер ответил HTTP 200 через 30,99 секунды. MCP оборачивает бизнес-результат в result.content[0].text в виде JSON-строки размером 33 915 байт. Внутри лежат platform, action, count, results и billing. count равнялся 100, а billing.charged_usd — 0,000556. Первому комментарию было 3 минуты.

Зритель перечислил конфигурацию своего ПК и заметил, что «средний игровой ПК» из выпуска мощноват. Второму комментарию было 9 минут, в нём автор рассказывал, как прошёл ремейк игры на эмуляторе. На скриншоте ниже показан реальный ответ с двумя записями. Имена пользователей скрыты, текст обрезан.

Скриншот реального ответа MCP-сервера EveryInfra на один tools/call. В заголовке: POST https://api.everyinfra.com/mcp, tools/call, 00:45:27 SGT, 30.99s. Верхний блок содержит запрос с именем инструмента everyinfra_call_api, platform youtube, action comments, sort newest и limit 100. Нижний блок содержит фрагмент ответа: count 100, два комментария, опубликованные 3 и 9 минут назад, скрытые имена авторов, пометка о ещё 98 записях и billing charged_usd 0.000556.
Раунд 2, комментарии YouTube через MCP: 100 записей, оплачено как один вызов за $0,000556. Скриншот реального ответа MCP EveryInfra (2026-11-03 00:45 SGT). Подробности о возможности:

Учитывайте такой размер ответа, когда пишете конфигурацию. Согласно примечаниям к выпуску Antigravity CLI 1.4.7, результаты MCP по запросу размером до 10 КБ передаются агенту напрямую. Более крупные сохраняются в файл, и агенту приходится читать этот файл отдельным шагом (примечания к выпуску 1.4.7). Одна страница из 100 комментариев весит около 33 КБ, поэтому всегда идёт через файл.

Для мониторинга это даже удобно. Сырой ответ всё равно стоит сохранять на диск. Skill велит агенту передать файл скрипту dedupe.py, а не загружать 33 КБ JSON в контекст.

Можно обойтись без MCP и вызывать REST-эндпоинт напрямую. Это удобно, если скрипт по таймеру получает данные до запуска agy. Этот способ мы использовали в раундах 1 и 3. Массив results имеет ту же структуру, что и в ответе MCP:

bash
curl -s https://api.everyinfra.com/api/v1/social \
  -H "Authorization: Bearer $EVERYINFRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"youtube","action":"comments","params":{"url":"https://www.youtube.com/watch?v=g9IOdTisQyM","sort":"newest","limit":100}}' \
  > youtube-$(date +%Y%m%d-%H%M).json

Наш совет: начните с MCP, чтобы увидеть, как выглядит хороший отчёт. Когда процесс устоится, перенесите выгрузку и дедупликацию в скрипт, а модели оставьте только оценку. Почему так, объясняется в разделе о предфильтре.

Ошибки тоже являются частью цикла запроса и ответа. Мы отправили в bilibili/comments параметр sort, который этот эндпоинт не поддерживает. В 00:21:33 SGT пришёл HTTP 422 с unknown_param. В сообщении были перечислены допустимые параметры — url и limit, а заканчивалось оно словами «Nothing was charged». Модель может прочитать это сообщение и повторить запрос без недопустимого параметра.

Сбой на стороне сервера выглядит иначе. В раунде 3 в 01:22:15 SGT вызов данмаку вернул HTTP 503 с fault, равным service, то есть сам запрос был корректным. В теле ответа для retryable было указано true, а для retry_after — 20 секунд. В строке next_steps было сказано, что плата за вызов не списана и что это сбой № 1 из 3. Мы отправили тот же запрос через 23 секунды и получили ответ HTTP 200 со 100 данмаку; было списано $0,000556. Скрипт с таймером должен учитывать эти поля: ждать столько секунд, сколько указано в retry_after, прекращать попытки при достижении max_retries, а затем писать в отчёте «Данмаку Bilibili в этом раунде отсутствуют».

Другие способы подключить удалённый MCP-сервер описаны в руководстве по MCP-серверу и в документации.

Этот цикл запроса и ответаИзмеренное значение
Время запроса2026-11-03 00:45:27 SGT
Инструментeveryinfra_call_api, platform=youtube, action=comments
Длительность30,99 с (синхронно; всё, что занимает менее 85 с, возвращается напрямую)
РеагированиеHTTP 200, count 100, тело 33 915 байт
Списание$0,000556 (billing.charged_usd)
По сравнению с раундом 191 запись из 100 уже встречалась, 9 новых

Мониторинг комментариев на YouTube: 100 комментариев за вызов и сколько времени они охватывают

Интервал мониторинга зависит от одного практического числа. Будет ли новых комментариев между двумя раундами больше, чем может вернуть один вызов? В каталоге для youtube/comments указано 20 записей по умолчанию и максимум 100. Необязательные параметры: sort (newest или popular) и since (фильтр по дате).

Поля: id, text, author_name, like_count, reply_count, posted_at, is_reply и reply_to_id. Параметра страницы нет. Значит, за один раунд видно не больше 100 записей.

Раунд 1 прошёл в 00:18 SGT. Возраст видео составлял 23,6 часа, у него было 1 546 комментариев. Мы запросили 100 последних комментариев, и вызов занял 22,2 секунды. У самой новой записи стояла метка «1 minute ago», у самой старой — «5 hours ago». К концу первых суток 100 записей охватывали лишь последние 5 часов.

Три записи были ответами (is_reply равно true), у четырёх был суффикс «(edited)». Если посмотреть с другой стороны, между 18-м и 23-м часами после публикации видео всё ещё набирало около 20 комментариев в час. Если проводить раунд раз в 6 часов, часть комментариев могла бы не попасть ни в одну выгрузку.

После первых суток комментарии продолжали поступать в стабильном темпе, примерно от 20 до 45 в час.

В раунде 2 в 00:45 SGT, через 27 минут после предыдущего, у видео было 1 557 комментариев, на 11 больше. Из последних 100 новыми были 9, а 91 уже встречалась ранее. Эти 100 записей по-прежнему охватывали лишь последние 5 часов.

В раунде 3 в 01:20 SGT, через 35 минут после предыдущего, у видео было 1 583 комментария, на 26 больше. Из последних 100 записей 18 не встречались ни в одном из двух предыдущих раундов, а 82 уже встречались. Если сравнивать только с раундом 2, новыми оказались 19, а 81 запись совпала. Эти 100 записей по-прежнему охватывали лишь последние 5 часов.

Новых записей меньше, чем прирост общего счётчика. Часть разницы объясняют ответы: в раунде 1 среди 100 новейших было 3 ответа, в раунде 2 их не было, в раунде 3 нашёлся 1. Остальное, вероятно, приходится на скрытые или свёрнутые комментарии. Фиксируйте оба числа в каждом раунде и отмечайте любое расхождение в отчёте.

Сгруппированная столбчатая диаграмма возраста видео и времени, охваченного 100 последними комментариями, по раундам. Раунд 1 в 00:18: возраст видео 23,56 часа, 100 последних охватывают не больше 5 часов. Раунд 2 в 00:45: возраст видео 24,0 часа, 100 последних охватывают не больше 5 часов. Раунд 3 в 01:20: возраст видео 24,59 часа, 100 последних охватывают не больше 5 часов. Бирюзовые столбцы показывают охваченное время.
Столбчатая диаграмма с накоплением: новые и уже встречавшиеся записи среди 100 последних комментариев в каждом раунде. Раунд 1 в 00:18: все 100 записей — новые. Раунд 2 в 00:45: 91 запись уже встречалась, 9 новых (бирюзовый сегмент), число комментариев выросло на 11. Раунд 3 в 01:20: 82 записи уже встречались, 18 новых (бирюзовый сегмент), число комментариев выросло на 26.

Параметр sort легко упустить из виду. В тот же момент мы выгрузили ещё 50 комментариев с сортировкой по популярности. Этот вызов занял 70,48 секунды и стал нашим самым медленным синхронным вызовом. У 50 популярных и 100 последних не оказалось ни одной общей записи.

В популярной выборке 30 записей оказались ответами. На них стояли метки от «9 minutes ago» до «23 hours ago», а у самого популярного комментария было 3 500 лайков. Главная задача мониторинга — не пропустить ни одного нового комментария, поэтому в каждом раунде используется сортировка newest. Раз в день мы используем сортировку по популярности, чтобы ответить на другой вопрос: какие комментарии задают тон прямо сейчас?

Поле posted_at содержит относительную метку вроде «N hours ago», а не дату и время публикации. Скрипт должен фиксировать время выгрузки и по каждой такой метке определять временной интервал. Дедупликацию выполняйте только по id комментария. Никогда не используйте для неё время.

ПолеЗамер раунда 1Применение в мониторинге
id100 уникальных значений вида Ugz…AaABAgЕдинственный ключ дедупликации; храните его в state/seen-<video ID>.json
textПолный текст; самая длинная запись содержала 1 876 символовОбрезайте текст в отчёте до 200 символов; полный текст храните локально
posted_atОт «1 minute ago» до «5 hours ago»; в 4 записях стоит «(edited)»Преобразуйте относительную метку, используя время выгрузки; в отредактированном комментарии может появиться новое содержание
like_count, reply_countЛайки были только у 3 из 100 последних записейУ новых комментариев ещё нет вовлечённости; для неё используйте сортировку по популярности
is_reply, reply_to_id3 ответаЧитайте ответ вместе с родительским комментарием, иначе неверно поймёте тон
author_nameЕстьИспользуйте только локально; в отчёт не включайте

Наш совет для YouTube: в первые 6 часов проводите один раунд в час, затем — один раунд каждые 2 часа. Если раунд нашёл ровно 100 новых записей, напишите в первой строке отчёта «в этом раунде могли быть пропущены комментарии». Затем проведите следующий раунд раньше. Это правило уже заложено в приведённое ниже дерево решений Skill. Все поля и параметры описаны на странице API комментариев YouTube. Общее число комментариев и число просмотров берутся из API видео YouTube.

Bilibili: только популярные комментарии и данмаку как второй сигнал

Пример с Bilibili — свежая публикация. Аккаунт DeepSeek Harness выложил своё первое видео 2 ноября в 21:28 SGT. Длительность видео — 200 секунд. Когда мы впервые запросили bilibili/video в 00:20 SGT, возраст видео составлял всего 2,9 часа. У него уже было 225 698 просмотров, 22 070 лайков, 4 075 комментариев и 342 данмаку. Когда видео взлетает в первые часы, мониторинг особенно важен.

Однако bilibili/comments в 00:21 SGT вернул всего 3 комментария за 1,26 секунды. Все три были популярными, с числом лайков от 48 до 212. Они были опубликованы в промежутке от 3 до 131 минуты после выхода видео. В раунде 2 в 00:46 SGT тот же запрос вернул 10 комментариев — это максимум.

Семь из них были для нас новыми, и у них было от 23 до 1 100 лайков. За те же 25 минут счётчик комментариев под видео вырос с 4 075 до 4 566. Это на 491 комментарий больше, то есть свыше тысячи в час. В раунде 3 в 01:22 SGT мы снова установили limit в 10, но запрос вернул только 3 комментария, и все они уже встречались раньше.

Каталог однозначно описывает этот эндпоинт. По умолчанию 10, максимум 10, большее значение обрезается до максимума. Параметров только два: url и limit. Мы попробовали параметр sort и получили описанную выше ошибку 422, без списания. Значит, получить через этот эндпоинт последние комментарии в хронологическом порядке нельзя.

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

Данмаку дают второй сигнал. bilibili/danmaku по умолчанию отдаёт 50 записей, максимум 200. Мы запросили 200 и получили 100. Они были отсортированы по времени в видео, с 0-й по 98-ю секунду, то есть охватывали только первую половину 200-секундного видео. Отправлены они были с 21:35 до 00:19 SGT.

Наше правило по ключевым словам отметило 29 из них как вопросы. Но 15 из этих 29 оказались восторженными выкриками с вопросительными знаками, в духе «Кит?! Неужели кит правда вышел?!». Содержательными оказались лишь несколько других сообщений. В четырёх сообщениях данмаку спрашивали о «режиме выживания», в одном просили десктопное приложение, а ещё в одном спрашивали, дают ли за подписку на аккаунт бесплатные токены. Вопросительный знак ещё не означает вопрос, а в данмаку тем более.

Данмаку (пересказ)Секунда видеоМетка правилаНаша проверка
«Кит?! Неужели правда вышел?!»0–10ВопросВосторг, действий не требует
«А режим выживания есть?»76ВопросВопрос о функции, часть общей темы
«Я как раз искал десктопное приложение»8ВопросВопрос о функции
«Подписчикам дают бесплатные токены?»53ВопросПолушутка, полувопрос
«Вы правда закончите работу вовремя?»25ВопросШутка про плагин обратного отсчёта

Затем тема режима выживания появилась и в популярных комментариях раунда 2. Комментарий с 352 лайками указывал, что в видео режим выживания вообще не упоминается. Четыре разрозненных данмаку и один популярный комментарий говорят об одном и том же. Хороший отчёт сводит их в одну строку: зрители продолжают спрашивать о режиме выживания.

В раунде 2 данмаку снова было 100 записей, заканчивающихся на 98-й секунде. Из них 21 оказалась новой, а общее число данмаку выросло с 342 до 388. Раунд 3 снова остановился на 98-й секунде: 16 новых записей при общем числе 430. Эндпоинт возвращает первые 100 данмаку из первой половины видео. Новое данмаку появится в ответе, только если попадает на этот отрезок таймлайна.

Горизонтальная столбчатая диаграмма: что показывает один вызов Bilibili. Комментарии в раунде 1: 3 из 4 075 (0.1%, бирюзовый). Комментарии в раунде 2: 10 из 4 566 (0.2%, бирюзовый). Комментарии в раунде 3: 3 из 5 121 (0.1%, бирюзовый). Данмаку в раунде 3: 100 из 430. Данмаку охватывают видео до 98-й секунды из 200.
ВозможностьКаталогЧто мы получилиПрименение в мониторинге
bilibili/video26 полей, включая просмотры, лайки, число комментариев и данмакуОдин вызов за 35,3 с, все поля на местеРаз в 4 раунда отслеживать прирост комментариев и данмаку
bilibili/commentsПо умолчанию 10, максимум 10; только url и limit3, 10 и 3 популярных комментария в трёх раундах; sort возвращает код 422 без списанияНаблюдение за популярными комментариями: сообщать, когда они меняются или становятся негативными
bilibili/danmakuПо умолчанию 50, максимум 200Запросили 200, получили 100; записи были отсортированы по времени в видео, и во всех трёх раундах выборка заканчивалась на 98-й секундеПоказывает, в каких местах видео зрители восторгаются или задают вопросы, и помогает найти проблемный фрагмент

Если вы ведёте собственный аккаунт на Bilibili и вам нужны все комментарии, используйте Creator Center. Или подайте заявку на Bilibili Open Platform. Для этого нужны регистрация разработчика, проверка квалификации и проверка приложения (Bilibili Open Platform). Этот путь гораздо сложнее, чем YouTube Data API.

При работе с видео конкурентов или без Bilibili Open Platform ограничьтесь срезом «популярные комментарии плюс данмаку» и прямо укажите это в отчёте. Подробности о параметрах приведены на страницах API комментариев Bilibili и API данмаку Bilibili. Обзоры платформ собраны на страницах API YouTube и API Bilibili.

Мониторинг в виде Skill: каркас для .agents/skills/comment-patrol/

Skill в Antigravity устроен как папка с файлом SKILL.md. В его YAML-заголовке обязательно только поле description. Если name не указан, используется имя папки. На каждом ходу агент видит только название и описание каждого Skill. Полный текст конкретного Skill он читает, только когда этот Skill кажется подходящим.

В документации это называется постепенным раскрытием (документация по Agent Skills). Формат следует открытому стандарту Agent Skills (agentskills.io). Другие инструменты с его поддержкой могут использовать тот же Skill с небольшими изменениями путей. В документации также есть два совета, которые хорошо подходят для мониторинга. Относитесь к скриптам как к чёрным ящикам и позволяйте агенту сначала выполнить --help. Описывайте сложные сценарии в виде деревьев решений.

text
.agents/
  mcp_config.json            # remote MCP config from above (keep out of Git)
  skills/
    comment-patrol/
      SKILL.md
      scripts/
        dedupe.py            # reads state/seen.json, keeps only new rows, turns "2 hours ago" into a window
        prefilter.py         # keyword pre-filter: question, negative, needs reply
      resources/
        report.schema.json   # output schema for --json-schema
state/
  seen-<video ID>.json       # comment IDs already seen, with first-seen time
reports/
  <video ID>-<round>.md
markdown
---
name: comment-patrol
description: Patrol YouTube and Bilibili comments in the 24 hours after a video goes live. Fetch new comments, dedupe, pre-filter, and flag complaints, questions and comments that need a reply. Use when the user asks for a comment patrol, post-launch monitoring, or a check of the comment section.
---

# Comment patrol

## Each round
1. Read `state/seen-<video ID>.json`. Create it in round 1.
2. Call everyinfra_call_api. Use only these capabilities:
   - YouTube: platform=youtube, action=comments, params={url, sort: "newest", limit: 100}
   - Bilibili: platform=bilibili, action=comments, params={url}; then action=danmaku, params={url, limit: 200}
   - Every 4 rounds: youtube/video and bilibili/video, to record comment_count growth
3. Save each response as-is under `data/<round>/`. Run `python3 scripts/dedupe.py --help`, then use it to keep only new rows.
4. Run `scripts/prefilter.py`. Judge only rows it marks as question, negative or needs-reply, plus any theme you see repeated.
5. Output per `resources/report.schema.json`: category, severity, needs_reply, and a draft reply of at most two sentences. Never promise prices or dates.

## Decision tree
- New YouTube rows = 100 (the per-call cap): comments were missed between rounds. Write "this round may have missed comments" on line 1 and suggest a shorter interval.
- Zero new rows: do not call the model. Write "no new comments".
- Refunds, safety, legal or privacy: severity=high, no draft reply, hand to a human.
- Emoji only, "first", or similar: drop it.

## Never
- Never post a comment or reply from the account. This skill is read-only.
- Never put user names or profile links in the report. Use comment IDs only.

Зачем выносить дедупликацию и предварительный фильтр в скрипты, а не просить модель посчитать? Во-первых, стоимость. Сырой ответ на 100 комментариев занимает около 8 075 токенов. В раунде 2 новыми были только 9 записей — около 505 токенов. Во-вторых, такой процесс можно проверить.

Скрипт применяет фиксированные правила: при повторной обработке одних и тех же входных данных результат не меняется. Модель стоит приберечь для шага, где нужно понимание языка. Идея report.schema.json взята из флага --json-schema для headless-режима. Флаг принимает путь к файлу схемы. Полученный после разбора объект затем появляется в поле structured_output выходной обёртки (документация по headless-режиму, раздел «Structured output with a schema»). Скрипт таймера читает только это поле и никогда не извлекает таблицу из свободного текста.

Предфильтр: что ловят правила по ключевым словам и что они пропускают

Прежде чем комментарии увидела хоть одна модель, мы прогнали фиксированные правила по 100 комментариям YouTube из раунда 1. Правила мы написали в 00:29 SGT и не меняли их, увидев новые данные. Вопросом считается текст со знаком вопроса, китайским вопросительным словом или вопросительным словом в начале, например how, why, what, is или can. Негативным комментарий считается, если в нём есть слово из списка (bad, worst, disappointed, clickbait, scam, broken и подобные).

Ответ нужен, если комментарий является вопросом или если он негативный и набрал не меньше 10 лайков. Правила отметили 28 вопросов и 8 негативных комментариев. Всего было отмечено 34 комментария. В выборке из 100 данмаку правила отметили 29 вопросов и ни одного негативного сообщения.

ПравилоОпределениеСрабатывания среди 100 комментариев на YouTubeСрабатывания среди 100 данмаку
ВопросВопросительный знак, вопросительное слово в начале или китайское вопросительное слово2829
НегативСлово из списка негативных слов80
Нужен ответВопрос или негативный комментарий, набравший не менее 10 лайков2829
Любая меткаВопрос или негатив3429

Затем мы вручную прочитали все 34 отмеченных комментария. Наш критерий был таким: комментарий касается этого видео, и автору видео важно знать о нём или ответить на него. Этому критерию соответствовали только 13 комментариев. Большинство из оставшихся 21 — риторические вопросы и споры.

В комментарии «Какая разница, сделано ли это с помощью ИИ?» есть вопросительный знак, но отвечать на него никому не нужно. Один комментарий называл аргумент гостя глупым и начинался с «What», поэтому правило приняло его за вопрос. Эти 13 полезных комментариев делятся на понятные типы. Один зритель спросил, почему видео загрузили с частотой 30 кадров/с.

Двое спросили о полосе размытия на 9:43. Ещё один заметил, что в выпуске обещали вернуться к тесту игры, но так и не вернулись. Другие спрашивали, не пропагандирует ли видео пиратство. Именно такие комментарии должны стоять в начале отчёта мониторинга.

Сгруппированная столбчатая диаграмма работы предварительного фильтра на 100 самых новых комментариях YouTube в раунде 1. Отмечено правилом: всего 34, из них 13 полезных (бирюзовый). Тема «размытие пропало»: 4 комментария, правило поймало 2. Тема «не топовое железо»: 10 комментариев, поймано 2. Тема «просят видео о джейлбрейке»: 6 комментариев, пойман 1. Правило по ключевым словам даёт ложные срабатывания на риторических вопросах и пропускает повторяющиеся отзывы без вопросительных знаков.

Важнее то, что правила пропустили. В 66 неотмеченных комментариях нашлось как минимум три повторяющиеся темы. Первая: размытие пропало. В четырёх комментариях писали, что размытие области с папкой игры на мгновение исчезло.

В одном из них команду просили проверить видео. Это ошибка при подготовке видео, которую автору нужно исправить немедленно, но правило поймало только 2 комментария с вопросительными знаками. Вторая тема: «это не топовое железо». Ведущий назвал тестовый ПК «не особо топовым», и 10 комментариев с этим не согласились.

Правило поймало 2. Третья тема: 6 комментариев просили видео о джейлбрейке PS5, а это готовая идея для ролика. Правило поймало 1.

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

Комментарий (перефразирован, имя пользователя не указано)Метка правилаНаша проверкаЧто должно быть в отчёте
Почему видео загрузили с частотой 30 кадров/с?ВопросПолезныйПроблема при подготовке видео; ответить в закреплённом комментарии
Что за полоса размытия на 9:43?ВопросПолезный, относится к теме «размытие пропало»Высокий приоритет: в видео может быть видно то, что показывать не следовало
Размытие папки не сработало, проверьте видеоНе отмеченПолезный, та же темаОбъединить со строкой выше, счётчик +1
Если это не топовое железо, то что тогда говорить о моём ПК?Не отмеченПолезный, относится к теме «не топовое железо»Одна сводная строка: 10 комментариев оспаривают эту фразу
Сделайте, пожалуйста, видео про джейлбрейк PS5Не отмеченИдея для темыВ раздел «зрители хотят», ответ не нужен
Да какая разница, сделано ли это с ИИ?!ВопросБесполезный (риторический)Не включать в отчёт

Вот как может выглядеть отчёт за раунд 2. Мы собрали его вручную по реальным ответам раундов 1 и 2. Это целевой результат, а не вывод модели:

ПриоритетПлатформаПунктПодтверждениеДействие
ВысокаяYouTubeРазмытие папки на мгновение пропало4 комментария в раунде 1; правило поймало 2Проверить кадры около 9:43; перемонтировать или закрепить пояснение
СредняяYouTubeЗрители оспаривают фразу «не топовое железо»10 комментариев в раунде 1, ещё 2 в раунде 2Закрепить короткое пояснение о тестовом ПК
СредняяBilibiliЗрители спрашивают про «режим выживания»4 данмаку и 1 популярный комментарий с 352 лайкамиОтветить в закреплённом комментарии
НизкаяYouTubeЗрители хотят видео про джейлбрейк PS56 комментариевДобавить в список тем
ИнформацияУ обеих сторонОхват в этом проходеYouTube: 9 новых записей против +11 в общем счётчике. Bilibili: 10 популярных из 4 566Сохранить интервал в 2 часа

Поэтому Skill распределяет работу так. Скрипт удаляет дубликаты, отбрасывает комментарии, состоящие только из эмодзи, и комментарии со словом «первый», а также добавляет к каждой записи метку правила. Модель получает «новые комментарии за этот проход и метки правил». Её задача — отсеивать ложные срабатывания, сводить комментарии по одной теме в одну учитываемую строку и назначать каждой теме уровень серьёзности.

Объём данных для модели растёт совсем немного, зато она находит темы, которые правила пропускают. Уже 2-й проход показал, зачем это нужно. Два из 9 новых комментариев на YouTube снова утверждали, что «средний» тестовый ПК слишком мощный. Ни в одном из них не было слов «high end».

Cron для Antigravity CLI: запуск agy -p через launchd, cron или systemd

В Antigravity есть два встроенных способа запускать задачи по расписанию. Ни один не подходит пользователю CLI, которому нужен мониторинг раз в несколько часов на сервере или ноутбуке. С /schedule агент через встроенный инструмент schedule ставит таймер или cron-выражение из пяти полей. Когда наступает время, инструкция возвращается агенту как уведомление с высоким приоритетом. В документации сказано, что расписание принадлежит создавшему его диалогу и завершается вместе с ним. Для долгосрочных задач между сессиями документация рекомендует sidecar-процессы (документация /schedule).

Sidecar — это фоновый процесс, описанный в ~/.gemini/config/sidecars/<name>/sidecar.json. С "builtin": "schedule" он может вызывать agentapi new-conversation по cron-выражению. Но в начале той же страницы в числе поддерживаемых указано только десктопное приложение Antigravity. Кроме того, sidecar-процессы по умолчанию выключены, и каждый нужно включать в ~/.gemini/config/config.json (документация Sidecars). Остаётся таймер операционной системы, который запускает headless-режим.

ПланировщикСрок действияКонтекст каждого запускаЕсли компьютер в спящем режимеПодходит ли для мониторинга
/schedule (внутри CLI)Только текущий диалогЗапускается с полной историей чатаНе запускается, если процесса уже нетПодходит для мониторинга в первые 2 часа, но не в течение 24 часов
Sidecar + agentapiРаботает между сессиями; управляется приложениемКаждый раз новый диалогТребуется, чтобы десктопное приложение было запущеноОписан только для десктопного приложения
macOS launchd + agy -pСистемный уровень; запускается после входа в системуКаждый раз запускается новый процесс без сохранённого состоянияStartCalendarInterval запускается один раз при пробужденииПодходит; рекомендуется на Mac
cron + agy -pСистемный уровеньКаждый раз запускается новый процесс без сохранённого состоянияПропускает запуски во время сна или выключения и не выполняет их позднееГодится для серверов, на ноутбуках пропускает проходы
Таймер systemd + agy -pСистемный уровеньКаждый раз запускается новый процесс без сохранённого состоянияPersistent=true навёрстывает пропущенное после загрузкиРекомендуется на Linux-серверах

Столбец о спящем режиме основан на документации операционных систем. Apple пишет, что задачи cron не выполняются, пока компьютер спит, и ждут следующего запланированного времени. Задача launchd с StartCalendarInterval, пропустившая время во сне, запускается при пробуждении. Ни та ни другая не выполняется на выключенном компьютере (Apple, «Scheduling Timed Jobs»).

В Linux аналогичный инструмент — параметр Persistent= у таймера systemd (руководство systemd.timer). Синтаксис cron и правила окружения описаны в crontab(5). Cron по умолчанию использует /bin/sh и не читает профиль вашей оболочки, поэтому указывайте полный путь к agy.

Этот пример для launchd запускает один проход каждые 2 часа в macOS. Поместите файл в ~/Library/LaunchAgents/. Не храните скрипты и данные в папках «Рабочий стол» и «Документы», иначе защита конфиденциальности macOS заблокирует доступ к ним:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>com.example.comment-patrol</string>
  <key>ProgramArguments</key>
  <array><string>/Users/you/patrol/run.sh</string></array>
  <key>StartCalendarInterval</key>
  <array>
    <dict><key>Minute</key><integer>5</integer><key>Hour</key><integer>0</integer></dict>
    <dict><key>Minute</key><integer>5</integer><key>Hour</key><integer>2</integer></dict>
    <!-- the other 10 even hours follow the same pattern, 12 rounds in total -->
  </array>
  <key>StandardOutPath</key><string>/Users/you/patrol/logs/out.log</string>
  <key>StandardErrorPath</key><string>/Users/you/patrol/logs/err.log</string>
</dict></plist>

Скрипт run.sh вызывает Antigravity, и здесь нужно учесть три ловушки:

bash
#!/bin/bash
set -uo pipefail
cd /Users/you/patrol
out=$(/usr/local/bin/agy -p "Use the comment-patrol skill on the videos in videos.txt. This is round ${ROUND:-1}." \
  --output-format json \
  --json-schema .agents/skills/comment-patrol/resources/report.schema.json \
  --model gemini-3.8-flash-medium \
  --print-timeout 15m 2> logs/last-stderr.log)
status=$(echo "$out" | jq -r '.status')
reason=$(echo "$out" | jq -r '.finished_reason // "complete"')
if [ "$status" != "SUCCESS" ] || [ "$reason" != "complete" ]; then
  echo "$(date -u +%FT%TZ) patrol failed: $status $reason" >> logs/alerts.log; exit 1
fi
if grep -qi "permission\|denied" logs/last-stderr.log; then
  echo "$(date -u +%FT%TZ) a tool was soft-denied, check permissions.allow" >> logs/alerts.log; exit 1
fi
echo "$out" | jq '.structured_output' > "reports/$(date +%Y%m%d-%H%M).json"
Скриншот официальной документации Antigravity по headless-режиму, раздел Permissions in headless mode. Бирюзовой рамкой выделен абзац: если инструменту требуется подтверждение, которое невозможно получить, запрос на его использование получает мягкий отказ, но запуск продолжается и завершается с кодом 0; в stderr выводится уведомление с названием инструмента и инструкцией, как разрешить его использование. Ниже показаны пример предварительного разрешения инструментов через permissions.allow в ~/.gemini/antigravity-cli/settings.json и предупреждение о флаге, который разрешает сразу все инструменты.
В headless-режиме отказ в разрешении инструменту не приводит к сбою процесса. Код выхода остаётся 0. Документация Antigravity, Headless mode, скриншот сделан 2026-11-03

Первая ловушка — мягкий отказ. В документации сказано, что в headless-режиме нет интерактивных запросов. Инструмент, которому нужно одобрение, а получить его негде, получает мягкий отказ. Запуск продолжается, процесс завершается с кодом 0, а уведомление уходит в stderr (Headless mode, «Permissions in headless mode»). Если правила permissions.allow заданы неверно, каждый запуск по расписанию завершается «успешно», но все отчёты остаются пустыми.

Поэтому скрипт должен читать и stderr. Точного текста уведомления в документации нет. Наш скрипт ищет ключевые слова. Перед запуском в работу намеренно удалите одно из разрешающих правил, один раз посмотрите фактический текст уведомления и скорректируйте условие поиска.

Вторая ловушка — вход в аккаунт. Headless-режим использует кешированные учётные данные, поэтому один раз запустите agy интерактивно и войдите. В среде без терминала и авторизованной сессии команда завершается с ошибкой «authentication required». В README сказано, что учётные данные хранятся в системной связке ключей (README на GitHub, «Authentication»). Поэтому задача launchd должна работать в сессии пользователя, вошедшего в систему. Используйте LaunchAgent, а не LaunchDaemon.

Третья ловушка — тайм-аут. По умолчанию --print-timeout равен 5 минутам. Две платформы, несколько вызовов и обработка моделью могут занять больше, поэтому в нашем примере стоит 15 минут. Версия 1.4.11, вышедшая 30 октября 2026 г. (UTC), добавила в JSON-вывод поле finished_reason. Если запуск был прерван, оно равно print_timeout.

Если ход завершается нормально, поля нет (примечания к выпуску 1.4.11). Теперь скрипт может отличить полный отчёт от неполного. Здесь важно и более раннее исправление. Начиная с версии 1.2.10 от 24 сентября 2026 г. запуск с -p, завершившийся с ошибкой во время потоковой передачи ответа, получает код выхода 3. Он больше не выглядит как успешный (примечания к выпуску 1.2.10).

Скриншот примечаний к выпуску Antigravity CLI 1.4.11 на GitHub. Бирюзовой рамкой выделен пункт, который добавляет поле finished_reason в результаты output-format json и stream-json. В нём сказано, что print_timeout означает истёкший print-timeout и неполный ответ, interrupted означает отменённый запуск, error означает любой другой сбой, а при нормальном завершении хода поля нет. В пункте выше сказано, что хук PreInvocation может вернуть terminate с errorMessage, и это тоже приводит к ненулевому коду выхода у запуска -p.
Примечания к выпуску 1.4.11: finished_reason позволяет скрипту таймера отличить полный отчёт от неполного. Скриншот примечаний к выпуску на GitHub, сделан 2026-11-03

Стоимость за 24 часа: плата за API за каждый вызов, использование модели — по квоте или токенам

Начнём с данных. На 3 ноября 2026 г. каждая из пяти возможностей в этом руководстве стоит в каталоге $0.000556 за вызов: youtube/comments, youtube/video, bilibili/comments, bilibili/danmaku и bilibili/video. Каталог открыт по адресу GET https://api.everyinfra.com/api/v1/social/catalog и не требует ключа. Всегда проверяйте там цену в день запуска. Один проход мониторинга делает три основных вызова, которые вместе стоят $0.001668: 100 новейших комментариев YouTube, популярные комментарии Bilibili и данмаку Bilibili.

Раз в 4 прохода мы добавляем по одному вызову с деталями каждого видео, чтобы отслеживать рост числа комментариев. Неудачные вызовы бесплатны. Наш запрос с ошибкой 422 выше ничего не стоил. Как сверить списания по ID запроса, читайте в статье сверка возвратов средств за неудачные запросы.

ИнтервалПроходов за 24 чВызовы APIПлата за API (по прейскуранту)Использование модели (оценка по ценам API Gemini 3.8 Flash)
Раз в 1 ч2484$0.047$0.205
Раз в 2 ч1242$0.023$0.103
Раз в 3 ч828$0.016$0.069
Раз в 4 ч622$0.012$0.051
Раз в 6 ч414$0.008$0.034

Столбец модели содержит оценку, поэтому приводим методику: подставьте свои цифры. В документации Antigravity по headless-режиму однострочный промпт в JSON-выводе показывает input_tokens, равное 10 415. Из них cache_read_tokens составляет 8 113, а output_tokens равно 657 (Headless mode, «JSON output»). Значит, каждый вызов agy -p несёт около десяти тысяч токенов системного промпта и описаний инструментов.

Для каждого раунда мы берём этот фиксированный вход, где 8 113 токенов идут по цене кеша. Добавляем около 805 токенов данных: 505 на 9 новых комментариев YouTube из раунда 2 и около 300 на инструкции и записи Bilibili. Добавляем также 1 500 выходных токенов.

Цены взяты со страницы тарифов Gemini API, обновлённой 30 октября 2026 г. Gemini 3.8 Flash стоит $0.75 за миллион входных токенов, $3.75 за миллион выходных и $0.075 за миллион кешированных. На странице сказано, что эти цены действуют до 31 декабря 2026 г., а с 1 января 2027 г. удваиваются (Gemini API pricing). Токены данных мы оцениваем как число байтов, делённое на 4. В документации Gemini сказано, что токен — это примерно 4 символа (Gemini API, «Understand and count tokens»). Для англоязычных комментариев это работает, а для китайского текста даёт заниженную оценку.

Сгруппированная столбчатая диаграмма стоимости мониторинга за 24 часа в зависимости от интервала. Раз в 1 час: $0.047 за API и около $0.205 за модель по ценам API. Раз в 2 часа: $0.023 и $0.103. Раз в 3 часа: $0.016 и $0.069. Раз в 4 часа: $0.012 и $0.051. Раз в 6 часов: $0.008 и $0.034. Плата за API показана бирюзовым, оценка модели — серым. Расходы на модель чуть более чем в 4 раза превышают плату за API.
Горизонтальная столбчатая диаграмма токенов, отправляемых модели за раунд. Фиксированный вход headless-режима: 10 415 (тёмный). 100 записей сырого JSON: около 8 075. Только 5 оставленных полей: около 6 153. Только 34 отмеченные записи: около 2 648. Раунд 2 только с 9 новыми комментариями: около 505 (бирюзовый). Токены данных оценены как число байтов, делённое на 4.

Смотрите на обе диаграммы вместе. В этой задаче расходы определяют не данные и не столько токены комментариев, сколько фиксированные затраты при каждом запуске agy. Поэтому экономьте в таком порядке.

Во-первых, увеличьте интервал: проход раз в 2 часа обходится вдвое дешевле, чем раз в час. Во-вторых, не вызывайте модель в проходах без новых комментариев, как предусмотрено деревом решений Skill. Только после этого сокращайте число полей в каждом комментарии.

Также с помощью --model выберите для мониторинга модель уровня Flash. В документации по моделям сказано, что пользователям бесплатного тарифа и Plus доступна только Gemini 3.8 Flash, а для Gemini 4 Argon нужен Pro или Ultra (документация по моделям). Если ваша модель по умолчанию — Argon, тот же мониторинг обойдётся намного дороже. На той же странице указано, что Gemini 4 Argon стоит $2 за миллион входных токенов и $10 за миллион выходных до 30 ноября 2026 г. С 1 декабря цена удваивается.

Частные пользователи не оплачивают этот счёт за токены напрямую. Они расходуют квоту тарифа. В документации Antigravity по тарифам указаны три уровня. У бесплатного уровня недельная квота.

Квота Pro обновляется каждые 5 часов, и у него также есть недельный лимит. У Ultra лимиты выше. Использовать собственный ключ нельзя (документация Plans). В посте о тарифах от 19 мая 2026 г. сказано, что Pro стоит $20 в месяц.

Там же объявлен уровень Ultra за $100, а прежний Ultra за $250 подешевел до $200. Модели Flash и Pro используют один общий пул, который расходуется по ценам API. Уровни за $100 и $200 дают в 5 и 20 раз больше квоты, чем Pro (блог Antigravity, 19 мая 2026 г.). Читайте столбец модели как «сколько квоты в долларах расходует этот мониторинг».

У YouTube есть и бесплатный вариант. commentThreads.list стоит 1 единицу квоты за вызов, а квота по умолчанию составляет 10 000 единиц в день (commentThreads.list, калькулятор квот, обновлено 2026-10-15). Для чтения комментариев к публичным видео достаточно API-ключа. OAuth от владельца видео нужен только для комментариев на модерации или помеченных как вероятный спам.

За это придётся завести проект в Google Cloud, использовать собственную квоту и реализовать логику пагинации; поддержки Bilibili не будет. Если вам нужны обе платформы в одном отчёте без двух интеграций, проще платить за каждый вызов. Полный список цен — на странице Тарифы.

Antigravity CLI и Gemini CLI: что изменить при переходе

Если вы запускали похожий скрипт по таймеру в Gemini CLI, основные изменения касаются расположения конфигурационных файлов и названий ключей. Файлы правил рабочего пространства остаются прежними. Официальная команда импорта agy plugin import gemini превращает старые расширения в плагины и записывает их MCP-определения в mcp_config.json (руководство по миграции, «Converting extensions to plugins»). Кроме того, при первом запуске agy обнаруживает старую конфигурацию и предлагает чек-лист.

Но MCP-серверы, которые вы прописали прямо в ~/.gemini/settings.json, всё равно нужно проверить. Проверьте и настройки доверия. Эту таблицу мы составили, построчно сравнив официальную документацию обоих инструментов:

ПунктGemini CLIAntigravity CLIЧто делать
Командаgemini -pagy -p (псевдонимы --print, --prompt)Замените команду и полный путь в скриптах
Расположение MCP-конфигурацииmcpServers в ~/.gemini/settings.json~/.gemini/config/mcp_config.json или .agents/mcp_config.jsonПеренесите в новый файл
Ключ удалённого адресаurl (SSE) или httpUrl (streamable HTTP)serverUrl (url тоже работает)Переименуйте ключ
Переменные окружения в заголовкахПоддерживаются $VAR и ${VAR}Не описаноСчитайте, что поддержки нет; храните ключ в защищённом файле
Пропуск подтвержденияtrust: true на уровне сервераПравила mcp(server/tool) в permissions.allowРазрешайте каждый инструмент отдельно
Список разрешённых инструментовincludeTools / excludeToolsenabledTools / disabledToolsПереименуйте ключи
Тайм-аутtimeout в мс, по умолчанию 600 000timeoutSeconds, по умолчанию 180 на вызов, 300 на подключениеСмените единицу измерения
Папка Skills проекта.gemini/skills/.agents/skills/Перенесите папку
Файлы правилGEMINI.md, AGENTS.mdТо жеБез изменений
ВходМожно использовать платный API-ключ GeminiАккаунт Google в связке ключей для частных пользователей; проект Google Cloud для компаний; собственный ключ не поддерживаетсяПеред запуском на сервере без участия пользователя проверьте способ входа

Для задач по расписанию важнее всего последняя строка. В документации по тарифам сказано, что для увеличения квоты нельзя подключить собственный ключ или эндпоинт (документация Plans). Разработчики в обсуждении на GitHub жалуются, что новый CLI больше не принимает API-ключ AI Studio (обсуждение #27274). В майском анонсе также сказано, что Gemini CLI по-прежнему работает с платными API-ключами и корпоративными лицензиями. Допустим, ваш мониторинг работает на облачном сервере без графического интерфейса и у вас есть только API-ключ. Тогда, возможно, проще остаться на Gemini CLI. Переходите, когда в документации Antigravity появится описание входа на сервер без участия пользователя.

Официального сравнения квот нет. Один пользователь Reddit сообщает, что Antigravity CLI расходует квоту быстрее. См. вопрос «что расходует меньше квоты» в разделе FAQ в конце.

Но это согласуется с цифрой из официальной документации. В JSON-примере headless-режима у однострочного промпта уже 10 415 входных токенов, из них 8 113 кешированы (Headless mode JSON example). При двенадцати раундах в день только фиксированные накладные расходы дают около 120 000 токенов. В разделе о стоимости выше это учтено.

Третье отличие — доступ к моделям. Gemini 4 Argon появилась в приложении и CLI Antigravity для пользователей Pro и Ultra 13 октября 2026 г. (блог Antigravity). В ветке форума от 14 октября 2026 г. сообщается о проблеме у некоторых пользователей корпоративного тарифа Ultra: они не могли выбрать Argon ни в приложении, ни в CLI (форум разработчиков Google AI). Для мониторинга это мало что меняет, потому что модели Flash достаточно. И всё же после миграции один раз проверьте /model и закрепите модель в скрипте.

Ограничения: на что обратить внимание

Со стороны данных действуют четыре ограничения. Во-первых, не видны комментарии, которые платформа отправляет на проверку. В Справке YouTube сказано, что при настройках «Базовая» или «Строгая» комментарии могут оставаться на проверке в YouTube Studio до 60 дней. Они остаются скрытыми, пока их не одобрят (Справка YouTube, настройки комментариев). Любая третья сторона, включая нас, видит только публичные комментарии. Владельцу канала, которому нужны комментарии на проверке, придётся вызывать YouTube Data API с OAuth и moderationStatus=heldForReview (документация commentThreads.list).

Во-вторых, время в YouTube указано относительными метками вроде «2 hours ago», а у 4 записей в раунде 1 была ещё пометка «(edited)». Пересчитанное время точно лишь до часа, и чем старше комментарий, тем больше погрешность. В-третьих, на Bilibili доступны только популярные комментарии. Мы получили 3, а затем 10 при общем числе 4 075 и 4 566. Полноценно отслеживать «каждый новый комментарий» на Bilibili невозможно, поэтому отслеживайте изменения в популярных комментариях и данмаку.

В-четвёртых, 30 сентября 2026 г. YouTube добавил snippet.imageUrl в ресурсы комментариев, как указано в истории изменений Data API. Комментарии с GIF и изображениями в ноябре станут доступны всем пользователям (история изменений YouTube Data API). В списке полей youtube/comments нет поля для изображения. Комментарий, состоящий только из изображения, отображается с пустым текстом.

Не считайте шумом каждый комментарий с пустым текстом. Кроме того, 23 сентября 2026 г. TechCrunch сообщил, что YouTube тестирует модерацию комментариев, которую каждый автор может настраивать под себя (TechCrunch). По мере расширения теста набор видимых комментариев может меняться.

Со стороны Antigravity: у CLI закрытый исходный код, и он быстро меняется. Это руководство опирается на документацию по состоянию на 3 ноября 2026 г. и примечания к выпуску 1.4.12. В документации по sidecar указано только десктопное приложение. Headless-режим зависит от кешированных данных для входа, а как организовать вход на облачном сервере без участия пользователя, документация не объясняет.

Квота личного тарифа расходуется в зависимости от объёма выполненной работы, а в документации по тарифам сказано, что квоты могут меняться. Считайте наши расчёты стоимости оценкой. Реальные цифры показывает панель /usage (документация /usage).

Наконец, есть ограничения на использование. Skill имеет доступ только для чтения и ничего не публикует. EveryInfra читает публичные данные и не может публиковать от имени вашего аккаунта. Любой черновик ответа отправляет человек из YouTube Studio или Bilibili Creator Center. Храните в отчётах только ID и текст комментариев и никогда не сохраняйте имена пользователей и ссылки на профили. Соблюдайте условия каждой платформы и законодательство о персональных данных там, где вы работаете.

Метки тоже неидеальны. Наши правила по ключевым словам отметили 34 комментария, и только 13 из них заслуживали внимания автора. Кроме того, правила пропустили половину комментариев на тему «размытие слетело».

Метки модели мы не проверяли. Перед запуском в работу разметьте те же 100 комментариев вручную и сравните свою разметку с результатами модели. Элементы с меткой «high» всегда читает человек. Модель лишь сокращает 100 комментариев примерно до дюжины.

Что изменилось за последнее время

  • 30 октября 2026 г. (UTC) Antigravity CLI 1.4.11 добавил finished_reason в --output-format json. В тот же день версия 1.4.12 исправила сломанные Markdown-таблицы в длинных ответах (1.4.11, 1.4.12). Что это значит для вас: скрипт, запускаемый по таймеру, теперь может отличить «отчёт готов» от «прервано по тайм-ауту». Используйте версию 1.4.11 или новее.
  • 29 октября 2026 г. версия 1.4.10 сократила запись в терминал при потоковом выводе примерно на 70%, а интерактивный интерфейс теперь освобождает около 100 МБ памяти после запуска. В примечаниях сказано, что изменение потребления памяти не затрагивает режимы print и headless (1.4.10). Что это значит для вас: многие выпуски ориентированы на интерактивный интерфейс. Прежде чем обновлять задачу, запускаемую по таймеру, проверяйте примечания к каждому выпуску на наличие изменений для headless-режима.
  • 24 октября 2026 г. версия 1.4.7 снизила нагрузку на CPU при запусках с -p в headless-режиме. Она также увеличила размер результатов MCP по запросу, которые возвращаются напрямую агенту, с 4 КБ до 10 КБ (1.4.7). Что это значит для вас: 100 комментариев YouTube занимают около 33 КБ — это всё ещё больше 10 КБ. Сначала сжимайте новые записи с помощью скрипта.
  • 13 октября 2026 г. модель Gemini 4 Argon стала доступна в приложении и CLI Antigravity для пользователей Google AI Pro и Ultra (блог Antigravity). В тот же день версия 1.3.4 изменила поведение в headless-режиме: если передать --agent неизвестное имя, CLI завершается с кодом 1 (1.3.4). Что это значит для вас: для сортировки комментариев достаточно Gemini 3.8 Flash, а опечатка в скрипте теперь приводит к явной ошибке.
  • Страница тарифов Gemini API обновлена 30 октября 2026 г. Для Gemini 3.8 Flash до 31 декабря указаны цены $0,75 за миллион входных токенов и $3,75 за миллион выходных токенов. С 1 января 2027 г. цены удваиваются. Для Gemini 4 Argon до 30 ноября действуют цены $2 и $10, после чего обе цены удваиваются (тарифы Gemini API). Что это значит для вас: квота тарифа расходуется по ценам API (майский пост о тарифах). Google не уточнил, повлияют ли новые цены API на скорость расходования квоты. Первую неделю после запуска следите за /usage.

FAQ

Где хранится MCP-конфигурация Antigravity CLI?

Глобальный файл — ~/.gemini/config/mcp_config.json. Файл проекта — .agents/mcp_config.json в корне проекта, как указано в руководстве по миграции. Один пользователь Reddit обнаружил, что конфигурация записалась в ~/.gemini/antigravity-cli/, и ему пришлось скопировать её в ~/.gemini/config/ (ветка r/google_antigravity). Быстрее всего проверить настройку командой /mcp. (Вопрос из подсказки Google «antigravity cli mcp config».)

Antigravity CLI или Gemini CLI: что расходует меньше квоты?

Официального сравнения нет. В одном посте на Reddit с 35 апвоутами сказано, что Antigravity CLI исчерпал квоту двух аккаунтов Pro за два часа веб-разработки. Gemini CLI за четыре часа израсходовал около 10% (это отчёт одного человека, а не измерение). Что известно: личная квота расходуется по ценам API, Flash и Pro используют общий пул, а каждый вызов в headless-режиме включает около 10 000 фиксированных входных токенов. Для коротких задач вроде мониторинга сначала поручите скрипту удалить дубликаты и предварительно отфильтровать данные. Отправляйте модели лишь несколько сотен токенов новых комментариев и зафиксируйте Flash с помощью --model. (Вопрос из подсказки «antigravity cli vs gemini cli quota» и ветки r/GeminiCLI.)

Можно ли использовать /schedule для cron-задачи Antigravity CLI?

С этой командой можно проверять комментарии каждые несколько минут, пока открыт один диалог. Запустить 24-часовую задачу без участия человека с ней нельзя. /schedule принимает cron-выражения из пяти полей и MaxIterations, но принадлежит текущему диалогу. Для долгих задач документация предлагает sidecar-процессы, а в описании sidecar указано только десктопное приложение. Пользователям CLI надёжнее вызывать agy -p через launchd, cron или systemd. (Вопрос из подсказок «antigravity cli cron job» и «antigravity cli cron expression».)

Что такое режим yolo в Antigravity CLI и стоит ли включать его для таймера?

В справочнике CLI нет флага с названием yolo. Ближе всего к нему --dangerously-skip-permissions, который разрешает все инструменты, и настройка toolPermission: "always-proceed". Мониторингу нужны всего три MCP-инструмента и одна папка для отчётов. Вместо этого перечислите их по имени в permissions.allow. (Вопрос из подсказки «antigravity cli yolo mode». Флаги описаны в справочнике CLI.)

У YouTube уже есть инструмент модерации комментариев. Зачем создавать отдельную систему мониторинга?

Модерация в YouTube Studio помещает подозрительные комментарии в очередь на проверку. Она отвечает на вопрос «что должно оставаться скрытым». Мониторинг отвечает на вопрос «какие публичные комментарии содержат вопросы или жалобы либо требуют ответа». Кроме того, он объединяет YouTube и Bilibili в одном отчёте и работает с видео конкурентов.

Для своего канала используйте оба инструмента: Studio — для комментариев в очереди на проверку, мониторинг — для последующей работы с публичными комментариями. (Вопрос из подсказки «youtube comment moderation tool». Настройки описаны в Справке YouTube.)

Может ли парсер комментариев Bilibili получить все комментарии к видео?

Через bilibili/comments — нет. Согласно каталогу, за один вызов возвращается не больше 10 комментариев, а больший лимит урезается. В нашем тесте эндпоинт вернул 3, а затем 10 популярных комментариев, хотя у видео их было больше четырёх тысяч. Кроме того, он отклоняет параметр сортировки.

Всё видит только владелец видео: в Creator Center или через одобренное приложение открытой платформы. Для мониторинга рассматривайте Bilibili как два сигнала: популярные комментарии и данмаку. (Вопрос из китайской поисковой подсказки, которая означает «парсер комментариев Bilibili».)

С чего начать

  1. Получите API-ключ в разделе Быстрый старт. Сначала изучите бесплатный каталог: GET https://api.everyinfra.com/api/v1/social/catalog?platform=youtube. Сделайте то же для ?platform=bilibili.
  2. На страницах YouTube API и Bilibili API выполните по одному пробному вызову эндпоинта комментариев с URL своего видео.
  3. Создайте .agents/mcp_config.json и добавьте настройку permissions.allow, как показано выше. Один раз запустите agy интерактивно и проверьте /mcp и /permissions.
  4. Поместите Skill в .agents/skills/comment-patrol/. Один раз запустите agy -p вручную. Убедитесь, что structured_output соответствует схеме, а в stderr нет сообщений об отказе в доступе к инструментам.
  5. Передайте запуск launchd, cron или systemd. В первый день запускайте каждые 2 часа, следите, не появится ли в строке 1 «возможно, пропущены комментарии», а затем настройте интервал.

Тот же подход работает и в других ИИ-инструментах. О задачах по расписанию в Claude Code читайте в статье Задачи по расписанию в Claude Code: боли пользователей Reddit. Другой способ подключить Gemini к удалённому MCP-серверу описан в статье Gemini Deep Research API с удалённым MCP. Очистка и разметка комментариев разобраны в статье DeepSeek V4 и Claude Code для очистки комментариев.

Все внешние источники в этом руководстве мы прочитали 3 ноября 2026 г. (SGT). Даты в списке источников — это даты публикации или обновления, указанные на каждой странице.

Источники

  1. Google Developers Blog: «Transitioning Gemini CLI to Antigravity CLI», 19 мая 2026 г.
  2. Обсуждение #27274 в репозитории gemini-cli на GitHub.
  3. «Antigravity CLI migration guide».
  4. «Antigravity CLI reference».
  5. «Antigravity CLI headless mode».
  6. «Antigravity /schedule command».
  7. «Antigravity sidecars».
  8. «Antigravity MCP docs» (вкладка CLI).
  9. «Antigravity Agent skills docs» (вкладка CLI).
  10. «Antigravity permissions docs» (вкладка CLI).
  11. «Antigravity plans docs».
  12. «Antigravity models docs».
  13. «Antigravity CLI modes».
  14. «Antigravity CLI /usage command».
  15. «Antigravity changelog».
  16. Репозиторий google-antigravity/antigravity-cli.
  17. Примечания к выпуску Antigravity CLI 1.4.12, 30 октября 2026 г. (UTC).
  18. Примечания к выпуску Antigravity CLI 1.4.11, 30 октября 2026 г. (UTC).
  19. Примечания к выпуску Antigravity CLI 1.4.10, 29 октября 2026 г.
  20. Примечания к выпуску Antigravity CLI 1.4.7, 24 октября 2026 г.
  21. Примечания к выпуску Antigravity CLI 1.3.4, 13 октября 2026 г.
  22. Примечания к выпуску Antigravity CLI 1.2.10, 24 сентября 2026 г.
  23. Примечания к выпуску Antigravity CLI 1.2.9, 23 сентября 2026 г.
  24. «Gemini CLI MCP docs».
  25. «Antigravity blog: plan changes», 19 мая 2026 г.
  26. «Antigravity blog: Gemini 4 Argon», 13 октября 2026 г.
  27. «Antigravity blog: Gemini 3.8 Flash».
  28. «Google blog: Gemini 4 Argon launch», 30 сентября 2026 г.
  29. «Gemini API pricing».
  30. «Gemini API: understand and count tokens».
  31. «Google AI developer forum: business Ultra users cannot access Gemini 4 Argon in Antigravity», 14 октября 2026 г.
  32. «MCP specification 2026-07-28: Transports».
  33. «Agent Skills open standard».
  34. «YouTube Data API: commentThreads.list».
  35. «YouTube Data API quota calculator».
  36. «YouTube Data API revision history».
  37. «YouTube Help: comment settings».
  38. «TechCrunch: YouTube comment features», 23 сентября 2026 г.
  39. Bilibili Open Platform.
  40. «Apple developer docs: Scheduling Timed Jobs».
  41. «crontab(5) manual».
  42. «systemd.timer manual».
  43. r/google_antigravity: «Antigravity CLI MCP Servers Pain».
  44. r/google_antigravity: «env vars in the MCP config».
  45. r/GeminiCLI: «why Antigravity CLI burns through quota».
  46. The New Stack: «the Gemini CLI replacement», 20 июня 2026 г.
  47. Пример видео на YouTube.
  48. Пример видео на Bilibili.
  49. Каталог EveryInfra: YouTube.
  50. Каталог EveryInfra: Bilibili.

Справка BL-72