Continuity
场记 / Continuity
Un plugin de DeepSeek Harness que proporciona a un agente generación local de imágenes / voz / música / efectos de sonido y recuerda lo que ha creado — el mismo personaje sigue siendo el mismo personaje en cada llamada, y una generación fallida nunca puede pasar por un éxito.
Se ejecuta localmente. Los modelos se cargan de forma diferida por petición y se liberan cuando están inactivos, así que cuando no lo estás usando, la GPU no se toca — 0,21 GiB residentes, medido. Puedes jugar a un juego en la misma tarjeta.
场记 es el supervisor de continuidad en un rodaje. Su trabajo consiste en dos cosas: asegurarse de que el vestuario, el peinado y el atrezo coinciden entre tomas, y detectar el error en el set antes de que se corte en la película. Eso es exactamente el trabajo de este plugin.
Instalación
uvx --from continuity-mcp continuity-setup # preflight → build engines → fetch weights → start
dsh plugin --profile <your-profile> add dsh-plugin-continuitycontinuity-setup comprueba la máquina antes de descargar nada, y ajusta el tamaño de la instalación a lo que encuentra. Ejecuta continuity-setup --check primero para ver qué haría — eso lee el hardware y no cambia nada:
体检结果:
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 显存)Dos detalles que existen porque la versión ingenua es incorrecta:
Omite
llvmpipe. El rasterizador por software anuncia 30,9 GiB de "VRAM" (es tu RAM del sistema) y ganaría cualquier concurso de "elige la tarjeta más grande". Entonces todo se ejecutaría en la CPU — funcionando, con aspecto completamente normal, e inutilizablemente lento.Elige por VRAM libre, pero filtra por VRAM total. En la máquina anterior, la tarjeta de 24 GiB tiene 1,4 GiB realmente libres porque otro proceso la ocupa; elegir por tamaño la seleccionaría y luego habría OOM. Pero "¿es esta tarjeta suficientemente buena?" es una cuestión de hardware, así que eso usa el total — de lo contrario, una tarjeta de 16 GiB sería rechazada por tener un juego abierto.
Requisitos mínimos
Mínimo | Notas | |
GPU | 8 GiB de VRAM | El pico es de 6,80 GiB (medido). Las peticiones se serializan, así que el pico es un modelo, no la suma. |
API de GPU | Vulkan 1.2+ | Sin CUDA, sin ROCm. Los kernels son SPIR-V compilados en tiempo de ejecución. |
Disco | 30 GiB durante la instalación, 19,5 GiB después | 17,4 de pesos + 2,1 de imagen de runtime + 8,5 de capas de compilación (recuperables). |
RAM del host | 16 GiB (8 GiB viable — ver más abajo) | Impulsada por picos transitorios, no por el estado inactivo. |
CPU | cualquier x86-64 | La eliminación de fondo se ejecuta en la CPU. |
Las instalaciones solo de audio (ver más abajo) necesitan 20 GiB durante la instalación, 9,5 GiB después.
Todas las cifras de VRAM/RAM en esta página son GiB (2³⁰ bytes), que es lo que reportan rocm-smi y vulkaninfo. Una versión anterior de este README las etiquetaba como GB; eso era incorrecto y hacía que el margen pareciera más ajustado de lo que es.
Vulkan en lugar de CUDA no es una preferencia — es la razón por la que esto funciona en absoluto. ROCm calcula mal la decodificación de VAE en esta clase de GPU (ROCm#6633): cinco decodificaciones de una entrada idéntica devolvieron cinco resultados mutuamente no correlacionados. Vulkan/RADV compila SPIR-V en tiempo de ejecución en lugar de buscar una tabla de kernels por arquitectura, y es correcto y más rápido aquí. El efecto secundario es la portabilidad entre los tres fabricantes.
Fabricantes de GPU
Cómo obtiene el contenedor la GPU | Estado | |
AMD |
| Probado (RX 7800 XT, RX 7900 XTX) |
Intel |
| Sin probar |
NVIDIA |
| Sin probar |
Solo tengo tarjetas AMD, así que no voy a afirmar más que eso. Nada en el código es específico de AMD — sin CUDA, sin ROCm, sin HIP, sin /dev/kfd, sin objetivos gfx — y el backend Vulkan de ggml se ejecuta ampliamente en NVIDIA. Pero "se ejecuta ampliamente" no es "lo he verificado".
La ruta de NVIDIA es un cableado genuinamente diferente, no solo una tarjeta diferente: el ICD de Vulkan de NVIDIA vive en el driver del host y debe ser inyectado por nvidia-container-toolkit, con NVIDIA_DRIVER_CAPABILITIES incluyendo graphics — el valor predeterminado compute,utility te da CUDA funcional y una lista de dispositivos vacía en Vulkan. continuity-setup detecta NVIDIA, usa la superposición de compose correcta, y te informa de que la ruta no está verificada. Los informes en cualquier dirección son bienvenidos.
RAM del host en detalle
El estado inactivo es insignificante; los picos son lo que dimensiona la máquina.
operación | pico de RSS |
inactivo | 0,52 GiB |
música | 0,50 GiB |
voz | 1,63 GiB |
imagen (1024²) | 4,94 GiB |
| 7,74 GiB |
| 1,33 GiB |
La eliminación de fondo es el techo, y su coste es independiente del tamaño de entrada — 256 / 512 / 1024 px alcanzan todos un pico de ~6,8 GiB, porque BiRefNet se ejecuta a una resolución interna fija.
Con 16 GiB todo funciona. Por debajo de 12 GiB, continuity-setup establece el valor predeterminado a quality="fast" (u2netp): el pico baja a 1,33 GiB y se ejecuta en 0,6 s en lugar de 7,2 s. En un sprite de juego típico, los dos son difíciles de distinguir a simple vista — comprobado lado a lado sobre un fondo magenta con los bordes ampliados. best sigue siendo el valor predeterminado donde hay espacio, porque los modelos sí difieren en principio en los bordes finos (cabello, flecos semitransparentes), pero trata fast como una opción legítima en lugar de un recurso degradado.
Qué se adapta a tu VRAM, y qué no puede
Tres cosas escalan con la tarjeta. Los tres umbrales están medidos, no adivinados:
Tarjeta pequeña | Tarjeta grande | Por qué | |
Qué mitad se instala | solo audio (<8 GiB) | imagen + audio | La generación de imágenes alcanza un pico de 6,80 GiB y no hay forma de reducirlo — ver más abajo |
Audio descargado antes de imagen | sí (<12 GiB) | no | Los modelos de audio permanecen residentes; la imagen encima de ellos alcanza un pico de 7,84 GiB en lugar de 6,80 |
Límite de audio de referencia | 15 s (<12 GiB) | 30 s | El audio de referencia cuesta ~0,19 GiB por segundo |
El nivel solo de audio es un producto real, no un premio de consolación: casting de voces, diálogo, música, efectos de sonido y recorte funcionan todos, y cabe cómodamente en 4 GiB.
Lo que no se adapta: el modelo de imagen. Cuantizarlo no mueve la VRAM en absoluto — Q4_0 (2,29 GiB de pesos) alcanza un pico de 6,60 GiB, Q8_0 (4,01 GiB) 6,59 GiB, idéntico. Bajar la resolución tampoco ayuda (512 / 768 / 1024 alcanzan todos el mismo pico; solo cambia el tiempo). El cuello de botella es el codificador de texto de 4B sin cuantizar de 8 GiB, no el modelo de difusión. Así que no hay un nivel de imagen "medio" que ofrecer, solo instalado o no. (Q4_0 se incluye de todos modos — misma VRAM, 1,7 GiB menos de disco.)
Bajar de 8 GiB para imágenes significa cambiar el codificador de texto o la familia de modelos. Eso es posible, pero mueve la fijación de identidad de ref_images nativo a IP-Adapter, que no está verificado aquí — y la fijación de identidad es el punto central.
Residencia cero
Medido en una RX 7800 XT sin nada más en la tarjeta:
GPU | |
inactivo | 0,21 GiB |
durante la generación de imágenes | 6,80 GiB |
2 s después de terminar | 0,21 GiB |
durante TTS | 2,39 GiB |
120 s después de TTS | 0,21 GiB |
Las imágenes son gratuitas: el motor transmite los pesos por petición y nunca los mantiene residentes. El audio se libera mediante un temporizador de inactividad (AUDIO_IDLE_UNLOAD_S, 120 s por defecto) — no inmediatamente, porque alguien que pone voz a diez líneas seguidas no debería pagar una recarga cada vez. La recarga no cuesta nada medible: la misma petición de TTS tardó 3,0 s tanto en frío como en caliente, porque los pesos están mapeados con mmap y residen en la caché de páginas.
Las peticiones se serializan, así que el pico = el modelo individual más grande. Cerrar el agente también libera la VRAM — el servidor MCP se descarga al salir en lugar de dejar que los motores la retengan.
Dos cosas que realmente hace
1. La identidad sobrevive entre llamadas. Los backends de generación no tienen estado: pide el mismo personaje dos veces y obtienes dos personas que meramente se parecen. Medido en Qwen3-TTS, cuatro líneas de una descripción de voz:
dispersión de tono en 4 líneas | |
directo al modelo (muestreo predeterminado) | 125 Hz |
directo al modelo, decodificación voraz | 242 Hz — peor |
a través de Continuity (referencia fijada) | 5 Hz |
Con decodificación voraz, la semilla es demostrablemente inerte — las semillas 5 / 99 / 777 produjeron un sha256 idéntico — así que la aleatoriedad se eliminó por completo, y aun así se desvió 242 Hz. La identidad es una función del texto de entrada, no del sorteo aleatorio. temperature=0 y top_k=1 no pueden arreglarlo. Solo fijarla a un artefacto de referencia puede.
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 / outfitLa identidad y el vestuario son separados: fija la cara y la constitución, luego cambia la ropa en el prompt de la escena. Una referencia con una túnica índigo, a la que se le pide wearing heavy red armor, vuelve con armadura y la misma cara.
¿Ya has hecho el casting de tu personaje en otro sitio? import_actor e import_subject fijan un artefacto que tú proporcionas — una grabación de voz real, un clip de ElevenLabs, una ficha de personaje de otra herramienta — y todo lo posterior se comporta de forma idéntica. El audio se normaliza a 24 kHz mono por ti (44,1 kHz estéreo de entrada, verificado: f0 de referencia idéntico, y un actor importado sigue a uno creado nativamente hasta 11 Hz).
2. La salida degenerada se rechaza. Un backend que calcula mal devuelve un WAV perfectamente bien formado de todo ceros, o un PNG gris plano, con HTTP 200. Cada artefacto se comprueba (desviación estándar de la imagen, RMS del audio, muestras no finitas) y la llamada falla de forma ruidosa en lugar de informar de éxito sobre basura. Los recortes además reciben un informe de calidad — mayormente transparente, nada eliminado, sujeto destrozado en fragmentos, agujeros que atraviesan el sujeto — cada uno con una advertencia específica en lugar de un pase silencioso.
Además remove_bg: los modelos de difusión dibujan "fondo transparente" como un tablero de ajedrez opaco; esto lo convierte en un recorte RGBA real, que es lo que requieren los sprites. Y gen_sfx, que sintetiza efectos de sonido de juego estilo sfxr de forma procedimental — bit-idéntico para una semilla dada, milisegundos, sin GPU — porque un modelo de difusión es el instrumento equivocado para un pickup de moneda de 40 ms.
Herramientas
19 herramientas. Todo devuelve rutas de archivo locales absolutas, no URLs — el agente y los motores están en la misma máquina, así que una ruta puede ir directamente a tu proyecto de juego sin un paso de descarga, y no hay servidor de archivos que ejecutar o configurar mal.
voz |
|
imagen |
|
audio |
|
post |
|
meta |
|
generate_image y generate_speech existen para usos puntuales y así lo indican en sus propias
descripciones: le dicen explícitamente al agente que lo que producen no volverá en la siguiente
llamada, y apuntan a las herramientas de fijación para cualquier cosa recurrente.
Límites, y por qué existe cada uno
Cada número aquí es un límite de fallo medido, no una política.
límite | valor | qué ocurre al superarlo |
longitud de línea | 200 caracteres | 600 caracteres bloquearon la GPU: |
audio de referencia | 15 s / 30 s | ~0,19 GiB de VRAM por segundo: 15 s → 6,59 GiB, 30 s → 9,04 GiB. Más allá de eso, la voz se convierte en el techo en lugar de la imagen. |
guion de casting | 45 caracteres | Produce el audio de referencia, que luego se vuelve a leer en cada línea posterior. El número de caracteres es un proxy deficiente (60 caracteres midieron 19,1 s, no los 13,7 s que predice la proporción), así que la duración real se comprueba después del casting y se informa. |
tamaño de imagen | 1024 px | 1280 llevó la VRAM a 14,5/16,4 GiB; 2048 envió al controlador a un thrashing de |
duración de música | 120 s | No es un límite de seguridad: el motor trunca silenciosamente a 120 s e informa éxito. El límite convierte eso en un campo |
El audio importado por debajo de 24 kHz se acepta pero se marca: el sobremuestreo no puede restaurar la octava que se descartó, así que el clon sale más apagado que el archivo que le diste. Eso merece una advertencia en lugar de un pase silencioso — es la misma forma de fallo que todo lo demás que este plugin existe para detectar.
Las entradas sobredimensionadas se manejan de forma diferente según el tipo, a propósito.
Una imagen demasiado grande se redimensiona y el resultado se te informa (原图 2400x1600 → 存为 1024x682) —
una imagen escalada sigue representando lo mismo. El audio de referencia demasiado largo se
rechaza, no se recorta: cortar el final del audio dejaría la transcripción describiendo algo
que el audio ya no dice, y esa alineación es exactamente de lo que depende la clonación.
Recortarlo silenciosamente te entregaría un actor que se importó correctamente y suena como
otra persona.
Trae tu propio backend (opcional)
Los motores locales son el valor predeterminado, pero cada backend es una URL (SD_SERVER,
AUDIO_SERVER). Apúntalos a tu propio servidor y los modelos locales nunca se cargan. Una
restricción si lo haces: el motor de audio resuelve la ruta del audio de referencia por sí
mismo, así que debe ver el mismo directorio de actores (la misma máquina, o un montaje
compartido).
El backend de imagen debe aceptar una imagen de referencia (ref_images nativo estilo
FLUX.2, IP-Adapter o PuLID para rostros). Sin eso, la fijación de identidad no puede funcionar —
y el plugin lo dice en lugar de degradarse silenciosamente.
Trabajo previo
Un estudio del ecosistema MCP actual — MiniMax-MCP, openrouter-mcp-multimodal, AtlasCloud, los plugins dsh vision/draw y cuatro servidores de assets de juegos — encontró clonación de voz en varios, fijación de sujeto visual en ninguno y verificación de salida en ninguno.
Diseño
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 manifestLicencia
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