Рабочий проект · Telegram → MAX

re-publisher

Что где лежит в коде, как запускается и что проверялось.
Версия 5f50077babfe · обновлено 3 октября 2026

О проекте

Хотел разбирать поток из нескольких каналов без ручного переноса каждого поста. Собрал конвейер, где можно посмотреть, почему материал отобран, что прочитал OCR и куда он отправился.

Беру новые сообщения из Telegram-папки MAX. На сервере пост проходит классификацию, фильтры и добавление источника. Подходящие материалы уходят в каналы MAX с исходным текстом и вложениями. В рабочем интерфейсе видны оценки моделей, OCR, лейблы, ошибки и история отправки.

Что отличает реализацию

Оригинал не переписывается. Текст поста и надписи на медиа классифицируются отдельно. Фильтр проверяет оценки модели, а назначает обычный лейбл из моего словаря. Один пост может уйти в несколько каналов. Сохранённые ID сообщений и история попыток позволяют разбирать ошибки отправки.

Состав прикладного кода

Python content pipeline 46.7%Python processing / CLI 23.2%FastAPI / Jinja 17.6%SQLAlchemy / PostgreSQL 12.5%

Доли по размеру прикладных файлов Git в закреплённой версии. Каждый файл отнесён к одной подсистеме по правилам scripts/generate-stack-share.mjs; тесты, ассеты, зависимости и generated-файлы исключены. Округление — до 0,1%. Это состав кода, а не уровень владения технологиями.

  • Метки корпуса поставлены Codex. Показатели моделей измеряют согласие с этой разметкой, а не независимую человеческую точность.
  • Маршруты для новичков и юмора экспериментальные. Для новичков test: 57/65 совпадений; для OCR-юмора validation: 92/104. Согласованные пороги качества не пройдены.
  • OCR не понимает картинку без текста, не слушает звук и не просматривает всё видео. Ошибки чтения требуют разбора.
  • Медиа больше 100 МБ и недоступные части альбома блокируют автоматическую готовность. В интерфейсе есть остановленные карточки.
  • Счётчики и время на скриншотах — снимок состояния, а не обещание производительности.

Скриншоты, схемы и исходные материалы сохранены на языке оригинала; подписи и описание переведены.

Архитектура и схемы

  • Новые сообщения принимает collector в режиме new_only. Старый необработанный буфер не запускается автоматически.
  • Отдельные процессы: web, collector, coordinator, TF-IDF, MiniLM, OCR и отправитель MAX. Очереди и результаты сохраняются в PostgreSQL.
  • RapidOCR читает изображения и статические превью видео. Распознанный текст не дописывается в публикацию.
  • Отсутствующая оценка остаётся неизвестной. Фильтры поддерживают категории, подкатегории, обязательные признаки, длину и вложенные И / ИЛИ / НЕ.
  • Отправляется оригинальный пост с медиа и ссылкой «Источник». Отдельного блока ссылок из текста нет.
Текущий конвейер: процессы, хранилище и MAX
Текущий конвейер: процессы, хранилище и MAX · Mermaid ↓

Code-map: файлы и связи

Карта привязана к версии 5f50077babfe. В таблице — экран или API, связанный модуль и данные.

ФункцияЭкран / APIМодульДанные / проверка
СборTelegram MTProtoapp/live_collector.py; app/collector.pyГраница new_only, курсор чата, оригиналы и медиа
Переходы стадий/pipelineapp/pipeline_coordinator.py; app/content/source_marking.pyPipelineEntry, актуальность текста, лейблы и готовность
Модели/api/pipeline/{id}/taxonomyapp/taxonomy/jobs.py; app/taxonomy/inference.pyЗадания, полные оценки, версия, input_source, история
OCR/api/pipeline/{id}/ocrapp/ocr/worker.py; app/ocr/engine.py; app/ocr/media.pyOCR run, строки, уверенность, кеш, хеши медиа
Фильтры и лейблы/pipeline/filters; /marksapp/content/selection_rules.py; app/content/selection_filters.pyДерево условий, версии правил, назначения и основания
MAX/publicationapp/publication/worker.py; app/publication/service.pyМаршруты, задания отправки, попытки, ID и сверка доставки

Как работать с картой

  1. Перед изменением найти функцию и пройти связи до API, состояния и хранилища.
  2. Проверить входы, ошибки, повторные события и зависимые сценарии.
  3. После изменения обновить карту и затронутые схемы вместе с кодом.
  4. Выполнить связанные проверки и привязать новые материалы к версии исходников.

Сценарии и API

  1. Посмотреть публичные каналы MAX и пример перепубликованного поста.
  2. С доступом владельца открыть доску: Не готовы → Отсортирован → Отфильтрован → Маркировка → На публикацию.
  3. Открыть карточку и выбрать источник результата: текст поста или OCR. Сравнить сохранённые прогоны.
  4. Открыть фильтр: проверить модель, условия, лейбл и совпавшие основания в предпросмотре.
  5. В истории MAX проверить канал, статус доставки, сохранённую ссылку и ошибки.

Проверка опубликованной версии

CI: Tests and runtime build ↗ · 5f50077b · версия этого демо · 2026-10-03

  • GitHub CI закреплённой версии завершён успешно; ссылка ниже относится к 5f50077.
  • При подготовке этой страницы открыты реальные обзор, доска, фильтр, карточки текста/OCR и история доставки.
  • В рабочем интерфейсе первая партия 9 × 20 отмечена как подтверждённая. Доступны сохранённые ссылки на публикации.

Эти проверки относятся к указанной версии. Коммерческие показатели и качество моделей на независимой выборке здесь не измерялись.

Измерения

  • Девять каналов MAX подключены. Первая партия содержит 180 публикаций — по 20 на канал. Отправитель новых подходящих сообщений включён.
  • В снимке истории есть последующие доставки. Число публикаций меняется по мере поступления сообщений.

Запуск и эксплуатация

Тренировочные корпуса и секреты хранятся вне Git. На VPS передаются модельные артефакты и закреплённые Docker-образы; обучение выполняется на компьютере.

Настройки читаются в app/config.py. Telegram-сессия доступна collector, токен MAX — отправителю. В публичных материалах нет ключей и приватной переписки.

MAX_PUBLISHER_ENABLED управляет отдельным отправителем. Старые LLM, рерайт и публикация в Telegram не участвуют в текущем маршруте.

История попыток хранится в БД. Неопределённую доставку сначала сверяют, чтобы не отправить повтор.

Стек

Python / TelethonСбор из пользовательской Telegram-папки MAX
FastAPI / Jinja / JavaScriptРабочий интерфейс, защищённые API и обновление доски
PostgreSQL / SQLAlchemy / AlembicОригиналы, задания, версии фильтров, лейблы, OCR и доставки
TF-IDF / scikit-learnОсновная автоматическая классификация
MiniLM / PyTorchОбучение локально и ручное сравнение на сервере
RapidOCR / ONNX RuntimeЧтение надписей на медиа отдельным worker
MAX Bot API / httpxЗагрузка вложений, отправка и сверка сообщений

Материалы и исходники

История репозитория: с 16 июня 2026. Текущий сценарий и снимки: 3 октября 2026.

Архив материалов на языке оригинала.