Skip to main content
Glama

场记 / Continuity

Ein DeepSeek Harness-Plugin, das einem Agenten lokale Bild-/Sprach-/Musik-/SFX-Generierung ermöglicht und sich merkt, was es erzeugt hat — dieselbe Figur bleibt bei jedem Aufruf dieselbe Figur, und eine fehlgeschlagene Generierung darf niemals als Erfolg durchgehen.

Läuft lokal. Modelle werden pro Anfrage lazy geladen und im Leerlauf freigegeben, sodass die GPU unberührt bleibt, wenn du das Plugin nicht nutzt — 0,21 GiB resident, gemessen. Du kannst auf derselben Karte ein Spiel spielen.

场记 ist die Continuity-Supervisorin am Filmset. Ihre gesamte Aufgabe besteht aus zwei Dingen: sicherstellen, dass Kostüm, Frisur und Requisiten zwischen den Takes übereinstimmen, und den Fehler am Set zu erkennen, bevor er in den Film geschnitten wird. Genau das ist die Aufgabe dieses Plugins.

Installation

uvx --from continuity-mcp continuity-setup      # preflight → build engines → fetch weights → start
dsh plugin --profile <your-profile> add dsh-plugin-continuity

continuity-setup prüft die Maschine, bevor es etwas herunterlädt, und dimensioniert die Installation nach dem, was es vorfindet. Führe zuerst continuity-setup --check aus, um zu sehen, was es tun würde — das liest die Hardware und ändert nichts:

体检结果:
  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 显存)

Zwei Details darin existieren, weil die naive Version falsch ist:

  • Es überspringt llvmpipe. Der Software-Rasterizer wirbt mit 30,9 GiB „VRAM" (es ist dein Arbeitsspeicher) und würde jeden „wähle die größte Karte"-Wettbewerb gewinnen. Alles würde dann auf der CPU laufen — funktionierend, völlig normal aussehend und unbrauchbar langsam.

  • Es wählt nach freiem VRAM aus, begrenzt nach Gesamt-VRAM. Auf der Maschine oben hat die 24-GiB-Karte 1,4 GiB tatsächlich frei, weil ein anderer Prozess sie hält; eine Auswahl nach Größe würde sie wählen und dann OOM auslösen. Aber „ist diese Karte gut genug" ist eine Hardware-Frage, daher wird dafür der Gesamtwert verwendet — sonst würde eine 16-GiB-Karte abgelehnt, nur weil ein Spiel geöffnet ist.

Mindestanforderungen

Minimum

Hinweise

GPU

8 GiB VRAM

Spitze ist 6,80 GiB (gemessen). Anfragen werden serialisiert, die Spitze ist also ein Modell, nicht die Summe.

GPU-API

Vulkan 1.2+

Kein CUDA, kein ROCm. Kernel werden zur Laufzeit als SPIR-V kompiliert.

Festplatte

30 GiB während der Installation, 19,5 GiB danach

17,4 Gewichte + 2,1 Laufzeit-Image + 8,5 Build-Layer (wiederverwertbar).

Arbeitsspeicher

16 GiB (8 GiB nutzbar — siehe unten)

Bestimmt durch transiente Spitzen, nicht durch den Leerlauf.

CPU

beliebiges x86-64

Hintergrundentfernung läuft auf der CPU.

Nur-Audio-Installationen (siehe unten) benötigen 20 GiB während der Installation, 9,5 GiB danach.

Alle VRAM/RAM-Angaben auf dieser Seite sind GiB (2³⁰ Bytes), was rocm-smi und vulkaninfo melden. Eine frühere Version dieser README bezeichnete sie als GB; das war falsch und ließ den Spielraum enger erscheinen, als er ist.

