Continuity
场记 / Continuity
Плагин для DeepSeek Harness, который даёт агенту локальную генерацию изображений / речи / музыки / звуковых эффектов и запоминает, что он создал — один и тот же персонаж остаётся тем же самым персонажем в каждом вызове, а неудачная генерация никогда не выдаётся за успешную.
Работает локально. Модели лениво загружаются по запросу и освобождаются в простое, поэтому когда вы не используете его, GPU не тронут — 0,21 ГиБ в памяти, измерено. Можно играть в игру на той же карте.
场记 — это супервайзер непрерывности на съёмочной площадке. Его работа сводится к двум вещам: следить, чтобы костюм, причёска и реквизит совпадали между дублями, и ловить ошибку на площадке до того, как она попадёт в фильм. Именно это и делает данный плагин.
Установка
uvx --from continuity-mcp continuity-setup # preflight → build engines → fetch weights → start
dsh plugin --profile <your-profile> add dsh-plugin-continuitycontinuity-setup проверяет машину до того, как что-либо скачать, и подгоняет установку под то, что находит. Сначала запустите continuity-setup --check, чтобы увидеть, что он сделает: это читает оборудование и ничего не меняет:
体检结果:
GPU AMD Radeon RX 7800 XT (RADV NAVI32) (16.0 GiB, 此刻可用 15.8 GiB, DISCRETE_GPU, vulkan device 1)
未选 AMD Radeon RX 7900 XTX (RADV NAVI31) (24.0 GiB, 此刻可用 1.4 GiB)
跳过 llvmpipe —— 软件渲染, 不是真显卡
内存 30.9 GiB
磁盘 3118.4 GiB 可用 / 需要 30 GiB
生图 启用
抠图默认档 best
参考音上限 30s (每秒约 0.19 GiB 显存)Две детали здесь существуют потому, что наивный вариант ошибочен:
Он пропускает
llvmpipe. Программный растеризатор заявляет 30,9 ГиБ «VRAM» (это ваша системная оперативная память) и выиграл бы любой конкурс «выбери самую большую карту». Тогда всё работало бы на CPU — работало, выглядело совершенно нормально и было бы неприемлемо медленным.Он выбирает по свободной VRAM, а пропускает по общей VRAM. На машине выше у карты на 24 ГиБ фактически свободно 1,4 ГиБ, потому что другой процесс удерживает её; выбор по размеру выбрал бы её и затем словил бы OOM. Но вопрос «достаточно ли хороша эта карта» — это вопрос об оборудовании, поэтому тут используется общая: иначе карта на 16 ГиБ была бы отклонена из-за открытой игры.
Минимальные требования
Минимум | Примечания | |
GPU | 8 ГиБ VRAM | Пик — 6,80 ГиБ (измерено). Запросы сериализованы, так что пик — одна модель, а не сумма. |
GPU API | Vulkan 1.2+ | Ни CUDA, ни ROCm. Ядра компилируются в SPIR-V во время выполнения. |
Диск | 30 ГиБ во время установки, 19,5 ГиБ после | 17,4 весов + 2,1 образ среды выполнения + 8,5 слоёв сборки (можно вернуть). |
RAM хоста | 16 ГиБ (8 ГиБ рабочий вариант — см. ниже) | Определяется кратковременными пиками, а не простоем. |
CPU | любой x86-64 | Удаление фона работает на CPU. |
Установки только с аудио (см. ниже) требуют 20 ГиБ во время установки, 9,5 ГиБ после.
Все значения VRAM/RAM на этой странице указаны в ГиБ (2³⁰ байт), именно их сообщают rocm-smi и vulkaninfo. В более ранней версии этого README они были обозначены как ГБ; это было неверно и заставляло запас выглядеть теснее, чем он есть.
Vulkan вместо CUDA — не предпочтение; это причина, по которой всё вообще работает. ROCm неверно вычисляет декодирование VAE на этом классе GPU (ROCm#6633): пять декодирований одинаковых входных данных вернули пять взаимно некоррелированных результатов. Vulkan/RADV компилирует SPIR-V во время выполнения вместо поиска по таблице ядер для каждой архитектуры и здесь работает правильно и быстрее. Побочный эффект — переносимость на все три вендора.
Производители GPU
Как контейнер получает GPU | Статус | |
AMD |
| Проверено (RX 7800 XT, RX 7900 XTX) |
Intel |
| Не проверено |
NVIDIA |
| Не проверено |
У меня есть только видеокарты AMD, поэтому я не буду утверждать большего. В коде нет ничего специфичного для AMD — ни CUDA, ни ROCm, ни HIP, ни /dev/kfd, ни целей gfx — а Vulkan-бэкенд ggml широко используется на NVIDIA. Но «широко используется» — это не «я это проверил».
Путь NVIDIA — это действительно другая разводка, а не просто другая карта: Vulkan ICD от NVIDIA живёт в драйвере хоста и должен внедряться nvidia-container-toolkit с NVIDIA_DRIVER_CAPABILITIES, включающим graphics; значение по умолчанию compute,utility даёт вам работающий CUDA и пустой список устройств в Vulkan. continuity-setup обнаруживает NVIDIA, использует правильный compose-оверлей и сообщает, что путь не проверен. Отчёты в любую сторону приветствуются.
Оперативная память хоста: подробности
Простой пренебрежимо мал; пики определяют размер машины.
операция | пиковый RSS |
простой | 0.52 ГиБ |
музыка | 0.50 ГиБ |
речь | 1.63 ГиБ |
изображение (1024²) | 4.94 ГиБ |
| 7.74 ГиБ |
| 1.33 ГиБ |
Удаление фона — это потолок, и его стоимость не зависит от размера входного изображения — 256 / 512 / 1024 px дают пик около 6,8 ГиБ, потому что BiRefNet работает с фиксированным внутренним разрешением.
На 16 ГиБ работает всё. Ниже 12 ГиБ continuity-setup устанавливает по умолчанию quality="fast" (u2netp): пик падает до 1,33 ГиБ, и это выполняется за 0,6 с вместо 7,2 с. На типичном игровом спрайте их трудно отличить на глаз — проверено бок о бок на пурпурном фоне с увеличением краёв. best остаётся значением по умолчанию там, где есть место, потому что модели в принципе различаются на тонких краях (волосы, полупрозрачная бахрома), но относитесь к fast как к законному выбору, а не как к ухудшенному запасному варианту.
Что адаптируется к вашей VRAM, а что нет
Три вещи масштабируются вместе с картой. Все три порога измерены, а не угаданы:
Маленькая карта | Большая карта | Почему | |
Какая половина устанавливается | только аудио (<8 ГиБ) | изображение + аудио | Генерация изображений достигает пика 6,80 ГиБ, и её невозможно уменьшить — см. ниже |
Выгрузка аудио перед изображением | да (<12 ГиБ) | нет | Аудиомодели остаются в памяти; изображение поверх них даёт пик 7,84 ГиБ вместо 6,80 |
Лимит референсного аудио | 15 с (<12 ГиБ) | 30 с | Референсное аудио стоит ~0,19 ГиБ за секунду |
Уровень только с аудио — это полноценный продукт, а не утешительный приз: кастинг голосов, диалоги, музыка, SFX и вырезание — всё работает и легко умещается в 4 ГиБ.
Что не адаптируется: модель изображений. Квантование вообще не двигает VRAM: Q4_0 (2,29 ГиБ весов) даёт пик 6,60 ГиБ, Q8_0 (4,01 ГиБ) — 6,59 ГиБ, одинаково. Снижение разрешения тоже не помогает (512 / 768 / 1024 дают один и тот же пик; меняется только время). Узкое место — 8-гигабайтный неквантованный текстовый энкодер 4B, а не диффузионная модель. Поэтому предлагать «средний» уровень изображений нечего — только установлен или нет. (Q4_0 поставляется в любом случае — та же VRAM, на 1,7 ГиБ меньше на диске.)
Опуститься ниже 8 ГиБ для изображений означает сменить текстовый энкодер или семейство моделей. Это возможно, но тогда закрепление идентичности переходит с нативных ref_images на IP-Adapter, который здесь не проверен — а закрепление идентичности и есть весь смысл.
Нулевое пребывание в памяти
Измерено на RX 7800 XT, когда на карте больше ничего нет:
GPU | |
простой | 0.21 ГиБ |
во время генерации изображения | 6.80 ГиБ |
через 2 с после завершения | 0.21 ГиБ |
во время TTS | 2.39 ГиБ |
через 120 с после TTS | 0.21 ГиБ |
Изображения бесплатны: движок потоково передаёт веса на каждый запрос и никогда не держит их в памяти. Аудио освобождается по таймеру простоя (AUDIO_IDLE_UNLOAD_S, по умолчанию 120 с) — не сразу, потому что человек, озвучивающий десять реплик подряд, не должен платить перезагрузкой каждый раз. Перезагрузка не стоит ничего измеримого: один и тот же TTS-запрос занял 3,0 с и на холодную, и на тёплую, потому что веса отображены через mmap и лежат в страничном кеше.
Запросы сериализованы, поэтому пик = одна самая большая модель. Закрытие агента также освобождает VRAM — MCP-сервер выгружает всё при выходе, а не оставляет движки удерживающими её.
Две вещи, которые он действительно делает
1. Идентичность сохраняется между вызовами. Бэкенды генерации не имеют состояния: попросите одного и того же персонажа дважды — и вы получите двух людей, которые просто похожи друг на друга. Измерено на Qwen3-TTS: четыре реплики из одного описания голоса:
разброс высоты тона по 4 репликам | |
напрямую в модель (сэмплирование по умолчанию) | 125 Гц |
напрямую в модель, жадное декодирование | 242 Гц — хуже |
через Continuity (закреплённый референс) | 5 Гц |
При жадном декодировании зерно доказуемо инертно — зерна 5 / 99 / 777 дали один идентичный sha256, — так что случайность была полностью устранена, и всё равно дрейф составил 242 Гц. Идентичность — функция входного текста, а не случайного розыгрыша. temperature=0 и top_k=1 этого не исправят. Исправить может только закрепление на референсном артефакте.
create_actor(name, voice) -> audition clip; listen before you commit
actor_tts(actor, text) -> same timbre every line
create_character / create_animal / create_object (name, appearance)
subject_image(subject, scene) -> same look, new scene / angle / outfitИдентичность и гардероб разделены: закрепите лицо и телосложение, затем меняйте одежду в промпте сцены. Референс в тёмно-синей мантии, если попросить wearing heavy red armor, вернётся в доспехах с тем же лицом.
Уже подобрали персонажа где-то ещё? import_actor и import_subject закрепляют предоставленный вами артефакт — реальную запись голоса, клип из ElevenLabs, лист персонажа из другого инструмента, — и всё дальнейшее поведение идентично. Аудио нормализуется для вас в 24 кГц моно (на входе 44,1 кГц стерео; проверено: эталонная f0 идентична, а импортированный актёр сходится с локально созданным до 11 Гц).
2. Вырожденный вывод отклоняется. Бэкенд, который неправильно считает, возвращает совершенно корректный WAV из одних нулей или плоский серый PNG с HTTP 200. Каждый артефакт проверяется (стандартное отклонение изображения, RMS аудио, неконечные сэмплы), и вызов громко завершается ошибкой, а не сообщает об успехе поверх мусора. Вырезания дополнительно получают отчёт о качестве — в основном прозрачное, ничего не удалено, объект разбит на фрагменты, в объекте проедены дыры — каждый случай с конкретным предупреждением вместо молчаливого пропуска.
Плюс remove_bg: диффузионные модели рисуют «прозрачный фон» как непрозрачную шахматную доску; она превращает это в настоящий RGBA-вырез, который требуется спрайтам. И gen_sfx, который процедурно синтезирует игровые SFX в стиле sfxr — бит-в-бит одинаковые для заданного зерна, миллисекунды, без GPU — потому что диффузионная модель — неправильный инструмент для 40-миллисекундного подбора монеты.
Инструменты
19 инструментов. Всё возвращает абсолютные локальные пути к файлам, а не URL, — агент и движки находятся на одной машине, поэтому путь может попасть прямо в ваш игровой проект без шага загрузки, и не нужно запускать или настраивать файловый сервер.
голос |
|
внешность |
|
аудио |
|
пост |
|
мета |
|
generate_image и generate_speech существуют для разовых задач и сами говорят об этом в своих описаниях: они явно сообщают агенту, что их результат не вернётся при следующем вызове, и указывают на инструменты закрепления для всего повторяющегося.
Ограничения и почему каждое из них существует
Каждое число здесь — это измеренная граница отказа, а не политика.
ограничение | значение | что происходит за его пределами |
длина строки | 200 символов | 600 символов заклинили GPU: |
референсное аудио | 15 с / 30 с | ~0.19 ГиБ VRAM в секунду: 15 с → 6.59 ГиБ, 30 с → 9.04 ГиБ. Дальше голос становится потолком вместо изображения. |
сценарий кастинга | 45 символов | Он создаёт референсное аудио, которое затем перечитывается на каждой последующей строке. Количество символов — плохой прокси (60 символов дали 19.1 с, а не 13.7 с, как предсказывает пропорция), поэтому реальная длительность проверяется после кастинга и сообщается. |
размер изображения | 1024 px | 1280 подняли VRAM до 14.5/16.4 ГиБ; 2048 отправили драйвер в thrashing |
длительность музыки | 120 с | Это не ограничение безопасности: движок молча обрезает на 120 с и сообщает об успехе. Ограничение превращает это в явное поле |
Импортированное аудио ниже 24 кГц принимается, но помечается: повышение частоты дискретизации не может восстановить выброшенную октаву, поэтому клон получается тусклее, чем файл, который вы дали. Это заслуживает предупреждения, а не молчаливого пропуска — это та же форма отказа, что и всё остальное, для чего существует этот плагин.
Слишком большие входные данные обрабатываются по-разному в зависимости от типа — и это намеренно. Слишком большое изображение масштабируется, и результат сообщается вам обратно (原图 2400x1600 → 存为 1024x682) — масштабированная картинка всё равно изображает то же самое. Слишком длинное референсное аудио отклоняется, а не обрезается: обрезка хвоста аудио оставила бы транскрипт, описывающий то, чего в аудио больше нет, а это соответствие — ровно то, на чём держится клонирование. Молчаливая обрезка дала бы вам актёра, который импортировался успешно, но звучит как кто-то другой.
Свой бэкенд (необязательно)
Локальные движки используются по умолчанию, но каждый бэкенд — это URL (SD_SERVER, AUDIO_SERVER). Укажите их на свой сервер — и локальные модели никогда не загружаются. Одно ограничение, если вы это сделаете: аудиодвижок сам разрешает путь к референсному аудио, поэтому он должен видеть тот же каталог актёров (та же машина или общий ресурс).
Изображенческий бэкенд обязан принимать референсное изображение (нативное ref_images в стиле FLUX.2, IP-Adapter или PuLID для лиц). Без этого закрепление личности не работает — и плагин говорит об этом, а не молча деградирует.
Существующие наработки
Обзор текущей экосистемы MCP — MiniMax-MCP, openrouter-mcp-multimodal, AtlasCloud, плагины dsh vision/draw и четыре игровых ассет-сервера — показал, что клонирование голоса есть в нескольких, закрепление визуального субъекта — ни в одном, а проверка вывода — ни в одном.
Структура
bundle/ dsh bundle (npm) — one plugin row; dsh spawns and supervises the MCP server
src/ the MCP server: pinning, guardrails, verification, cutout, VRAM lifecycle
src/continuity_mcp/deploy/ compose + engine Dockerfile + weight manifestЛицензия
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for Wan AI video generation
MCP server for Hailuo (MiniMax) AI video generation
MCP server for MiniMax H3 multimodal video generation
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/linxuhao/Deepseek-Continuity'
If you have feedback or need assistance with the MCP directory API, please join our Discord server