У меня есть open‑source проект, который я поддерживаю долгое время, и всё это время несколько вещей мне не давали покоя. Во‑первых, мой проект был таким монолитом, с больше чем 50 нейронными сетями суммарно по всем задачам, и нужно продумывать много вещей помимо того, как сделать так, чтобы нейронные сети выгружались и загружались, при этом без краша домашнего ноутбука, а во‑вторых, каждая новая нейронка начинает использовать свои библиотеки и версии, что стало конфликтом и стопором интеграции и развития проекта. Новая модель липсинка требовала такой torch, от которого ломалась замена лица. Вывод из этого: не стоит держать все яйца в одной корзине.

И да, это была причина, из‑за которой я на долгое время проект забросил. И ещё я обнаружил, что очень много людей с macOS, которые бы хотели запустить проект, но не могли это сделать, так как он был рассчитан на Windows и Linux.

В начале августа этого года я вернулся к работе над проектом, решив реализовать новое архитектурное решение. Меня вдохновила идея плагинов, которые так давно есть в видеоредакторах, и из Flask‑приложения на Python и JavaScript я занялся полноценным видеоредактором на Qt и Python. И это мне позволило архитектурно сделать решение, при котором конфликты библиотек исключаются, пользователь ставит только то, что интересно, а также появляется свободный вход для всех, кто хотел бы в проект интегрировать свою нейронную сеть или даже сервис с API.

В этой статье будет инструкция, как создавать плагины для проекта самостоятельно или через Claude Code, Codex, Cursor. Для этого в репозитории я добавил код сборщика и умения для облачных языковых моделей.

Можно, а зачем?
Можно, а зачем?

А зачем это надо?

И с этого стоит начать, рассказать, что умеет приложение сейчас, какие у него особенности и какие боли оно решает. Я разрабатываю проект Wunjo Make уже 3 года. Новая версия v3 — это сильно переработанный форк Kdenlive, добротного open‑source видеоредактора на лицензии GNU General Public License v3.0. Помимо всех базовых возможностей, я интегрировал две крупные идеи. Монтировать может нейронная сеть, пользователь может сам под себя расширять видеоредактор.

Первая идея, MCP для Claude Code, Codex, Cursor и, конечно, локальных нейронных сетей. Локальные нейронки для управления MCP, создаются как плагины. По умолчанию я сделал плагин с локальной Qwen 3.5, но можно добавлять любые свои. Нейронная сеть благодаря MCP и приложению может искать файлы на компьютере по описанию или сама решать, что поставить, искать файлы в интернете на площадках стоковых видео и аудио, генерировать видео и аудио. При этом модель не обработчик промптов, хотя и не без этого. Есть система навыков. Навыки можно создавать свои. А ещё есть loop, когда вы задаёте сценарий и последовательность действий, а также критерии конечного результата, при которых нейронке нужно остановиться.

И первая идея со сценариями, умениями, контролем умных языковых моделей с овердофига контекстом даёт возможность создавать любые конвейеры видео и аудио. В будущем я сделаю статью, где расскажу с практической части, как внедрять MCP для своего проекта, про сам стандарт.

А вот вторая идея, система плагинов, позволяет пользователю выбирать то, что именно надо. Например, озвучить видео нужным голосом или дописать голос в видео, сгенерировать видео или отредактировать его, заменить одежду, причёску и всё, сделать разные ракурсы, что сейчас могут Seedance 2.5, Gemini Omni или локальные нейронки, сделать звуковые эффекты, музыкальное сопровождение, добавить эмоции на видео актёрам, лишённым их. Да даже обычный сценарий, взять видео, наложить субтитры, акцентироваться на лице и нарезать на шортсы.

И вот эта система плагинов раскрывает все возможности для фантазиии конвейера. Можно взять что‑то из библиотеки готовых плагинов или написать свой за часик на вайбкодинге. Например, взять Pika API и использовать его в локальном видеоредакторе, в который можно постоянно заходить офлайн в проект, а не открывать сайт, искать файлы и прочее.

Что такое плагины?

Плагины старше Macintosh. Идея началась не с графики и не с меня. В середине 1970-х текстовый редактор EDT на мейнфрейме Unisys VS/9 умел запускать программу изнутри и давать ей работать с буфером редактора. В этом вся концепция в одном предложении: хозяин, которому принадлежит документ, и гость, которому разрешено его трогать. Персональный компьютер сделал из этого продуктовую функцию. HyperCard и QuarkXPress, оба вышедшие для Macintosh в 1987 году, можно было расширять кодом, который с ними не поставлялся, а в 1988-м Silicon Beach Software добавила plug‑in в Digital Darkroom и SuperPaint, и слово закрепилось в графическом софте. Netscape Navigator 2.0 открыл браузер для плагинов в 1995-м, чтобы страница могла проиграть видео или запустить Java прямо в себе, а не вызывать другую программу. Steinberg опубликовала спецификацию VST в 1996-м вместе с Cubase 3.02, и цифровая звуковая станция превратилась из программы в платформу: каждый ревербератор и компрессор, а с 1999 года и каждый виртуальный инструмент мог прийти от кого‑то другого и работать внутри микшера хоста. WordPress добавил плагины в версии 1.2 в мае 2004-го, и к концу 2021-го их было почти шестьдесят тысяч. Браузерный плагин тем временем умер: Chrome отказался от него в 2015-м, Firefox окончательно в 2021-м, по соображениям безопасности и поддержки, и его место заняло расширение в песочнице с объявленными разрешениями. Каждая из этих систем по‑своему отвечала на одни и те же четыре вопроса. Кому разрешено расширять программу, как загружается гость, что ему можно трогать и как хозяин переживает гостя, который ведёт себя плохо.

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

