Архитектура · AI Video Production

Карта проекта

Сейчас весь сайт — это один большой файл на 7500 строк. Когда ты обновляешь страницу в браузере (нажимаешь F5 или Cmd+R), сайт всегда возвращает тебя на «Пайплайны → Обзоры ЖК», даже если ты был в «Обзорах локации». Здесь показано что у нас сейчас и как предлагаю разделить сайт на отдельные страницы — каждый раздел на своём адресе.

📖 Словарь — что значат технические слова на этой странице
Страница — то, что открывается на одном адресе в браузере. Например, ai-video-production.ru/architecture — это страница «Архитектура». Сейчас у нас фактически одна большая страница, на которой переключаются вкладки внутри.
URL / адрес — то, что в адресной строке браузера. Например, /youtube/reviews-zhk. Когда ты копируешь и отправляешь его — другой человек по этому адресу попадает в тот же раздел.
Обновить страницу (refresh) — когда ты нажимаешь F5 / Cmd+R / кнопку «↻» в браузере. Сейчас это всегда возвращает на главный таб — твоя главная боль.
Блок — большой кусок интерфейса на странице, выполняющий одну функцию. Например, на «Обзорах локации» сейчас 3 блока: «Запуск ресёрча», «История» и «Готовые обзоры».
Этап — шаг внутри блока. Например, в обзоре локации этапы: гео → фактура → метро → цены → инфраструктура → отзывы. Это не отдельные блоки на UI, это шаги одного процесса.
Агент — программа-исполнитель, которая делает работу. Например, location-research-faktura — это агент, который ищет исторические факты о районе. Каждый агент работает 1-5 минут.
Endpoint / эндпоинт — это «адрес функции» на сервере. Когда фронтенд (то что в браузере) хочет что-то сделать на сервере — он отправляет запрос на конкретный эндпоинт. Например, эндпоинт POST /api/jobs = «запусти мне новую задачу». Тебе как пользователю их видеть не надо — это для меня инструмент чтобы знать что куда подключать.
Output / выход — куда сохраняется результат работы агента. Обычно это папка на сервере (/var/tg-output/...) с готовыми файлами: сценарий, картинки, JSON с данными.
SQLite — простая база данных в виде одного файла. Мы там храним список запущенных задач, истории, короткие ссылки.
Партиал / partial — общий кусок интерфейса (например, боковое меню), который подгружается на каждую страницу из одного файла. Меняешь в одном месте — обновляется везде.
работает частично / в разработке заглушка

Один файл frontend/index.html (7500+ строк) с боковым меню и платформенными табами. URL никогда не меняется — всё на /. При обновлении страницы открывается дефолтный таб (YouTube Shorts → Shorts).

Основное
Дашборд
Пайплайны 6
Контент
Аналитика
Публикации
Переписки
Система
Агенты 9
Настройки
Видео Продакшен
Сократить URL

Платформы и пайплайны (внутри одной страницы)

📱 YouTube Shorts
1 тип контента
Shorts работает
ресёрч тем сценарии монтаж видеовставки постпродакшн публикация
Shorts генерация stub
Судебная практика работает
legal-research legal-script
📺 YouTube
4 типа контента
Обзоры ЖК работает
research reviews-script post-prod publish
Обзоры локации работает
location-research location-history location-writer
Аналитические видео stub
Продажные видео stub
📷 Instagram
3 типа контента
Reels stub
Карусели работает
carousels-single (1 ЖК) carousels-selection (подборка)
Stories stub
📖 Stories (platform)
скоро
Заглушка

Что снаружи пайплайнов (отдельные API/UI)

📊 Аналитика YouTube
youtube_analytics.py · insights.py
видео-список статистика insights AI
💬 Переписки
dialogs.py · из AI-чат-бота
диалоги квалификации
🔗 Сократить URL
POST /api/shorten
📦 Постпродакшн (общий)
postprod.py · postprod_artifacts SQLite
транскрипт описание тайм-коды
Почему это проблема:
  1. Обновляешь страницу — слетаешь на главную. Сейчас все вкладки нарисованы внутри одного файла. Адрес в браузере всегда один и тот же (просто /), поэтому браузер не знает на какой именно вкладке ты был. При обновлении он показывает дефолтную.
  2. Ссылку нельзя послать. Если ты залип в «Обзорах локации Купчино» и хочешь скинуть Роме — URL у тебя /, по нему Рома попадёт на главную, а не на твой обзор.
  3. Сайт работает медленнее. Каждый раз при открытии браузер загружает все 7500 строк — и обзоры локации, и шортсы, и карусели — даже если ты будешь смотреть только что-то одно. Они «лежат рядом» в памяти браузера.
  4. Сложно дорабатывать. Когда я меняю что-то в одной секции — приходится прокручивать огромный файл, легко задеть соседнее. Если ошибка в одной части — может сломаться вся страница, потому что код общий.

