Zum Inhalt springen

Python-SDK

Markieren Sie KI-Bilder, -Songs und -Clips aus Python mit einer Zeile: in der Cloud oder, bei Bildern, auf Ihrem eigenen Rechner, den sie dann nie verlassen. Sicherheitsprüfung und Verifizierung sind enthalten. Unter MIT-Lizenz; der Cloud-Client braucht keine Abhängigkeiten.

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

Das SDK liest Ihren Schlüssel aus KENNMARQ_API_KEY oder nimmt ihn über api_key= entgegen. Python 3.10 oder neuer.

In der 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)

Das Bild geht an POST /v1/mark: Unsere Server in Zürich markieren es im Arbeitsspeicher und bewahren nichts auf. Eine Datei über 4 MB, bis 25 MB, lädt das SDK selbstständig zuerst über POST /v1/uploads hoch; check() und verify() tun dasselbe (ein Upload braucht einen Schlüssel).

Songs und Clips

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() nimmt in der Cloud auch Songs (MP3, WAV, M4A) und Clips (MP4) entgegen: Ein Clip ist ein Auftrag, auf den mark() wartet (bis zu 40 Minuten), bevor es den markierten Clip herunterlädt; ein Clip bis 1 GB wird zuerst selbstständig hochgeladen. Ein blockiertes Einzelbild löst ContentBlocked aus, mit dem Einzelbild in safety. Der lokale Modus markiert vorerst nur Bilder.

mark(..., label=True) zeichnet die sichtbare Kennzeichnung der EU („AI GENERATED“) in ein Bild oder in jedes Einzelbild eines Clips; deepfake=True schaltet sie ein, und label_language, label_position, label_size und label_style gestalten sie. Kennzeichnungen werden in der Cloud gezeichnet: mark_file() zeichnet sie noch nicht.

Auf Ihrem Rechner

Python
result = k.mark_file("render.png", "render.marked.png", source="created", model="FLUX.1 schnell")
assert result.mode == "local"
  • Wasserzeichen und Content Credentials entstehen auf Ihrem Rechner. Nur das Manifest, etwa 13 KB und nie Pixel, geht an POST /v1/sign, um signiert und mit einem Zeitstempel versehen zu werden. Jede Datei zählt eine Markierung.
  • Bevor es etwas schreibt, liest das SDK die Datei mit unseren Wurzelzertifikaten: Das Ergebnis muss Trusted lauten, mit einem validierten Zeitstempel und vorhandenem Wasserzeichen. Andernfalls löst es InvalidSignedFile aus und schreibt nichts.
  • Content Credentials, die die Datei bereits trägt, bleiben als Bestandteil („Ingredient“) erhalten, wie es der Verhaltenskodex verlangt, und werden mit dem Manifest mitgesendet; mit keep_input_credentials=False bleiben keine erhalten.
  • Das Modell des Wasserzeichens (65 MB) wird einmalig nach ~/.cache/kennmarq/models oder KENNMARQ_MODELS_DIR heruntergeladen und gegen seinen festgelegten SHA-256-Hash geprüft.
  • Wo es für die C2PA-Bibliothek keinen Build gibt (vorerst Windows), entsteht das Wasserzeichen auf Ihrem Rechner und das Manifest in der Cloud: Das Bild mit dem Wasserzeichen wird an POST /v1/mark gesendet (mode == "hybrid").
  • Ohne Schlüssel schreibt watermark_file() nur das Wasserzeichen und die IPTC-KI-Kennzeichnung, ohne Content Credentials.

Die Sicherheitsprüfung

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

Dieselbe Prüfung wie POST /v1/check, mit denselben Modellen und denselben Fehlerraten. Auf Ihrem Rechner werden ihre Modelle einmalig heruntergeladen, etwa 2,3 GB.

Datei verifizieren

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

Fehler

API-Fehler lösen KennmarqError aus, mit code, status und request_id der API (Fehler). ContentBlocked trägt die Antwort der Prüfung in safety; MissingApiKey, LocalModeUnavailable und InvalidSignedFile sagen, was fehlt.