mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat(docs-i18n): translate all documentation into 20 languages
All 181 docs markdown files translated into 20 languages (apps/docs/<locale>/**). Companion to the i18n code PR; admin-merged because the file count exceeds GitHub's per-PR CI trigger limit. Validated by pnpm i18n:check (all surfaces, 0 stale/missing) and a clean all-locale docs build.
This commit is contained in:
@@ -0,0 +1,438 @@
|
||||
---
|
||||
description: "KI-Engine-Referenz mit allen lokalen ML-Werkzeugen. Hintergrundentfernung, Hochskalierung, OCR, Gesichtserkennung, Fotorestaurierung und mehr."
|
||||
i18n_source_hash: 14728c1dcd05
|
||||
i18n_provenance: machine
|
||||
i18n_output_hash: 00f94aaf3764
|
||||
---
|
||||
|
||||
# KI-Engine-Referenz {#ai-engine-reference}
|
||||
|
||||
Das `@snapotter/ai`-Paket verbindet Node.js mit einem **dauerhaften Python-Sidecar** für alle ML-Operationen. Der Dispatcher-Prozess bleibt zwischen Anfragen aktiv, was einen schnellen Warmstart ermöglicht. NVIDIA CUDA wird beim Start automatisch erkannt und, sofern verfügbar, genutzt; andernfalls laufen KI-Werkzeuge auf der CPU.
|
||||
|
||||
Eine iGPU-Beschleunigung von Intel/AMD über VA-API, Quick Sync oder OpenCL wird für KI-Inferenz derzeit nicht unterstützt. Das Durchreichen von `/dev/dri` in einen Container beschleunigt diese Python-Sidecar-Werkzeuge nicht, sofern keine CUDA-fähige NVIDIA-GPU verfügbar ist.
|
||||
|
||||
19 KI-Werkzeuge im Python-Sidecar über vier Modalitäten hinweg (Bild, Audio, Video, Dokument), plus 2 Werkzeuge mit optionalen KI-Fähigkeiten. Alle Modelle laufen lokal - nach dem ersten Modell-Download ist kein Internet erforderlich.
|
||||
|
||||
## Architektur {#architecture}
|
||||
|
||||
```
|
||||
Node.js Tool Route
|
||||
|
|
||||
v
|
||||
@snapotter/ai bridge.ts
|
||||
| (stdin/stdout JSON + stderr progress events)
|
||||
v
|
||||
Python dispatcher (persistent process, "ai" profile)
|
||||
|
|
||||
|-- remove_bg.py (rembg / BiRefNet)
|
||||
|-- upscale.py (RealESRGAN)
|
||||
|-- inpaint.py (LaMa ONNX)
|
||||
|-- outpaint.py (LaMa canvas expansion)
|
||||
|-- ocr.py (PaddleOCR / Tesseract)
|
||||
|-- ocr_pdf.py (page-by-page document OCR)
|
||||
|-- ocr_preprocess.py (image enhancement for OCR)
|
||||
|-- detect_faces.py (MediaPipe)
|
||||
|-- face_landmarks.py (MediaPipe landmarks)
|
||||
|-- enhance_faces.py (GFPGAN / CodeFormer)
|
||||
|-- colorize.py (DDColor)
|
||||
|-- noise_removal.py (SCUNet / tiered denoising)
|
||||
|-- red_eye_removal.py (landmark + color analysis)
|
||||
|-- restore.py (scratch repair + enhancement + denoising)
|
||||
|-- transcribe.py (faster-whisper speech-to-text)
|
||||
+-- install_feature.py (on-demand bundle installer)
|
||||
```
|
||||
|
||||
Ein separates "docs"-Dispatcher-Profil ersetzt die KI-Zulassungsliste durch Skripte zur Dokumentenverarbeitung (`doc_pagecount`, `doc_health`, `doc_flatten`, `doc_redact`, `doc_text`, `doc_to_word`, `doc_metadata`, `doc_html_pdf`) und überspringt die aufwendigen ML-Importe.
|
||||
|
||||
**Zeitüberschreitungen:** 300 s standardmäßig; OCR und die BiRefNet-Hintergrundentfernung erhalten 600 s.
|
||||
|
||||
## Feature-Bundles {#feature-bundles}
|
||||
|
||||
KI-Modelle werden nach gemeinsamem Abhängigkeits-Stack gebündelt, nicht als ein Archiv pro Werkzeug. Ein Feature-Bundle kann mehrere Werkzeuge aktivieren, wenn diese dieselbe Modellfamilie, dieselben Python-Wheels oder dieselben nativen Bibliotheken verwenden. Das hält das Release-Docker-Image kleiner und vermeidet doppelte Kopien derselben Modelle für Hintergrund-Matting, Gesichtserkennung, OCR, Restaurierung und Sprache.
|
||||
|
||||
Das Docker-Image liefert die Anwendung sowie die gemeinsame Laufzeitumgebung. Große Modellarchive werden bei Bedarf in das dauerhafte `/data/ai`-Volume heruntergeladen und dann von jedem Werkzeug wiederverwendet, das sie benötigt. Wenn ein Bundle bereits installiert ist, weil ein anderes Werkzeug es benötigt hat, lädt das Aktivieren eines neuen abhängigen Werkzeugs dieses Bundle nicht erneut herunter.
|
||||
|
||||
Jedes KI-Werkzeug benötigt ein oder mehrere Feature-Bundles, bevor es ausgeführt werden kann. Die Admin-Oberfläche installiert werkzeugbezogen über `POST /api/v1/admin/tools/:toolId/features/install`, das die vollständige Bundle-Liste auflöst, bereits installierte Bundles überspringt und nur die fehlenden Downloads in die Warteschlange stellt. Zum Beispiel stellt das Aktivieren von Passfoto auf einer frischen Instanz `background-removal` und `face-detection` in die Warteschlange; wird es aktiviert, nachdem Hintergrundentfernung bereits installiert ist, wird nur `face-detection` in die Warteschlange gestellt.
|
||||
|
||||
| Bundle | Größe | Gemeinsame Abhängigkeitsgruppe | Werkzeuge, die es nutzen |
|
||||
|--------|------|-------------------------|-------------------|
|
||||
| `background-removal` | 4-5 GB | rembg / BiRefNet Hintergrund-Matting | remove-background, passport-photo, transparency-fixer, background-replace, blur-background |
|
||||
| `face-detection` | 200-300 MB | MediaPipe Gesichtserkennung und Landmarken | blur-faces, red-eye-removal, smart-crop |
|
||||
| `object-eraser-colorize` | 1-2 GB | LaMa Inpainting/Outpainting und DDColor | erase-object, colorize, ai-canvas-expand |
|
||||
| `upscale-enhance` | 5-6 GB | RealESRGAN, GFPGAN / CodeFormer, Rauschunterdrückung | upscale, enhance-faces, noise-removal |
|
||||
| `photo-restoration` | 4-5 GB | Kratzerreparatur und Restaurierungs-Pipeline | restore-photo |
|
||||
| `ocr` | 5-6 GB | PaddleOCR / Tesseract OCR-Stack | ocr, ocr-pdf |
|
||||
| `transcription` | ~600 MB | faster-whisper Sprache-zu-Text-Modelle | transcribe-audio, auto-subtitles |
|
||||
|
||||
Werkzeuge mit bundleübergreifenden Abhängigkeiten:
|
||||
|
||||
| Werkzeug | Erforderliche Bundles | Grund |
|
||||
|------|------------------|-----|
|
||||
| `passport-photo` | `background-removal`, `face-detection` | Entfernt den Hintergrund und verwendet dann Gesichtslandmarken, um den Zuschnitt gemäß den Regeln für Pass- und Ausweisfotos auszurichten. |
|
||||
| `enhance-faces` | `upscale-enhance`, `face-detection` | Erkennt Gesichter, bevor es GFPGAN oder CodeFormer zur Verbesserung der ausgewählten Gesichtsbereiche ausführt. |
|
||||
|
||||
Ein Werkzeug ist nur verfügbar, wenn alle erforderlichen Bundles installiert sind. Teilinstallationen sind gültig und werden inkrementell behandelt: installierte Bundles werden wiederverwendet, fehlende Bundles werden als Downloads angezeigt, und Installationen in der Warteschlange werden nacheinander ausgeführt, damit die gemeinsame Python-Umgebung nicht gleichzeitig verändert wird.
|
||||
|
||||
---
|
||||
|
||||
## Hintergrundentfernung {#background-removal}
|
||||
|
||||
**Werkzeug-Route:** `remove-background`
|
||||
**Modell:** rembg mit BiRefNet (Standard) oder U2-Net-Varianten
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `model` | string | - | Modellvariante (optionale Überschreibung) |
|
||||
| `backgroundType` | string | `"transparent"` | Eines von: `transparent`, `color`, `gradient`, `blur`, `image` |
|
||||
| `backgroundColor` | string | - | Hex-Farbe für einfarbigen Hintergrund |
|
||||
| `gradientColor1` | string | - | Erste Verlaufsfarbe |
|
||||
| `gradientColor2` | string | - | Zweite Verlaufsfarbe |
|
||||
| `gradientAngle` | number | - | Verlaufswinkel in Grad |
|
||||
| `blurEnabled` | boolean | - | Hintergrundunschärfe-Effekt aktivieren |
|
||||
| `blurIntensity` | number (0-100) | - | Unschärfeintensität |
|
||||
| `shadowEnabled` | boolean | - | Schlagschatten am Motiv aktivieren |
|
||||
| `shadowOpacity` | number (0-100) | - | Schattendeckkraft |
|
||||
| `outputFormat` | string | - | Ausgabeformat: `png`, `webp` oder `avif` |
|
||||
| `edgeRefine` | integer (0-3) | - | Grad der Kantenverfeinerung |
|
||||
| `decontaminate` | boolean | - | Farbränder an den Kanten entfernen |
|
||||
|
||||
## Hintergrund ersetzen {#background-replace}
|
||||
|
||||
**Werkzeug-Route:** `background-replace`
|
||||
**Modell:** rembg / BiRefNet (gemeinsam mit remove-background)
|
||||
|
||||
Entfernt den Hintergrund und ersetzt ihn durch eine einfarbige Fläche oder einen Verlauf.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `backgroundType` | `"color"` \| `"gradient"` | `"color"` | Hintergrundmodus |
|
||||
| `color` | string | `"#ffffff"` | Hintergrund-Hex-Farbe (wenn `backgroundType` gleich `color` ist) |
|
||||
| `gradientColor1` | string | - | Erste Verlaufs-Hex-Farbe |
|
||||
| `gradientColor2` | string | - | Zweite Verlaufs-Hex-Farbe |
|
||||
| `gradientAngle` | integer (0-360) | `180` | Verlaufswinkel in Grad |
|
||||
| `feather` | integer (0-20) | `0` | Radius der Kantenweichzeichnung |
|
||||
| `format` | `"png"` \| `"webp"` | `"png"` | Ausgabeformat |
|
||||
|
||||
## Hintergrund weichzeichnen {#blur-background}
|
||||
|
||||
**Werkzeug-Route:** `blur-background`
|
||||
**Modell:** rembg / BiRefNet (gemeinsam mit remove-background)
|
||||
|
||||
Zeichnet den Hintergrund weich und hält das Motiv scharf.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `intensity` | integer (1-100) | `50` | Unschärfeintensität |
|
||||
| `feather` | integer (0-20) | `0` | Radius der Kantenweichzeichnung |
|
||||
| `format` | `"png"` \| `"webp"` | `"png"` | Ausgabeformat |
|
||||
|
||||
## Bildhochskalierung {#image-upscaling}
|
||||
|
||||
**Werkzeug-Route:** `upscale`
|
||||
**Modell:** RealESRGAN (mit Lanczos-Fallback, wenn nicht verfügbar)
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `scale` | number | `2` | Hochskalierungsfaktor |
|
||||
| `model` | string | `"auto"` | Modellvariante |
|
||||
| `faceEnhance` | boolean | `false` | GFPGAN-Durchgang zur Gesichtsverbesserung anwenden |
|
||||
| `denoise` | number | `0` | Stärke der Rauschunterdrückung |
|
||||
| `format` | string | `"auto"` | Überschreibung des Ausgabeformats |
|
||||
| `quality` | number | `95` | Ausgabequalität (1-100) |
|
||||
|
||||
## OCR / Textextraktion {#ocr-text-extraction}
|
||||
|
||||
**Werkzeug-Route:** `ocr`
|
||||
**Modelle:** Tesseract (schnell), PaddleOCR PP-OCRv5 (ausgewogen), PaddleOCR-VL 1.5 (beste)
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `quality` | `"fast"` \| `"balanced"` \| `"best"` | `"balanced"` | Verarbeitungsstufe |
|
||||
| `language` | string | `"auto"` | Sprache: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
|
||||
| `enhance` | boolean | `true` | Bild vorverarbeiten, um die OCR-Genauigkeit zu verbessern |
|
||||
| `engine` | string | - | Veraltet. Bildet `tesseract` auf `fast` ab, `paddleocr` auf `balanced` |
|
||||
|
||||
Gibt strukturierte Ergebnisse mit Begrenzungsrahmen, Konfidenzwerten und extrahierten Textblöcken zurück.
|
||||
|
||||
## PDF-OCR {#pdf-ocr}
|
||||
|
||||
**Werkzeug-Route:** `ocr-pdf`
|
||||
**Modelle:** Dasselbe Stufensystem wie bei der Bild-OCR
|
||||
|
||||
Extrahiert Text aus gescannten PDF-Dokumenten mittels KI-gestützter OCR, Seite für Seite.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `quality` | `"fast"` \| `"balanced"` \| `"best"` | `"balanced"` | Verarbeitungsstufe |
|
||||
| `language` | string | `"auto"` | Sprache: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
|
||||
| `pages` | string | `"all"` | Seitenauswahl: `"all"`, `"1-3"`, `"1,3,5"` |
|
||||
|
||||
## Gesichts- / PII-Weichzeichnung {#face-pii-blur}
|
||||
|
||||
**Werkzeug-Route:** `blur-faces`
|
||||
**Modell:** MediaPipe-Gesichtserkennung
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `blurRadius` | number (1-100) | `30` | Radius der Gaußschen Weichzeichnung |
|
||||
| `sensitivity` | number (0-1) | `0.5` | Konfidenzschwelle der Erkennung |
|
||||
|
||||
## Gesichtsverbesserung {#face-enhancement}
|
||||
|
||||
**Werkzeug-Route:** `enhance-faces`
|
||||
**Modelle:** GFPGAN, CodeFormer
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `model` | `"auto"` \| `"gfpgan"` \| `"codeformer"` | `"auto"` | Verbesserungsmodell |
|
||||
| `strength` | number (0-1) | `0.8` | Verbesserungsstärke |
|
||||
| `sensitivity` | number (0-1) | `0.5` | Schwellenwert der Gesichtserkennung |
|
||||
| `onlyCenterFace` | boolean | `false` | Nur das zentralste Gesicht verbessern |
|
||||
|
||||
## KI-Kolorierung {#ai-colorization}
|
||||
|
||||
**Werkzeug-Route:** `colorize`
|
||||
**Modell:** DDColor (mit OpenCV-DNN-Fallback)
|
||||
|
||||
Wandelt Schwarz-Weiß- oder Graustufenfotos in Vollfarbe um.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `intensity` | number (0-1) | `1.0` | Stärke der Farbsättigung |
|
||||
| `model` | `"auto"` \| `"ddcolor"` \| `"opencv"` | `"auto"` | Modellvariante |
|
||||
|
||||
## Rauschentfernung {#noise-removal}
|
||||
|
||||
**Werkzeug-Route:** `noise-removal`
|
||||
**Modell:** SCUNet (gestufte Rauschunterdrückungs-Pipeline)
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `tier` | `"quick"` \| `"balanced"` \| `"quality"` \| `"maximum"` | `"balanced"` | Verarbeitungsstufe |
|
||||
| `strength` | number (0-100) | `50` | Stärke der Rauschunterdrückung |
|
||||
| `detailPreservation` | number (0-100) | `50` | Wie viele Details erhalten bleiben; höher bewahrt mehr Textur |
|
||||
| `colorNoise` | number (0-100) | `30` | Stärke der Farbrauschreduzierung |
|
||||
| `format` | string | `"original"` | Ausgabeformat: `original`, `png`, `jpeg`, `webp`, `avif`, `jxl` |
|
||||
| `quality` | number (1-100) | `90` | Qualität der Ausgabekodierung |
|
||||
|
||||
## Rote-Augen-Entfernung {#red-eye-removal}
|
||||
|
||||
**Werkzeug-Route:** `red-eye-removal`
|
||||
|
||||
Erkennt Gesichtslandmarken, lokalisiert Augenbereiche und korrigiert die Übersättigung des Rotkanals.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `sensitivity` | number (0-100) | `50` | Schwellenwert zur Erkennung roter Pixel |
|
||||
| `strength` | number (0-100) | `70` | Korrekturstärke |
|
||||
| `format` | string | - | Überschreibung des Ausgabeformats (optional) |
|
||||
| `quality` | number (1-100) | `90` | Ausgabequalität |
|
||||
|
||||
## Fotorestaurierung {#photo-restoration}
|
||||
|
||||
**Werkzeug-Route:** `restore-photo`
|
||||
|
||||
Mehrstufige Pipeline für alte oder beschädigte Fotos: Erkennung und Reparatur von Kratzern/Rissen, Gesichtsverbesserung, Rauschunterdrückung und optionale Kolorierung.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `scratchRemoval` | boolean | `true` | Kratzer und Risse erkennen und reparieren |
|
||||
| `faceEnhancement` | boolean | `true` | Durchgang zur Gesichtsverbesserung anwenden |
|
||||
| `fidelity` | number (0-1) | `0.7` | Stärke der Gesichtsverbesserung (höher = konservativer) |
|
||||
| `denoise` | boolean | `true` | Durchgang zur Rauschunterdrückung anwenden |
|
||||
| `denoiseStrength` | number (0-100) | `25` | Stärke der Rauschunterdrückung |
|
||||
| `colorize` | boolean | `false` | Nach der Restaurierung kolorieren |
|
||||
| `colorizeStrength` | number (0-100) | `85` | Kolorierungsintensität |
|
||||
|
||||
## Passfoto {#passport-photo}
|
||||
|
||||
**Werkzeug-Route:** `passport-photo`
|
||||
**Modelle:** MediaPipe-Gesichtslandmarken + BiRefNet-Hintergrundentfernung
|
||||
|
||||
Zweiphasiger Ablauf: analysieren (Gesicht erkennen + Hintergrund entfernen), dann generieren (zuschneiden, skalieren, kacheln). Unterstützt über 37 Länder in 6 Regionen.
|
||||
|
||||
### Phase 1: Analysieren {#phase-1-analyze}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo/analyze`
|
||||
|
||||
Nimmt eine Bilddatei entgegen (multipart). Gibt Gesichtslandmarkendaten, eine Base64-Vorschau und Bildabmessungen zurück.
|
||||
|
||||
### Phase 2: Generieren {#phase-2-generate}
|
||||
|
||||
`POST /api/v1/tools/image/passport-photo/generate`
|
||||
|
||||
Nimmt einen JSON-Body mit den Ergebnissen aus Phase 1 sowie den Generierungseinstellungen entgegen:
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `jobId` | string | (erforderlich) | Job-ID aus Phase 1 |
|
||||
| `filename` | string | (erforderlich) | Ursprünglicher Dateiname aus Phase 1 |
|
||||
| `countryCode` | string | (erforderlich) | ISO-Ländercode (z. B. `US`, `GB`, `IN`) |
|
||||
| `documentType` | string | `"passport"` | Dokumententyp |
|
||||
| `bgColor` | string | `"#FFFFFF"` | Hintergrundfarbe als Hex |
|
||||
| `printLayout` | string | `"none"` | Druck-Layout: `none`, `4x6`, `a4`, `letter` |
|
||||
| `maxFileSizeKb` | number | `0` | Maximale Dateigröße in KB (0 = kein Limit) |
|
||||
| `dpi` | number (72-1200) | `300` | Ausgabe-DPI |
|
||||
| `customWidthMm` | number | - | Benutzerdefinierte Breite in mm (überschreibt die Länderspezifikation) |
|
||||
| `customHeightMm` | number | - | Benutzerdefinierte Höhe in mm (überschreibt die Länderspezifikation) |
|
||||
| `zoom` | number (0.5-3) | `1` | Zoomfaktor |
|
||||
| `adjustX` | number | `0` | Horizontale Positionsanpassung |
|
||||
| `adjustY` | number | `0` | Vertikale Positionsanpassung |
|
||||
| `landmarks` | object | (erforderlich) | Landmarken aus Phase 1 |
|
||||
| `imageWidth` | number | (erforderlich) | Bildbreite aus Phase 1 |
|
||||
| `imageHeight` | number | (erforderlich) | Bildhöhe aus Phase 1 |
|
||||
|
||||
## Objekte entfernen (Inpainting) {#object-erasing-inpainting}
|
||||
|
||||
**Werkzeug-Route:** `erase-object`
|
||||
**Modell:** LaMa über ONNX Runtime
|
||||
|
||||
Die Maske wird als **zweiter Dateibestandteil** gesendet (Feldname `mask`), nicht als Base64. Weiße Pixel in der Maske kennzeichnen die zu entfernenden Bereiche. Die Einstellungen `format` und `quality` werden als Formularfelder auf oberster Ebene gesendet.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `file` | file | (erforderlich) | Quellbild (multipart) |
|
||||
| `mask` | file | (erforderlich) | Maskenbild (multipart, Feldname `mask`, weiß = entfernen) |
|
||||
| `format` | string | `"auto"` | Ausgabeformat: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| `quality` | integer (1-100) | `95` | Ausgabequalität |
|
||||
|
||||
CUDA-beschleunigt, wenn eine NVIDIA-GPU verfügbar ist.
|
||||
|
||||
## KI-Leinwanderweiterung {#ai-canvas-expand}
|
||||
|
||||
**Werkzeug-Route:** `ai-canvas-expand`
|
||||
**Modell:** LaMa-basiertes Outpainting
|
||||
|
||||
Erweitert die Leinwand eines Bildes in jede Richtung und füllt die neuen Bereiche mit KI-generierten Inhalten, die zum bestehenden Bild passen.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `extendTop` | integer | `0` | Pixel zur Erweiterung oben |
|
||||
| `extendRight` | integer | `0` | Pixel zur Erweiterung rechts |
|
||||
| `extendBottom` | integer | `0` | Pixel zur Erweiterung unten |
|
||||
| `extendLeft` | integer | `0` | Pixel zur Erweiterung links |
|
||||
| `tier` | `"fast"` \| `"balanced"` \| `"high"` | `"balanced"` | Qualitätsstufe |
|
||||
| `format` | string | `"auto"` | Ausgabeformat: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
|
||||
| `quality` | integer (1-100) | `95` | Ausgabequalität |
|
||||
|
||||
Mindestens eine Erweiterungsrichtung muss größer als 0 sein.
|
||||
|
||||
## Intelligenter Zuschnitt {#smart-crop}
|
||||
|
||||
**Werkzeug-Route:** `smart-crop`
|
||||
**Modell:** MediaPipe-Gesichtserkennung (nur im Gesichtsmodus)
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `mode` | string | `"subject"` | Zuschnittstrategie: `subject`, `face`, `trim` |
|
||||
| `strategy` | `"attention"` \| `"entropy"` | `"attention"` | Strategie für den Motivmodus |
|
||||
| `width` | integer | - | Ausgabebreite |
|
||||
| `height` | integer | - | Ausgabehöhe |
|
||||
| `padding` | integer (0-50) | `0` | Prozentualer Abstand um das Motiv |
|
||||
| `facePreset` | string | `"head-shoulders"` | Voreingestellte Rahmung, wenn `mode=face` |
|
||||
| `sensitivity` | number (0-1) | `0.5` | Schwellenwert der Gesichtserkennung |
|
||||
| `threshold` | integer (0-255) | `30` | Schwellenwert der Hintergrunderkennung (Trim-Modus) |
|
||||
| `padToSquare` | boolean | `false` | Getrimmtes Ergebnis auf ein Quadrat auffüllen |
|
||||
| `padColor` | string | `"#ffffff"` | Hintergrundfarbe für die quadratische Auffüllung |
|
||||
| `targetSize` | integer | - | Zielgröße für die aufgefüllte Ausgabe (Pixel) |
|
||||
| `quality` | integer (1-100) | - | Ausgabequalität |
|
||||
|
||||
Die veralteten `mode`-Werte `attention` und `content` werden akzeptiert und auf `subject` bzw. `trim` abgebildet.
|
||||
|
||||
**Gesichts-Voreinstellungen:**
|
||||
|
||||
| Voreinstellung | Am besten geeignet für |
|
||||
|--------|---------|
|
||||
| `closeup` | Porträtaufnahmen |
|
||||
| `head-shoulders` | Profilfotos |
|
||||
| `upper-body` | LinkedIn / formell |
|
||||
| `half-body` | Gesamter Oberkörper |
|
||||
|
||||
## Audio transkribieren {#transcribe-audio}
|
||||
|
||||
**Werkzeug-Route:** `transcribe-audio`
|
||||
**Modell:** faster-whisper
|
||||
|
||||
Wandelt Sprache in Text um. Unterstützt die Ausgabeformate Klartext, SRT und VTT.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `language` | string | `"auto"` | Sprache: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko`, `id`, `th`, `vi` |
|
||||
| `outputFormat` | `"txt"` \| `"srt"` \| `"vtt"` | `"txt"` | Ausgabeformat |
|
||||
|
||||
## Automatische Untertitel {#auto-subtitles}
|
||||
|
||||
**Werkzeug-Route:** `auto-subtitles`
|
||||
**Modell:** faster-whisper (extrahiert Audio aus dem Video und transkribiert dann)
|
||||
|
||||
Erzeugt Untertiteldateien aus der Audiospur eines Videos.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `language` | string | `"auto"` | Sprache: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko`, `id`, `th`, `vi` |
|
||||
| `format` | `"srt"` \| `"vtt"` | `"srt"` | Ausgabeformat der Untertitel |
|
||||
|
||||
## PNG-Transparenz-Korrektur {#png-transparency-fixer}
|
||||
|
||||
**Werkzeug-Route:** `transparency-fixer`
|
||||
**Modell:** BiRefNet HR-Matting (Auflösung 2048x2048)
|
||||
|
||||
Behebt "unecht transparente" PNGs, bei denen der Hintergrund entfernt wurde, aber Fransen, Halos oder halbtransparente Artefakte zurückgeblieben sind. Verwendet das hochauflösende Matting-Modell von BiRefNet, um einen sauberen Alphakanal zu erzeugen, und wendet anschließend eine konfigurierbare Defringe-Verarbeitung an, um Farbverunreinigungen entlang der Kanten zu entfernen.
|
||||
|
||||
**OOM-Fallback-Kette:** Überschreitet das BiRefNet HR-Matting den verfügbaren Speicher, greift das Werkzeug automatisch auf `birefnet-general` und dann auf `u2net` zurück.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `defringe` | number (0-100) | `30` | Stärke des Kanten-Defringe zur Entfernung von Farbverunreinigungen |
|
||||
| `outputFormat` | `"png"` \| `"webp"` | `"png"` | Ausgabebildformat |
|
||||
| `removeWatermark` | boolean | `false` | Vorverarbeitung zur Wasserzeichenentfernung anwenden (Medianfilter) |
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/transparency-fixer \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-F "file=@fake-transparent.png" \
|
||||
-F 'settings={"defringe":30,"outputFormat":"png"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Werkzeuge mit optionalen KI-Fähigkeiten {#tools-with-optional-ai-capabilities}
|
||||
|
||||
Die folgenden Werkzeuge sind keine Python-Sidecar-Werkzeuge, nutzen aber KI-Funktionen, wenn bestimmte Optionen aktiviert sind.
|
||||
|
||||
### Bildverbesserung {#image-enhancement}
|
||||
|
||||
**Werkzeug-Route:** `image-enhancement`
|
||||
**Engine:** Analysebasiert (Sharp-Histogramm und -Statistik)
|
||||
|
||||
Analysiert das Bild und wendet automatische Korrekturen für Belichtung, Kontrast, Weißabgleich, Sättigung, Schärfe und Rauschen an. Unterstützt szenenspezifische Modi.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `mode` | `"auto"` \| `"portrait"` \| `"landscape"` \| `"low-light"` \| `"food"` \| `"document"` | `"auto"` | Szenenmodus zum Feinabstimmen der Korrekturen |
|
||||
| `intensity` | number (0-100) | `50` | Gesamtkorrekturstärke |
|
||||
| `corrections.exposure` | boolean | `true` | Belichtungskorrektur anwenden |
|
||||
| `corrections.contrast` | boolean | `true` | Kontrastkorrektur anwenden |
|
||||
| `corrections.whiteBalance` | boolean | `true` | Weißabgleichskorrektur anwenden |
|
||||
| `corrections.saturation` | boolean | `true` | Sättigungskorrektur anwenden |
|
||||
| `corrections.sharpness` | boolean | `true` | Schärfekorrektur anwenden |
|
||||
| `corrections.denoise` | boolean | `true` | Rauschunterdrückung anwenden |
|
||||
| `deepEnhance` | boolean | `false` | KI-Rauschentfernung über SCUNet aktivieren (erfordert das `upscale-enhance`-Bundle) |
|
||||
|
||||
Ein zusätzlicher Analyse-Endpunkt ist unter `POST /api/v1/tools/image/image-enhancement/analyze` verfügbar, der die erkannten Korrekturen zurückgibt, ohne sie anzuwenden.
|
||||
|
||||
### Inhaltsbewusste Größenänderung (Seam Carving) {#content-aware-resize-seam-carving}
|
||||
|
||||
**Werkzeug-Route:** `content-aware-resize`
|
||||
**Engine:** Go-Binary `caire` (kein Python - kein GPU-Vorteil)
|
||||
|
||||
Ändert die Größe von Bildern intelligent, indem energiearme Nähte entfernt und wichtige Inhalte erhalten werden.
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `width` | number | - | Zielbreite |
|
||||
| `height` | number | - | Zielhöhe |
|
||||
| `protectFaces` | boolean | `false` | Erkannte Gesichtsbereiche schützen (erfordert das `face-detection`-Bundle) |
|
||||
| `blurRadius` | number (0-20) | `4` | Vorab-Weichzeichnung für die Energieberechnung |
|
||||
| `sobelThreshold` | number (1-20) | `2` | Schwellenwert der Kantenempfindlichkeit |
|
||||
| `square` | boolean | `false` | Quadratische Ausgabe erzwingen |
|
||||
@@ -0,0 +1,211 @@
|
||||
---
|
||||
description: "Referenz zu den Operationen der Image-Engine. Alle Sharp-basierten Bildverarbeitungsoperationen und ihre Parameter."
|
||||
i18n_source_hash: 42febdf85fa8
|
||||
i18n_provenance: human
|
||||
i18n_output_hash: 360d6021118d
|
||||
---
|
||||
|
||||
# Image-Engine {#image-engine}
|
||||
|
||||
Das `@snapotter/image-engine`-Paket übernimmt alle Bildoperationen ohne KI. Es kapselt [Sharp](https://sharp.pixelplumbing.com/) und läuft vollständig im Prozess ohne externe Abhängigkeiten.
|
||||
|
||||
## Operationen {#operations}
|
||||
|
||||
### resize {#resize}
|
||||
|
||||
Ein Bild auf bestimmte Abmessungen oder um einen Prozentsatz skalieren.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `width` | number | Zielbreite in Pixeln |
|
||||
| `height` | number | Zielhöhe in Pixeln |
|
||||
| `fit` | string | `cover`, `contain`, `fill`, `inside` oder `outside` |
|
||||
| `withoutEnlargement` | boolean | Wenn true, werden kleinere Bilder nicht hochskaliert |
|
||||
| `percentage` | number | Statt absoluter Abmessungen um einen Prozentsatz skalieren |
|
||||
|
||||
Du kannst `width`, `height` oder beides festlegen. Wenn du nur einen Wert festlegst, wird der andere berechnet, um das Seitenverhältnis beizubehalten.
|
||||
|
||||
### crop {#crop}
|
||||
|
||||
Einen rechteckigen Bereich aus dem Bild ausschneiden.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `left` | number | X-Versatz vom linken Rand |
|
||||
| `top` | number | Y-Versatz vom oberen Rand |
|
||||
| `width` | number | Breite des Zuschnittbereichs |
|
||||
| `height` | number | Höhe des Zuschnittbereichs |
|
||||
| `unit` | string | `px` (Standard) oder `percent` |
|
||||
|
||||
### rotate {#rotate}
|
||||
|
||||
Das Bild um einen bestimmten Winkel drehen.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `angle` | number | Drehwinkel in Grad (0-360) |
|
||||
| `background` | string | Füllfarbe für den freigelegten Bereich (Standard: `#000000`). Gilt nur für Winkel, die kein Vielfaches von 90 Grad sind. |
|
||||
|
||||
### flip {#flip}
|
||||
|
||||
Das Bild horizontal, vertikal oder in beide Richtungen spiegeln. Mindestens einer der Werte muss true sein.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `horizontal` | boolean | Von links nach rechts spiegeln |
|
||||
| `vertical` | boolean | Von oben nach unten spiegeln |
|
||||
|
||||
### convert {#convert}
|
||||
|
||||
Das Bildformat ändern.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `format` | string | Zielformat: `jpg`, `png`, `webp`, `avif`, `tiff`, `gif`, `jxl`, `heic`, `heif`, `bmp`, `ico`, `jp2`, `qoi` |
|
||||
| `quality` | number | Komprimierungsqualität (1-100, gilt für verlustbehaftete Formate) |
|
||||
|
||||
Die ersten sieben Formate (`jpg` bis `jxl`) werden von Sharp im Prozess kodiert. Die übrigen Formate verwenden externe Encoder auf der API-Ebene: `heic`/`heif` über heif-enc, `bmp`/`ico` über ImageMagick, `jp2` über opj_compress und `qoi` über einen Inline-TypeScript-Codec.
|
||||
|
||||
### compress {#compress}
|
||||
|
||||
Die Dateigröße reduzieren und dabei dasselbe Format beibehalten.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `quality` | number | Zielqualität (1-100) |
|
||||
| `targetSizeBytes` | number | Optionale Zieldateigröße in Bytes |
|
||||
| `format` | string | Optionale Überschreibung des Formats |
|
||||
|
||||
### strip-metadata {#strip-metadata}
|
||||
|
||||
EXIF-, IPTC-, XMP- und ICC-Metadaten aus dem Bild entfernen. Ohne Parameter (oder mit `stripAll: true`) wird alles entfernt. Übergib einzelne Flags für ein selektives Entfernen.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `stripAll` | boolean | Alle Metadaten entfernen (Standard, wenn keine Flags gesetzt sind) |
|
||||
| `stripExif` | boolean | EXIF-Daten entfernen (einschließlich GPS, sofern `stripGps` nicht separat gesetzt ist) |
|
||||
| `stripGps` | boolean | GPS-Standortdaten entfernen |
|
||||
| `stripIcc` | boolean | ICC-Farbprofil entfernen |
|
||||
| `stripXmp` | boolean | XMP-Metadaten entfernen |
|
||||
|
||||
### Farbanpassungen {#color-adjustments}
|
||||
|
||||
Diese Operationen verändern die Farbeigenschaften eines Bildes. Jede nimmt einen einzelnen numerischen Wert entgegen.
|
||||
|
||||
| Operation | Parameter | Bereich | Beschreibung |
|
||||
|---|---|---|---|
|
||||
| `brightness` | `value` | -100 bis 100 | Helligkeit anpassen |
|
||||
| `contrast` | `value` | -100 bis 100 | Kontrast anpassen |
|
||||
| `saturation` | `value` | -100 bis 100 | Farbsättigung anpassen |
|
||||
|
||||
### Farbfilter {#color-filters}
|
||||
|
||||
Diese wenden eine feste Farbtransformation an. Sie nehmen keine Parameter entgegen.
|
||||
|
||||
| Operation | Beschreibung |
|
||||
|---|---|
|
||||
| `grayscale` | In Graustufen umwandeln |
|
||||
| `sepia` | Einen Sepiaton anwenden |
|
||||
| `invert` | Alle Farben invertieren |
|
||||
|
||||
### Farbkanäle {#color-channels}
|
||||
|
||||
Einzelne RGB-Farbkanäle anpassen. Werte sind Multiplikatoren, wobei 100 = keine Änderung bedeutet.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `red` | number | Multiplikator des Rotkanals (0 bis 200, 100 = unverändert) |
|
||||
| `green` | number | Multiplikator des Grünkanals (0 bis 200, 100 = unverändert) |
|
||||
| `blue` | number | Multiplikator des Blaukanals (0 bis 200, 100 = unverändert) |
|
||||
|
||||
### sharpen {#sharpen}
|
||||
|
||||
Einfaches Schärfen, gesteuert durch einen einzelnen Wert.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `value` | number | Schärfungsintensität (0 bis 100). Abgebildet auf ein Gaußsches Sigma von 0,5-10. |
|
||||
|
||||
### sharpen-advanced {#sharpen-advanced}
|
||||
|
||||
Erweitertes Schärfen mit drei wählbaren Methoden und einem optionalen Rauschunterdrückungs-Vordurchlauf.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `method` | string | `adaptive`, `unsharp-mask` oder `high-pass` |
|
||||
| `sigma` | number | Radius der Gaußschen Unschärfe, 0,5-10 (adaptiv) |
|
||||
| `m1` | number | Schärfung in flachen Bereichen, 0-10 (adaptiv) |
|
||||
| `m2` | number | Schärfung in strukturierten Bereichen, 0-20 (adaptiv) |
|
||||
| `x1` | number | Schwelle flach/zackig, 0-10 (adaptiv) |
|
||||
| `y2` | number | Maximale Aufhellung (Halo-Begrenzung), 0-50 (adaptiv) |
|
||||
| `y3` | number | Maximale Abdunklung (Halo-Begrenzung), 0-50 (adaptiv) |
|
||||
| `amount` | number | Intensität in Prozent, 0-500 (Unschärfemaske) |
|
||||
| `radius` | number | Unschärferadius, 0,1-5,0 (Unschärfemaske) |
|
||||
| `threshold` | number | Minimale Kantenhelligkeit, 0-255 (Unschärfemaske) |
|
||||
| `strength` | number | Überblendungsstärke, 0-100 (Hochpass) |
|
||||
| `kernelSize` | number | `3` oder `5` für 3x3- / 5x5-Kernel (Hochpass) |
|
||||
| `denoise` | string | Rauschunterdrückungs-Vordurchlauf: `off`, `light`, `medium` oder `strong` |
|
||||
|
||||
Die Parameter sind methodenspezifisch. Gib nur die für die gewählte Methode relevanten an.
|
||||
|
||||
### color-blindness {#color-blindness}
|
||||
|
||||
Eine Farbfehlsichtigkeit mithilfe einer 3x3-Farbrekombinationsmatrix simulieren.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `type` | string | Eines von: `protanopia`, `deuteranopia`, `tritanopia`, `protanomaly`, `deuteranomaly`, `tritanomaly`, `achromatopsia`, `blueConeMonochromacy` |
|
||||
|
||||
### edit-metadata {#edit-metadata}
|
||||
|
||||
Einzelne EXIF-/IPTC-Metadatenfelder schreiben oder entfernen, ohne den gesamten Block zu entfernen.
|
||||
|
||||
| Parameter | Typ | Beschreibung |
|
||||
|---|---|---|
|
||||
| `artist` | string | EXIF-Tag Artist |
|
||||
| `copyright` | string | EXIF-Tag Copyright |
|
||||
| `imageDescription` | string | EXIF-Tag ImageDescription |
|
||||
| `software` | string | EXIF-Tag Software |
|
||||
| `dateTime` | string | EXIF-Tag DateTime |
|
||||
| `dateTimeOriginal` | string | EXIF-Tag DateTimeOriginal |
|
||||
| `clearGps` | boolean | Alle GPS-Tags entfernen |
|
||||
| `fieldsToRemove` | string[] | Liste der zu löschenden EXIF-Feldnamen |
|
||||
|
||||
Alle Parameter sind optional. In `fieldsToRemove` aufgeführte Felder werden aus dem vorhandenen EXIF-Block gelöscht. Über die benannten Parameter gesetzte Felder werden geschrieben (oder überschrieben). Binäre/unsichere Schlüssel wie MakerNote werden stillschweigend ignoriert.
|
||||
|
||||
## Formaterkennung {#format-detection}
|
||||
|
||||
Die Engine erkennt Eingabeformate automatisch anhand der Dateiheader, nicht nur anhand der Dateiendungen. Das bedeutet, dass eine `.jpg`-Datei, die in Wirklichkeit ein PNG ist, korrekt verarbeitet wird. Die Erkennung verfolgt einen mehrstufigen Ansatz: zuerst die Magic Bytes, dann die Dateiendung als Fallback.
|
||||
|
||||
SnapOtter unterstützt **55+ Eingabeformate** und **13 Ausgabeformate**, darunter 23 Kamera-RAW-Formate von über 20 Marken, professionelle Formate (PSD, EPS, OpenEXR, HDR), moderne Codecs (JPEG XL, AVIF, HEIC, QOI, JPEG 2000) sowie wissenschaftliche/Gaming-Formate (FITS, DDS). Die Dekodierung übernimmt nach Möglichkeit Sharp nativ, mit automatischem Fallback auf ImageMagick, LibRaw und spezialisierte CLI-Decoder.
|
||||
|
||||
Die vollständige Liste findest du auf der Seite [Unterstützte Formate](/de/guide/supported-formats).
|
||||
|
||||
## Metadatenextraktion {#metadata-extraction}
|
||||
|
||||
Das `info`-Tool gibt Bildmetadaten zurück. Die vollständige Feldreferenz findest du unter [Bildinformationen](/de/tools/image/info).
|
||||
|
||||
```json
|
||||
{
|
||||
"filename": "photo.jpg",
|
||||
"fileSize": 2450000,
|
||||
"width": 4032,
|
||||
"height": 3024,
|
||||
"format": "jpeg",
|
||||
"channels": 3,
|
||||
"hasAlpha": false,
|
||||
"colorSpace": "srgb",
|
||||
"density": 72,
|
||||
"isProgressive": false,
|
||||
"hasExif": true,
|
||||
"hasIcc": true,
|
||||
"hasXmp": false,
|
||||
"bitDepth": "8",
|
||||
"pages": 1,
|
||||
"histogram": [
|
||||
{ "channel": "red", "min": 0, "max": 255, "mean": 128.45, "stdev": 52.31 },
|
||||
{ "channel": "green", "min": 2, "max": 253, "mean": 115.22, "stdev": 48.76 },
|
||||
{ "channel": "blue", "min": 0, "max": 250, "mean": 102.89, "stdev": 55.14 }
|
||||
]
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,702 @@
|
||||
---
|
||||
description: "Vollständige REST-API-Referenz. Tool-Endpunkte, Stapelverarbeitung, Pipelines, Dateibibliothek, Authentifizierung, Teams und Admin-Operationen."
|
||||
i18n_source_hash: 8646977f7cc9
|
||||
i18n_provenance: machine
|
||||
i18n_output_hash: 8efd33eca67a
|
||||
---
|
||||
|
||||
# REST-API-Referenz {#rest-api-reference}
|
||||
|
||||
Interaktive API-Dokumentation mit Beispielen für Anfragen und Antworten ist verfügbar unter [http://localhost:1349/api/docs](http://localhost:1349/api/docs).
|
||||
|
||||
Maschinenlesbare Spezifikationen:
|
||||
- `/api/v1/openapi.yaml` - OpenAPI-3.1-Spezifikation
|
||||
- `/llms.txt` - LLM-freundliche Zusammenfassung
|
||||
- `/llms-full.txt` - Vollständige LLM-freundliche Dokumentation
|
||||
|
||||
## Authentifizierung {#authentication}
|
||||
|
||||
Alle Endpunkte erfordern eine Authentifizierung, sofern nicht `AUTH_ENABLED=false`.
|
||||
|
||||
### Sitzungs-Token {#session-token}
|
||||
|
||||
```bash
|
||||
# Login
|
||||
curl -X POST http://localhost:1349/api/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"admin","password":"admin"}'
|
||||
# Returns: {"token":"<session-token>"}
|
||||
|
||||
# Use token
|
||||
curl http://localhost:1349/api/v1/tools/image/resize \
|
||||
-H "Authorization: Bearer <session-token>"
|
||||
```
|
||||
|
||||
Sitzungen laufen nach 7 Tagen ab (konfigurierbar über `SESSION_DURATION_HOURS`).
|
||||
|
||||
### API-Schlüssel {#api-keys}
|
||||
|
||||
```bash
|
||||
# Create a key (returns key once - store it)
|
||||
curl -X POST http://localhost:1349/api/v1/api-keys \
|
||||
-H "Authorization: Bearer <session-token>" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"name":"my-script"}'
|
||||
# Returns: {"key":"si_<96 hex chars>","id":"...","name":"my-script"}
|
||||
|
||||
# Use the key
|
||||
curl http://localhost:1349/api/v1/tools/image/resize \
|
||||
-H "Authorization: Bearer si_<your-key>"
|
||||
```
|
||||
|
||||
Schlüssel erhalten das Präfix `si_` und werden als scrypt-Hashes gespeichert. Der Rohschlüssel wird einmal angezeigt und ist danach nie wieder abrufbar.
|
||||
|
||||
### Auth-Endpunkte {#auth-endpoints}
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `POST` | `/api/auth/login` | Öffentlich | Anmelden, Sitzungs-Token erhalten |
|
||||
| `POST` | `/api/auth/logout` | Auth | Aktuelle Sitzung beenden |
|
||||
| `GET` | `/api/auth/session` | Auth | Aktuelle Sitzung validieren |
|
||||
| `POST` | `/api/auth/change-password` | Auth | Eigenes Passwort ändern (macht alle anderen Sitzungen + API-Schlüssel ungültig) |
|
||||
| `GET` | `/api/auth/users` | Admin | Alle Benutzer auflisten |
|
||||
| `POST` | `/api/auth/register` | Admin | Neuen Benutzer erstellen |
|
||||
| `PUT` | `/api/auth/users/:id` | Admin | Benutzerrolle oder -team aktualisieren |
|
||||
| `POST` | `/api/auth/users/:id/reset-password` | Admin | Passwort eines Benutzers zurücksetzen |
|
||||
| `DELETE` | `/api/auth/users/:id` | Admin | Einen Benutzer löschen |
|
||||
| `GET` | `/api/v1/config/auth` | Öffentlich | Prüfen, ob die Authentifizierung aktiviert ist (`{ authEnabled: bool }`) |
|
||||
| `POST` | `/api/auth/mfa/enroll` | Auth | TOTP-MFA-Registrierung starten. Erfordert das Enterprise-Feature `mfa` |
|
||||
| `POST` | `/api/auth/mfa/verify` | Auth | MFA-Registrierung mit einem TOTP-Code bestätigen |
|
||||
| `POST` | `/api/auth/mfa/complete` | Öffentlich | Eine ausstehende MFA-Login-Challenge abschließen |
|
||||
| `POST` | `/api/auth/mfa/disable` | Auth | MFA für den aktuellen Benutzer deaktivieren |
|
||||
| `POST` | `/api/auth/users/:id/mfa/reset` | Admin (`users:manage`) | MFA für einen Benutzer zurücksetzen |
|
||||
| `GET` | `/api/auth/oidc/login` | Öffentlich | OIDC-Login starten, wenn OIDC aktiviert ist |
|
||||
| `GET` | `/api/auth/oidc/callback` | Öffentlich | OIDC-Autorisierungs-Callback |
|
||||
| `GET` | `/api/auth/saml/metadata` | Öffentlich | SAML-SP-Metadaten-XML, wenn SAML aktiviert ist |
|
||||
| `GET` | `/api/auth/saml/login` | Öffentlich | SAML-Login starten |
|
||||
| `POST` | `/api/auth/saml/callback` | Öffentlich | SAML Assertion Consumer Service |
|
||||
|
||||
Wenn MFA für einen Benutzer aktiviert ist, gibt `POST /api/auth/login` statt eines Sitzungs-Tokens `{"requiresMfa":true,"mfaToken":"...","mfaRequired":true|false}` zurück. Senden Sie dieses `mfaToken` zusammen mit einem TOTP- oder Wiederherstellungscode an `/api/auth/mfa/complete`.
|
||||
|
||||
### Berechtigungen {#permissions}
|
||||
|
||||
| Berechtigung | Admin | Benutzer |
|
||||
|-----------|:-----:|:----:|
|
||||
| Tools verwenden | ✓ | ✓ |
|
||||
| Eigene Dateien/Pipelines/API-Schlüssel | ✓ | ✓ |
|
||||
| Dateien/Pipelines/Schlüssel aller Benutzer sehen | ✓ | - |
|
||||
| Einstellungen schreiben | ✓ | - |
|
||||
| Benutzer & Teams verwalten | ✓ | - |
|
||||
| Branding verwalten | ✓ | - |
|
||||
|
||||
## Health-Check {#health-check}
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/health` | Öffentlich | Grundlegender Health-Check. Gibt `{"status":"healthy","version":"..."}` mit 200 zurück oder `{"status":"unhealthy"}` mit 503, wenn die Datenbank nicht erreichbar ist. |
|
||||
| `GET` | `/api/v1/readyz` | Öffentlich | Readiness-Probe. Prüft PostgreSQL, Redis, Speicherplatz und S3, sofern konfiguriert. Gibt 503 zurück, wenn die Instanz keinen Datenverkehr erhalten sollte. |
|
||||
| `GET` | `/api/v1/admin/health` | Admin (`system:health`) | Detaillierte Diagnose einschließlich Betriebszeit, Speichermodus, Datenbankstatus, Warteschlangenstatus und GPU-Verfügbarkeit. |
|
||||
|
||||
## Tools verwenden {#using-tools}
|
||||
|
||||
Jedes Tool folgt demselben Muster:
|
||||
|
||||
```bash
|
||||
# Single file
|
||||
curl -X POST http://localhost:1349/api/v1/tools/<section>/<toolId> \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-F "file=@input.jpg" \
|
||||
-F 'settings={"width":800,"height":600}'
|
||||
|
||||
# Batch (returns ZIP)
|
||||
curl -X POST http://localhost:1349/api/v1/tools/<section>/<toolId>/batch \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-F "files=@a.jpg" \
|
||||
-F "files=@b.jpg" \
|
||||
-F 'settings={...}'
|
||||
```
|
||||
|
||||
`<section>` ist einer der Werte `image`, `video`, `audio`, `pdf` oder `files`.
|
||||
|
||||
- Der Upload ist `multipart/form-data`.
|
||||
- `settings` ist ein JSON-String mit tool-spezifischen Optionen.
|
||||
- `clientJobId` ist ein optionales Formularfeld für vom Aufrufer bereitgestellte Fortschrittskorrelation.
|
||||
- `fileId` ist ein optionales Formularfeld, das auf ein vorhandenes Element der Dateibibliothek verweist. Wenn vorhanden, wird die verarbeitete Ausgabe als neue Version gespeichert und die Antwort enthält `savedFileId`.
|
||||
- **Schnelle Tools** geben in der Regel 200-JSON zurück: `{"jobId":"...","downloadUrl":"/api/v1/download/<jobId>/<filename>","originalSize":1234,"processedSize":567}`. Rufen Sie die verarbeitete Datei von `downloadUrl` ab.
|
||||
- **Jedes eingereihte Tool** kann 202-JSON zurückgeben, wenn es lange läuft oder das synchrone Warte-Zeitfenster überschreitet: `{"jobId":"...","async":true}`. Verbinden Sie sich mit SSE für den Fortschritt und laden Sie die Datei nach Abschluss herunter (siehe [Fortschrittsverfolgung](#progress-tracking)).
|
||||
- **Batch**-Routen geben ein direkt gestreamtes ZIP-Archiv zurück (mit `X-Job-Id`-Header) für Tools, die im generischen Batch-Register registriert sind.
|
||||
|
||||
## Tools-Referenz {#tools-reference}
|
||||
|
||||
### Konvertierungs-Presets {#conversion-presets}
|
||||
|
||||
Der gemeinsame Katalog enthält 83 dedizierte Konvertierungs-Preset-Endpunkte wie `jpg-to-png`, `mov-to-mp4`, `m4a-to-mp3`, `pdf-to-jpg` und `excel-to-csv`. Presets sind vollwertige Tool-Routen:
|
||||
|
||||
`POST /api/v1/tools/<section>/<presetId>`
|
||||
|
||||
Jedes Preset legt das Ausgabeformat fest und delegiert an ein Basis-Tool wie `convert`, `convert-video`, `extract-audio`, `convert-audio`, `image-to-pdf`, `pdf-to-image`, `svg-to-raster` oder `convert-spreadsheet`. Die vollständige Routentabelle und die optionalen Einstellungen finden Sie unter [Konvertierungs-Presets](/de/tools/conversion-presets).
|
||||
|
||||
### Grundlagen {#essentials}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `resize` | Größe ändern | `width`, `height`, `fit` (cover/contain/fill/inside/outside), `percentage`, `withoutEnlargement`, plus 23 Social-Media-Presets |
|
||||
| `crop` | Zuschneiden | `left`, `top`, `width`, `height`, `unit` (px/Prozent) |
|
||||
| `rotate` | Drehen & Spiegeln | `angle`, `horizontal` (bool), `vertical` (bool) |
|
||||
| `convert` | Konvertieren | `format` (jpg/png/webp/avif/tiff/gif/heic/heif), `quality` |
|
||||
| `compress` | Komprimieren | `mode` (quality/targetSize), `quality` (1–100), `targetSizeKb` |
|
||||
|
||||
### Optimierung {#optimization}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `optimize-for-web` | Für Web optimieren | `format` (webp/jpeg/avif/png), `quality`, `maxWidth`, `maxHeight`, `progressive`, `stripMetadata` |
|
||||
| `strip-metadata` | Metadaten entfernen | - |
|
||||
| `edit-metadata` | Metadaten bearbeiten | `title`, `description`, `author`, `copyright`, `keywords`, `gps` (lat/lon), `dateTime` |
|
||||
| `bulk-rename` | Massen-Umbenennung | `pattern` (unterstützt `{n}`, `{date}`, `{original}`), `startIndex`, `padding` |
|
||||
| `image-to-pdf` | Bild zu PDF | `pageSize` (A4/Letter/...), `orientation`, `margin`, `targetSize` ({value, unit}) |
|
||||
| `favicon` | Favicon-Generator | `padding`, `backgroundColor`, `borderRadius` - generiert alle Standardgrößen |
|
||||
|
||||
### Anpassungen {#adjustments}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `adjust-colors` | Farben anpassen | `brightness`, `contrast`, `exposure`, `saturation`, `temperature`, `tint`, `hue`, `sharpness`, `red`, `green`, `blue`, `effect` (none/grayscale/sepia/invert) |
|
||||
| `sharpening` | Schärfen | `method` (adaptive/unsharp-mask/high-pass), `sigma`, `m1`, `m2`, `x1`, `y2`, `y3`, `amount`, `radius`, `threshold`, `strength`, `kernelSize` (3/5), `denoise` (off/light/medium/strong) |
|
||||
| `replace-color` | Farbe ersetzen | `sourceColor`, `targetColor` (Ersatz), `makeTransparent`, `tolerance` |
|
||||
| `color-blindness` | Farbenblindheits-Simulation | `simulationType` (protanopia/deuteranopia/tritanopia/protanomaly/deuteranomaly/tritanomaly/achromatopsia/blueConeMonochromacy, Standard \"deuteranomaly\") |
|
||||
| `duotone` | Duotone | `shadow` (hex), `highlight` (hex), `intensity` (0-100) |
|
||||
| `pixelate` | Verpixeln | `blockSize` (2-128), `region` ({left, top, width, height} für teilweise Verpixelung) |
|
||||
| `vignette` | Vignette | `strength` (0.1-1), `color` (hex), `radius`, `softness`, `roundness`, `centerX`, `centerY` |
|
||||
|
||||
### KI-Tools {#ai-tools}
|
||||
|
||||
Alle KI-Tools laufen auf Ihrer Hardware: standardmäßig auf der CPU oder auf NVIDIA CUDA, wenn eine unterstützte NVIDIA-GPU verfügbar ist. Intel/AMD-iGPU-Beschleunigung über VA-API, Quick Sync oder OpenCL wird für KI-Inferenz derzeit nicht unterstützt. Keine Internetverbindung erforderlich.
|
||||
|
||||
| Tool-ID | Name | KI-Modell | Wichtige Einstellungen |
|
||||
|---------|------|---------|-------------|
|
||||
| `remove-background` | Hintergrund entfernen | rembg (BiRefNet / U2-Net) | `model`, `backgroundType` (transparent/color/gradient/blur/image), `backgroundColor`, `gradientColor1`, `gradientColor2`, `gradientAngle`, `blurEnabled`, `blurIntensity`, `shadowEnabled`, `shadowOpacity` |
|
||||
| `upscale` | Bild-Hochskalierung | RealESRGAN | `scale` (2/4), `model`, `faceEnhance`, `denoise`, `format`, `quality` |
|
||||
| `erase-object` | Objekt-Radierer | LaMa (ONNX) | Maske als zweiter Datei-Teil gesendet (Feldname `mask`), `format`, `quality` |
|
||||
| `ocr` | OCR / Textextraktion | PaddleOCR / Tesseract | `quality` (fast/balanced/best), `language`, `enhance` |
|
||||
| `blur-faces` | Gesichts-/PII-Unschärfe | MediaPipe | `blurRadius`, `sensitivity` |
|
||||
| `smart-crop` | Smart Crop | MediaPipe + Sharp | `mode` (subject/face/trim), `strategy` (attention/entropy), `width`, `height`, `padding`, `facePreset` (closeup/head-shoulders/upper-body/half-body), `sensitivity`, `threshold`, `padToSquare`, `padColor`, `targetSize`, `quality` |
|
||||
| `image-enhancement` | Bildverbesserung | Analysebasiert | `mode` (auto/exposure/contrast/color/sharpness), `strength` |
|
||||
| `enhance-faces` | Gesichtsverbesserung | GFPGAN / CodeFormer | `model` (gfpgan/codeformer), `strength`, `sensitivity`, `centerFace` |
|
||||
| `colorize` | KI-Kolorierung | DDColor | `intensity`, `model` |
|
||||
| `noise-removal` | Rauschentfernung | Gestufte Entrauschung | `tier` (quick/balanced/quality/maximum), `strength`, `detailPreservation`, `colorNoise`, `format`, `quality` |
|
||||
| `red-eye-removal` | Rote-Augen-Entfernung | Gesichts-Landmarken + Farbanalyse | `sensitivity`, `strength` |
|
||||
| `restore-photo` | Fotorestaurierung | Mehrstufige Pipeline | `mode` (auto/light/heavy), `scratchRemoval`, `faceEnhancement`, `fidelity`, `denoise`, `denoiseStrength`, `colorize` |
|
||||
| `passport-photo` | Passfoto | MediaPipe-Landmarken | Zweiphasiger Ablauf. Die Analyse verwendet multipart `file`; die Generierung verwendet JSON mit `countryCode`, `bgColor`, `printLayout` (none/4x6/a4), Landmarken, Bildabmessungen |
|
||||
| `content-aware-resize` | Inhaltsbasierte Größenänderung | Seam Carving (caire) | `width`, `height`, `protectFaces`, `blurRadius`, `sobelThreshold`, `square` |
|
||||
| `transparency-fixer` | PNG-Transparenz-Korrektur | BiRefNet HR-Matting | `defringe` (0-100), `outputFormat` (png/webp) |
|
||||
| `background-replace` | Hintergrund ersetzen | rembg (BiRefNet) | `backgroundType` (color/gradient), `color` (hex), `gradientColor1`, `gradientColor2`, `gradientAngle`, `feather` (0-20), `format` (png/webp) |
|
||||
| `blur-background` | Hintergrund weichzeichnen | rembg (BiRefNet) | `intensity` (1-100), `feather` (0-20), `format` (png/webp) |
|
||||
| `ai-canvas-expand` | KI-Leinwand-Erweiterung | LaMa (Outpainting) | `extendTop`, `extendRight`, `extendBottom`, `extendLeft` (px), `tier` (fast/balanced/high), `format`, `quality` |
|
||||
|
||||
### Wasserzeichen & Overlay {#watermark-overlay}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `watermark-text` | Text-Wasserzeichen | `text`, `font`, `fontSize`, `color`, `opacity`, `position`, `rotation`, `tile` |
|
||||
| `watermark-image` | Bild-Wasserzeichen | `opacity`, `position`, `scale` - die zweite Datei ist das Wasserzeichen |
|
||||
| `text-overlay` | Text-Overlay | `text`, `font`, `fontSize`, `color`, `x`, `y`, `background`, `padding`, `borderRadius` |
|
||||
| `compose` | Bildkomposition | `x`, `y`, `opacity`, `blend` - die zweite Datei wird darübergelegt |
|
||||
| `meme-generator` | Meme-Generator | `templateId`, `textLayout` (top-bottom/top-only/bottom-only/center/side-by-side), `textBoxes` ([{id, text}]), `fontFamily` (anton/arial-black/comic-sans/montserrat/bebas-neue/permanent-marker/roboto), `fontSize`, `textColor`, `strokeColor`, `textAlign`, `allCaps`. Unterstützt den Vorlagenmodus (JSON-Body mit `templateId`) oder den benutzerdefinierten Bildmodus (multipart mit Datei). |
|
||||
|
||||
### Dienstprogramme {#utilities}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `info` | Bildinformationen | - (gibt Breite, Höhe, Format, Größe, Kanäle, hasAlpha, DPI, EXIF zurück) |
|
||||
| `compare` | Bildvergleich | `mode` (side-by-side/overlay/diff), `diffThreshold` - die zweite Datei ist das Vergleichsziel |
|
||||
| `find-duplicates` | Duplikate finden | `threshold` (Abstand des perzeptuellen Hashs, Standard 8) - Mehrfachdatei |
|
||||
| `color-palette` | Farbpalette | `count` (Anzahl der dominanten Farben), `format` (hex/rgb) |
|
||||
| `qr-generate` | QR-Code-Generator | `data`, `size`, `margin`, `colorDark`, `colorLight`, `errorCorrectionLevel`, `dotStyle`, `cornerStyle`, `logo` (optionale Datei) |
|
||||
| `barcode-read` | Barcode-Leser | - (erkennt automatisch QR, EAN, Code128, DataMatrix usw.) |
|
||||
| `image-to-base64` | Bild zu Base64 | `format` (data-uri/plain), `mimeType` |
|
||||
| `html-to-image` | HTML zu Bild | `url`, `format` (png/jpg/webp), `quality`, `fullPage`, `devicePreset` (desktop/tablet/mobile/custom), `viewportWidth`, `viewportHeight` |
|
||||
| `histogram` | Histogramm | `scale` (linear/log) - gibt RGB-Histogramm-Diagramm + Statistiken pro Kanal zurück |
|
||||
| `lqip-placeholder` | LQIP-Platzhalter | `width` (4-64), `blur`, `strategy` (blur/pixelate/solid), `format` (webp/png/jpeg), `quality` |
|
||||
| `barcode-generate` | Barcode-Generator | `text`, `type` (code128/ean13/upca/code39/itf14/datamatrix), `scale` (1-8), `includeText` (bool). JSON-Body, kein Datei-Upload. |
|
||||
|
||||
### Layout & Komposition {#layout-composition}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `collage` | Collage / Raster | `template` (25+ Layouts), `gap`, `backgroundColor`, `borderRadius` - Mehrfachdatei |
|
||||
| `stitch` | Zusammenfügen / Kombinieren | `direction` (horizontal/vertical/grid), `gap`, `backgroundColor`, `alignment` - Mehrfachdatei |
|
||||
| `split` | Bildaufteilung | `mode` (grid/rows/cols), `rows`, `cols`, `tileWidth`, `tileHeight` |
|
||||
| `border` | Rand & Rahmen | `width`, `color`, `style` (solid/gradient/pattern), `borderRadius`, `padding`, `shadow` |
|
||||
| `beautify` | Screenshot verschönern | `backgroundType` (solid/linear-gradient/radial-gradient/image/transparent), `gradientStops`, `padding`, `borderRadius`, `shadowPreset`, `frame` (none/macos-light/macos-dark/windows-light/windows-dark/browser-light/browser-dark/iphone/macbook/ipad/...), `socialPreset` (none/twitter/linkedin/instagram-square/instagram-story/facebook/producthunt), `watermarkText`, `outputFormat` |
|
||||
| `circle-crop` | Kreis-Zuschnitt | `zoom` (1-5), `offsetX`, `offsetY`, `borderWidth`, `borderColor`, `background` (transparent/hex), `outputSize` |
|
||||
| `image-pad` | Bild auffüllen | `target` (16:9/9:16/1:1/4:3/3:4/custom), `ratioW`, `ratioH`, `background` (color/transparent/blur), `color` (hex), `padding` (0-50%) |
|
||||
| `sprite-sheet` | Sprite-Sheet | `columns` (1-16), `padding`, `background` (hex), `format` (png/webp/jpeg), `quality` - Mehrfachdatei (2-64 Bilder) |
|
||||
|
||||
### Format & Konvertierung {#format-conversion}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `svg-to-raster` | SVG zu Raster | `format` (png/jpeg/webp/avif/tiff/gif/heif), `width`, `height`, `scale`, `dpi`, `background` |
|
||||
| `vectorize` | Bild zu SVG | `colorMode` (bw/color), `threshold`, `colorPrecision`, `filterSpeckle`, `pathMode` (none/polygon/spline) |
|
||||
| `gif-tools` | GIF-Tools | `action` (resize/optimize/reverse/speed/extract-frames/rotate/add-text), aktionsspezifische Parameter |
|
||||
| `gif-webp` | GIF/WebP-Konverter | `quality` (1-100), `lossless` (bool), `resizePercent` (10-100) |
|
||||
|
||||
### Video-Tools {#video-tools}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `convert-video` | Video konvertieren | `format` (mp4/mov/webm/avi/mkv), `quality` (high/balanced/small) |
|
||||
| `compress-video` | Video komprimieren | `quality` (light/balanced/strong), `resolution` (original/1080p/720p/480p) |
|
||||
| `trim-video` | Video zuschneiden | `startS`, `endS`, `precise` (bool, bildgenauer Schnitt) |
|
||||
| `mute-video` | Video stummschalten | - |
|
||||
| `video-to-gif` | Video zu GIF | `fps` (1-30), `width`, `startS`, `durationS` (max. 60s) |
|
||||
| `resize-video` | Video-Größe ändern | `width`, `height`, `preset` (custom/2160p/1440p/1080p/720p/480p/360p) |
|
||||
| `crop-video` | Video zuschneiden (Crop) | `width`, `height`, `x`, `y` |
|
||||
| `rotate-video` | Video drehen | `transform` (cw90/ccw90/180/hflip/vflip) |
|
||||
| `change-fps` | FPS ändern | `fps` (1-120) |
|
||||
| `video-color` | Video-Farbe | `brightness`, `contrast`, `saturation`, `gamma` |
|
||||
| `video-speed` | Video-Geschwindigkeit | `factor` (0.25-4), `keepPitch` (bool) |
|
||||
| `reverse-video` | Video umkehren | - (max. 5 Minuten) |
|
||||
| `video-loudnorm` | Audio normalisieren | - (EBU R128) |
|
||||
| `aspect-pad` | Seitenverhältnis auffüllen | `target` (16:9/9:16/1:1/4:3/3:4), `color` (hex) |
|
||||
| `blur-pad` | Unschärfe-Auffüllung | `target` (16:9/9:16/1:1/4:3/3:4), `blur` (2-50) |
|
||||
| `watermark-video` | Video mit Wasserzeichen | `text`, `position`, `fontSize`, `opacity`, `color` |
|
||||
| `stabilize-video` | Video stabilisieren | `smoothing` (5-60, in Frames) |
|
||||
| `gif-to-video` | GIF zu Video | `format` (mp4/webm/mov) |
|
||||
| `video-to-webp` | Video zu WebP | `fps`, `width`, `quality`, `loop` (bool) |
|
||||
| `video-to-frames` | Video zu Frames | `mode` (all/nth/timestamps), `n`, `timestamps`, `format` (png/jpg) |
|
||||
| `merge-videos` | Videos zusammenführen | - (Mehrfachdatei, auf die Auflösung des ersten Videos normalisiert) |
|
||||
| `replace-audio` | Audio ersetzen | - (Video- + Audiodatei, zwei Dateien) |
|
||||
| `burn-subtitles` | Untertitel einbrennen | `fontSize` (8-72) - Video- + Untertiteldatei |
|
||||
| `embed-subtitles` | Untertitel einbetten | `language` (ISO-639-2/B-Code) - Video- + Untertiteldatei |
|
||||
| `extract-subtitles` | Untertitel extrahieren | - (gibt SRT aus) |
|
||||
| `images-to-video` | Bilder zu Video | `secondsPerImage` (0.5-10), `resolution` (1080p/720p/square), `fps` - Mehrfachdatei |
|
||||
| `video-metadata` | Video-Metadaten bereinigen | - |
|
||||
| `auto-subtitles` | Auto-Untertitel (KI) | `language` (auto/en/de/fr/es/zh/ja/ko/id/th/vi), `format` (srt/vtt) |
|
||||
| `extract-audio` | Audio extrahieren | `format` (mp3/wav/m4a/ogg) |
|
||||
|
||||
### Audio-Tools {#audio-tools}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `convert-audio` | Audio konvertieren | `format` (mp3/wav/ogg/flac/m4a), `bitrateKbps` (32-320) |
|
||||
| `trim-audio` | Audio zuschneiden | `startS`, `endS` |
|
||||
| `volume-adjust` | Lautstärke anpassen | `gainDb` (-30 bis 30) |
|
||||
| `normalize-audio` | Audio normalisieren | - (EBU R128, -16 LUFS) |
|
||||
| `fade-audio` | Audio ein-/ausblenden | `fadeInS` (0-30), `fadeOutS` (0-30) |
|
||||
| `reverse-audio` | Audio umkehren | - |
|
||||
| `audio-speed` | Audio-Geschwindigkeit | `factor` (0.25-4) |
|
||||
| `pitch-shift` | Tonhöhe verschieben | `semitones` (-12 bis 12) |
|
||||
| `audio-channels` | Audio-Kanäle | `mode` (stereo-to-mono/mono-to-stereo/swap) |
|
||||
| `silence-removal` | Stille entfernen | `thresholdDb` (-80 bis -20), `minSilenceS` (0.1-5) |
|
||||
| `noise-reduction` | Rauschunterdrückung | `strength` (light/medium/strong) |
|
||||
| `merge-audio` | Audio zusammenführen | `format` (mp3/wav/flac/m4a) - Mehrfachdatei |
|
||||
| `split-audio` | Audio aufteilen | `mode` (time/parts/silence), `segmentS`, `parts`, `thresholdDb`, `minSilenceS` |
|
||||
| `ringtone-maker` | Klingelton-Ersteller | `startS`, `durationS` (1-30) |
|
||||
| `waveform-image` | Wellenform-Bild | `width`, `height`, `color` (hex) |
|
||||
| `audio-metadata` | Audio-Metadaten | `strip` (bool), `title`, `artist`, `album` |
|
||||
| `transcribe-audio` | Audio transkribieren (KI) | `language` (auto/en/de/fr/es/zh/ja/ko/id/th/vi), `outputFormat` (txt/srt/vtt) |
|
||||
|
||||
### Dokument-Tools {#document-tools}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `merge-pdf` | PDFs zusammenführen | - (Mehrfachdatei, bis zu 20 PDFs) |
|
||||
| `split-pdf` | PDF aufteilen | `mode` (range/every), `range`, `everyN` (1-500) |
|
||||
| `compress-pdf` | PDF komprimieren | `mode` (quality/targetSize), `quality` (1-100), `targetSizeKb` |
|
||||
| `rotate-pdf` | PDF drehen | `angle` (90/180/270), `range` (Seitenbereich) |
|
||||
| `extract-pages` | Seiten extrahieren | `range` (qpdf-Syntax, z.B. \"1-5,8,10-z\") |
|
||||
| `remove-pages` | Seiten entfernen | `pages` (zu entfernender qpdf-Bereich) |
|
||||
| `organize-pdf` | PDF organisieren | `order` (qpdf-Seitenreihenfolge, z.B. \"3,1,2,5-z\") |
|
||||
| `protect-pdf` | PDF schützen | `userPassword`, `ownerPassword` (AES-256) |
|
||||
| `unlock-pdf` | PDF entsperren | `password` |
|
||||
| `repair-pdf` | PDF reparieren | - |
|
||||
| `linearize-pdf` | PDF für Web optimieren | - (linearisieren für schnelle Web-Anzeige) |
|
||||
| `grayscale-pdf` | PDF in Graustufen | - |
|
||||
| `pdfa-convert` | PDF/A konvertieren | - (Archiv-PDF/A-2) |
|
||||
| `crop-pdf` | PDF zuschneiden | `margin` (0-2000 Punkte) |
|
||||
| `nup-pdf` | N-up PDF | `perSheet` (2/3/4/8/9/12/16) |
|
||||
| `booklet-pdf` | Broschüren-PDF | `perSheet` (2/4/6/8) |
|
||||
| `watermark-pdf` | PDF mit Wasserzeichen | `text`, `position`, `fontSize`, `opacity`, `rotation` |
|
||||
| `pdf-page-numbers` | PDF-Seitenzahlen | `position` (bl/bc/br/tl/tc/tr), `fontSize` |
|
||||
| `flatten-pdf` | PDF reduzieren (Flatten) | - (fixiert Formulare und Anmerkungen) |
|
||||
| `redact-pdf` | PDF schwärzen (Redact) | `terms` (string[]), `caseSensitive` (bool) |
|
||||
| `sign-pdf` | PDF signieren | Benutzerdefinierte multipart-Route mit PDF `file`, Signaturdateien `sig0`, `sig1` und `placements` JSON-Array |
|
||||
| `pdf-to-text` | PDF zu Text | - |
|
||||
| `pdf-to-word` | PDF zu Word | - |
|
||||
| `pdf-metadata` | PDF-Metadaten | `title`, `author`, `subject`, `keywords` |
|
||||
| `convert-document` | Dokument konvertieren | `format` (docx/odt/rtf/txt) |
|
||||
| `convert-presentation` | Präsentation konvertieren | `format` (pptx/odp) |
|
||||
| `convert-spreadsheet` | Tabellenkalkulation konvertieren | `format` (xlsx/ods/csv) |
|
||||
| `excel-to-pdf` | Excel zu PDF | - |
|
||||
| `word-to-pdf` | Word zu PDF | - |
|
||||
| `powerpoint-to-pdf` | PowerPoint zu PDF | - |
|
||||
| `html-to-pdf` | HTML zu PDF | - (Remote-Ressourcen deaktiviert) |
|
||||
| `markdown-to-docx` | Markdown zu Word | - |
|
||||
| `markdown-to-html` | Markdown zu HTML | - |
|
||||
| `markdown-to-pdf` | Markdown zu PDF | - (Remote-Ressourcen deaktiviert) |
|
||||
| `epub-convert` | EPUB konvertieren | `format` (pdf/docx/html/md) |
|
||||
| `to-epub` | Zu EPUB konvertieren | - (akzeptiert .docx, .md, .html, .txt) |
|
||||
| `ocr-pdf` | PDF-OCR (KI) | `quality` (fast/balanced/best), `language` (auto/en/de/fr/es/zh/ja/ko), `pages` |
|
||||
| `pdf-to-image` | PDF zu Bild | `pages` (all/range), `format`, `dpi`, `quality` |
|
||||
| `pdf-to-jpg` | PDF zu JPG | `pages`, `dpi`, `quality`, `colorMode` |
|
||||
| `pdf-to-png` | PDF zu PNG | `pages`, `dpi`, `quality`, `colorMode` |
|
||||
| `pdf-to-tiff` | PDF zu TIFF | `pages`, `dpi`, `quality`, `colorMode` |
|
||||
|
||||
### Datei-Tools {#file-tools}
|
||||
|
||||
| Tool-ID | Name | Wichtige Einstellungen |
|
||||
|---------|------|-------------|
|
||||
| `chart-maker` | Diagramm-Ersteller | `kind` (bar/line/pie), `title`, `width`, `height` |
|
||||
| `csv-excel` | CSV zu Excel | `sheet` (Arbeitsblattnummer für XLSX-Eingabe) - bidirektional |
|
||||
| `csv-json` | CSV zu JSON | `pretty` (bool) - bidirektional |
|
||||
| `json-xml` | JSON zu XML | `pretty` (bool) - bidirektional |
|
||||
| `split-csv` | CSV aufteilen | `rowsPerFile` (1-1000000), `keepHeader` (bool) |
|
||||
| `merge-csvs` | CSVs zusammenführen | - (Mehrfachdatei, übereinstimmende Spalten) |
|
||||
| `yaml-json` | YAML / JSON | - (bidirektional) |
|
||||
| `xml-to-csv` | XML zu CSV | - (findet automatisch sich wiederholende Elemente) |
|
||||
| `excel-to-csv` | Excel zu CSV | dediziertes Konvertierungs-Preset, gestützt auf `convert-spreadsheet` |
|
||||
| `create-zip` | ZIP erstellen | - (Mehrfachdatei, 2-50 Dateien) |
|
||||
| `extract-zip` | ZIP extrahieren | - (Bomben-geschützt) |
|
||||
|
||||
### HTML zu Bild {#html-to-image}
|
||||
|
||||
Eine Webseite als Bild erfassen. Anders als andere Tools akzeptiert dieser Endpunkt `application/json` statt multipart-Formulardaten (kein Datei-Upload erforderlich).
|
||||
|
||||
**Endpunkt:** `POST /api/v1/tools/image/html-to-image`
|
||||
|
||||
**Content-Type:** `application/json`
|
||||
|
||||
| Parameter | Typ | Standard | Beschreibung |
|
||||
|-----------|------|---------|-------------|
|
||||
| `url` | string | (erforderlich) | Zu erfassende URL (nur http/https) |
|
||||
| `format` | string | `"png"` | Ausgabeformat: `jpg`, `png`, `webp` |
|
||||
| `quality` | number | `90` | Qualität 1-100 (nur JPG/WebP) |
|
||||
| `fullPage` | boolean | `false` | Vollständige scrollbare Seite erfassen |
|
||||
| `devicePreset` | string | `"desktop"` | `desktop`, `tablet`, `mobile`, `custom` |
|
||||
| `viewportWidth` | number | `1280` | Benutzerdefinierte Viewport-Breite 320-3840 |
|
||||
| `viewportHeight` | number | `720` | Benutzerdefinierte Viewport-Höhe 320-2160 |
|
||||
|
||||
**Beispiel:**
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/html-to-image \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"url": "https://snapotter.com", "format": "png", "devicePreset": "desktop"}'
|
||||
```
|
||||
|
||||
**Antwort:**
|
||||
|
||||
```json
|
||||
{
|
||||
"jobId": "uuid",
|
||||
"downloadUrl": "/api/v1/download/{jobId}/screenshot.png",
|
||||
"originalSize": 0,
|
||||
"processedSize": 54321
|
||||
}
|
||||
```
|
||||
|
||||
### Tool-Unterrouten {#tool-sub-routes}
|
||||
|
||||
Einige Tools stellen zusätzliche Endpunkte über die Standard-`POST /api/v1/tools/<section>/<toolId>` hinaus bereit:
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/v1/tools/popular` | Beliebte Tool-IDs zurückgeben, mit Rückfall auf eine kuratierte Standardliste, wenn Nutzungsdaten spärlich sind |
|
||||
| `POST` | `/api/v1/tools/image/remove-background/effects` | Hintergrundeffekte (color/gradient/blur/shadow) anwenden, ohne die KI erneut auszuführen. Verwendet die zwischengespeicherte Maske aus der ursprünglichen Entfernung. |
|
||||
| `POST` | `/api/v1/tools/image/edit-metadata/inspect` | Vorhandene EXIF/IPTC/XMP-Metadaten aus einem Bild lesen |
|
||||
| `POST` | `/api/v1/tools/image/strip-metadata/inspect` | Metadatenfelder vor dem Entfernen prüfen |
|
||||
| `POST` | `/api/v1/tools/image/passport-photo/analyze` | Phase 1: KI-Gesichtserkennung + Hintergrundentfernung. Gibt Gesichts-Landmarken und zwischengespeicherte Daten zurück. |
|
||||
| `POST` | `/api/v1/tools/image/passport-photo/generate` | Phase 2: Zuschneiden, Größe ändern und Kacheln mit zwischengespeicherter Analyse. Keine erneute KI-Ausführung. |
|
||||
| `POST` | `/api/v1/tools/image/gif-tools/info` | GIF-Metadaten abrufen (Frame-Anzahl, Abmessungen, Dauer) |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-image/info` | PDF-Metadaten abrufen (Seitenanzahl, Abmessungen) |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-image/preview` | Eine Vorschau einer bestimmten PDF-Seite erzeugen |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-jpg/info` | PDF-Metadaten für das dedizierte JPG-Preset abrufen |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-jpg/preview` | Eine JPG-Preset-PDF-Seitenvorschau erzeugen |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-png/info` | PDF-Metadaten für das dedizierte PNG-Preset abrufen |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-png/preview` | Eine PNG-Preset-PDF-Seitenvorschau erzeugen |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-tiff/info` | PDF-Metadaten für das dedizierte TIFF-Preset abrufen |
|
||||
| `POST` | `/api/v1/tools/pdf/pdf-to-tiff/preview` | Eine TIFF-Preset-PDF-Seitenvorschau erzeugen |
|
||||
| `POST` | `/api/v1/tools/image/svg-to-raster/batch` | Mehrere SVGs im Stapel in Raster konvertieren |
|
||||
| `POST` | `/api/v1/tools/image/image-enhancement/analyze` | Bildqualität analysieren und Verbesserungsempfehlungen zurückgeben |
|
||||
| `POST` | `/api/v1/tools/image/optimize-for-web/preview` | Leichtgewichtige Vorschau für die Live-Parameteranpassung. Gibt ein optimiertes Bild mit Größen-Headern zurück. |
|
||||
|
||||
## Stapelverarbeitung {#batch-processing}
|
||||
|
||||
Wenden Sie ein generisches batch-fähiges Tool auf mehrere Dateien gleichzeitig an. Gibt ein ZIP-Archiv zurück. Benutzerdefinierte Mehrfachdatei- oder mehrstufige Routen wie PDF-Signierung, PDF-OCR und PDF-zu-Bild-Preset-Routen verwenden ihren eigenen Endpunkt-Vertrag anstelle der generischen `/batch`-Route.
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:1349/api/v1/tools/image/compress/batch \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-F "files=@a.jpg" \
|
||||
-F "files=@b.jpg" \
|
||||
-F "files=@c.jpg" \
|
||||
-F 'settings={"quality":80}'
|
||||
```
|
||||
|
||||
Die Nebenläufigkeit wird durch `CONCURRENT_JOBS` gesteuert (Standard: automatisch anhand der CPU-Kerne erkannt). `MAX_BATCH_SIZE` begrenzt die Anzahl der Dateien pro Stapel (Standard: 100; 0 für unbegrenzt setzen).
|
||||
|
||||
## Pipelines {#pipelines}
|
||||
|
||||
### Eine Pipeline ausführen {#execute-a-pipeline}
|
||||
|
||||
```bash
|
||||
# Single file
|
||||
curl -X POST http://localhost:1349/api/v1/pipeline/execute \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-F "file=@input.jpg" \
|
||||
-F 'pipeline={"steps":[
|
||||
{"toolId":"resize","settings":{"width":1200}},
|
||||
{"toolId":"compress","settings":{"quality":80}},
|
||||
{"toolId":"watermark-text","settings":{"text":"© 2025"}}
|
||||
]}'
|
||||
|
||||
# Batch (multiple files → ZIP)
|
||||
curl -X POST http://localhost:1349/api/v1/pipeline/batch \
|
||||
-H "Authorization: Bearer <token>" \
|
||||
-F "files=@a.jpg" \
|
||||
-F "files=@b.jpg" \
|
||||
-F 'pipeline={"steps":[{"toolId":"resize","settings":{"width":800}}]}'
|
||||
```
|
||||
|
||||
Die Ausgabe jedes Schritts ist die Eingabe des nächsten Schritts. Pipelines erlauben standardmäßig 20 Schritte, konfigurierbar über `MAX_PIPELINE_STEPS`. Setzen Sie `MAX_PIPELINE_STEPS=0`, um das Limit aufzuheben.
|
||||
|
||||
### Pipelines speichern und verwalten {#save-and-manage-pipelines}
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|--------|------|-------------|
|
||||
| `POST` | `/api/v1/pipeline/save` | Eine benannte Pipeline speichern (`name`, `description`, `steps[]`) |
|
||||
| `GET` | `/api/v1/pipeline/list` | Gespeicherte Pipelines auflisten (Admins sehen alle; Benutzer sehen eigene) |
|
||||
| `DELETE` | `/api/v1/pipeline/:id` | Löschen (Eigentümer oder Admin) |
|
||||
| `GET` | `/api/v1/pipeline/tools` | Tool-IDs auflisten, die für Pipeline-Schritte gültig sind |
|
||||
|
||||
## Fortschrittsverfolgung {#progress-tracking}
|
||||
|
||||
Lang laufende Jobs, eingereihte Tools, Batch-Jobs und Pipelines geben Echtzeit-Fortschritt über Server-Sent Events aus. Der Fortschritts-Stream ist öffentlich und wird über die Job-ID gekennzeichnet, sodass Clients keinen Authorization-Header senden müssen, um ihn zu lesen.
|
||||
|
||||
```bash
|
||||
# Connect to the SSE stream (jobId is in the JSON response body from the tool endpoint)
|
||||
curl -N http://localhost:1349/api/v1/jobs/<jobId>/progress
|
||||
```
|
||||
|
||||
Ereignisformat:
|
||||
```
|
||||
data: {"jobId":"...","type":"single","phase":"processing","stage":"Upscaling","percent":42}
|
||||
data: {"jobId":"...","type":"single","phase":"complete","percent":100,"result":{"downloadUrl":"/api/v1/download/..."}}
|
||||
data: {"jobId":"...","type":"batch","status":"processing","completedFiles":2,"totalFiles":5,"failedFiles":0,"errors":[]}
|
||||
```
|
||||
|
||||
Sie können den Abbruch eines eingereihten oder laufenden Jobs mit `POST /api/v1/jobs/:jobId/cancel` anfordern. Die Antwort ist `{"canceled":true|false}`.
|
||||
|
||||
## Dateibibliothek {#file-library}
|
||||
|
||||
Dauerhafte Dateispeicherung mit Versionsverlauf.
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|--------|------|-------------|
|
||||
| `POST` | `/api/v1/upload` | Dateien in den Arbeitsbereich hochladen (temporäre Verarbeitung) |
|
||||
| `POST` | `/api/v1/files/upload` | Dateien in die dauerhafte Dateibibliothek hochladen |
|
||||
| `POST` | `/api/v1/files/save-result` | Ein Tool-Verarbeitungsergebnis als neue Dateiversion speichern |
|
||||
| `GET` | `/api/v1/files` | Gespeicherte Dateien auflisten (paginiert, mit Suche) |
|
||||
| `GET` | `/api/v1/files/:id` | Dateimetadaten + Versionskette abrufen |
|
||||
| `GET` | `/api/v1/files/:id/download` | Datei herunterladen |
|
||||
| `GET` | `/api/v1/files/:id/thumbnail` | 300px-JPEG-Thumbnail abrufen |
|
||||
| `DELETE` | `/api/v1/files` | Dateien und ihre Versionsketten massenhaft löschen (Body: `{ ids: [...] }`) |
|
||||
| `POST` | `/api/v1/fetch-urls` | Remote-URLs in den Arbeitsbereich abrufen für URL-basierte Importe |
|
||||
| `POST` | `/api/v1/preview` | Eine browserkompatible WebP-Vorschau erzeugen (für HEIC/HEIF/RAW-Formate) |
|
||||
| `GET` | `/api/v1/files/:id/preview` | Eine zwischengespeicherte oder erzeugte browserkompatible Vorschau für eine gespeicherte PDF-, Office-Dokument-, Video- oder Audiodatei streamen |
|
||||
| `POST` | `/api/v1/preview/generate` | Eine On-Demand-MP4- oder -MP3-Vorschau für eine hochgeladene Mediendatei erzeugen, ohne sie zuerst zu speichern |
|
||||
| `GET` | `/api/v1/download/:jobId/:filename` | Eine verarbeitete Datei aus einem Arbeitsbereich herunterladen |
|
||||
|
||||
Um ein Tool-Ergebnis automatisch in der Bibliothek zu speichern, fügen Sie `fileId` als multipart-Formularfeld hinzu, das auf eine vorhandene Bibliotheksdatei verweist. Das verarbeitete Ergebnis wird als neue Version gespeichert.
|
||||
|
||||
## API-Schlüssel-Verwaltung {#api-key-management}
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `POST` | `/api/v1/api-keys` | Auth | Neuen Schlüssel generieren - einmal angezeigt |
|
||||
| `GET` | `/api/v1/api-keys` | Auth | Schlüssel auflisten (Name, id, lastUsedAt - nicht der Rohschlüssel) |
|
||||
| `DELETE` | `/api/v1/api-keys/:id` | Auth | Schlüssel löschen |
|
||||
|
||||
## Teams {#teams}
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/teams` | Admin (`teams:manage`) | Teams auflisten |
|
||||
| `POST` | `/api/v1/teams` | Admin (`teams:manage`) | Team erstellen |
|
||||
| `PUT` | `/api/v1/teams/:id` | Admin (`teams:manage`) | Team umbenennen |
|
||||
| `DELETE` | `/api/v1/teams/:id` | Admin (`teams:manage`) | Team löschen (Standard-Team oder Teams mit Mitgliedern können nicht gelöscht werden) |
|
||||
|
||||
## Einstellungen {#settings}
|
||||
|
||||
Laufzeit-Schlüssel-Wert-Konfiguration (von jedem authentifizierten Benutzer lesbar, nur vom Admin schreibbar).
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/v1/settings` | Alle Einstellungen abrufen |
|
||||
| `PUT` | `/api/v1/settings` | Einstellungen massenhaft aktualisieren (JSON-Body mit Schlüssel-Wert-Paaren) |
|
||||
| `GET` | `/api/v1/settings/:key` | Eine bestimmte Einstellung nach Schlüssel abrufen |
|
||||
|
||||
Bekannte Schlüssel: `disabledTools` (JSON-Array von Tool-IDs), `enableExperimentalTools` (bool-String), `loginAttemptLimit` (Zahl).
|
||||
|
||||
## Einstellungen (Preferences) {#preferences}
|
||||
|
||||
Benutzerspezifische Einstellungen sind von den Instanzeinstellungen getrennt. Jeder authentifizierte Benutzer kann seine eigene Einstellungs-Map lesen und aktualisieren.
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|--------|------|-------------|
|
||||
| `GET` | `/api/v1/preferences` | Die Einstellungen des aktuellen Benutzers als `{ "preferences": { ... } }` abrufen |
|
||||
| `PUT` | `/api/v1/preferences` | Einen oder mehrere Einstellungsschlüssel für den aktuellen Benutzer per Upsert setzen |
|
||||
|
||||
## Rollen {#roles}
|
||||
|
||||
Benutzerdefinierte Rollenverwaltung mit granularen Berechtigungen.
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/roles` | Admin (`audit:read`) | Alle Rollen mit Benutzeranzahl auflisten |
|
||||
| `POST` | `/api/v1/roles` | Admin (`security:manage`) | Eine benutzerdefinierte Rolle erstellen (`name`, `description`, `permissions`) |
|
||||
| `PUT` | `/api/v1/roles/:id` | Admin (`security:manage`) | Eine benutzerdefinierte Rolle aktualisieren (integrierte Rollen können nicht geändert werden) |
|
||||
| `DELETE` | `/api/v1/roles/:id` | Admin (`security:manage`) | Eine benutzerdefinierte Rolle löschen (integrierte Rollen können nicht gelöscht werden; betroffene Benutzer fallen auf die Rolle `user` zurück) |
|
||||
|
||||
Verfügbare Berechtigungen (17): `tools:use`, `files:own`, `files:all`, `apikeys:own`, `apikeys:all`, `pipelines:own`, `pipelines:all`, `settings:read`, `settings:write`, `users:manage`, `teams:manage`, `features:manage`, `system:health`, `audit:read`, `compliance:manage`, `webhooks:manage`, `security:manage`.
|
||||
|
||||
## Audit-Log {#audit-log}
|
||||
|
||||
Nur für Admins verfügbarer Endpunkt zur Überprüfung sicherheitsrelevanter Aktionen.
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/audit-log` | Admin (`audit:read`) | Paginiertes Audit-Log mit optionalen Filtern |
|
||||
|
||||
Abfrageparameter:
|
||||
|
||||
| Parameter | Beschreibung |
|
||||
|-----------|-------------|
|
||||
| `page` | Seitennummer (Standard: 1) |
|
||||
| `limit` | Einträge pro Seite (Standard: 50, max.: 100) |
|
||||
| `action` | Nach Aktionstyp filtern (z.B. `ROLE_CREATED`, `ROLE_DELETED`) |
|
||||
| `ip` | Nach Quell-IP-Adresse filtern |
|
||||
| `from` | Einträge nach diesem ISO-8601-Datum filtern |
|
||||
| `to` | Einträge vor diesem ISO-8601-Datum filtern |
|
||||
|
||||
## Analytics {#analytics}
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/config/analytics` | Öffentlich | Die effektive Analytics-Konfiguration abrufen (PostHog-Schlüssel, Sentry-DSN, Abtastrate). Schlüssel, DSN und Instanz-ID sind leer, wenn Analytics deaktiviert ist, entweder durch das Kompilierzeit-Baking oder die Instanzeinstellung `analyticsEnabled`. |
|
||||
| `POST` | `/api/v1/feedback` | Auth | Explizites Benutzer-Feedback an das konfigurierte PostHog-Projekt als `feedback_submitted` übermitteln. Die Route beachtet das Analytics-Gate, begrenzt die Übermittlungsrate, entfernt Kontaktfelder, sofern `contactOk` nicht true ist, und akzeptiert niemals Dateiinhalte, Dateinamen, Upload-Pfade oder rohen privaten Fehlertext. Wenn Analytics deaktiviert ist, gibt sie `{ "ok": true, "accepted": false }` zurück. |
|
||||
| `PUT` | `/api/v1/settings` | Admin (`settings:write`) | Den instanzweiten Opt-out setzen. Senden Sie einen JSON-Body `{ "analyticsEnabled": "false" }`, um Analytics für alle zu deaktivieren, oder `"true"`, um es wieder zu aktivieren. |
|
||||
|
||||
## Features / KI-Bundles {#features-ai-bundles}
|
||||
|
||||
KI-Feature-Bundles verwalten (KI-Modellpakete in der Docker-Umgebung installieren/deinstallieren). Bevorzugen Sie den Tool-Level-Installationsendpunkt, wenn Sie ein Tool aus benutzerdefinierter Automatisierung aktivieren: Einige KI-Tools benötigen mehr als ein gemeinsames Bundle, und dieser Endpunkt überspringt bereits installierte Bundles und reiht nur die fehlenden ein.
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/features` | Auth | Alle Feature-Bundles und ihren Installationsstatus auflisten |
|
||||
| `POST` | `/api/v1/admin/features/:bundleId/install` | Admin (`features:manage`) | Ein Feature-Bundle installieren (asynchron, gibt `jobId` zur Fortschrittsverfolgung zurück) |
|
||||
| `POST` | `/api/v1/admin/tools/:toolId/features/install` | Admin (`features:manage`) | Jedes von einem Tool benötigte Bundle installieren; gibt den Status queued/skipped pro Bundle zurück |
|
||||
| `POST` | `/api/v1/admin/features/:bundleId/uninstall` | Admin (`features:manage`) | Ein Feature-Bundle deinstallieren und Modelldateien bereinigen |
|
||||
| `GET` | `/api/v1/admin/features/disk-usage` | Admin (`features:manage`) | Den gesamten Speicherplatzverbrauch der KI-Modelle abrufen |
|
||||
| `POST` | `/api/v1/admin/features/import` | Admin (`features:manage`) | Ein Offline-KI-Bundle-Archiv importieren |
|
||||
|
||||
## Admin-Operationen {#admin-operations}
|
||||
|
||||
Operative Endpunkte für Observability, Support, Nutzungsberichte und Backup-Status.
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/admin/log-level` | Admin (`settings:write`) | Das aktuelle Laufzeit-Log-Level lesen |
|
||||
| `POST` | `/api/v1/admin/log-level` | Admin (`settings:write`) | Das Laufzeit-Log-Level ändern (`fatal`, `error`, `warn`, `info`, `debug`, `trace` oder `silent`) |
|
||||
| `GET` | `/api/v1/metrics` | Admin (`system:health`) | Prometheus-Metriken im Textformat |
|
||||
| `GET` | `/api/v1/admin/support-bundle` | Admin (`system:health`) | Ein redigiertes diagnostisches Support-Bundle-ZIP herunterladen |
|
||||
| `GET` | `/api/v1/admin/usage` | Admin (`audit:read`) | Daten des Nutzungs-Dashboards, mit optionalem Abfrageparameter `days` |
|
||||
| `GET` | `/api/v1/admin/backup-status` | Admin (`system:health`) | Metadaten und Aktualitätsstatus des letzten Backups lesen |
|
||||
| `POST` | `/api/v1/admin/backup-status` | Admin (`system:health`) | Ein abgeschlossenes Backup erfassen (`type`, optional `sizeBytes`, optional `notes`) |
|
||||
|
||||
## Enterprise-APIs {#enterprise-apis}
|
||||
|
||||
Diese Routen sind durch das zugehörige Enterprise-Feature lizenzgesteuert. Sie erfordern weiterhin die aufgeführte SnapOtter-Berechtigung.
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/enterprise/audit/export` | Admin (`audit:read`) | Audit-Einträge als JSON oder CSV mit Filtern exportieren |
|
||||
| `GET` | `/api/v1/enterprise/config/export` | Admin (`system:health`) | Redigierte Instanzkonfiguration, benutzerdefinierte Rollen und Teams exportieren |
|
||||
| `POST` | `/api/v1/enterprise/config/import` | Admin (`system:health`) | Konfiguration importieren, mit optionalem Probelauf |
|
||||
| `GET` | `/api/v1/enterprise/ip-allowlist` | Admin (`security:manage`) | Konfigurierte CIDR-Erlaubnisliste lesen |
|
||||
| `PUT` | `/api/v1/enterprise/ip-allowlist` | Admin (`security:manage`) | CIDR-Erlaubnisliste mit Selbstsperrungs-Prävention aktualisieren |
|
||||
| `GET` | `/api/v1/enterprise/legal-hold` | Admin (`compliance:manage`) | Legal Holds für Benutzer und Teams auflisten |
|
||||
| `PUT` | `/api/v1/enterprise/legal-hold` | Admin (`compliance:manage`) | Einen Legal Hold auf einen Benutzer oder ein Team anwenden oder aufheben |
|
||||
| `POST` | `/api/v1/enterprise/scim/token` | Admin (`users:manage`) | Ein SCIM-Bearer-Token generieren, einmal zurückgegeben |
|
||||
| `DELETE` | `/api/v1/enterprise/scim/token` | Admin (`users:manage`) | Das aktuelle SCIM-Bearer-Token widerrufen |
|
||||
| `GET` | `/api/v1/enterprise/siem/config` | Admin (`webhooks:manage`) | SIEM-Weiterleitungskonfiguration lesen |
|
||||
| `PUT` | `/api/v1/enterprise/siem/config` | Admin (`webhooks:manage`) | SIEM-Weiterleitungskonfiguration aktualisieren |
|
||||
| `GET` | `/api/v1/enterprise/webhooks` | Admin (`webhooks:manage`) | Webhook-Ziele auflisten |
|
||||
| `POST` | `/api/v1/enterprise/webhooks` | Admin (`webhooks:manage`) | Ein Webhook-Ziel erstellen |
|
||||
| `PUT` | `/api/v1/enterprise/webhooks/:index` | Admin (`webhooks:manage`) | Ein Webhook-Ziel aktualisieren |
|
||||
| `DELETE` | `/api/v1/enterprise/webhooks/:index` | Admin (`webhooks:manage`) | Ein Webhook-Ziel löschen |
|
||||
| `POST` | `/api/v1/enterprise/webhooks/:index/test` | Admin (`webhooks:manage`) | Eine Test-Webhook-Nutzlast senden |
|
||||
| `POST` | `/api/v1/enterprise/users/:id/export` | Admin (`compliance:manage`) | Einen GDPR-Benutzerexport-Job starten |
|
||||
| `GET` | `/api/v1/enterprise/users/:id/export/:jobId` | Admin (`compliance:manage`) | GDPR-Exportstatus und Download-URL lesen |
|
||||
| `DELETE` | `/api/v1/enterprise/users/:id/purge` | Admin (`compliance:manage`) | Die Daten eines Benutzers nach Bestätigung dauerhaft löschen |
|
||||
| `DELETE` | `/api/v1/enterprise/teams/:id/purge` | Admin (`compliance:manage`) | Die Daten eines Teams nach Bestätigung dauerhaft löschen |
|
||||
| `GET` | `/api/v1/admin/version` | Admin (`system:health`) | App-, Build-, Node- und Schema-Versionsmetadaten lesen |
|
||||
| `GET` | `/api/v1/admin/migrations/pending` | Admin (`system:health`) | Verpackte Migrationen mit angewendeten Migrationen vergleichen |
|
||||
| `GET` | `/api/v1/admin/upgrade-check` | Admin (`system:health`) | Upgrade-Bereitschaftsprüfungen ausführen |
|
||||
|
||||
### SCIM 2.0 {#scim-2-0}
|
||||
|
||||
SCIM-Discovery-Endpunkte sind öffentlich. Benutzer- und Gruppenendpunkte erfordern das oben generierte SCIM-Bearer-Token.
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/scim/v2/ServiceProviderConfig` | Öffentlich | SCIM-Server-Fähigkeiten |
|
||||
| `GET` | `/api/v1/scim/v2/Schemas` | Öffentlich | SCIM-Schema-Discovery |
|
||||
| `GET` | `/api/v1/scim/v2/ResourceTypes` | Öffentlich | SCIM-Ressourcentyp-Discovery |
|
||||
| `GET` | `/api/v1/scim/v2/Users` | SCIM-Token | Benutzer auflisten, mit optionalem SCIM-Filter |
|
||||
| `POST` | `/api/v1/scim/v2/Users` | SCIM-Token | Einen Benutzer erstellen |
|
||||
| `GET` | `/api/v1/scim/v2/Users/:id` | SCIM-Token | Einen Benutzer abrufen |
|
||||
| `PUT` | `/api/v1/scim/v2/Users/:id` | SCIM-Token | Einen Benutzer ersetzen |
|
||||
| `DELETE` | `/api/v1/scim/v2/Users/:id` | SCIM-Token | Einen Benutzer soft deaktivieren |
|
||||
| `GET` | `/api/v1/scim/v2/Groups` | SCIM-Token | Teams als SCIM-Gruppen auflisten |
|
||||
| `POST` | `/api/v1/scim/v2/Groups` | SCIM-Token | Ein Team erstellen |
|
||||
| `GET` | `/api/v1/scim/v2/Groups/:id` | SCIM-Token | Ein Team abrufen |
|
||||
| `PUT` | `/api/v1/scim/v2/Groups/:id` | SCIM-Token | Ein Team und die Gruppenmitgliedschaft ersetzen |
|
||||
| `DELETE` | `/api/v1/scim/v2/Groups/:id` | SCIM-Token | Ein Team löschen |
|
||||
|
||||
## Meme-Vorlagen {#meme-templates}
|
||||
|
||||
Unterstützende API für das Meme-Generator-Tool.
|
||||
|
||||
| Methode | Pfad | Zugriff | Beschreibung |
|
||||
|--------|------|--------|-------------|
|
||||
| `GET` | `/api/v1/meme-templates` | Auth | Alle verfügbaren Meme-Vorlagen mit Textfeld-Positionen auflisten |
|
||||
| `GET` | `/api/v1/meme-templates/full/:filename` | Auth | Vollständiges Vorlagenbild bereitstellen |
|
||||
| `GET` | `/api/v1/meme-templates/thumbs/:filename` | Auth | Vorlagen-Thumbnail bereitstellen |
|
||||
| `GET` | `/api/v1/meme-templates/fonts/:filename` | Auth | Schriftdatei für das Rendering von Meme-Text bereitstellen |
|
||||
|
||||
## Fehlerantworten {#error-responses}
|
||||
|
||||
Alle Fehler geben JSON zurück:
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "Human-readable message",
|
||||
"code": "MACHINE_READABLE_CODE"
|
||||
}
|
||||
```
|
||||
|
||||
| Status | Bedeutung |
|
||||
|--------|---------|
|
||||
| 400 | Ungültige Anfrage / Validierung fehlgeschlagen |
|
||||
| 401 | Nicht authentifiziert |
|
||||
| 403 | Unzureichende Berechtigungen |
|
||||
| 404 | Ressource nicht gefunden |
|
||||
| 413 | Datei zu groß (siehe `MAX_UPLOAD_SIZE_MB`) |
|
||||
| 422 | Verarbeitung nach der Validierung fehlgeschlagen |
|
||||
| 429 | Ratenbegrenzt (siehe `RATE_LIMIT_PER_MIN`) |
|
||||
| 501 | Erforderliches KI-Feature-Bundle ist nicht installiert (`FEATURE_NOT_INSTALLED`) |
|
||||
| 500 | Interner Serverfehler |
|
||||
Reference in New Issue
Block a user