npx skills add ...
npx skills add run-labs-com/agent-skills --skill eu-ai-label
Add the official EU AI-content labels (EU icons for labelling AI-generated content, AI Act Art. 50) to images and videos. Use when the user asks to label, watermark, mark, or badge media as AI-generated, AI-modified, or a deepfake, mentions the EU AI icons / AI Act transparency disclosure, or asks to put an "AI" label/badge in a corner of a photo, screenshot, GIF or video.
npx skills add run-labs-com/agent-skills --skill eu-ai-label
Burns the official European Commission icons for labelling AI-generated content into
images and videos. Source: https://digital-strategy.ec.europa.eu/en/policies/eu-icons-labelling-ai-generated-content
(icons bundled in assets/, PNG + SVG, all four colour variations).
Writes <name>-ai-label.<ext> next to the input and prints the recommended alt text.
Always use the absolute skill path when calling from another directory, e.g.
python3 ~/.pi/agent/skills/eu-ai-label/scripts/ai-label.py clip.mp4.
--variant | Icon | When to use |
|---|---|---|
ai (default) | "AI" badge | AI was involved in creating a deep fake or published text, or you add your own text label / second layer (e.g. "voices generated with" + icon) |
generated | "AI GENERATED" | The whole thing is AI-generated, no human-created elements or editorial control beyond prompting |
modified | "AI MODIFIED" | Pre-existing human-made content partially altered with AI (face swap, AI-furnished room, …) |
Ask the user which case applies if it is not obvious; when unsure default to ai.
-c/--color auto|black|white — auto samples the target corner and picks the contrasting icon.--half — the 50 %-transparency icon variants (only when the full-opacity one is too dominant).-p/--position — bottom-right (default), bottom-left, top-right, top-left, bottom-center, top-center; br/bl/tr/tl/bc/tc aliases work.--height (% of frame height, default 8) or --width (% of frame width), or absolute --height-px / --width-px. Guards: --min-px (24), --max-width (40 %).--margin % of the shorter side (default 2.5) or --margin-px.--crf 18, --preset medium, --vcodec libx264; audio is stream-copied. Add anything else with --ffmpeg-arg.-n/--dry-run prints the ffmpeg command, -f/--force overwrites, --no-metadata skips the disclosure comment tag.Behaviour notes: images keep their format (JPEG q2, PNG flattened unless --keep-alpha),
GIFs are re-encoded with a generated palette, audio-only inputs are skipped with a hint
(the EU icons are visual — disclose audio in the player UI, description or an accompanying label).
Metadata is video-only. The disclosure comment tag is written for video containers (MP4/MOV/…),
but ffmpeg's still-image muxers discard it, so PNG/JPEG/WebP/TIFF/GIF outputs carry no tag — the
script says so instead of pretending otherwise. This is cosmetic for compliance: Art. 50 wants a
visible mark, and the label is burned into the pixels either way. To add a tag anyway:
exiftool -Comment='…' out.png.
Follow these unless the user explicitly overrides them:
top-left or bottom-left there).--print-alt).Full rules and scope: references/eu-rules.md.
# fully AI-generated video, white icon, bottom-left, slightly bigger
python3 scripts/ai-label.py clip.mp4 -v generated -c white -p bottom-left --height 10
# partially modified photo
python3 scripts/ai-label.py photo.jpg -v modified
# batch into a folder (note: use --suffix=-xyz for values starting with a dash)
python3 scripts/ai-label.py shots/*.png --outdir labelled/ -v generated
# label only the first 5 seconds (still must be visible at first exposure)
python3 scripts/ai-label.py clip.mp4 --enable 'between(t,0,5)'
# busy background: add a backing plate
python3 scripts/ai-label.py clip.mp4 --padding 10 --padding-color 'white@0.85'
# just get the raw asset path / alt text for use elsewhere (web, editor, Figma)
python3 scripts/ai-label.py --print-asset generated --color black
python3 scripts/ai-label.py --print-alt modified
python3 scripts/ai-label.py --list