VALYDA AI PROTOCOL · EU AI Act · Broadcast (ARD, ZDF, RTL, BBC and others)
Your broadcaster wants the prompt in plain text. This node pre-fills it
- video
- images
- audio
- akte
If you deliver to a broadcaster, the game is different from posting on social. Delivery contracts - ARD, ZDF, RTL, BBC, Netflix - don't just want a label; they want a full production record, right down to the prompt. In plain text. Per clip. And since Article 50 of the EU AI Act applied on 2 August 2026, that transparency duty covers every broadcaster, public, private, or international. Chasing all that metadata by hand, per shot, is how delivery weeks die. The Broadcast node from the Valyda-Protocol pack does it automatically, every render.
It's the sibling of the Creator node, but it asks for more and gives you more. Four required fields - Production, Scene, Reason_for_AI_Use, Disclosure_Type - plus timecodes, source footage, credits, and a broadcaster dropdown with 84 entries covering the whole ARD network (BR, NDR, WDR…), ZDF, ORF, SRF, Deutsche Welle, and an "andere / other" option with a name field for anyone else.
The trick that makes it special
Pick ARD Degeto or ARD Das Erste and the node doesn't just write the protocol - it also generates the Erklärungsbogen KI, the AI declaration sheet straight out of the Degeto delivery contract, already filled in. That's normally a form you'd be filling by hand at 2am. Other broadcasters have their own paperwork, so for them the main protocol is the basis; the author notes that explicitly rather than pretending one form fits everyone.
Same honest mechanics as the rest of the pack: it reads the executed workflow, not the canvas JSON, then hashes every model file it finds (SHA-256, cached), pulls seed, sampler, steps, resolution, frame rate, and logs the prompt. Whatever you type is marked as your input; whatever's missing says so. Nothing invented.
Inputs worth your attention
- Store_Prompt - defaults to
show prompthere, the opposite of the Creator node. That's deliberate: German public broadcasters require the prompt in plain text, and it cannot be recovered afterwards. Hiding it would be the wrong default for this node. - Prompt_Assignment - some workflows don't reveal which text block is the prompt and which is the negative.
automaticleaves both in the document unlabelled; "main text is the prompt" records your statement that the long text is the prompt. It's marked as your call, not the tool's claim. - Timecode_In / Timecode_Out -
00:21:48:11style; dots or commas get turned into colons. Leave In empty until the edit is locked - it also sets the ordering in the project record. - Broadcaster_Name - for "Redaktion Fiktion" style precision; the document shows it as one line,
ARD Degeto · Redaktion Fiktion. - Output_File - the saved file's full path, so the record's checksum binds to that exact deliverable.
Connect video, images, or audio (one is enough). Outputs are two strings - pdf and akte - the file paths, written to ComfyUI/output/valyda/<production>/ alongside the JSON record.
Install and gotchas
ComfyUI Manager: search "Valyda-Protocol". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/RebellionPictures/Valyda-Protocol
pip install -r Valyda-Protocol/requirements.txt
Dependencies are just reportlab and Pillow - no models, no GPU, no network, no API key. The same install covers all three nodes in the pack, so if you have Creator installed, this one's already there.
The usual traps: a muted node writes no record and can't say so; Production must be spelled identically on every clip or records scatter into separate folders; if your ComfyUI build errors on the in-node preview, flip Preview_In_Node to off (the record is unaffected). And remember the sheet is a self-declaration, not a proof of authenticity - that's stated on every page, and it's what keeps it defensible.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| Production | STRING | Title of the production. It holds the project together: all clips with the same name go into one folder, and the Project node combines them into one record at the end. Always spell it identically. | |
| Scene | STRING | Designation of the shot, e.g. 'Scene 14 - sky replacement'. Goes verbatim into the declaration form. | |
| Reason_for_AI_Use | STRING | Why AI was used, e.g. 'weather match'. Goes verbatim into the declaration form. | |
| Disclosure_Type | COMBO | not classified / nicht eingestuft | Article 50 (4) EU AI Act - your assessment, the tool never decides this for you. The definition is broad: it covers persons, objects, places and events that COULD exist in reality. A realistic-looking car falls under it even if that exact car never existed. Only what is obviously impossible stays outside - dragons, people flying unaided. Realistic content - visible label: disclosure required. Artistic work - discreet notice: the duty remains, but the notice may be discreet, e.g. in the credits. Clearly fantastical - no disclosure: no obligation. not classified: nothing is decided, nothing will be ticked. |
| videoopt | VIDEO | Connect the VIDEO output of your save/combine node. Video, image or audio - one of them is enough. | |
| imagesopt | IMAGE | Connect your result images. | |
| audioopt | AUDIO | For synthetic voice or sound. A waveform is used as the preview. | |
| Timecode_Inopt | STRING | Start timecode in the broadcast cut, entered by hand. Format: hours:minutes:seconds:frames, e.g. 00:21:48:11 Dots or commas are turned into colons. Leave empty until the edit is locked - it also sets the order in the project record. | |
| Timecode_Outopt | STRING | End timecode in the broadcast cut. If set, it is used as given; if empty, it is calculated from frame rate and frame count where possible. | |
| Source_Footageopt | COMBO | not stated / nicht angegeben | The tool only sees THAT an image entered the workflow - not where it came from. An AI image looks like a photo to ComfyUI. 'AI-generated itself' sets the status to fully generated. This statement comes from YOU and is marked as such. |
| Creatoropt | STRING | Who created this shot. | |
| Produceropt | STRING | Production company. Left empty, the document says 'not stated' - nothing is invented. | |
| Co_Produceropt | STRING | Co-producing company, if any. Appears on the record only when filled in. | |
| Broadcasteropt | COMBO | Broadcaster or client - public service, private or international; Article 50 applies to every broadcaster. Not listed? Choose 'andere / other' and type the name below - any client is possible. The declaration form (Erklärungsbogen KI) is generated ONLY for ARD Degeto and ARD Das Erste - it is their contract form; the other broadcasters have their own paperwork, there the main protocol is the basis. BR Bayerischer Rundfunk · HR Hessischer Rundfunk · MDR Mitteldeutscher Rundfunk · NDR Norddeutscher Rundfunk · RB Radio Bremen · RBB Rundfunk Berlin-Brandenburg · SR Saarländischer Rundfunk · SWR Südwestrundfunk · WDR Westdeutscher Rundfunk · DW Deutsche Welle · ORF Österreichischer Rundfunk · SRF Schweizer Radio und Fernsehen | |
| Broadcaster_Nameopt | STRING | Which one exactly? Editorial department or the precise client - 'Redaktion Fiktion', 'ARD Degeto Nord'. Not listed? Choose 'andere / other' above and type the name here. The document shows both as ONE line: 'ARD Degeto · Redaktion Fiktion'. Required only with 'andere / other', otherwise optional. | |
| Rights_Holderopt | STRING | Rights holder of the PRODUCTION - not the software rights holder named in the footer. | |
| Output_Fileopt | STRING | Full path of the saved file. Only then does the checksum bind the record to that exact file. | |
| Store_Promptopt | COMBO | show prompt / Prompt zeigen | 'show prompt' writes the prompt into the document - broadcasters require it. 'hide prompt' keeps it private: nobody can read the prompt, but anyone can verify that you did not change it afterwards. |
| Prompt_Assignmentopt | COMBO | automatic / automatisch | Some workflows do not reveal which text is the prompt and which the negative prompt. Both then appear side by side in the document, unlabelled. 'main text is the prompt': you state that the long text is the prompt. It is printed as such, marked as your statement. |
| Preview_In_Nodeopt | COMBO | on / an | Shows the preview image inside the node. Some ComfyUI builds try to load a video preview instead and report an error - switch to 'off' then. It does not affect the record. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| STRING | — | |
| akte | STRING | — |