Каждый раздел — отдельный HTML-файл, отдельный URL. Sidebar остаётся общий (shared component, копируется в каждый файл или генерируется на бэкенде). Refresh всегда возвращает на ту же страницу. Кнопки «назад/вперёд» в браузере работают. Можно открыть несколько разделов в разных вкладках.

Карта URL → файл → назначение

/
frontend/index.html
📊 Дашборд
Главная страница. Сводка: лиды из amoCRM (за сегодня/неделю), свежие YouTube-видео с метриками (CTR, удержание), активные jobs в работе с прогресс-барами, быстрые ссылки на основные разделы.
GET /api/dialogs/recent GET /api/analytics/videos GET /api/jobs?active=true
/pipelines
frontend/pipelines.html
⚙️ Пайплайны (хаб платформ)
Каталог платформ и пайплайнов. Сетка из карточек: YouTube Shorts / YouTube / Instagram / Stories. Каждая карточка — ссылка на конкретный пайплайн.
/youtube/reviews-zhk
frontend/yt-reviews-zhk.html
📺 YouTube · Обзоры ЖК
Полный конвейер: ресёрч (Trendagent + PNPRO) → сценарий 10-12 мин → пост-прод → публикация. URL поддерживает ?slug=fizik-vodaya чтобы открыть конкретный обзор.
POST /api/jobs type=research POST /api/jobs type=script POST /api/jobs type=post-prod POST /api/jobs type=publish
/youtube/reviews-location
frontend/yt-reviews-location.html
📍 YouTube · Обзоры локации
Multi-agent ресёрч локации: geo (с уточнением зоны через карту) → фактура → метро → цены → инфраструктура → отзывы. URL ?slug=metro-rybackoe открывает конкретный обзор.
POST /api/location-research/start_geo POST /api/jobs type=location-research GET /api/location-research/runs
/shorts
frontend/shorts.html
📱 Shorts · обычные (про недвижимость СПб)
6 этапов на одной странице: ресёрч тем → 20 сценариев (10+10) → монтаж → подбор видеовставок → постпродакшн → публикация на YouTube. Это базовый формат, ежедневный.
шесть этапов на /api/jobs type=shorts-*
/shorts/legal
frontend/shorts-legal.html
⚖️ Shorts · Судебная практика
Отдельный формат шортсов на основе свежих судебных кейсов в недвижимости. Этапы: ресёрч дел → сценарии (по 1 кейсу или batch'ом из 5-10). Отдельная страница потому что источники и логика сценаристов другие, чем у обычных Shorts.
этап ресёрч · legal_research этап сценарии · legal_scriptwriter
/shorts/sales
🔜 запланировано
💼 Shorts · Продажные (когда дойдём)
Отдельный формат для прямой продажи объектов: акценты на оффер, цене, рассрочке. Сейчас не реализовано — слот зарезервирован.
/youtube/analytics-video
🔜 запланировано
📊 YouTube · Аналитические видео
Длинные аналитические видео на канал: «топ ЖК года», «тренды рынка», «районы для инвестиций». Сейчас как слот в боковом меню — реальной реализации нет.
/youtube/sales-video
🔜 запланировано
💼 YouTube · Продажные видео
Длинные продающие видео: конкретный ЖК → выгоды для покупателя → CTA. Сейчас как слот.
/instagram/carousels
frontend/ig-carousels.html
📷 Карусели ипотеки 12%
Генерация PDF-каруселей: 1 ЖК или подборка. С публикацией VK.
этап «1 ЖК» · carousel_agent этап «подборка» · carousel_agent этап «публикация в VK»
/instagram/reels
🔜 запланировано
🎞 Instagram Reels
Reels для Instagram-аккаунта (вертикальные видео). Слот зарезервирован.
/stories
🔜 запланировано
📖 Stories (Instagram + платформенные)
Stories под Instagram и формат сторис для YouTube. Слот.
/analytics
frontend/analytics.html
📊 Аналитика YouTube
Каналы: основной + новый. По видео — CTR, удержание, source-таблица. AI-insights (что сработало). URL ?video_id=xxx открывает деталь конкретного видео.
GET /api/analytics/videos POST /api/analytics/video/{id}/insight/regenerate
/dialogs
frontend/dialogs.html
💬 Переписки и квалификация
Лиды из AI-чат-бота (@nikita_krasnov_anbot): диалоги, квалификация, передача в amoCRM.
/tools/shorten
frontend/tools-shorten.html
🔗 Сократить URL
Микро-инструмент: длинный URL → короткий код. Сохраняется в SQLite.
/architecture
frontend/architecture.html
📐 Эта самая страница
Документация архитектуры. Обновляется руками когда добавляем разделы.

Что будет общим на всех страницах

Подтверждено решение: боковое меню + шапка — один файл-партиал. То есть лежит в одном месте, при загрузке любой страницы он туда «вставляется». Меняем меню один раз — обновляется везде. Никакого копи-паста.

Что общееГде лежит на сервереПростое объяснение
Боковое меню + шапкаfrontend/_partials/sidebar.htmlОдин файл, подгружается на каждую страницу. Меняешь иконку или пункт меню — обновляется везде.
Проверка авторизацииfrontend/_partials/auth.jsНа входе любой страницы проверяет: залогинен ли ты через Telegram. Если нет — кидает на /login.
Общие стили (цвета, шрифты)frontend/_partials/base.cssФайл с цветами темы, размерами, отступами. Подключается тегом <link> в каждую страницу.
Просмотрщик файловfrontend/modal-viewer.jsУже существует. Это окошко, в котором ты сейчас открываешь сценарии, фактуру, цены — общее на весь сайт.

Что МЕНЯТЬ глубже сервера (бэкенд)

Хорошая новость — почти ничего. Сервер уже умеет принимать запросы по конкретным адресам. Меняем только то, как сервер раздаёт страницы браузеру.

ЧтоСейчасБудет
Раздача страниц (nginx)любой адрес отдаёт index.htmlкаждый адрес → свой файл (/youtube/reviews-zhkyt-reviews-zhk.html)
API сервераработаетНЕ трогаем — все запросы агентам остаются те же
База задач (SQLite)общаяНЕ трогаем
Восстановление прогресса после закрытия вкладкисейчас прогресс хранится только в памяти браузера, при закрытии теряетсяid задачи зашивается в адрес (?job=abc123). Открываешь вкладку — она сразу подцепляет твою задачу с сервера и продолжает показывать прогресс.
Стратегия переезда (поэтапно, без поломок):
  1. Сначала самое болючее — Обзоры локации. Именно туда ты чаще всего жмёшь F5 / обновляешь и слетаешь. Это даст быстрый wow-эффект: «открыл свой обзор Купчино, обновил — всё на месте».
  2. Потом по одному переезжают остальные: Обзоры ЖК, Shorts, Карусели. Каждый — отдельный URL.
  3. Старый index.html не трогаем сразу. Он продолжает работать как раньше — мы рядом добавляем новые адреса. Если что-то пойдёт не так в новой странице — старая всё ещё рабочая, ничего не сломается.
  4. Когда все разделы переехали — заменяем / (главную) на новый Дашборд с лидами и аналитикой. Старый index.html удаляется.

Внутри одной страницы блоки остаются вместе. Например, страница «Обзоры локации» содержит все этапы (гео → фактура → метро → цены → инфраструктура → отзывы) и историю — это всё один процесс, не разбиваем. Просто живёт на своём URL.

Здесь для каждой страницы расписано что внутри неё происходит на сервере — какие агенты работают, куда сохраняется результат. Это нужно понимать общее устройство — если что-то ломается, понятнее где искать. Чисто для справки. По «Этап» — это шаги внутри одной страницы, не отдельные страницы.

📺 Страница «YouTube · Обзоры ЖК»

Полный конвейер обзора жилого комплекса: от ресёрча до публикации на канал. Все 4 этапа живут на одной странице и идут друг за другом.

Этап на страницеЧто делаетПрограмма-исполнительКуда сохраняет
1. Ресёрч ЖК Собирает данные о ЖК из Trendagent и PNPRO: цены, планировки, инфраструктура, отделка, динамика цен, ипотека. reviews/researcher tg-output/reviews/research/
2. Сценарий обзора Пишет сценарий на 10-12 минут по структуре «хук → цены → плюсы → минусы → район → застройщик → вывод → CTA». reviews_scriptwriter.py tg-output/reviews/scripts/
3. Постпродакшн Берёт твоё записанное видео с Я.Диска, делает транскрипт через AssemblyAI, генерирует описание YouTube, тайм-коды, теги. postprod.py база данных postprod_artifacts
4. Публикация Загружает финальное видео на YouTube канал «Никита Краснов» (или новый), ставит обложку, описание, теги, расписание. publish.py + YouTube API YouTube

📍 Страница «YouTube · Обзоры локации»

Multi-agent ресёрч: запускается один раз, параллельно работают 6 программ. На страничке потом видны все собранные данные + кнопка перейти к написанию сценария.

Этап / агентЧто делаетКуда сохраняет
Гео location-research-geo Определяет границы локации на карте, координаты центра, радиус, к какому району относится. Делает картинку зоны. Если включён интерактивный режим — даёт тебе править зону вручную. geo.json + zone.png
Фактура location-research-faktura Собирает 3-5 исторических хайлайтов про район: этимология, личности, что было раньше. Скачивает архивные фото и старые карты. faktura.json + _visuals/
Метро location-research-metro Профиль ближайшей станции метро: год открытия, глубина, пассажиропоток. Или 3 ближайшие, если своей станции нет. metro.json
Цены location-research-prices Собирает реальные объявления Avito в круге локации: студии / 1к / 2к / 3к — диапазон цен, медиана, цена за метр + 9 примеров с фото. prices.json + 9 примеров
Инфраструктура infrastructure_search.py Считает через Яндекс.Карты: сколько в зоне магазинов, аптек, школ, детсадов, поликлиник, парков, ресторанов, фитнес-клубов. infrastructure.json
Отзывы и минусы reviews_search.py Парсит отзывы жителей с irecommend, otzovik, городских форумов + Perplexity. Выделяет 8-12 минусов района с цитатами и ссылками. reviews.json + reviews.md
Сценарист не подключён Запланирован: возьмёт все собранные данные и напишет сценарий обзора локации. Сейчас сценарии пишутся отдельно.

📱 Страница «YouTube Shorts»

6 этапов: от поиска темы до публикации шортса 35-40 секунд.

ЭтапЧто делаетКуда сохраняет
1. Ресёрч тем shorts_research.pyПарсит конкурентов через yt-dlp + ищет темы по 7 ключевым словам недвижимости СПб. Даёт 10 «трендовых» тем + 10 «поисковых».tg-output/shorts/research/
2. Сценарии shorts_scriptwriter.pyПишет 20 сценариев Shorts (10+10) по структуре ВИСП (Внимание-Интерес-Смысл-Призыв) и Лестнице Ханта.tg-output/shorts/scripts/
3. Монтаж shorts_editor.pyРаскладывает текст сценария на сегменты с тайм-кодами и подсказками к монтажу.tg-output/shorts/edits/
4. B-roll (видеовставки) shorts_brolls.pyПодбирает стоковые видео для перебивок между лицом в кадре.tg-output/shorts/brolls/
5. Постпродакшн shorts_postprod.pyТранскрипт записанного шортса + описание + теги.база shorts_artifacts
6. Публикация shorts_publish.pyЗагружает Shorts на YouTube.YouTube

⚖️ Страница «Shorts · Судебная практика»

Отдельный формат шортсов на основе судебных дел в недвижимости.

ЭтапЧто делаетКуда сохраняет
1. Ресёрч дел legal_research.pyПодбирает свежие судебные кейсы в недвижимости (за неделю/месяц) с конкретикой и ссылками на решения.tg-output/legal/research/
2. Сценарии legal_scriptwriter.pyПревращает кейсы в сценарии Shorts — по 1 кейсу или batch'ом.tg-output/legal/scripts/

📷 Страница «Instagram · Карусели»

Генерация PDF-каруселей с подборками квартир под ипотеку 12%.

ЭтапЧто делаетКуда сохраняет
Карусель про 1 ЖК carousels/ipoteka/carousel_agent.pyБерёт 4-6 лучших квартир из конкретного ЖК с ежемесячными платежами под 12%, делает красивый PDF на 10 слайдов.tg-output/carousels/<id>/result.pdf
Подборка ЖК carousel_agent.py (другой режим)Подборка из нескольких ЖК — например, «5 лучших ЖК в Приморском районе до 15 млн».tg-output/carousels/<id>/
Публикация в VKПосле одобрения — постит PDF в группу VK с подписью.VK

🌐 Вспомогательное: Chrome-расширения для сбора данных

Это не страницы, а маленькие программы-помощники в твоём браузере. Они нужны потому что некоторые сайты (Avito, Perplexity, PNPRO) блокируют запросы с серверов — а с твоего домашнего IP через браузер пускают. Расширения играют роль «прокси»: сервер просит — расширение делает запрос — отдаёт ответ обратно.

РасширениеЧто обслуживает
Browser relay (Avito + Я.Карты)Цены квартир в обзорах локации (Avito) · поиск через Яндекс.Карты для блока инфраструктуры
Perplexity relayОтзывы жителей из Perplexity — для блока «минусы» в обзорах локации
PNPRO relayКаталог ЖК Setl Group (бионика, чистое небо, нева хаус и т.п.) — для обзоров ЖК которых нет в Trendagent