OKO · Идея-Радар · M1-v2 · Design Doc

Движок построен и доказан вживую: velocity бьёт популярность

Near-real-time радар вирусности — from «подбирателя исторических фактов» к детектору взлёта. On-demand, $0, без фонового поллинга.

2026-06-18 · pipeline/idea_radar/ · Источники: GDELT, Google News RSS, Reddit (готов) · Основан на 4 ресёрчах 2026-06-18
Доказано smoke-прогоном вживую
97.2

Ускоряющаяся новость поднялась на #1 momentum — статус «exploding»

Один python -m idea_radar.radar --field both → топ-15 за прогон. Новость с GDELT-рядом набрала 97.2 против ~30 у flat-новостей. Velocity-движок работает как задумано.

Тесты: 29/29
Активных источников: 2
Бюджет: $0
Модель: on-demand
Итог Фазы 1 · ядро
$0

Бесплатное ядро работает — velocity из GDELT-ряда за один вызов реально поднимает нужное в топ

«Популярно» ≠ «растёт». Движок считает производную: velocity + acceleration + overperform. Это то, за что берут enterprise-деньги у NewsWhip. Написано самостоятельно поверх бесплатных источников.

Модель запуска — Hard Rule (Тимур, 2026-06-18)

Hard — не меняем без явного решения

On-demand, НЕ фон. Движок запускается по команде → проводит работу в моменте → выдаёт дайджест → останавливается. Никакого крона, никакой фоновой нагрузки, лимиты подписок не трогаем без явного запуска. Каждый прогон ограничен и предсказуем по числу вызовов.

Будущее (отдельное решение, не сейчас): тот же движок оборачивается в планировщик. Архитектура делает этот переход тривиальным — фон = обёртка-cron вокруг той же функции run(). Сегодня фон не строим.

Velocity без фонового поллинга

Раз фона нет — свою базовую линию мы не копим заранее. Берём источники, отдающие производную в одном вызове:

  • Reddit /rising — уже velocity-сортировка от Reddit (что быстро набирает относительно нормы саба)
  • GDELT timelinevol — объём упоминаний темы по 15-мин/часовым корзинам за один запрос → velocity и acceleration считаем прямо из ряда внутри ответа, без своего фона
  • Google Trends RSS (trendspyg) — фид «растущих сейчас» запросов
  • Telegram t.me/s — share/view ratio и views/возраст по одному снимку поста
  • YouTube — views / возраст ролика как snapshot-прокси скорости

Каждый прогон пишет снимки в SQLite → при повторных ручных запусках база линий накапливается как бонус, тогда включается полноценный z-score vs история. Калибровка порогов (ориентир от NewsWhip): z>2.5–3 = breakout; точность прогноза пика ±21% при 1ч наблюдения, ±12% при 3ч.

Статус реализации (2026-06-18) — что построено и доказано

Построено и доказано вживую

Все компоненты ниже — в pipeline/idea_radar/, прогнаны 2026-06-18:

python -m idea_radar.radar --field both
# → топ-15, ускоряющаяся новость: momentum 97.2 / exploding → #1
# → flat-новости: momentum ~30
# → $0, on-demand, без фона

Известные ограничения (честно)

🔴 Reddit отключён VPS-IP в бане у Reddit (403 на любом UA, www и old; camoufox без резидентного прокси — та же сеть). До решения источник отключён, прогон не падает.

🟡 GDELT hit-rate GDELT отдал velocity-ряды 1/12 за прогон — keyword-extractor грубый + rate-limit. Улучшить: proper nouns, retry, enrich по всем новостям. Velocity сейчас живёт только у обогащённых новостей.

Следующий шаг (Фаза 1, осталось)

  • Surface (приоритет): cockpit-дашборд (страница ленты последнего прогона) + TG-дайджест топ-N — оба нужны (Тимур)
  • Reddit через Mac-релей по Tailscale — бесплатно, инфра уже есть
  • Поднять hit-rate GDELT; добавить Telegram t.me/s (RU-ядро) + Google Trends RSS

Главный принцип — ядро движка

«Популярно» ≠ «растёт».« Топ-чарты (Trending tab, Hot) показывают уже взлетевшее — там ты опоздал. Нужна производная:

Все платные сервисы (NewsWhip ~enterprise, Exploding Topics, BuzzSumo) делают ровно это. Это не покупается — это пишется. Самописный velocity-слой поверх бесплатных источников = 80% ценности движка. Платные «серые API» нужны только чтобы пробить анти-бот TikTok/Instagram — и только когда движок докажет, что находит идеи.

Архитектура — 6 слоёв (строим 3, остальное наслаиваем)

Состояние — в SQLite. Тяжёлое (embeddings/кластеризация/LLM) — батчами, не на каждый item (правило слабого VPS).

