Собственный блог NewsCatcher превратился в инструкцию для ИИ-агентов
ИИ-агенты настроили бесплатный поиск в Google News для моего проекта о крупных кошачьих
В прошлом году я наконец-то автоматизировал свой новостной конвейер о крупных кошачьих. Я ищу, иногда перевожу и публикую новости о крупных кошачьих с 2007 года. Я быстро понял, что у меня нет ресурсов, чтобы поддерживать и расширять его в одиночку. Затем на основной работе я начал работать с ИИ-агентами и понял, что могу управлять ими так же, как управляю младшими разработчиками. Именно это и сделало мой личный проект жизнеспособным для одного человека с помощью ИИ.
Я переработал один конкретный уровень: сам поиск. Остальную часть конвейера я написал вручную в течение 2025 года: перевод, анализ, редактирование, повторный анализ. Он работал исправно. Поиск работал на бесплатном тарифе NewsCatcherAPI для некоммерческих проектов. Бесплатный тариф продлевается каждые несколько месяцев, но только если попросить и показать, что проект до сих пор жив и по-прежнему некоммерческий. 1 сентября 2025 года мой доступ истек. Я не просил о продлении. На тот момент я уже был перегружен другими делами и не возвращался к личному проекту несколько месяцев.
В начале 2026 года моя подписка на NewsCatcherAPI снова заработала на несколько дней. Не знаю, почему. Какие-то статьи попали в мою очередь на просмотр и напомнили, что проект всё ещё существует. К тому времени я уже ежедневно пользовался ИИ-агентами на работе, а ещё начал использовать их для собственного кода. Я также вспомнил пару статей в блоге NewsCatcher о том, как построить сервис, подобный их, с нуля. Я решил поручить ИИ-агенту прочитать эти статьи и перестроить поиск.
В 2025 году я создал систему ИИ-агентов, не зная, что это именно она. Не было ни одного руководства. Конвейер прогоняет несколько ИИ-моделей циклами, переключая провайдеров, когда один из них выходит из строя. Модель-редактор и модель-анализатор пересылают статью туда-сюда, пока не перестанут находить проблемы или не упрутся в лимит циклов. В конце 2025 года я начал работать с ИИ-агентами на основной работе. Я руковожу командой третьей линии поддержки, и большую часть времени уделяю расследованию багов и управлению продуктом в производственной среде. Как только я освоил терминологию, понял, что именно создал.
Я направил ИИ на блог NewsCatcher и попросил провести ещё более широкое исследование. ИИ вернулся с тем, что мне было нужно для поиска, в частности с постом NewsCatcher, в котором были выяснены параметры запроса Google News RSS, которые сам Google не документирует. Оттуда я велел ему реализовать поиск. Самым сложным было расшифровать URL-адреса, которые возвращает Google News. Google не возвращает URL статьи напрямую; он возвращает редирект с закодированным содержимым, а считать это содержимое — задача нетривиальная. ИИ написал декодер, который корректно обрабатывал эту кодировку.
В течение следующих нескольких недель всплывали и другие мелочи. Мне пришлось добавить этап очистки поверх поиска, потому что бесплатные источники возвращают сырой HTML с шаблонным мусором, рекламой и навигацией, которые платный продукт NewsCatcher вырезал для меня. Был ещё баг с запросом Google News, где подстановочные знаки в положительных поисковых терминах в течение нескольких часов молча не возвращали ни одного результата. Я узнал этот паттерн по производственной среде на работе, и исправление оказалось простым. В GDELT тоже была проблема с лимитом запросов, где логика повторных попыток только ухудшала ситуацию; логи показывали, что успешно завершаются менее 5% повторов. Исправлением было их удаление. Новый поиск вписался в конвейер уровня статьи с 2025 года. Но сам конвейер не стоял на месте, пока я работал над поиском.
Всё на основной работе я расследую по логам. Эту же дисциплину я перенёс на личный проект. Я поручил ИИ с самого начала обеспечить качественное логгирование, анализировать логи и отчитываться передо мной. Именно так я обнаружил, что многие статьи срывались — сайты, которые ничего полезного не возвращали на обычный HTTP-запрос. Я поручил ИИ изучить самохостный скрапер и добавить его в цепочку резервных вариантов. ИИ сопротивлялся использованию headless-браузера. Говорил, что браузеры тяжелые, медленные и ещё одна штука, которая может сломаться. Я разрешил ему сначала попробовать более лёгкий вариант. Затем я посмотрел, что возвращается, и оказалось, что более лёгкого варианта недостаточно. Я поручил ему добавить резервный вариант с headless-браузером, несмотря ни на что.
Все изменения конвейера в 2026 году были запрограммированы ИИ под моим руководством, так же как и перестройка поиска. Больше всего итераций ушло на обнаружение «флип-флопов». Я поручил ИИ реализовать это в 2026 году, потому что анализатор и прикладная программа тратили слишком много циклов на статьи, где эти две модели не могли прийти к согласию. Я плачу за токены, которые потребляет конвейер, поэтому рост количества итераций замечаю на своём счёте раньше, чем в логах.
Первая версия хешировала статью целиком и искала полные откаты. ИИ перевёл его на фразовое хеширование, чтобы улавливать частичные откаты, а затем на обнаружение пар исправлений для более мелких флип-флопов, возникающих внутри предложений. Когда флип-флоп подтверждается после двух проверок подряд, отдельный вызов ИИ выбирает лучшую из двух конкурирующих версий и отправляет статью обратно в анализатор для финального прохода. Это оставляет эскалацию в качестве крайней меры, а не автоматического следующего шага. ИИ сообщал о количестве итераций; я решал, что исправлять дальше.
Пользователю требовались собственные исправления. Устаревшие задачи Apply сталкивались с активными задачами Analyze, конечные символы накапливались от цикла к циклу редактирования, не хватало предохранителей по количеству предложений, а диф-верификатор — этап, проверяющий, что изменилось между двумя версиями, — не получал необходимых правок для обработки слияний и разбиений.
Запуск нового поиска каждый час также обнажил проблемы на уровне рабочего процесса очереди. ИИ построил самомасштабируемый пул рабочих процессов, механизм восстановления после принудительного завершения для длительных задач, которые хостинговая среда то и дело останавливала, и исправления для запусков рабочих процессов, которые незаметно срывались из-за запуска не той версии PHP. Ничто из этого не является новаторской работой. Каждая производственная система, масштабно обрабатывающая задачи, рано или поздно решает эти проблемы. Решить их в личном проекте одного человека означало использовать те же шаблоны, которые я использую на работе для производственного продукта.
Продукт NewsCatcherAPI — лучший в своём роде. Я сравнивал его с другими сервисами, и остальные — слабее. Бесплатный доступ для некоммерческих и академических проектов — щедрый. Для коммерческого использования я бы платил за него сам. NewsCatcherAPI — компания, основанная украинцами, и поскольку я ищу новости уже 19 лет, мне очень нравится, что такой сервис создали украинцы. Мой собственный проект публикует новости на украинском языке, в чём и заключается весь смысл его существования. Эта перестройка — не жалоба на NewsCatcherAPI. Они возвращают больше новостей, чем один человек способен просмотреть вручную, и перестройка соответствует размеру проекта, который я веду в одиночку, чтобы поддерживать свои навыки в тонусе.
Проект снова жизнеспособен. Новый поиск работает каждый час, а ИИ-агенты отмечают то, что требует просмотра человеком. Я просматриваю то, что они отмечают, точно так же, как просматривал бы то, что приносит мне помощник. Если ты сам управляешь ИИ-агентами, мне было бы интересно услышать, как ты с этим справляешься.