Vulkan statt CUDA ist keine Präferenz — es ist der Grund, warum das überhaupt läuft. ROCm berechnet die VAE-Dekodierung auf dieser GPU-Klasse falsch (ROCm#6633): fünf Dekodierungen identischer Eingaben lieferten fünf gegenseitig unkorrelierte Ergebnisse. Vulkan/RADV kompiliert SPIR-V zur Laufzeit, statt eine pro-Architektur-Kerneltabelle nachzuschlagen, und ist hier korrekt und schneller. Der Nebeneffekt ist Portabilität über alle drei Hersteller.

GPU-Hersteller

Wie der Container die GPU erhält

Status

AMD

/dev/dri + Mesa RADV im Image

Getestet (RX 7800 XT, RX 7900 XTX)

Intel

/dev/dri + Mesa ANV im Image — gleicher Mechanismus

Ungetestet

NVIDIA

nvidia-container-toolkit injiziert den Host-Treiber (docker-compose.nvidia.yml)

Ungetestet

Ich habe nur AMD-Karten, daher werde ich nicht mehr behaupten. Nichts im Code ist AMD-spezifisch — kein CUDA, kein ROCm, kein HIP, kein /dev/kfd, keine gfx-Ziele — und ggmls Vulkan-Backend wird auf NVIDIA breit eingesetzt. Aber „breit eingesetzt" ist nicht „ich habe es verifiziert".

Der NVIDIA-Pfad ist eine wirklich andere Verdrahtung, nicht nur eine andere Karte: NVIDIAs Vulkan-ICD lebt im Host-Treiber und muss von nvidia-container-toolkit injiziert werden, wobei NVIDIA_DRIVER_CAPABILITIES graphics enthalten muss — die Standardwerte compute,utility liefern dir funktionierendes CUDA und eine leere Geräteliste in Vulkan. continuity-setup erkennt NVIDIA, verwendet das richtige Compose-Overlay und teilt dir mit, dass der Pfad unverifiziert ist. Berichte in beide Richtungen sind willkommen.

Arbeitsspeicher im Detail

Der Leerlauf ist vernachlässigbar; die Spitzen bestimmen die Maschinengröße.

Vorgang

Spitzen-RSS

Leerlauf

0,52 GiB

Musik

0,50 GiB

Sprache

1,63 GiB

Bild (1024²)

4,94 GiB

remove_bg quality="best"

7,74 GiB

remove_bg quality="fast"

1,33 GiB

Die Hintergrundentfernung ist die Obergrenze, und ihre Kosten sind unabhängig von der Eingabegröße — 256 / 512 / 1024 px erreichen alle eine Spitze von ~6,8 GiB, weil BiRefNet mit einer festen internen Auflösung läuft.

Auf 16 GiB funktioniert alles. Unter 12 GiB setzt continuity-setup den Standard auf quality="fast" (u2netp): Die Spitze fällt auf 1,33 GiB und es läuft in 0,6 s statt 7,2 s. Bei einem typischen Game-Sprite sind die beiden mit bloßem Auge schwer zu unterscheiden — nebeneinander über einem Magenta-Hintergrund mit gezoomten Kanten geprüft. best bleibt der Standard, wo Platz ist, weil sich die Modelle im Prinzip bei feinen Kanten unterscheiden (Haare, halbtransparente Ränder), aber betrachte fast als legitime Wahl statt als degradierten Fallback.

Was sich an deinen VRAM anpasst, und was nicht

Drei Dinge skalieren mit der Karte. Alle drei Schwellenwerte sind gemessen, nicht geraten:

Kleine Karte

Große Karte

Warum

Welche Hälfte installiert

nur Audio (<8 GiB)

Bild + Audio

Bildgenerierung erreicht eine Spitze von 6,80 GiB und es gibt keine Möglichkeit, sie zu verkleinern — siehe unten

Audio vor Bild entladen

ja (<12 GiB)

nein

Audiomodelle bleiben resident; Bild zusätzlich dazu erreicht eine Spitze von 7,84 GiB statt 6,80

Referenz-Audio-Limit

15 s (<12 GiB)

30 s

Referenzaudio kostet ~0,19 GiB pro Sekunde

Die Nur-Audio-Stufe ist ein echtes Produkt, kein Trostpreis: Stimmen besetzen, Dialog, Musik, SFX und Ausschneiden funktionieren alle, und es passt bequem in 4 GiB.

Was sich nicht anpasst: das Bildmodell. Quantisierung bewegt den VRAM überhaupt nicht — Q4_0 (2,29 GiB Gewichte) erreicht eine Spitze von 6,60 GiB, Q8_0 (4,01 GiB) 6,59 GiB, identisch. Eine niedrigere Auflösung hilft auch nicht (512 / 768 / 1024 erreichen alle dieselbe Spitze; nur die Zeit ändert sich). Der Engpass ist der 8 GiB große, unquantisierte 4B-Text-Encoder, nicht das Diffusionsmodell. Es gibt also keine „mittlere" Bildstufe anzubieten, nur installiert oder nicht. (Q4_0 wird trotzdem mitgeliefert — gleicher VRAM, 1,7 GiB weniger Festplatte.)

Unter 8 GiB für Bilder zu gehen bedeutet, den Text-Encoder oder die Modellfamilie zu ändern. Das ist möglich, verschiebt aber die Identitätsverankerung von nativem ref_images zu IP-Adapter, was hier nicht verifiziert ist — und Identitätsverankerung ist der ganze Sinn.

Null-Residenz

Gemessen auf einer RX 7800 XT ohne sonstige Last auf der Karte:

GPU

Leerlauf

0,21 GiB

während Bildgenerierung

6,80 GiB

2 s nach Abschluss

0,21 GiB

während TTS

2,39 GiB

120 s nach TTS

0,21 GiB

Bilder sind kostenlos: Die Engine streamt Gewichte pro Anfrage und hält sie nie resident. Audio wird durch einen Leerlauf-Timer freigegeben (AUDIO_IDLE_UNLOAD_S, Standard 120 s) — nicht sofort, weil jemand, der zehn Zeilen hintereinander vertont, nicht jedes Mal einen Neuladevorgang bezahlen sollte. Neuladen kostet nichts Messbares: Dieselbe TTS-Anfrage dauerte kalt und warm 3,0 s, weil die Gewichte mmap'd sind und im Page Cache liegen.

Anfragen werden serialisiert, also Spitze = das einzelne größte Modell. Das Schließen des Agenten gibt den VRAM ebenfalls frei — der MCP-Server entlädt beim Beenden, statt die Engines damit halten zu lassen.

Zwei Dinge, die es tatsächlich tut

1. Identität überlebt Aufrufe. Generierungs-Backends sind zustandslos: Frage zweimal nach derselben Figur und du bekommst zwei Personen, die sich lediglich ähneln. Gemessen mit Qwen3-TTS, vier Zeilen aus einer Stimmbeschreibung:

Tonhöhen-Streuung über 4 Zeilen

direkt an das Modell (Standard-Sampling)

125 Hz

direkt an das Modell, gierige Dekodierung

242 Hz — schlechter

durch Continuity (verankerte Referenz)

5 Hz

Bei gieriger Dekodierung ist der Seed nachweislich wirkungslos — die Seeds 5 / 99 / 777 erzeugten einen identischen sha256 — also wurde die Zufälligkeit vollständig eliminiert, und es driftete trotzdem um 242 Hz. Identität ist eine Funktion des Eingabetextes, nicht der Zufallsziehung. temperature=0 und top_k=1 können das nicht beheben. Nur die Verankerung an einem Referenzartefakt kann es.

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

Identität und Garderobe sind getrennt: Verankere Gesicht und Körperbau, dann ändere die Kleidung im Szenen- Prompt. Eine Referenz in einem Indigo-Gewand, gebeten um wearing heavy red armor, kommt in Rüstung mit demselben Gesicht zurück.

Hast du deine Figur woanders schon besetzt? import_actor und import_subject verankern ein Artefakt, das du lieferst — eine echte Sprachaufnahme, einen ElevenLabs-Clip, ein Charakterblatt aus einem anderen Tool — und alles nachgelagerte verhält sich identisch. Audio wird für dich auf 24 kHz Mono normalisiert (44,1 kHz Stereo als Eingabe, verifiziert: Referenz-f0 identisch, und ein importierter Actor folgt einem nativ besetzten bis auf 11 Hz).

2. Degenerierte Ausgaben werden abgelehnt. Ein Backend, das falsch rechnet, liefert eine perfekt wohlgeformte All-Null-WAV oder ein flaches graues PNG mit HTTP 200. Jedes Artefakt wird geprüft (Bild-Standardabweichung, Audio-RMS, nicht-finite Samples), und der Aufruf schlägt laut fehl, statt Erfolg über Müll zu melden. Ausschnitte erhalten zusätzlich einen Qualitätsbericht — größtenteils transparent, nichts entfernt, Subjekt in Fragmente zersplittert, Löcher durch das Subjekt gefressen — jeweils mit einer spezifischen Warnung statt eines stillen Durchwinkens.

Plus remove_bg: Diffusionsmodelle zeichnen „transparenten Hintergrund" als undurchsichtiges Schachbrettmuster; das verwandelt es in einen echten RGBA-Ausschnitt, den Sprites benötigen. Und gen_sfx, das prozedural sfxr-artige Game-SFX synthetisiert — bit-identisch für einen gegebenen Seed, Millisekunden, keine GPU — weil ein Diffusionsmodell das falsche Instrument für einen 40-ms-Münz-Pickup ist.

Tools

19 Tools. Alles gibt absolute lokale Dateipfade zurück, keine URLs — der Agent und die Engines befinden sich auf derselben Maschine, sodass ein Pfad direkt in dein Spielprojekt gehen kann, ohne Download-Schritt, und es gibt keinen Dateiserver, den man betreiben oder falsch konfigurieren müsste.

Stimme

create_actor import_actor actor_tts list_actors delete_actor generate_speech

Optik

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 und generate_speech existieren für einmalige Vorgänge und sagen dies in ihren eigenen Beschreibungen: Sie teilen dem Agenten explizit mit, dass das, was sie erzeugen, beim nächsten Aufruf nicht zurückkommt, und verweisen für alles Wiederkehrende auf die Pinning-Werkzeuge.

Grenzen und warum jede einzelne existiert

Jede Zahl hier ist eine gemessene Fehlergrenze, keine Richtlinie.

Grenze

Wert

Was darüber hinaus passiert

Zeilenlänge

200 Zeichen

600 Zeichen klemmten die GPU: amdgpu GPU reset(6), Gerät verloren, ein unabhängiger Prozess auf der anderen Karte wurde beendet. 200 ist die Hälfte des größten bekannten sicheren Werts.

Referenz-Audio

15 s / 30 s

~0,19 GiB VRAM pro Sekunde: 15 s → 6,59 GiB, 30 s → 9,04 GiB. Darüber hinaus wird die Stimme zum Engpass statt des Bildes.

Casting-Skript

45 Zeichen

Es erzeugt das Referenz-Audio, das bei jeder späteren Zeile erneut gelesen wird. Die Zeichenanzahl ist ein schlechter Näherungswert (60 Zeichen ergaben gemessene 19,1 s, nicht die 13,7 s, die das Verhältnis vorhersagt), daher wird die tatsächliche Dauer nach dem Casting geprüft und gemeldet.

Bildgröße

1024 px

1280 trieb den VRAM auf 14,5/16,4 GiB; 2048 versetzte den Treiber in restore_userptr_worker-Thrashing, wobei der Prozess im nicht unterbrechbaren D-Zustand festhing — schlimmer als ein sauberer OOM.

Musiklänge

120 s

Keine Sicherheitsgrenze: Die Engine kürzt bei 120 s stillschweigend und meldet Erfolg. Die Grenze macht daraus ein explizites clamped-Feld.

Importiertes Audio unter 24 kHz wird akzeptiert, aber markiert: Hochsampling kann die Oktave, die verworfen wurde, nicht wiederherstellen, daher kommt der Klon matter heraus als die Datei, die du gegeben hast. Das verdient eine Warnung statt eines stillen Durchwinkens — es ist dieselbe Fehlerform wie alles andere, das dieses Plugin abfangen soll.

Übergroße Eingaben werden bewusst nach Typ unterschiedlich behandelt. Ein zu großes Bild wird verkleinert und das Ergebnis wird dir zurückgemeldet (原图 2400x1600 → 存为 1024x682) — ein skaliertes Bild zeigt immer noch dasselbe. Referenz-Audio, das zu lang ist, wird abgelehnt, nicht gekürzt: Das Abschneiden des Endes würde das Transkript hinterlassen, das etwas beschreibt, das das Audio nicht mehr sagt, und genau auf dieser Übereinstimmung beruht das Klonen. Stilles Kürzen würde dir einen Actor liefern, der erfolgreich importiert wurde und wie jemand anderes klingt.

Eigenes Backend mitbringen (optional)

Lokale Engines sind die Standardeinstellung, aber jedes Backend ist eine URL (SD_SERVER, AUDIO_SERVER). Richte sie auf deinen eigenen Server aus und die lokalen Modelle werden nie geladen. Eine Einschränkung, wenn du das tust: Die Audio-Engine löst den Referenz-Audio-Pfad selbst auf, daher muss sie dasselbe Actors-Verzeichnis sehen (gleiche Maschine oder ein gemeinsames Mount).

Das Bild-Backend muss ein Referenzbild akzeptieren (FLUX.2-artige native ref_images, IP-Adapter oder PuLID für Gesichter). Ohne das kann Identitäts-Pinning nicht funktionieren — und das Plugin sagt das, statt stillschweigend zu degradieren.

Stand der Technik

Eine Untersuchung des aktuellen MCP-Ökosystems — MiniMax-MCP, openrouter-mcp-multimodal, AtlasCloud, die dsh-Vision/Draw-Plugins und vier Game-Asset-Server — fand Sprachklonen in mehreren, visuelles Subjekt-Pinning in keinem und Ausgabeverifizierung in keinem.

Layout

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

Lizenz

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