О проекте
Хотел разбирать поток из нескольких каналов без ручного переноса каждого поста. Собрал конвейер, где можно посмотреть, почему материал отобран, что прочитал OCR и куда он отправился.
Беру новые сообщения из Telegram-папки MAX. На сервере пост проходит классификацию, фильтры и добавление источника. Подходящие материалы уходят в каналы MAX с исходным текстом и вложениями. В рабочем интерфейсе видны оценки моделей, OCR, лейблы, ошибки и история отправки.
Что отличает реализацию
Оригинал не переписывается. Текст поста и надписи на медиа классифицируются отдельно. Фильтр проверяет оценки модели, а назначает обычный лейбл из моего словаря. Один пост может уйти в несколько каналов. Сохранённые ID сообщений и история попыток позволяют разбирать ошибки отправки.
Состав прикладного кода
Доли по размеру прикладных файлов 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 читает изображения и статические превью видео. Распознанный текст не дописывается в публикацию.
- Отсутствующая оценка остаётся неизвестной. Фильтры поддерживают категории, подкатегории, обязательные признаки, длину и вложенные И / ИЛИ / НЕ.
- Отправляется оригинальный пост с медиа и ссылкой «Источник». Отдельного блока ссылок из текста нет.
Code-map: файлы и связи
Карта привязана к версии 5f50077babfe. В таблице — экран или API, связанный модуль и данные.
| Функция | Экран / API | Модуль | Данные / проверка |
|---|---|---|---|
| Сбор | Telegram MTProto | app/live_collector.py; app/collector.py | Граница new_only, курсор чата, оригиналы и медиа |
| Переходы стадий | /pipeline | app/pipeline_coordinator.py; app/content/source_marking.py | PipelineEntry, актуальность текста, лейблы и готовность |
| Модели | /api/pipeline/{id}/taxonomy | app/taxonomy/jobs.py; app/taxonomy/inference.py | Задания, полные оценки, версия, input_source, история |
| OCR | /api/pipeline/{id}/ocr | app/ocr/worker.py; app/ocr/engine.py; app/ocr/media.py | OCR run, строки, уверенность, кеш, хеши медиа |
| Фильтры и лейблы | /pipeline/filters; /marks | app/content/selection_rules.py; app/content/selection_filters.py | Дерево условий, версии правил, назначения и основания |
| MAX | /publication | app/publication/worker.py; app/publication/service.py | Маршруты, задания отправки, попытки, ID и сверка доставки |
Как работать с картой
- Перед изменением найти функцию и пройти связи до API, состояния и хранилища.
- Проверить входы, ошибки, повторные события и зависимые сценарии.
- После изменения обновить карту и затронутые схемы вместе с кодом.
- Выполнить связанные проверки и привязать новые материалы к версии исходников.
Сценарии и API
- Посмотреть публичные каналы MAX и пример перепубликованного поста.
- С доступом владельца открыть доску: Не готовы → Отсортирован → Отфильтрован → Маркировка → На публикацию.
- Открыть карточку и выбрать источник результата: текст поста или OCR. Сравнить сохранённые прогоны.
- Открыть фильтр: проверить модель, условия, лейбл и совпавшие основания в предпросмотре.
- В истории 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.
Архив материалов на языке оригинала.