Перейти к содержанию

Люми Дайджест Бот

Что это

Отдельный Telegram-бот (@LyumiHSEDigestbot) для управления каналом @LyumiHSEDigest. Генерирует посты по расписанию и по команде, отправляет на модерацию, публикует в канал.

Деплой

Запускается внутри контейнера lyumi-hse-bot через docker exec -d. НЕ имеет отдельного Dockerfile. Требует pip install apscheduler при каждом перезапуске контейнера.

Старый контейнер lyumi-digest-bot (sleep infinity) — удалён 15 апреля. Вызывал Telegram ConflictError.

Статус: v2 (multi-query) задеплоен и работает с 15 апреля 2026.

Процедура деплоя: 1. scp digest_bot.py на сервер 2. docker cp в контейнер 3. Убить старый процесс (Python one-liner через /proc, pkill нет в slim-образе) 4. sleep 15-20 (дать Telegram отпустить polling) 5. pip install apscheduler --break-system-packages 6. docker exec -d запуск 7. Проверить: docker exec lyumi-hse-bot tail -5 /app/logs/digest.log

Архитектура генерации (v2 — multi-query, 15 апреля 2026)

Pipeline

Команда (/topic, /analytics, /trends, /incidents, /case)
  → Haiku генерирует 6-8 подзапросов (generate_sub_queries)
  → Параллельный Sonar по всем углам (asyncio.gather)
  → Объединение результатов (multi_query_research)
  → [только /analytics] ChromaDB обогащение (enrich_with_knowledge_base)
  → Opus генерация с инжекцией:
      - Текущая дата (дата-awareness)
      - История тем (topic history — не повторяться)
      - Факт-чекинг правила (FACT_CHECK_INJECTION)
      - Правила глубины и баланса (кейсы компаний, обе стороны)
  → inject_source_urls (URL из Sonar → блок источников)
  → verify_urls_in_text (httpx HEAD, удаление битых)
  → Драфт → Модерация → Публикация
  → save_topic_to_history (при публикации)

Ключевые компоненты

  • generate_sub_queries() — Haiku разбивает тему на 6-8 поисковых углов (регуляторика, статистика, инциденты, технологии, КЗ-контекст, тренды)
  • multi_query_research() — параллельные Sonar запросы, объединение, фильтрация пустых
  • inject_source_urls() — извлекает URL из raw Sonar контента, фильтрует .ru/google/perplexity, заменяет текстовые источники на кликабельные
  • verify_urls_in_text() — httpx HEAD/GET проверка всех URL в тексте (и <a href>, и bare), удаление битых
  • topic history — JSON файл _topic_history.json, последние 30 тем инжектируются в промпт для антиповтора, хранит до 100
  • FACT_CHECK_INJECTION — жёсткие правила: каждая цифра из контекста, не выдумывать URL, показывать обе стороны, глубина и баланс
  • Дата-awareness — текущая дата инжектируется в каждый generate_post(), чеклисты начинаются с текущего месяца, не путать годы
  • Fallback — если multi-query не сработал → fallback на одиночный Sonar запрос (старый метод)

Стоимость

~$0.22/пост (было $0.18). При 7 постах/неделю = +$1.20/мес.

Расписание (APScheduler, 06:00 Алматы)

  • Пн: НПА РК (Әділет)
  • Вт: Инструмент (чётная) / Экология-ЧС (нечётная)
  • Ср: Кейс (ротация: инцидент → экология → ЧС → success)
  • Чт: Международный стандарт/тренд
  • Пт: Опрос или короткий пост
  • Сб: Флагман недели (Opus, 2500-3500 знаков)
  • Вс: Пасхалка

Команды

  • /topic <тема> — компактный пост (≤3000 символов, Sonnet)
  • /analytics <тема> — глубокий разбор (Opus, max_tokens 4500)
  • /trends — мировые HSE-тренды (multi-query)
  • /incidents — промышленные инциденты
  • /case — кейс из практики
  • /short <тема> — 400-800 знаков
  • /poll <тема> — Telegram-опрос
  • /easter — воскресная пасхалка
  • /post — ручная публикация
  • /spider — ручной обход паутины

Промпт-правила (обновлено 15 апреля)

  • ASCII-таблицы разрешены для матриц/сравнений (оборачивать в <code>)
  • Не упоминать казахстанские компании по имени (ТШО, КПО и т.д.)
  • Не приглашать в комментарии (discussion group отключена)
  • Не использовать вымышленные фамилии (Иванов/Петров) — TODO: добавить в промпт
  • Женский род (Люми), мужской к читателю
  • Факт-чекинг: каждая цифра из контекста, полные URL из источников
  • Дата-awareness: текущий год/месяц, не путать 2025 и 2026

Известные проблемы

  • "Вопрос читателю" — бот иногда генерирует "обсудите в комментариях" в /case и /poll. Камал вырезает вручную. TODO: добавить запрет в промпт кейса/опроса
  • Вымышленные фамилии — Opus иногда вставляет Иванов/Петров в кейсы. TODO: запрет в промпт
  • 2/3 URL битые в /case — inject_source_urls помогает, но Sonar не всегда возвращает рабочие URL для кейсов
  • Dockerfile — apscheduler и digest_bot не в Dockerfile, при каждом docker build нужно ставить заново

Связанные

  • [[lyumi/brand]] — бренд и экономика
  • [[lyumi/kz_monitor_spider]] — паутина НПА