1. Проблема: объявления — наименее читаемый тип сообщений в Discord
Каждый администратор сообщества знает этот шаблон. Вы пишете тщательно продуманное объявление, закрепляете его, пингуете всех, и уже через час оно погребено под мемами и двумя спорами. Discord — это поток в реальном времени без редакционного слоя. Участник, зашедший во вторник, никогда не увидит то, что вы опубликовали в понедельник.
Еженедельный дайджест заменяет эту ставку другим контрактом. Вместо того чтобы проталкивать больше сообщений в поток, он вытягивает неделю из потока и переиздает ее как один структурированный, легко просматриваемый документ. Дайджест генерируется из бесед участников, а не из объявлений администраторов. Именно это отличие не дает ему ощущаться как маркетинг.
2. Конвейер: выборка, кластеризация, написание, публикация
Задача дайджеста Sovereign запускается каждый понедельник в 09:00 UTC. Она отбирает сообщения за последние 7 дней (до 100, сохраняя только реальный контент длиной более 3 символов), определяет целевой язык из цепочки приоритетов — язык панели управления, затем настройки арендатора, затем предпочтительная локаль Discord гильдии, затем запасной вариант — и передает выборку в LLM в соответствии со строгим контрактом подсказки.
Этот контракт является контролем качества. Подсказка запрещает корпоративную «воду», ограничивает вывод 15–20 строками и навязывает фиксированную трехблочную структуру: ключевые моменты (3–4 фактических пункта), достижения и метрики (2 коротких пункта) и два приоритета на предстоящую неделю. Модель проинструктирована основывать каждую строку на реальных сообщениях в выборке. Она не придумывает бенчмарки.
Опубликованный дайджест хранится с указанием границ недели, резюме и основных тем, так что тот же контент может быть воспроизведен в виде рассылки по электронной почте, ветки форума или закрепленного сообщения канала.
// Language resolution: dashboard UI > tenant settings > guild locale > fallback
const LANG_PRIORITY = [targetLang, settings.language, guildLocale, 'fr'];
const effectiveLang = LANG_PRIORITY.find(Boolean);
// 7-day sampling window, max 100 messages, real content only
const weekStart = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
const sample = await prisma.unifiedMessage.findMany({
where: { member: { tenantId }, createdAt: { gte: weekStart } },
orderBy: { createdAt: 'asc' },
take: 100
});
// Prompt contract enforced on the LLM:
// 1. Key highlights: 3-4 factual bullets taken from real messages
// 2. Wins & metrics: 2 short points
// 3. Focus for the week: 2 priorities
// Hard cap: 15-20 lines. Corporate filler: forbidden.3. Публикация: webhook Основателя, а не сообщение бота
Sovereign публикует дайджест через канал webhook, оформленный с использованием профиля бренда сообщества — имени и аватара основателя или компании, а не имени пользователя бота. Участники читают его как человеческий голос, что меняет как вовлеченность, так и доверие.
Discord ограничивает сообщения 2000 символами, поэтому конвейер разбивает дайджест на фрагменты по 1900 символов и публикует их последовательно. Если webhook недоступен, бот возвращается к обычному сообщению. Один механизм, два пути, никакой дублирующейся логики.
Подсказка дайджеста явно запрещает корпоративную «воду» и общий маркетинг. Если за неделю не было реальных ярких моментов, дайджест так и сообщает. Честная «скудная» неделя заслуживает больше доверия, чем придуманная впечатляющая.