v1.0.0 — стабильная версия
Персональный генератор ежедневного новостного дайджеста для технического архитектора крупного банка. Собирает RSS/Atom-ленты, суммирует их через LLM, отправляет в Telegram и сохраняет markdown-файлы в репозиторий (для Obsidian через git-sync).
Работает на GitHub Actions (бесплатный tier) — без VPS и платного хостинга.
flowchart TD
CFG[config.yaml] --> COL[collector]
COL --> RSS[(RSS/Atom)]
COL --> SUM[summarizer]
SUM --> PC{ProviderChain}
PC --> P[Anthropic / Gemini / Groq / Mistral / DeepSeek]
SUM --> TG[Telegram Bot]
SUM --> MD[Markdown]
MD --> GH[GitHub Actions]
GH --> OBS[Obsidian]
Каждая категория суммируется параллельно через назначенного провайдера (или цепочку по умолчанию, если маршрутизация не задана). ProviderChain автоматически переключается на следующего провайдера при сбое — дайджест всегда доставляется, даже если один API недоступен.
flowchart LR
REQ[Request] --> P1[Primary]
P1 -- OK --> RES[Result]
P1 -- Fail --> P2[Fallback 1]
P2 -- OK --> RES
P2 -- Fail --> P3[Fallback N]
P3 -- OK --> RES
P3 -- Fail --> ERR[RuntimeError]
Каждая категория обрабатывается параллельно:
main.pyвызываетresolve_category_providers— получает словарькатегория → ProviderChain- Для каждой категории параллельно запускается
build_category_prompt+ вызов LLM - После получения всех категорий строится
build_trends_promptи вызывается LLM для трендов - Итоговый дайджест собирается из всех категорий + трендов
Можно назначить конкретного LLM-провайдера отдельным категориям. Категории без маршрутизации используют цепочку по умолчанию. Если API-ключ назначенного провайдера отсутствует — автоматически используется цепочка по умолчанию.
llm:
providers:
- name: "gemini"
model: "gemini-2.5-flash"
- name: "groq"
model: "llama-3.3-70b-versatile"
routing:
- categories: ["AI & LLM", "AI Engineering"]
provider: "gemini"
model: "gemini-2.5-flash"Рекомендации основаны на комментариях в config.yaml. Это не жёсткие правила — любая модель справится с любой категорией, и вы можете настроить любую комбинацию.
| Категория | Провайдер | Модель | Почему |
|---|---|---|---|
| AI & LLM, AI Engineering | Gemini | gemini-2.5-flash | Быстрый, хорошо разбирается в AI-тематике, бесплатный tier |
| Banking & Fintech, Payments & Fintech | Groq | llama-3.3-70b-versatile | Быстрый inference, хорошо работает с финансовой аналитикой |
| Architecture & Distributed Systems | DeepSeek | deepseek-chat | Силён в технических и архитектурных темах |
| Остальные категории | По умолчанию | — | Используется цепочка из llm.providers |
git clone https://github.com/<you>/digest.git
cd digest- Найдите @BotFather в Telegram, отправьте
/newbot. - Следуйте инструкциям и сохраните полученный токен бота.
- Напишите любое сообщение своему новому боту, затем откройте:
https://api.telegram.org/bot<TOKEN>/getUpdatesНайдитеchat.idв ответе. Альтернативно используйте @userinfobot.
Выберите одного или нескольких провайдеров (у Gemini и Groq есть бесплатные тиры):
| Провайдер | Консоль | Бесплатный tier |
|---|---|---|
| Anthropic Claude | https://console.anthropic.com/ | Пробные кредиты |
| Google Gemini | https://aistudio.google.com/app/apikey | Да |
| Groq | https://console.groq.com/ | Да |
| Mistral | https://console.mistral.ai/ | Пробные кредиты |
| DeepSeek | https://platform.deepseek.com/ | Пробные кредиты |
Отредактируйте config.yaml:
llm:
provider: "anthropic" # или "gemini", "groq"
model: "claude-sonnet-4-20250514"
digest:
language: "ru" # "ru" или "en"
summary_style: "analytical" # "analytical" | "brief" | "detailed"В вашем форке: Settings → Secrets and variables → Actions → New repository secret.
Добавьте секреты для выбранных провайдеров:
| Имя секрета | Описание |
|---|---|
ANTHROPIC_API_KEY |
API-ключ Anthropic (если используете Claude) |
GEMINI_API_KEY |
API-ключ Gemini (если используете Gemini) |
GROQ_API_KEY |
API-ключ Groq (если используете Groq) |
MISTRAL_API_KEY |
API-ключ Mistral (если используете Mistral) |
DEEPSEEK_API_KEY |
API-ключ DeepSeek (если используете DeepSeek) |
TELEGRAM_BOT_TOKEN |
Токен бота от @BotFather |
TELEGRAM_CHAT_ID |
Ваш Telegram chat ID |
Дайджест запускается ежедневно в 06:00 UTC (11:00 по Ташкенту, UTC+5).
Также можно запустить вручную: Actions → Daily News Digest → Run workflow
Сгенерированные файлы дайджеста сохраняются в digests/ и автоматически коммитятся в репозиторий.
python -m digest [OPTIONS]| Флаг | Описание |
|---|---|
| (без флагов) | Полный пайплайн: collect → summarize → deliver → commit cache |
--config PATH |
Путь к config-файлу (по умолчанию: config.yaml) |
--dry-run |
Собрать и суммировать, но не отправлять в Telegram и не сохранять markdown |
--verbose |
Включить DEBUG-уровень логирования |
--discover |
LLM-поиск новых RSS-источников для недопредставленных категорий, затем выход |
--check |
Валидация config + проверка всех feed URL, затем выход (exit 0 = OK, exit 1 = ошибки) |
# Установить зависимости
pip install -r requirements.txt
# Скопировать и заполнить credentials
cp .env.example .env
# отредактировать .env с вашими ключами
# Проверить конфиг и API-ключи
python -m digest --check
# Запустить дайджест
python -m digest
# Dry-run: собрать и суммировать, но не отправлять и не сохранять
python -m digest --dry-run --verbose
# Использовать другой конфиг-файл
python -m digest --config my-config.yaml
# Найти новые RSS-источники через LLM
python -m digest --discoverОтредактируйте список sources в config.yaml. Каждый источник имеет поля:
sources:
- name: "My Feed" # отображаемое название (используется в дайджесте)
url: "https://..." # URL RSS или Atom-ленты
category: "AI & LLM" # группирует источники в дайджесте
enabled: true # false — временно отключить без удаления
priority: 3 # от 1 (низший) до 5 (высший); по умолчанию 3Необязательные поля для пробных источников:
trial: true # тестировать новый источник с ограниченными слотами
trial_started: "2026-03-15" # заполняется автоматически при старте испытания
trial_days: 7 # дней до автоматического повышения/понижения (по умолчанию 7)Поле priority определяет долю слотов статей, которую получает источник относительно других.
Источники с высоким приоритетом также обрабатываются первыми и всегда заполняют свою квоту
до того, как источники с низким приоритетом займут общий бюджет.
При включении (adaptive.enabled: true в config.yaml) система автоматически настраивает приоритеты источников:
- Обратная связь: реакции 👍/👎 на сообщения дайджеста в Telegram влияют на приоритеты.
- Оценка качества: отслеживает надёжность, продуктивность и качество описаний по каждому источнику.
- Пробные источники: новые источники с
trial: trueполучают отдельный бюджет слотов. По истечении пробного периода качественные источники переходят в постоянные; некачественные отключаются. - Определение трендов: источники с ростом числа статей >50% за 7 дней получают бонус к приоритету.
Предустановленные категории:
- Banking & Fintech — Finextra, PYMNTS, Monzo Tech Blog
- AI & LLM — MIT Technology Review, The Batch, Hugging Face Blog, OpenAI News
- Architecture & Distributed Systems — High Scalability, Brendan Gregg, SRE Weekly, Martin Fowler
- Enterprise Architecture — InfoQ, ThoughtWorks, Hacker News Best
- Geopolitics & CIS — Spot.uz, Kun.uz
Дайджест использует формат трёх перспектив для наиболее важных новостей в каждой категории:
### AI & LLM
**OpenAI выпускает GPT-5** — [OpenAI Blog](https://...)
Краткое аналитическое описание новости.
🟢 **Оптимист** — Это прорыв, который в 10 раз увеличит продуктивность разработчиков
и наконец сделает AI-агентов надёжными в production.
🔴 **Скептик** — Накрутка бенчмарков и галлюцинации сохраняются. Корпоративное
внедрение отстанет от хайпа на 12–18 месяцев, как обычно.
⚖️ **Реалист** — Реальный скачок возможностей, но сложность интеграции означает,
что большинство команд будет получать пользу постепенно, за 6–12 месяцев.
Второстепенные новости получают стандартный аналитический комментарий в 2–3 предложения без перспектив.
Стили суммаризации (задаются через digest.summary_style):
analytical— анализ трендов + три перспективы для топ-тем (по умолчанию)brief— одно предложение на новость, без перспективdetailed— полный контекст, три перспективы для всех новостей
---
title: "Daily Digest 2026-03-14"
date: "2026-03-14"
sources_count: 13
articles_count: 24
llm_provider: anthropic
tags:
- digest
- daily
---
## 🏦 Banking & Fintech
**Visa запускает рельсы для трансграничных платежей в реальном времени** — [Finextra](https://...)
Новая инфраструктура Visa нацелена на B2B-коридоры в 40 странах...
🟢 **Оптимист** — ...
🔴 **Скептик** — ...
⚖️ **Реалист** — ...
---
## 🤖 AI & LLM
...
## 📈 Ключевые тренды дня
1. Платежи в реальном времени продолжают вытеснять корреспондентский банкинг...
2. ...Каждая статья в Telegram приходит с кнопками 👍/👎. Оценки накапливаются и влияют на то, сколько статей от каждого источника попадает в следующий дайджест.
Как это работает:
- Нажимаете 👍 или 👎 под статьёй в Telegram
- При следующем запуске дайджест собирает все нажатия через Telegram getUpdates
- Оценки за последние 14 дней формируют
feedback_scoreисточника [0.0..1.0] feedback_scoreкомбинируется с автоматическими метриками качества (score_weight) и базовым приоритетом (base_weight) — см. формулу вconfig.yaml- Эффективный приоритет определяет долю слотов статей в дайджесте
Источники с высокими оценками получают больше места в следующих дайджестах, источники с низкими — меньше.
python -m digest --discoverКоманда использует LLM для предложения новых RSS-источников в категории, где источников мало. Алгоритм:
- Находит категории с недостаточным количеством активных источников
- Просит LLM предложить релевантные RSS-ленты
- Проверяет, что URL реально существуют и отдают feed
- Сохраняет кандидатов в
.cache/pending_sources.json - Отправляет в Telegram карточку с кнопками ✅ Approve / ❌ Reject
При нажатии Approve источник автоматически добавляется в config.yaml в режиме trial. Через trial_days (по умолчанию 7) дней система оценивает качество источника и либо переводит его в постоянные, либо отключает.
Discover workflow запускается автоматически каждое воскресенье в 06:00 UTC.
Все состояние хранится в .cache/ и коммитится в репозиторий GitHub Actions после каждого запуска:
| Файл | Назначение |
|---|---|
seen_articles.json |
Дедупликация: хеши просмотренных статей (7 дней) |
source_stats.json |
Статистика источников: надёжность, продуктивность, история (30 дней) |
feedback.json |
Оценки пользователя из Telegram, last_update_id для polling |
pending_sources.json |
Очередь кандидатов из --discover, ожидающих одобрения |
Никакой базы данных, никакого внешнего хранилища — только git.
Установите зависимости для разработки и активируйте pre-commit хуки:
pip install -r requirements-dev.txt
pre-commit installПосле этого перед каждым коммитом автоматически запускается ruff (lint + format).
Используйте Makefile для стандартных задач:
make lint # ruff check digest/ tests/
make lint-fix # ruff check --fix + ruff format
make typecheck # mypy digest/
make test # pytest tests/ -v
make check # lint + typecheck + testИли прямые команды:
# Запустить тесты
python -m pytest tests/ -v
# Проверка типов
python -m mypy digest/ --ignore-missing-imports
# Линтинг
python -m ruff check digest/См. .env.example для полного списка. Все переменные необязательны — скрипт деградирует gracefully:
если Telegram-credentials отсутствуют, доставка пропускается, но markdown-файл всё равно сохраняется.
| Переменная | Описание |
|---|---|
ANTHROPIC_API_KEY |
API-ключ Anthropic Claude |
GEMINI_API_KEY |
API-ключ Google Gemini |
GROQ_API_KEY |
API-ключ Groq |
MISTRAL_API_KEY |
API-ключ Mistral |
DEEPSEEK_API_KEY |
API-ключ DeepSeek |
TELEGRAM_BOT_TOKEN |
Токен Telegram-бота |
TELEGRAM_CHAT_ID |
Telegram chat ID |