СлойЧто делаетФазаСтатус
0. Оркестратор run() On-demand: одна команда → все ingestion-адаптеры один раз, последовательно с nice. Без крона/фона. Тот же run() позже = планировщик. 1 ✅ Готов
1. Ingestion Тянет сырьё → {source, entity, text, engagement_snapshot, ts, lang, media_urls}. RSS — фундамент, scrape — точечно. 1 ✅ Частично
2. Нормализация UTC, единая шкала engagement, извлечение сущностей (regex/NER), lang-tag (RU/EN). 1 ✅ Готов
3. Scoring (momentum) velocity + acceleration + overperform(z-score vs rolling baseline, MAD) + diversity. Итог — momentum_score 0–100. Сердце движка. 1 ✅ Доказан
4. Clustering / dedup MinHash LSH → embeddings(CPU, батч) или TF-IDF → HDBSCAN. Склейка кросс-источников по entity+времени: один кластер = одно событие. 2 ⏳ Фаза 2
5. Ranking (жанр-фит) Фильтр Rising/Exploding → LLM-классификатор «годится в ДИЧЬ?» (абсурд/факап да, драма нет; бан: не Премия Дарвина). Скор = momentum × жанр-фит × материал. 2 ⏳ Фаза 2
6. Выдача + HITL Ранжированная лента: тема, momentum, статус, источники, ссылки на сырьё, прогноз пика, бриф реакции. Surface — cockpit-дашборд + TG-дайджест, оба с Фазы 1. 1 (выдача)
2 (фидбек)
🟡 В работе

Стек источников

Детекция событий · бесплатное (Слой 1)

ПолеИсточникМетодЦенаСтатус
EN+RU новостиGDELT 2.0DOC API + timelinevol, 15-мин окна, 100+ языков$0✅ Работает
EN+RU новостиGoogle News RSSRSS (hl=ru / hl=en)$0✅ 60 нов/прогон
EN соцReddit .json/r/all/rising + /new сабы; fallback stealth-browser$0⚠️ VPS-IP в бане
RU ядроTelegram t.me/sстатичный HTML + Telethon (сессия есть)$0⏳ Фаза 1.6
СпросGoogle Trends RSStrendspyg, 125 стран, 4h/24h$0⏳ Фаза 1.6
Каркас-рефtrend-pulse (MIT)20 zero-auth источников + velocity + SQLite$0⏳ Референс
RU соцVK newsfeed.searchофиц. токен, публичные посты$0⏳ Фаза 1.6

Детекция событий · платное (Фаза 2, по апруву)

ПлатформаСервисЦенаПочему
InstagramHikerAPI$0.0006/запросуже подключён (~/.claude/.accounts/hikerapi.env), баланс низкий
TikTok+IG+YT+XEnsembleDatafree 50/день → $100+/месодин API на 8 платформ, один биллинг
TikTokScrapeCreators$10 / 5000 (кредиты не истекают)pay-as-you-go, лучший для рваной нагрузки

Сбор реакции аудитории (комментарии)

ПлатформаМетодЦенаСтатус
YouTubeyoutube-comment-downloader (OSS, innertube, без квоты)$0⏳ Фаза 2.1
Redditдерево .json / PRAW (100 req/min)$0⚠️ VPS-IP в бане
TelegramTelethon (комменты дискуссий, реакции, views)$0⏳ Фаза 2.1
VKwall.getComments (100/запрос)$0⏳ Фаза 2.1
InstagramHikerAPI media comments$0.0006/зап⏳ Фаза 2.1
TikTokScrapeCreators / EnsembleDataплатно⏳ Фаза 2

Дистилляция комментов → нарративный бриф

НЕ «вали всё в LLM». Пайплайн: ранжир top-N + очаги спора → дедуп (копипаста) → map-reduce суммаризация (чанки → map → reduce) → extraction-промпт «угол подачи».

Выход — JSON: доминирующие_лагеря / ось_спора / контроверсия / эмоциональные_крючки / мемы / сентимент / рекомендованный_угол_видео. Цитаты дословные (анти-галлюцинация). LLM — Gemini через integrations/gemini.

План постройки

Фаза 1 — бесплатное on-demand-ядро · $0

Фаза 2 — реакция + точность (по апруву на бюджет)

Развилки / блокеры — статус (2026-06-18)

Переиспользуем (НЕ переделываем)

Что это даёт (итог ядра)

Движок находит ускоряющиеся новости раньше чем они попадают в публичные «тренды». Velocity из GDELT-ряда за один вызов — без фона, без подписок, $0 на прогон.

Честные оговорки

Размер проверки: один smoke-прогон, 1 событие с GDELT-рядом против N flat-новостей. Статистики по качеству ранжирования в целом нет — это первое доказательство принципа, не финальный бенчмарк точности.

Reddit отключён: EN-социальный сигнал отсутствует. Это ключевой источник velocity-сигналов. Без него движок работает только на новостях + GDELT, покрытие соцсетей — ноль.

GDELT hit-rate 1/12: velocity-ряд получает только 1 из 12 новостей за прогон — keyword-extractor грубый. Остальные скорятся только snapshot-прокси (views/возраст). Реальная точность momentum ограничена до улучшения экстрактора.

Без кластеризации (Фаза 2): одно событие с Reddit + GDELT + News отображается как 3 отдельных элемента в ленте. Дедуп кросс-источниковый — не до Фазы 2.

OKO · Идея-Радар M1-v2 · Design Doc · 2026-06-18
Источники данных: GDELT 2.0 · Google News RSS · Reddit .json (VPS-IP бан) · trend-pulse MIT · NewsWhip Spike methodology · youtube-comment-downloader · HikerAPI