SDK Python
Marquez les images, morceaux et vidéos IA depuis Python en une ligne : dans le cloud, ou, pour les images, sur votre propre machine, qu’elles ne quittent jamais. Le contrôle de sécurité et la vérification sont inclus. Sous licence MIT ; le client cloud n’a aucune dépendance.
Installation
pip install kennmarq # the cloud API: no dependencies
pip install "kennmarq[local]" # local mode
pip install "kennmarq[safety]" # the safety check on your machine tooLe SDK lit votre clé dans KENNMARQ_API_KEY, ou la reçoit via api_key=. Python 3.10 ou version ultérieure.
Dans le cloud
from kennmarq import Kennmarq
k = Kennmarq()
result = k.mark("render.png", "render.marked.png", source="created", model="FLUX.1 schnell")
print(result.mark_id, result.watermark_id, result.marks_used)L’image part vers POST /v1/mark : nos serveurs de Zurich la marquent en mémoire et ne conservent rien. Un fichier de plus de 4 Mo, jusqu’à 25 Mo, est d’abord envoyé automatiquement via POST /v1/uploads ; check() et verify() font de même (un envoi nécessite une clé).
Morceaux et vidéos
song = k.mark("track.mp3", "track.marked.mp3", model="Song Model 2")
print(song.marks_counted, song.audio_watermark) # 15 (five per started minute), "claimed"
clip = k.mark("clip.mp4", "clip.marked.mp4", check="ai-act") # waits for the job, then downloads
print(clip.watermark_id, clip.marks_counted)
job = k.mark("long.mp4", wait=False) # or start it now…
clip = k.wait_for(job.mark_id, "long.marked.mp4") # …and fetch it latermark() accepte aussi les morceaux MP3, WAV et M4A et les vidéos MP4, dans le cloud : une vidéo est une tâche, dont mark() attend la fin (jusqu’à 40 minutes) avant de télécharger la vidéo marquée ; une vidéo jusqu’à 1 Go est d’abord envoyée automatiquement. Une image bloquée dans une vidéo lève ContentBlocked, avec cette image dans safety. Pour l’instant, le mode local ne marque que les images.
mark(..., label=True) appose la mention visible de l’UE (« AI GENERATED ») sur une image ou sur chaque image d’une vidéo ; deepfake=True l’active, et label_language, label_position, label_size et label_style la configurent. Les mentions sont apposées dans le cloud : mark_file() ne les appose pas encore.
Sur votre machine
result = k.mark_file("render.png", "render.marked.png", source="created", model="FLUX.1 schnell")
assert result.mode == "local"- Le filigrane et les Content Credentials sont créés sur votre machine. Seul le manifeste part vers POST /v1/sign, environ 13 Ko et jamais de pixels, pour être signé et horodaté. Chaque fichier compte pour un marquage.
- Avant d’écrire quoi que ce soit, le SDK lit le fichier avec nos certificats racines : la lecture doit donner Trusted, avec un horodatage validé et son filigrane en place. Sinon, il lève
InvalidSignedFileet n’écrit rien. - Les Content Credentials que porte déjà le fichier sont conservés en tant qu’ingrédient, comme le demande le code de bonne pratique, et voyagent avec le manifeste ;
keep_input_credentials=Falsen’en conserve aucun. - Le modèle du filigrane (65 Mo) se télécharge une seule fois, dans
~/.cache/kennmarq/modelsouKENNMARQ_MODELS_DIR, et il est vérifié par rapport à son empreinte SHA-256 épinglée. - Là où la bibliothèque C2PA n’a pas de build (Windows, pour l’instant), le filigrane est créé sur votre machine et le manifeste dans le cloud : l’image filigranée est envoyée à
POST /v1/mark(mode == "hybrid"). - Sans clé,
watermark_file()écrit seulement le filigrane et la mention IA IPTC, sans Content Credentials.
Le contrôle de sécurité
answer = k.check("render.png", policy="ai-act") # in the cloud: two marks
answer = k.check("render.png", policy="ai-act", local=True) # on your machine: nothing sent, nothing counted
result = k.mark_file("render.png", "out.png", check="ai-act") # a block raises ContentBlockedLe même contrôle que POST /v1/check, avec les mêmes modèles et les mêmes taux d’erreur. Sur votre machine, ses modèles se téléchargent une seule fois, environ 2,3 Go.
Vérifier un fichier
Kennmarq().verify("render.marked.png") # free, no key neededErreurs
Les erreurs de l’API lèvent KennmarqError, avec le code, le status et le request_id de l’API (erreurs). ContentBlocked porte la réponse du contrôle dans safety ; MissingApiKey, LocalModeUnavailable et InvalidSignedFile indiquent ce qui manque.