Nodes/VALYDA AI PROTOCOL/VALYDA AI PROTOCOL · EU AI Act · Creator (web, social, festival)
ComfyUI Node

VALYDA AI PROTOCOL · EU AI Act · Creator (web, social, festival)

Posting AI content in the EU? This node writes your Article 50 label trail

By RebellionPictures·Created 2 months ago·Updated 9 days ago· 1
VALYDA AI PROTOCOL · EU AI Act · Creator (web, social, festival)
  • video
  • images
  • audio
  • pdf
  • record
Production
Scene
Reason_for_AI_Use
Disclosure_Typenot classified
Timecode_In
Timecode_Out
Source_Footagenot stated
Creator
Producer
Co_Producer
Published_On
Published_On_Name
Rights_Holder
Output_File
Label_WordingAI-generated content
Store_Prompthide prompt
Preview_In_Nodeon

Since August 2, 2026, Article 50 of the EU AI Act is in force, and the transparency duty is real: publish AI-generated images, video or synthetic voice where EU rules reach, and you're meant to label it and be able to show you did. Hand-tracking "which model, what prompt, what seed, was there a source image?" for every upload is exactly the kind of thing you'll get wrong at 11pm before a launch. This node is the fix. You drop it at the end of your workflow, pick one option, hit run, and out comes a PDF plus a machine-readable record of what your workflow actually ran - no metadata copy-pasting, no spreadsheet.

It's the Creator node from the Valyda-Protocol pack, aimed at everything that goes online: social, your own site, festival submissions. One page, one decision, done. (Delivering to a broadcaster instead? Use the sibling Broadcast node - this one hides your prompt by default, which makes it incomplete for delivery contracts.)

How it works

Here's the part that makes it trustworthy: it doesn't read the pretty canvas JSON you see in the UI. It reads the executed prompt - the same API payload ComfyUI actually ran - via a hidden input, then walks every upstream node. It finds your model and hashes the real file (SHA-256, cached so it doesn't stall on a 7GB checkpoint), pulls the prompt, seed, sampler, steps, resolution, frame rate, and whether a real image entered the workflow at all. Everything the tool reads directly is logged as a measurement. Everything you type into a field is logged next to it, clearly marked as your input. If something's missing, the sheet says "not stated" - never a guess, never a placeholder.

The one honest limit, from the author's own docs: it only sees that an image entered the workflow, not where it came from. To ComfyUI, an AI image looks like a photo. So whether that reference is "real footage" or "AI-generated itself" is your call - and it's marked as your statement.

The inputs that actually matter

  • Disclosure_Type - the one decision it asks of you. Realistic content → visible label required. Artistic work → discreet notice, duty remains. Clearly fantastical (dragons, people flying unaided) → no obligation. not classified → nothing gets ticked. The tool never decides this for you, and it's honest about that.
  • Production + Scene - Production groups clips into one folder; spell it exactly the same on every run. Scene names the shot, e.g. Scene 14 - sky replacement.
  • Store_Prompt - defaults to hide prompt, which stores only a checksum. Nobody can read your prompt, but anyone can verify you didn't change it afterwards. Choose show prompt if you might ever need a broadcast record later - plain-text prompts can't be recovered.
  • Output_File - full path of the saved file. Only with this filled does the checksum bind the record to that exact file.

Connect video, images, or audio (one is enough; audio gets a waveform preview). The node outputs two strings - pdf and record - the paths to what it wrote. Both land in ComfyUI/output/valyda/<production>/, with the JSON record alongside so you can hand it to a tool later.

Installing it

ComfyUI Manager: search "Valyda-Protocol", one click. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/RebellionPictures/Valyda-Protocol
pip install -r Valyda-Protocol/requirements.txt

That's the whole dependency story: reportlab and Pillow. No models to download, no GPU, no network calls, no API key. The name sounds like a protocol with infrastructure behind it; it's actually a PDF generator. Deliberately.

Where people get burned

  • Connect at least one of video/images/audio, or it errors out - there's nothing to record otherwise.
  • If your ComfyUI build tries to load a video preview and throws an error, set Preview_In_Node to off. It doesn't affect the record.
  • A muted VALYDA node writes nothing, and can't tell you it didn't. Check before you deliver.
  • It doesn't detect AI in someone else's footage, it's not legal advice, and it's a self-declaration, not a proof of authenticity - the sheet says so on every page. That's the honest part, and it's why a broadcaster can actually trust it.
CategoryVALYDA

Inputs (20)

NameTypeDefaultDescription
videooptVIDEOConnect the VIDEO output of your save/combine node. Video, image or audio - one of them is enough.
imagesoptIMAGEConnect your result images.
audiooptAUDIOFor synthetic voice or sound. A waveform is used as the preview.
ProductionoptSTRINGGroups clips of the same work into one folder. Use the exact same spelling everywhere.
SceneoptSTRINGScene or shot designation, e.g. 'Scene 14 - sky replacement'
Reason_for_AI_UseoptSTRINGWhy AI was used in this shot, e.g. 'weather match to the adjacent scene'
Disclosure_TypeoptCOMBOnot classifiedThe one decision this node asks of you. 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.
Timecode_InoptSTRINGStart timecode in the final 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.
Timecode_OutoptSTRINGEnd timecode in the final cut. If set, it is used as given; if empty, it is calculated from frame rate and frame count where possible.
Source_FootageoptCOMBOnot statedThe 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.
CreatoroptSTRINGYour name or e-mail. Appears on the record.
ProduceroptSTRINGProduction company. Left empty: 'not stated'.
Co_ProduceroptSTRINGCo-producing company, if any. Appears on the record only when filled in.
Published_OnoptCOMBOWhere this clip is published. Delivering to a broadcaster? Use the Broadcast node instead - this node stores the prompt as a checksum by default, so a broadcaster record would be incomplete. Each category has its own 'andere / other' entry - for a platform, site or release that is not listed. The final 'other / sonstiges' is for anything that fits none of the three categories (intranet training, company presentation, competition entry). The prefix (Social / Web / Auswertung = release) only structures the list - the record holds only the part after it.
Published_On_NameoptSTRINGWhich one exactly? Auswertung · Festival -> Berlinale 2027 Social · andere Plattform -> Mastodon Web · Website / own site -> rebellion-pictures.de Social · YouTube -> Rebellion Docs channel (optional) Required for every 'andere / other' entry and for festival, cinema, exhibition, trade show, website and podcast. Optional for named platforms. The document shows both as ONE line: 'Festival · Berlinale 2027'.
Rights_HolderoptSTRINGRights holder of the PRODUCTION, not of this software.
Output_FileoptSTRINGFull path of the saved file. Only then does the checksum bind the record to that exact file.
Label_WordingoptSTRINGAI-generated contentPlain-language label shown to the viewer. Vague wording like 'enhanced media' fails the clarity test.
Store_PromptoptCOMBOhide promptBy default the prompt is hidden: only its checksum is stored - your prompt stays private and is not printed. Hidden means: nobody can read the prompt, but anyone can verify that you did not change it afterwards. 'show prompt' stores it in the record AND prints it on the sheet. Choose it if you may later need a broadcaster record: German public broadcasters require the prompt in plain text, and it cannot be recovered afterwards.
Preview_In_NodeoptCOMBOonShows 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)

NameTypeDescription
pdfSTRING
recordSTRING