Люми Дайджест Бот
Что это
Отдельный 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]] — паутина НПА