Папка, манифест и четыре вида строк

Если вы покупали плагин для Premiere Pro или DaVinci Resolve, вы знаете привычный формат. Скомпилированное расширение из маркетплейса, привязанное к одному хосту, непрозрачное.

Белка и торнадо
Белка и торнадо

В этом проекте плагин устроен немного иначе. Плагин — это папка, внутри манифест plugin.json, скрипт на Python, обычно main.py, и файл с зависимостями. В упакованном виде папка превращается в.wmplugin, обычный ZIP с тем же деревом в корне. Весов моделей внутри нет, но можно положить. Однако лучший паттерн, когда манифест перечисляет их с URL и контрольной суммой, а редактор скачивает их при установке загрузчиком, который умеет продолжать оборванное соединение и сверяет хеш, прежде чем довериться файлу. Архив весит несколько сотен килобайт, даже когда модели за ним занимают гигабайты, а лицензия весов остаётся с весами.

У каждого плагина свой Python. Когда вы нажимаете «Установить» на его вкладке настроек, редактор просит uv, пакетный менеджер на Rust, создать окружение с Python 3.11, названное по имени плагина, и uv сам скачивает интерпретатор, если на машине его нет. Зависимости плагина ставятся в это окружение и больше никуда. Плагин может везти несколько файлов зависимостей и позволить редактору выбрать по версии CUDA‑драйвера, так что один и тот же архив ставит torch для процессора на ноутбук и torch под CUDA 12.4 на рабочую станцию. Depth Map может держать torch ниже 2.7, а Voice Toolkit прибивать transformers к 4.57, потому что 5.x ломает его модель, и ни один из них не знает о существовании другого.

Редактор не импортирует плагин. Наоборот, редактор пишет один JSON‑файл, задание, в свежую рабочую папку и запускает интерпретатор плагина с этим файлом как единственным аргументом. В задании сказано, с какими клипами работать и с какого кадра по какой, что пользователь выставил на вкладке настроек, куда писать результат, частота кадров и размер проекта и путь к собственному ffmpeg редактора. Плагин отвечает в стандартный вывод, по строке за раз, и значение имеют только четыре вида строк: число прогресса, фраза для строки состояния, запрос недостающей модели или ключа и финальный результат со списком созданных файлов. Логи идут в stderr, а код выхода говорит, почему плагин остановился, от плохих входных данных до нехватки памяти. Редактор никогда не делит интерпретатор с моделью, поэтому плагин, который упал или съел всю видеопамять, не тянет за собой ничего.

Что плагину разрешено

Манифест решает, где плагин появится. Тот, что нацелен на видео, возникает по правому клику на клипе, в подменю «Искусственный интеллект», а тот, что нацелен на звук, только на клипах, где есть звук. Нацеленный на лицо появляется в маленьком меню, которое выскакивает из рамки найденного лица в мониторе, и получает прямоугольник лица вместе с клипом. У генератора нет клипа, на котором можно сидеть, поэтому он работает через карточку в чате. А агентный плагин вовсе не инструмент, а способ работы с MCP: он отвечает в панели чата и управляет редактором через тот же скриптовый интерфейс, что и внешний ассистент.

Возвращается ровно то, что объявлено: видео, звук, картинка или субтитры, и попадают они в корзину проекта, на таймлайн или на место зоны, на которой запускались. Foley мой любимый пример того, насколько это свободно. Эффект Foley на видеоклипе, но возвращает он звук, и редактор кладёт его на новую дорожку под тем клипом, на который смотрел. Плагин может предлагать размеры, small, base и large, каждый со своей потребностью в видеопамяти и пометкой, работает ли он на процессоре вообще. Веса, нужные только одной функции, можно пометить как необязательные, поэтому Voice Toolkit ставится с тремя файлами из тридцати двух, а остальные двадцать девять, модели озвучки, предлагает только тем, кто этой функцией пользуется.

Видов плагинов два. Локальный запускает модели на машине и обязан работать без сети, как только его веса на месте. API‑плагин вызывает платного или бесплатного провайдера по сети, и ключ попадает в скрипт только как переменная окружения, никогда через командную строку и никогда в то, что плагин печатает. Плагин может писать только в выданную ему рабочую папку, не может ничего устанавливать во время работы, а если модели нет, говорит об этом строкой запроса и выходит. Ограничения есть. Плагин называет поддерживаемые операционные системы, и редактор отказывается ставить его на другие. Например, Head Swap работает только на Linux и Windows, потому что в его основе WANN 2.1 и для его работы нужна видеокарта NVIDIA с восемью гигабайтами памяти. Каждый плагин имеет свои технические требования.

