Aller au contenu

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

Shell
pip install kennmarq                 # the cloud API: no dependencies
pip install "kennmarq[local]"        # local mode
pip install "kennmarq[safety]"       # the safety check on your machine too

Le 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

Python
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

Python
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 later

mark() 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

Python
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 InvalidSignedFile et 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=False n’en conserve aucun.
  • Le modèle du filigrane (65 Mo) se télécharge une seule fois, dans ~/.cache/kennmarq/models ou KENNMARQ_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é

Python
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 ContentBlocked

Le 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

Python
Kennmarq().verify("render.marked.png")   # free, no key needed

Erreurs

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.