Skip to main content
Glama

场记 / 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-continuity

continuity-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

/dev/dri + mesa RADV dentro de la imagen

Probado (RX 7800 XT, RX 7900 XTX)

Intel

/dev/dri + mesa ANV dentro de la imagen — mismo mecanismo

Sin probar

NVIDIA

nvidia-container-toolkit inyecta el driver del host (docker-compose.nvidia.yml)

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

remove_bg quality="best"

7,74 GiB

remove_bg quality="fast"

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 / outfit

La 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

create_actor import_actor actor_tts list_actors delete_actor generate_speech

imagen

create_character create_animal create_object import_subject subject_image list_subjects delete_subject generate_image

audio

generate_music gen_sfx

post

remove_bg slice_sheet

meta

continuity_status

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: amdgpu GPU reset(6), dispositivo perdido, un proceso no relacionado en la otra tarjeta fue eliminado. 200 es la mitad del valor seguro más grande conocido.

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 restore_userptr_worker con el proceso atascado en estado D ininterrumpible — peor que un OOM limpio.

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 clamped explícito.

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 manifest

Licencia

MIT

-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all MCP Connectors

Latest Blog Posts

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