Пишем плагин с ассистентом

Наконец‑то, мы дошли до этого. Папка plugins/skills в репозитории не документация в обычном смысле, а навыки для языковых моделей, которые пишут код. Там страница правил, страница с полным описанием от полей манифеста до выходных данных, страница с четырьмя рабочими образцами, по одному на каждый вид плагина, и страница ограничений: секреты только через окружение, никаких шелл‑трюков, писать только в папку результата, держать main.py читаемым, потому что человек будет проверять то, что написала модель. Те же страницы продублированы на сайте документации.

Пользоваться ими нужно так же, как любым скиллом в Claude Code, Cursor или Codex. Укажите агенту на папку или вставьте страницы в контекст, опишите модель или сервис, который хотите обернуть, и где должна появиться кнопка, и дайте ему писать. Потом запустите плагин руками на файле задания, который написали сами, ещё до того, как в деле появится редактор, потому что файл на входе и строки на выходе не требуют редактора для проверки. Когда строки выглядят правильно, прогоните упаковщик с флагом проверки, чтобы провалидировать манифест, упакуйте и импортируйте архив через «Настройки», «Настроить Wunjo Make», “Плагины”, «Добавить плагин». Чтобы показать, насколько маленьким может быть плагин, вот полный пример. Он инвертирует цвета клипа собственным ffmpeg редактора, не имеет файла зависимостей, а значит работает на системном Python без сборки окружения, и ничего не скачивает.

Два файла: plugin.json и под ним main.py.

{
  "manifest_version": 1,
  "id": "invert",
  "name": "Invert",
  "version": "1.0.0",
  "description": "Inverts the colours of a clip with the editor's own ffmpeg.",
  "license": "MIT",
  "kind": "local",
  "target": "video",
  "entry": "main.py",
  "os": ["linux", "windows", "macos"],
  "input": {"clip": "video", "multiple": false, "zone": false},
  "result": {"type": "video", "place": "bin"}
}
import argparse, json, os, subprocess, sys

def emit(line):
    sys.stdout.write(line + "\n")
    sys.stdout.flush()

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--job", required=True)
    with open(parser.parse_args().job, encoding="utf-8") as f:
        job = json.load(f)
    clip = job["input"]["clips"][0]
    fps = job["project"]["fps"]
    start = clip["in"] / fps
    length = (clip["out"] - clip["in"] + 1) / fps
    out = os.path.join(job["output_dir"], "invert.mp4")
    emit("info:inverting " + os.path.basename(clip["path"]))
    emit("progress:10")
    cmd = [job["ffmpeg"], "-y", "-ss", f"{start:.3f}", "-t", f"{length:.3f}",
           "-i", clip["path"], "-vf", "negate", "-c:a", "copy", out]
    run = subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
    if run.returncode != 0:
        sys.stderr.write(run.stderr.decode(errors="replace"))
        return 1
    emit("progress:100")
    emit("result:" + json.dumps({"outputs": [{"type": "video", "path": out}]}))
    return 0

if __name__ == "__main__":
    sys.exit(main())

Сорок четыре строки. Я прогнал его на трёхсекундном тестовом клипе с написанным от руки заданием, и он напечатал ровно четыре строки: info:inverting clip.mp4, затем progress:10, затем progress:100, затем строку результата с именем invert.mp4 в рабочей папке, и вышел с нулём. Проверка упаковщика ответила одной своей строкой, invert: OK (Invert 1.0.0, local/video).

 Вот и все пироги
Вот и все пироги

Ассистент, которому дали папку skills и одно предложение брифа, попадает в несколько строк от этого, а сухой прогон говорит, правильно ли он понял контракт, ещё до открытия редактора. Настоящий плагин с моделью добавляет файл зависимостей, список моделей в манифесте и строку запроса на случай отсутствия весов, а его первая установка скачивает гигабайты. Форма не меняется.

Собрать плагин, достаточно просто. Файл pack.py `python pack folder_name`, где folder_name ваш плагин с main.py и plugin.json.

Владислав Радченко

Про автора. Я инженер‑программист. Активно внедряю новые методы разработки, основанный на агентах и автоматизации. Код в этой статье взят из Wunjo Make, открытого локального редактора для тех, кто делает видео. Найти меня можно на GitHub и в LinkedIn.

Надеюсь, вас заинтересовала идея плагинов в моём open‑source видеоредакторе. Если вы хотите присоединиться к разработке, буду рад вашим идеям и вашим плагинам. Вы можете создавать собственные плагины и добавлять их в проект через fetch и push. Я просматриваю все изменения, поэтому каждый желающий может предложить свои решения и помочь развивать проект.

Комментарии (2)


  1. tw0face
    09.10.2026 09:12

    Поддерживаем такое


    1. Wladradchenko Автор
      09.10.2026 09:12

      Спасибо за поддержку