LEAD RADAR
Сервис, который превращает поток Telegram-каналов в проверяемый конвейер лидов.
- ROLE
- PRODUCT · SETUP · REVIEW
- STACK
- Python · SQLite/WAL · Telegram · Groq · systemd · Ubuntu VDS
- STATUS
- IN PRODUCTION
- 01SOURCESреестр источников
- 02INGESTнормализация, дедуп
- 03LEDGERSQLite/WAL, провенанс
- 04PRE-FILTERдетерминированный отбор
- 05QUALIFYответ модели, схема
- 06RANKранжирование, дедуп показа
- 07DIGESTдва окна в день, до 10 карточек
- 08OWNERрешение владельца
CONTEXT
Руками просматривать много Telegram-каналов — шумно, однообразно и легко отстать. Интересное тонет в потоке, а через день его уже не найти.
Нужен был не бот-пересылка, а сервис: с реестром источников, собственной памятью и понятной ответственностью за каждое решение.
PROBLEM
Поток сообщений нужно нормализовать и дедуплицировать, иначе одно и то же приходит по нескольку раз.
Модель нельзя пускать на весь объём: это дорого и медленно. До неё должен работать детерминированный отбор.
Ответ модели нельзя принимать на веру: нужна строгая схема, валидация и кэш, чтобы одинаковый текст не квалифицировался дважды.
Доставка должна переживать перезапуск: если процесс упал в середине отправки, дайджест не должен потеряться или задвоиться.
APPROACH
Границы разведены: читатель Telegram и бот-доставка — разные боундари. Обработчики событий быстро сохраняют и никогда не ждут вызова модели.
Перед моделью стоит детерминированный пре-фильтр, настроенный на полноту: лучше пропустить лишнее дальше, чем потерять релевантное.
Квалификация — один структурированный запрос без инструментов, с последующей строгой валидацией и неизменяемым сохранением анализа.
Владелец принимает финальное решение сам. Система готовит и ранжирует, но не решает за человека.
SYSTEM / ARCHITECTURE
- SOURCES
- постоянный реестр источников с идемпотентной сверкой и изоляцией сбоев
- INGEST
- версионированная нормализация, точная дедупликация по источнику и id сообщения
- LEDGER
- долговечный журнал приёма: переживает удаление payload и сохраняет идентичность для восстановления
- PRE-FILTER
- детерминированный отбор до любого обращения к модели
- QUALIFY
- провайдеро-независимый интерфейс с адаптером Groq: строгая схема, пейсинг, Retry-After, глобальный кулдаун, лизы, состояние предохранителя
- RANK
- детерминированное ранжирование, дедупликация показа по содержимому, ограниченный перенос PRIORITY ровно в одно следующее окно
- DIGEST
- окна 10:00 и 16:00 в заданной таймзоне, максимум 10 карточек на окно; пустое окно закрывается как skipped
- OWNER
- действия только для владельца, атомарные решения и транзакционный outbox
REAL OUTPUT
Три состояния одного конвейера: как выглядит квалифицированная карточка, чем она отличается от карточки тиром ниже и что с ней делает владелец. Совпадение — оценка конкретного лида, а не точность сервиса.
- 05.AQUALIFICATION← 05 QUALIFY
EXTRACTED SIGNAL- ТИР
- ПРИОРИТЕТ
- НАПРАВЛЕНИЕ
- ПАРСИНГ
- БЮДЖЕТ
- 1 000 – 3 000 ₽
- РАЗБОР
- ПОЧЕМУ ПОДХОДИТ
ОКНО 01 ИЗ 02 · КАРТОЧКА ПРОДОЛЖАЕТСЯ
- 05.BRISK & FIT← 05 QUALIFY
EXTRACTED SIGNAL- FIT / ЭТОТ ЛИД
- 92 / 100
- ОГОВОРКИ
- 2 РИСКА
- ОПУБЛИКОВАНО
- 02.09.2026
- САНИТИЗАЦИЯ
- КАНАЛ СКРЫТ
ОКНО 02 ИЗ 02 · НИЖНЯЯ ГРАНИЦА КАРТОЧКИ ЦЕЛАЯ
- 07.AHUMAN DECISION← 07 DIGEST
OBSERVED OUTPUT- ДЕЙСТВИЯ
- 3 КНОПКИ
- РЕШАЕТ
- ВЛАДЕЛЕЦ
- 06.ACOMPARISON← 06 RANK
EXTRACTED SIGNAL- FIT / ЭТОТ ЛИД
- 78 / 100
- ТИР
- ПОДХОДИТ
- ПОКАЗЫВАЕТ
- РАНЖИРОВАНИЕ
IMPLEMENTATION
- Классификатор возвращает одну из меток PRIORITY, GOOD, BORDERLINE или REJECT вместе с валидированной уверенностью, оценкой соответствия, кратким описанием и явно извлечёнными коммерческими деталями.
- Недоверенный текст из Telegram изолирован как данные: инструменты отключены, отсутствующие поля остаются null, детерминированные жёсткие отказы до провайдера не доходят.
- SQLite/WAL хранит очередь, провенанс, курсоры, состояние дайджестов, ретраев, решений и outbox. Дедлайны ретраев и состояние предохранителя переживают перезапуск.
- Догон ограничен постранично и глобально, поэтому старт не может незаметно вычерпать неограниченную историю.
- Рантайм собран как один супервизируемый модульный монолит и кооперативно останавливается по SIGTERM.
- Приватный деплой работает на Linux VPS под systemd, только исходящие соединения, без открытых входящих портов.
Автоматический набор тестов не требует ключей и использует фейковые адаптеры провайдера и Telegram.
На момент подготовки публичного снапшота проходили 758 тестов на Python 3.12 — это покрытие кода, а не показатель работы сервиса.
RESULT
- После запуска работает стабильно, без постоянных ручных перезапусков.
- Регулярно приносит 6–10 релевантных возможностей для отклика.
- По одному из найденных системой лидов уже закрыт реальный заказ.
Публичный снапшот санитизирован: продакшн-креды, сессии, база, payload'ы, каталог источников и история деплоя в него не входят.