Voice Agent: Добавил поиск новостей в чат-бота за три часа отладки

Voice Agent: Как я добавил интеллектуальную систему сбора IT-новостей
Когда разработчик говорит: «А давай добавим поиск по новостям прямо в чат-бота?» — обычно это означает три часа отладки и переосмысления архитектуры. Но в проекте Voice Agent это было неизбежно.
В чём была суть задачи
Система должна была собирать актуальные IT-новости, анализировать их через AI и выдавать релевантные новости прямо в диалог. Звучит просто, но в реальности это означало:
- Интегрировать веб-поиск в FastAPI бэкенд
- Построить асинхронную очередь задач
- Добавить фоновый worker, который проверяет новости каждые 10 секунд
- Хранить результаты в SQLite через aiosqlite для асинхронного доступа
- Все это должно работать в монорепо вместе с React фронтенд-ом и Telegram Mini App
Первым делом я разобрался: этот проект — это не просто чат, это целая система с голосовым интерфейсом (используется русская модель Vosk для локального распознавания). Добавлять новости сюда значило не просто расширять функционал, а интегрировать его в существующий пайплайн обработки.
Как это реализовывалось
Я начал с бэкенда. Нужно было создать:
- Таблицу в БД для хранения новостей — всего несколько полей: заголовок, ссылка, AI-анализ, дата сбора
- Scheduled task в asyncio, которая периодически срабатывает и проверяет, не появились ли новые новости
- Tool для LLM — специальный инструмент, который агент может вызывать, когда пользователь просит новости
Неожиданно выяснилось, что интеграция веб-поиска в монорепо с Turbopack требует аккуратности. Пришлось разобраться с тем, как правильно настроить окружение так, чтобы бэкенд и фронт не конфликтовали между собой.
Небольшой экскурс в историю
Кстати, знаете ли вы, почему в веб-скрапинге всегда советуют ограничивать частоту запросов? Это не просто вежливость. В начале 2000-х годов поисковики просто блокировали IP-адреса агрессивных ботов. Сейчас алгоритмы умнее — они анализируют паттерны поведения. Поэтому каждые 10 секунд с задержкой между запросами — это не параноя, а best practice.
Что получилось
В итоге Voice Agent получил новую возможность. Теперь:
- Система автоматически собирает IT-новости из разных источников
- AI-модель анализирует каждую статью и выделяет суть
- Пользователь может спросить: «Что нового в Python?» — и получить свежие новости прямо в диалог
- Все это работает асинхронно, не блокируя основной чат
Дальше план амбициозный — добавить персонализацию, чтобы система учила, какие новости интересуют конкретного юзера, и научиться агрегировать не только текстовые источники, но и видео с YouTube. Но это уже следующая история.
Главное, что я понял: в монорепо надо всегда помнить о границах между системами. Когда ты добавляешь асинхронный воркер к FastAPI-приложению, который работает рядом с React-фронтенд-ом, мелочей не бывает.
«Если WebSearch работает — не трогай. Если не работает — тоже не трогай, станет хуже.» 😄
Метаданные
- Session ID:
- grouped_C--projects-ai-agents-voice-agent_20260206_2254
- Branch:
- main
- Dev Joke
- Если Jest работает — не трогай. Если не работает — тоже не трогай, станет хуже.
Часть потока:
Разработка: ai-agents-voice-agent