Backend‑бот для аналитики командных чатов Telegram. Он:
- принимает обновления из Telegram по webhook,
- сохраняет сообщения, правки, реплаи и упоминания в PostgreSQL,
- строит нити обсуждений и детерминированные процессные сигналы (open loops, нерешённые обсуждения, нет владельца, нет дедлайна, медленные ответы на упоминания),
- по расписанию собирает дневные/недельные отчёты и прогоняет их через LLM‑пайплайн (аналитик → верификатор → финализатор),
- отправляет отчёты только владельцу в личные сообщения и ведёт аудит‑логи.
Все функциональные и архитектурные детали описаны в specs/001-team-communication-analytics/.
-
Ингест Telegram по webhook
FastAPI‑приложение принимает POST‑запросы от Telegram на/webhook/telegram, нормализует JSON и сохраняет события (сообщения, правки, упоминания) в PostgreSQL. -
Детерминированная аналитика
На основе сохранённых данных считаются:- open loops – вопросы/задачи без ответа дольше порога;
- нерешённые обсуждения – длинные нити без явного решения;
- нет владельца – task‑подобные нити, где не выделен ответственный человек;
- нет дедлайна – задачи с владельцем, но без ожидаемой даты;
- медленные ответы на упоминания – когда упомянутого человека ждут дольше порога;
- базовая тематическая разметка нитей по ключевым словам (release, incident и т.п.).
-
Факт‑ориентированные отчёты с LLM
- Сначала строится список фактов и сигналов (
process_signals) за период. - LLM‑аналитик собирает черновой структурированный отчёт (JSON).
- LLM‑верификатор сверяет каждое утверждение с фактами и может отклонить черновик.
- LLM‑финализатор формирует финальный текст только из подтверждённых утверждений.
- Если что‑то идёт не так (нет фактов, неподдержанные утверждения, недоступен LLM) – отчёт не отправляется, статус отчёта и
llm_runsотражают причину.
- Сначала строится список фактов и сигналов (
-
Приватная рассылка и аудит
- Отчёты отправляются только whitelisted Telegram user ID владельца в личные сообщения.
- В группах/каналах отчёты никогда не публикуются.
- Все ключевые действия (ингест, аналитика, отчёты, LLM‑ошибки, retention) логируются в
audit_logs.
-
Расписание и удержание данных
- Celery beat планирует ежедневные/еженедельные отчёты и задачи по очистке старых данных.
- Сервис ретенции удаляет/анонимизирует старые raw‑сообщения и правки по настраиваемым порогам, сохраняя агрегаты (сигналы, отчёты).
- Есть health‑эндпоинты и структурированные логи для мониторинга и безопасных рестартов.
Система следует «конституции» (.specify/memory/constitution.md), которая жёстко требует детерминизма, идемпотентности и проверяемости фактов. LLM никогда не является источником фактов.
- Python 3.10+, FastAPI (API и webhook), aiogram (Telegram‑бот), SQLAlchemy + Alembic (PostgreSQL), Celery + Redis (очереди и расписание), Pydantic Settings, HTTPX (LLM).
api– FastAPI + Uvicorn, эндпоинты/webhook/telegram,/health/live,/health/ready, опциональные админ‑эндпоинты.worker– Celery worker, выполняет задачи аналитики, отчётов, ретенции.beat– Celery beat, планирует задачи.db– PostgreSQL (единственный источник истины).redis– брокер задач и временное хранилище (locks/idempotency), не используется как источник истины.
src/app/– конфиг, DI‑контейнер, FastAPI‑приложение, логирование, health.src/api/– HTTP‑роуты (webhook, admin), зависимости.src/telegram_bot/– aiogram‑бот, роутинг обновлений, DTO для Telegram JSON.src/db/– модели БД, enums, репозитории, Alembic‑миграции.src/analytics/– логика построения нитей и модулей аналитики (правила).src/services/– сервисы домена: ingestion, threading, analytics, reporting, retention.src/llm/– клиент LLM, pydantic‑схемы, стадии analyst/verifier/finalizer.src/reporting/– сборка отчётов, доставка через Telegram, аудит.src/workers/– Celery app, задачи по аналитике, отчётам, обслуживанию.src/security/– whitelist владельцев, помощники по приватности и редактированию логов.tests/– unit, integration, contract‑тесты.
Подробности см. в specs/001-team-communication-analytics/quickstart.md. Здесь – краткая версия.
- Установлены Docker и Docker Compose.
- Есть Telegram‑бот (BotFather) и его токен.
- Есть ключ OpenAI‑совместимого LLM (в dev можно заменить моком через monkeypatch).
В корне репозитория создайте .env и укажите как минимум:
BOT_TOKEN– токен Telegram‑бота.POSTGRES_DSN– строка подключения к PostgreSQL (должна совпадать с тем, что использует контейнер).REDIS_URL– URL Redis.LLM_API_KEY– ключ к LLM.OWNER_TELEGRAM_USER_ID– ваш Telegram user id (кому отправлять отчёты).
Опционально:
OPEN_LOOP_THRESHOLD_HOURS– часы до «open loop» (по умолчанию 24).SLOW_RESPONSE_THRESHOLD_HOURS– часы до «медленного ответа на упоминание» (по умолчанию 4).RETENTION_DAYS– срок хранения raw‑сообщений (по умолчанию 180).
Из корня репозитория:
docker compose up --buildЗапустятся сервисы api, worker, beat, db, redis.
Если миграции не применяются автоматически – войдите в контейнер api и выполните:
alembic upgrade head- Пробросьте
apiнаружу (ngrok http 8000или свой домен). - Вызовите
setWebhookу Bot API, передав:- URL:
https://<публичный-хост>/webhook/telegram - secret token, если вы задали
TELEGRAM_WEBHOOK_SECRET.
- URL:
- Создайте test‑группу/супергруппу в Telegram.
- Добавьте туда бота, дайте права читать сообщения.
- Отправьте разные сообщения:
- обычные, ответы, длинную ветку обсуждения;
- task‑подобные сообщения с/без владельца и дедлайна;
- сообщения с
@mentionи большим лагом до ответа; - продублируйте какое‑то обновление (для проверки идемпотентности).
Проверьте по логам api/worker, что ошибок нет, и данные попадают в БД.
- Ожидайте срабатывания Celery beat (дневной/недельный отчёт), либо в dev вручную вызовите
build_report_taskи последующие LLM‑задачи. - Убедитесь, что:
- отчёт приходит только вам в личный чат;
- в отчёте отражены ваши тестовые сценарии (open loops, нерешённые нити, нет владельца/дедлайна, медленные ответы);
- в саму группу отчёт не отправляется.
- повторно отправьте одно и то же Telegram‑обновление – не должно появиться дубликатов сообщений/сигналов/отчётов;
- уменьшите временно пороги ретенции, запустите задачу ретенции и проверьте, что старые raw‑данные очистились, а агрегаты остались консистентными.
Конфигурация описана в src/app/config.py (Pydantic Settings). Кратко:
- Подключения:
DATABASE_URL/POSTGRES_DSN– PostgreSQL;REDIS_URL– Redis;TELEGRAM_BOT_TOKEN/BOT_TOKEN– токен бота;TELEGRAM_WEBHOOK_SECRET– опциональный секрет webhook’а;LLM_API_KEY– ключ к LLM.
- Владелец:
OWNER_TELEGRAM_USER_IDS– список Telegram user id владельцев, которые могут получать отчёты.
- Пороги по умолчанию:
OPEN_LOOP_THRESHOLD_HOURS– открытые петли;SLOW_RESPONSE_THRESHOLD_HOURS– медленные ответы на упоминания;RETENTION_DAYS– хранение raw‑сообщений.
- HTTP‑клиент:
- таймауты и лимиты соединений для LLM/Telegram HTTP‑запросов.
Пер‑владельческие настройки (пороги, ретенция, часовой пояс и т.д.) задаются через строки в таблице owner_settings.
pytesttests/unit/– юнит‑тесты правил аналитики, построения нитей, LLM‑верификатора, приоритизации сигналов и т.п.tests/integration/– интеграционные тесты webhook‑ингеста, аналитического пайплайна, отчётов, LLM‑пайплайна, расписаний, ретенции, идемпотентности, health‑эндпоинтов.tests/contract/– контрактные тесты Telegram JSON и LLM JSON‑схем.
- Все внешние вызовы имеют таймауты и retries с backoff.
- Задачи Celery спроектированы как идемпотентные (safe retries).
- Для разработки LLM можно подменить
LLMClientмоком (см.tests/integration/test_llm_pipeline.py).
- Секреты (токены, пароли БД и т.п.) хранятся только в окружении/секрет‑менеджере и не закоммичены.
- Отчёты доставляются только в личные чаты владельцев; в группах ничего не публикуется.
- Логи структурированы и стараются не содержать полный текст сообщений, где это не обязательно; имеются помощники для редактирования/маскировки (см.
src/security/privacy.py). - Retention реализован в коде и может настраиваться покомпонентно (raw‑сообщения vs агрегаты).
Подробнее о нефункциональных требованиях, гарантиях и принципах см.:
specs/001-team-communication-analytics/spec.md.specify/memory/constitution.md
Полная англоязычная версия README и инструкций расположена в файле README.md в корне репозитория.