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:
SnapOtter
2026-07-11 13:52:47 +08:00
committed by GitHub
parent 00b651c9f8
commit 4963ab3bbd
3620 changed files with 306134 additions and 0 deletions
+438
View File
@@ -0,0 +1,438 @@
---
description: "Referens för AI-motorn med alla lokala ML-verktyg. Bakgrundsborttagning, uppskalning, OCR, ansiktsdetektering, fotorestaurering och mer."
i18n_source_hash: 14728c1dcd05
i18n_provenance: machine
i18n_output_hash: d8168ab39420
---
# Referens för AI-motorn {#ai-engine-reference}
Paketet `@snapotter/ai` kopplar Node.js till en **beständig Python-sidecar** för alla ML-operationer. Dispatcher-processen hålls vid liv mellan förfrågningar för snabb prestanda med varm start. NVIDIA CUDA identifieras automatiskt vid uppstart och används när det är tillgängligt; annars körs AI-verktygen på CPU.
Acceleration via Intel/AMD-iGPU genom VA-API, Quick Sync eller OpenCL stöds inte för AI-inferens idag. Att mappa `/dev/dri` in i en container accelererar inte dessa Python-sidecar-verktyg om inte en CUDA-kapabel NVIDIA-GPU finns tillgänglig.
19 Python-sidecar-AI-verktyg över fyra modaliteter (bild, ljud, video, dokument), plus 2 verktyg med valfria AI-funktioner. Alla modeller körs lokalt - ingen internetuppkoppling krävs efter den första nedladdningen av modellerna.
## Arkitektur {#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)
```
En separat "docs"-dispatcherprofil ersätter AI-tillåtelselistan med skript för dokumentbearbetning (`doc_pagecount`, `doc_health`, `doc_flatten`, `doc_redact`, `doc_text`, `doc_to_word`, `doc_metadata`, `doc_html_pdf`) och hoppar över tunga ML-importer.
**Tidsgränser:** 300 s som standard; OCR och BiRefNet-bakgrundsborttagning får 600 s.
## Funktionspaket {#feature-bundles}
AI-modeller paketeras efter delad beroendestack, inte ett arkiv per verktyg. Ett funktionspaket kan aktivera flera verktyg när de använder samma modellfamilj, Python-wheels eller inbyggda bibliotek. Detta håller den utgivna Docker-avbildningen mindre och undviker att lagra dubbletter av samma modeller för bakgrundsmattning, ansiktsdetektering, OCR, restaurering och tal.
Docker-avbildningen levereras med applikationen plus den gemensamma körtidsmiljön. Stora modellarkiv laddas ned vid behov till den beständiga volymen `/data/ai` och återanvänds sedan av alla verktyg som behöver dem. Om ett paket redan är installerat eftersom ett annat verktyg behövde det, laddas det paketet inte ned igen när ett nytt beroende verktyg aktiveras.
Varje AI-verktyg kräver ett eller flera funktionspaket innan det kan köras. Admingränssnittet installerar per verktyg via `POST /api/v1/admin/tools/:toolId/features/install`, som löser upp den fullständiga paketlistan, hoppar över paket som redan är installerade och köar bara de saknade nedladdningarna. Att till exempel aktivera Passfoto på en ny instans köar `background-removal` och `face-detection`; att aktivera det efter att Bakgrundsborttagning redan är installerat köar bara `face-detection`.
| Paket | Storlek | Delad beroendegrupp | Verktyg som använder det |
|--------|------|-------------------------|-------------------|
| `background-removal` | 4-5 GB | rembg / BiRefNet bakgrundsmattning | remove-background, passport-photo, transparency-fixer, background-replace, blur-background |
| `face-detection` | 200-300 MB | MediaPipe ansiktsdetektering och landmärken | blur-faces, red-eye-removal, smart-crop |
| `object-eraser-colorize` | 1-2 GB | LaMa inpainting/outpainting och DDColor | erase-object, colorize, ai-canvas-expand |
| `upscale-enhance` | 5-6 GB | RealESRGAN, GFPGAN / CodeFormer, brusreducering | upscale, enhance-faces, noise-removal |
| `photo-restoration` | 4-5 GB | pipeline för reparation av repor och restaurering | restore-photo |
| `ocr` | 5-6 GB | PaddleOCR / Tesseract OCR-stack | ocr, ocr-pdf |
| `transcription` | ~600 MB | faster-whisper tal-till-text-modeller | transcribe-audio, auto-subtitles |
Verktyg med beroenden över flera paket:
| Verktyg | Nödvändiga paket | Varför |
|------|------------------|-----|
| `passport-photo` | `background-removal`, `face-detection` | Tar bort bakgrunden och använder sedan ansiktslandmärken för att beskära bilden enligt reglerna för pass- och ID-foton. |
| `enhance-faces` | `upscale-enhance`, `face-detection` | Detekterar ansikten innan GFPGAN- eller CodeFormer-förbättring körs på de valda ansiktsregionerna. |
Ett verktyg är tillgängligt först när alla dess nödvändiga paket är installerade. Delvisa installationer är giltiga och hanteras stegvis: installerade paket återanvänds, saknade paket visas som nedladdningar, och köade installationer körs en i taget så att den delade Python-miljön inte modifieras samtidigt.
---
## Bakgrundsborttagning {#background-removal}
**Verktygsrutt:** `remove-background`
**Modell:** rembg med BiRefNet (standard) eller U2-Net-varianter
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `model` | string | - | Modellvariant (valfri åsidosättning) |
| `backgroundType` | string | `"transparent"` | En av: `transparent`, `color`, `gradient`, `blur`, `image` |
| `backgroundColor` | string | - | Hexfärg för enfärgad bakgrund |
| `gradientColor1` | string | - | Första gradientfärgen |
| `gradientColor2` | string | - | Andra gradientfärgen |
| `gradientAngle` | number | - | Gradientvinkel i grader |
| `blurEnabled` | boolean | - | Aktivera oskärpeeffekt på bakgrunden |
| `blurIntensity` | number (0-100) | - | Oskärpans intensitet |
| `shadowEnabled` | boolean | - | Aktivera slagskugga på motivet |
| `shadowOpacity` | number (0-100) | - | Skuggans opacitet |
| `outputFormat` | string | - | Utdataformat: `png`, `webp` eller `avif` |
| `edgeRefine` | integer (0-3) | - | Nivå för kantförfining |
| `decontaminate` | boolean | - | Ta bort färgblödning från kanter |
## Bakgrundsutbyte {#background-replace}
**Verktygsrutt:** `background-replace`
**Modell:** rembg / BiRefNet (delas med remove-background)
Tar bort bakgrunden och ersätter den med en enfärgad färg eller gradient.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `backgroundType` | `"color"` \| `"gradient"` | `"color"` | Bakgrundsläge |
| `color` | string | `"#ffffff"` | Bakgrundens hexfärg (när `backgroundType` är `color`) |
| `gradientColor1` | string | - | Första gradientens hexfärg |
| `gradientColor2` | string | - | Andra gradientens hexfärg |
| `gradientAngle` | integer (0-360) | `180` | Gradientvinkel i grader |
| `feather` | integer (0-20) | `0` | Radie för kantutjämning |
| `format` | `"png"` \| `"webp"` | `"png"` | Utdataformat |
## Oskärp bakgrund {#blur-background}
**Verktygsrutt:** `blur-background`
**Modell:** rembg / BiRefNet (delas med remove-background)
Gör bakgrunden oskarp samtidigt som motivet hålls skarpt.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `intensity` | integer (1-100) | `50` | Oskärpans intensitet |
| `feather` | integer (0-20) | `0` | Radie för kantutjämning |
| `format` | `"png"` \| `"webp"` | `"png"` | Utdataformat |
## Bilduppskalning {#image-upscaling}
**Verktygsrutt:** `upscale`
**Modell:** RealESRGAN (med Lanczos-reserv när den inte är tillgänglig)
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `scale` | number | `2` | Uppskalningsfaktor |
| `model` | string | `"auto"` | Modellvariant |
| `faceEnhance` | boolean | `false` | Kör en GFPGAN-ansiktsförbättring |
| `denoise` | number | `0` | Styrka på brusreducering |
| `format` | string | `"auto"` | Åsidosättning av utdataformat |
| `quality` | number | `95` | Utdatakvalitet (1-100) |
## OCR / Textextraktion {#ocr-text-extraction}
**Verktygsrutt:** `ocr`
**Modeller:** Tesseract (snabb), PaddleOCR PP-OCRv5 (balanserad), PaddleOCR-VL 1.5 (bäst)
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `quality` | `"fast"` \| `"balanced"` \| `"best"` | `"balanced"` | Bearbetningsnivå |
| `language` | string | `"auto"` | Språk: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
| `enhance` | boolean | `true` | Förbehandla bilden för att förbättra OCR-noggrannheten |
| `engine` | string | - | Föråldrad. Mappar `tesseract` till `fast`, `paddleocr` till `balanced` |
Returnerar strukturerade resultat med avgränsningsrutor, konfidenspoäng och extraherade textblock.
## PDF-OCR {#pdf-ocr}
**Verktygsrutt:** `ocr-pdf`
**Modeller:** Samma nivåsystem som bild-OCR
Extraherar text från inskannade PDF-dokument med AI-driven OCR, sida för sida.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `quality` | `"fast"` \| `"balanced"` \| `"best"` | `"balanced"` | Bearbetningsnivå |
| `language` | string | `"auto"` | Språk: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
| `pages` | string | `"all"` | Sidval: `"all"`, `"1-3"`, `"1,3,5"` |
## Oskärp ansikten / PII {#face-pii-blur}
**Verktygsrutt:** `blur-faces`
**Modell:** MediaPipe ansiktsdetektering
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `blurRadius` | number (1-100) | `30` | Radie för gaussisk oskärpa |
| `sensitivity` | number (0-1) | `0.5` | Konfidenströskel för detektering |
## Ansiktsförbättring {#face-enhancement}
**Verktygsrutt:** `enhance-faces`
**Modeller:** GFPGAN, CodeFormer
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `model` | `"auto"` \| `"gfpgan"` \| `"codeformer"` | `"auto"` | Förbättringsmodell |
| `strength` | number (0-1) | `0.8` | Styrka på förbättring |
| `sensitivity` | number (0-1) | `0.5` | Tröskel för ansiktsdetektering |
| `onlyCenterFace` | boolean | `false` | Förbättra endast det mest centrala ansiktet |
## AI-kolorering {#ai-colorization}
**Verktygsrutt:** `colorize`
**Modell:** DDColor (med OpenCV DNN-reserv)
Omvandlar svartvita eller gråskalefoton till fullständig färg.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `intensity` | number (0-1) | `1.0` | Styrka på färgmättnad |
| `model` | `"auto"` \| `"ddcolor"` \| `"opencv"` | `"auto"` | Modellvariant |
## Brusreducering {#noise-removal}
**Verktygsrutt:** `noise-removal`
**Modell:** SCUNet (nivåindelad pipeline för brusreducering)
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `tier` | `"quick"` \| `"balanced"` \| `"quality"` \| `"maximum"` | `"balanced"` | Bearbetningsnivå |
| `strength` | number (0-100) | `50` | Styrka på brusreducering |
| `detailPreservation` | number (0-100) | `50` | Hur mycket detaljer som ska bevaras; högre behåller mer textur |
| `colorNoise` | number (0-100) | `30` | Styrka på reducering av färgbrus |
| `format` | string | `"original"` | Utdataformat: `original`, `png`, `jpeg`, `webp`, `avif`, `jxl` |
| `quality` | number (1-100) | `90` | Kvalitet på utdatakodning |
## Borttagning av röda ögon {#red-eye-removal}
**Verktygsrutt:** `red-eye-removal`
Detekterar ansiktslandmärken, lokaliserar ögonregioner och korrigerar övermättnad i rödkanalen.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `sensitivity` | number (0-100) | `50` | Tröskel för detektering av röda pixlar |
| `strength` | number (0-100) | `70` | Styrka på korrigering |
| `format` | string | - | Åsidosättning av utdataformat (valfritt) |
| `quality` | number (1-100) | `90` | Utdatakvalitet |
## Fotorestaurering {#photo-restoration}
**Verktygsrutt:** `restore-photo`
Pipeline i flera steg för gamla eller skadade foton: detektering och reparation av repor/revor, ansiktsförbättring, brusreducering och valfri kolorering.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `scratchRemoval` | boolean | `true` | Detektera och reparera repor, revor |
| `faceEnhancement` | boolean | `true` | Kör en ansiktsförbättring |
| `fidelity` | number (0-1) | `0.7` | Styrka på ansiktsförbättring (högre = mer konservativ) |
| `denoise` | boolean | `true` | Kör en brusreducering |
| `denoiseStrength` | number (0-100) | `25` | Styrka på brusreducering |
| `colorize` | boolean | `false` | Kolorera efter restaurering |
| `colorizeStrength` | number (0-100) | `85` | Intensitet på kolorering |
## Passfoto {#passport-photo}
**Verktygsrutt:** `passport-photo`
**Modeller:** MediaPipe ansiktslandmärken + BiRefNet-bakgrundsborttagning
Arbetsflöde i två faser: analysera (detektera ansikte + ta bort bakgrund) och sedan generera (beskär, ändra storlek, lägg i rutmönster). Stöder 37+ länder över 6 regioner.
### Fas 1: Analysera {#phase-1-analyze}
`POST /api/v1/tools/image/passport-photo/analyze`
Tar emot en bildfil (multipart). Returnerar data om ansiktslandmärken, en base64-förhandsvisning och bilddimensioner.
### Fas 2: Generera {#phase-2-generate}
`POST /api/v1/tools/image/passport-photo/generate`
Tar emot en JSON-kropp med resultaten från Fas 1 plus genereringsinställningar:
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `jobId` | string | (obligatorisk) | Jobb-ID från Fas 1 |
| `filename` | string | (obligatorisk) | Ursprungligt filnamn från Fas 1 |
| `countryCode` | string | (obligatorisk) | ISO-landskod (t.ex. `US`, `GB`, `IN`) |
| `documentType` | string | `"passport"` | Dokumenttyp |
| `bgColor` | string | `"#FFFFFF"` | Bakgrundsfärg i hex |
| `printLayout` | string | `"none"` | Utskriftslayout: `none`, `4x6`, `a4`, `letter` |
| `maxFileSizeKb` | number | `0` | Maximal filstorlek i KB (0 = ingen gräns) |
| `dpi` | number (72-1200) | `300` | Utdata-DPI |
| `customWidthMm` | number | - | Anpassad bredd i mm (åsidosätter landsspecifikationen) |
| `customHeightMm` | number | - | Anpassad höjd i mm (åsidosätter landsspecifikationen) |
| `zoom` | number (0.5-3) | `1` | Zoomfaktor |
| `adjustX` | number | `0` | Justering av horisontellt läge |
| `adjustY` | number | `0` | Justering av vertikalt läge |
| `landmarks` | object | (obligatorisk) | Landmärken från Fas 1 |
| `imageWidth` | number | (obligatorisk) | Bildbredd från Fas 1 |
| `imageHeight` | number | (obligatorisk) | Bildhöjd från Fas 1 |
## Objektborttagning (Inpainting) {#object-erasing-inpainting}
**Verktygsrutt:** `erase-object`
**Modell:** LaMa via ONNX Runtime
Masken skickas som en **andra fildel** (fältnamn `mask`), inte som base64. Vita pixlar i masken anger områden som ska raderas. Inställningarna `format` och `quality` skickas som formulärfält på toppnivå.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `file` | file | (obligatorisk) | Källbild (multipart) |
| `mask` | file | (obligatorisk) | Maskbild (multipart, fältnamn `mask`, vitt = radera) |
| `format` | string | `"auto"` | Utdataformat: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
| `quality` | integer (1-100) | `95` | Utdatakvalitet |
CUDA-accelererad när en NVIDIA-GPU finns tillgänglig.
## AI-canvasutökning {#ai-canvas-expand}
**Verktygsrutt:** `ai-canvas-expand`
**Modell:** LaMa-baserad outpainting
Utökar bildens canvas i valfri riktning och fyller nya områden med AI-genererat innehåll som matchar den befintliga bilden.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `extendTop` | integer | `0` | Antal pixlar att utöka upptill |
| `extendRight` | integer | `0` | Antal pixlar att utöka till höger |
| `extendBottom` | integer | `0` | Antal pixlar att utöka nedtill |
| `extendLeft` | integer | `0` | Antal pixlar att utöka till vänster |
| `tier` | `"fast"` \| `"balanced"` \| `"high"` | `"balanced"` | Kvalitetsnivå |
| `format` | string | `"auto"` | Utdataformat: `auto`, `png`, `jpg`, `jpeg`, `webp`, `tiff`, `gif`, `avif`, `heic`, `heif`, `jxl` |
| `quality` | integer (1-100) | `95` | Utdatakvalitet |
Minst en utökningsriktning måste vara större än 0.
## Smart beskärning {#smart-crop}
**Verktygsrutt:** `smart-crop`
**Modell:** MediaPipe ansiktsdetektering (endast ansiktsläge)
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `mode` | string | `"subject"` | Beskärningsstrategi: `subject`, `face`, `trim` |
| `strategy` | `"attention"` \| `"entropy"` | `"attention"` | Strategi för motivläge |
| `width` | integer | - | Utdatabredd |
| `height` | integer | - | Utdatahöjd |
| `padding` | integer (0-50) | `0` | Marginal i procent runt motivet |
| `facePreset` | string | `"head-shoulders"` | Förinställd inramning när `mode=face` |
| `sensitivity` | number (0-1) | `0.5` | Tröskel för ansiktsdetektering |
| `threshold` | integer (0-255) | `30` | Tröskel för bakgrundsdetektering (trimläge) |
| `padToSquare` | boolean | `false` | Fyll ut trimmat resultat till en kvadrat |
| `padColor` | string | `"#ffffff"` | Bakgrundsfärg för kvadratisk utfyllnad |
| `targetSize` | integer | - | Målstorlek för utfyllt utdata (pixlar) |
| `quality` | integer (1-100) | - | Utdatakvalitet |
Äldre `mode`-värden `attention` och `content` accepteras och mappas till `subject` respektive `trim`.
**Förinställningar för ansikte:**
| Förinställning | Bäst för |
|--------|---------|
| `closeup` | Porträttbilder |
| `head-shoulders` | Profilbilder |
| `upper-body` | LinkedIn / formellt |
| `half-body` | Hela överkroppen |
## Transkribera ljud {#transcribe-audio}
**Verktygsrutt:** `transcribe-audio`
**Modell:** faster-whisper
Omvandlar tal till text. Stöder utdataformaten oformaterad text, SRT och VTT.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `language` | string | `"auto"` | Språk: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko`, `id`, `th`, `vi` |
| `outputFormat` | `"txt"` \| `"srt"` \| `"vtt"` | `"txt"` | Utdataformat |
## Automatiska undertexter {#auto-subtitles}
**Verktygsrutt:** `auto-subtitles`
**Modell:** faster-whisper (extraherar ljud från video och transkriberar sedan)
Genererar undertextfiler från en videos ljudspår.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `language` | string | `"auto"` | Språk: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko`, `id`, `th`, `vi` |
| `format` | `"srt"` \| `"vtt"` | `"srt"` | Utdataformat för undertext |
## PNG-transparensfixare {#png-transparency-fixer}
**Verktygsrutt:** `transparency-fixer`
**Modell:** BiRefNet HR-matting (2048x2048 upplösning)
Åtgärdar "falskt transparenta" PNG-filer där bakgrunden togs bort men lämnade kvar fransning, glorior eller halvtransparenta artefakter. Använder BiRefNets högupplösta mattningsmodell för att producera en ren alfakanal och tillämpar sedan konfigurerbar defringe-bearbetning för att ta bort färgkontaminering längs kanterna.
**Reservkedja vid minnesbrist:** Om BiRefNet HR-matting överskrider tillgängligt minne faller verktyget automatiskt tillbaka till `birefnet-general`, sedan till `u2net`.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `defringe` | number (0-100) | `30` | Styrka på kant-defringe för att ta bort färgkontaminering |
| `outputFormat` | `"png"` \| `"webp"` | `"png"` | Utdatabildens format |
| `removeWatermark` | boolean | `false` | Kör förbehandling för borttagning av vattenstämpel (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"}'
```
---
## Verktyg med valfria AI-funktioner {#tools-with-optional-ai-capabilities}
Följande verktyg är inte Python-sidecar-verktyg men använder AI-funktioner när vissa alternativ är aktiverade.
### Bildförbättring {#image-enhancement}
**Verktygsrutt:** `image-enhancement`
**Motor:** Analysbaserad (Sharp-histogram och statistik)
Analyserar bilden och tillämpar automatiska korrigeringar för exponering, kontrast, vitbalans, mättnad, skärpa och brus. Stöder scenspecifika lägen.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `mode` | `"auto"` \| `"portrait"` \| `"landscape"` \| `"low-light"` \| `"food"` \| `"document"` | `"auto"` | Scenläge för att finjustera korrigeringar |
| `intensity` | number (0-100) | `50` | Total korrigeringsstyrka |
| `corrections.exposure` | boolean | `true` | Tillämpa exponeringskorrigering |
| `corrections.contrast` | boolean | `true` | Tillämpa kontrastkorrigering |
| `corrections.whiteBalance` | boolean | `true` | Tillämpa vitbalanskorrigering |
| `corrections.saturation` | boolean | `true` | Tillämpa mättnadskorrigering |
| `corrections.sharpness` | boolean | `true` | Tillämpa skärpekorrigering |
| `corrections.denoise` | boolean | `true` | Tillämpa brusreducering |
| `deepEnhance` | boolean | `false` | Aktivera AI-brusreducering via SCUNet (kräver paketet `upscale-enhance`) |
En ytterligare analysslutpunkt finns tillgänglig på `POST /api/v1/tools/image/image-enhancement/analyze` som returnerar de detekterade korrigeringarna utan att tillämpa dem.
### Innehållsmedveten storleksändring (Seam Carving) {#content-aware-resize-seam-carving}
**Verktygsrutt:** `content-aware-resize`
**Motor:** Go-binären `caire` (inte Python - ingen GPU-fördel)
Ändrar storlek på bilder intelligent genom att ta bort lågenergisömmar och bevara viktigt innehåll.
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `width` | number | - | Målbredd |
| `height` | number | - | Målhöjd |
| `protectFaces` | boolean | `false` | Skydda detekterade ansiktsregioner (kräver paketet `face-detection`) |
| `blurRadius` | number (0-20) | `4` | Föroskärpa för energiberäkning |
| `sobelThreshold` | number (1-20) | `2` | Tröskel för kantkänslighet |
| `square` | boolean | `false` | Tvinga kvadratiskt utdata |
+211
View File
@@ -0,0 +1,211 @@
---
description: "Referens för bildmotorns operationer. Alla Sharp-baserade bildbehandlingsoperationer och deras parametrar."
i18n_source_hash: 42febdf85fa8
i18n_provenance: human
i18n_output_hash: 5b940c0b5573
---
# Bildmotor {#image-engine}
Paketet `@snapotter/image-engine` hanterar alla bildoperationer som inte är AI-baserade. Det omsluter [Sharp](https://sharp.pixelplumbing.com/) och körs helt i processen utan externa beroenden.
## Operationer {#operations}
### resize {#resize}
Skala en bild till specifika dimensioner eller med procentandel.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `width` | number | Målbredd i pixlar |
| `height` | number | Målhöjd i pixlar |
| `fit` | string | `cover`, `contain`, `fill`, `inside` eller `outside` |
| `withoutEnlargement` | boolean | Om sant kommer mindre bilder inte att skalas upp |
| `percentage` | number | Skala med procentandel i stället för absoluta dimensioner |
Du kan ange `width`, `height` eller båda. Om du bara anger den ena beräknas den andra för att bibehålla bildförhållandet.
### crop {#crop}
Klipp ut ett rektangulärt område från bilden.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `left` | number | X-förskjutning från vänsterkanten |
| `top` | number | Y-förskjutning från överkanten |
| `width` | number | Bredd på beskärningsområdet |
| `height` | number | Höjd på beskärningsområdet |
| `unit` | string | `px` (standard) eller `percent` |
### rotate {#rotate}
Rotera bilden med en angiven vinkel.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `angle` | number | Rotationsvinkel i grader (0-360) |
| `background` | string | Fyllnadsfärg för exponerat område (standard: `#000000`). Gäller endast vinklar som inte är 90 grader. |
### flip {#flip}
Spegla bilden horisontellt, vertikalt eller båda. Minst en måste vara sann.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `horizontal` | boolean | Spegla från vänster till höger |
| `vertical` | boolean | Spegla från topp till botten |
### convert {#convert}
Ändra bildformatet.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `format` | string | Målformat: `jpg`, `png`, `webp`, `avif`, `tiff`, `gif`, `jxl`, `heic`, `heif`, `bmp`, `ico`, `jp2`, `qoi` |
| `quality` | number | Komprimeringskvalitet (1-100, gäller förlustbehäftade format) |
De första sju formaten (`jpg` till och med `jxl`) kodas av Sharp i processen. De återstående formaten använder externa kodare på API-lagret: `heic`/`heif` via heif-enc, `bmp`/`ico` via ImageMagick, `jp2` via opj_compress och `qoi` via en inbäddad TypeScript-codec.
### compress {#compress}
Minska filstorleken samtidigt som samma format behålls.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `quality` | number | Målkvalitet (1-100) |
| `targetSizeBytes` | number | Valfri målfilstorlek i byte |
| `format` | string | Valfri åsidosättning av format |
### strip-metadata {#strip-metadata}
Ta bort EXIF-, IPTC-, XMP- och ICC-metadata från bilden. Utan parametrar (eller `stripAll: true`) tas allt bort. Skicka enskilda flaggor för selektiv borttagning.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `stripAll` | boolean | Ta bort all metadata (standard när inga flaggor är satta) |
| `stripExif` | boolean | Ta bort EXIF-data (inklusive GPS om `stripGps` inte är separat satt) |
| `stripGps` | boolean | Ta bort GPS-platsdata |
| `stripIcc` | boolean | Ta bort ICC-färgprofil |
| `stripXmp` | boolean | Ta bort XMP-metadata |
### Färgjusteringar {#color-adjustments}
Dessa operationer ändrar en bilds färgegenskaper. Var och en tar ett enda numeriskt värde.
| Operation | Parameter | Intervall | Beskrivning |
|---|---|---|---|
| `brightness` | `value` | -100 till 100 | Justera ljusstyrka |
| `contrast` | `value` | -100 till 100 | Justera kontrast |
| `saturation` | `value` | -100 till 100 | Justera färgmättnad |
### Färgfilter {#color-filters}
Dessa tillämpar en fast färgtransformation. De tar inga parametrar.
| Operation | Beskrivning |
|---|---|
| `grayscale` | Konvertera till gråskala |
| `sepia` | Tillämpa en sepiaton |
| `invert` | Invertera alla färger |
### Färgkanaler {#color-channels}
Justera enskilda RGB-färgkanaler. Värden är multiplikatorer där 100 = ingen förändring.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `red` | number | Multiplikator för röd kanal (0 till 200, 100 = oförändrad) |
| `green` | number | Multiplikator för grön kanal (0 till 200, 100 = oförändrad) |
| `blue` | number | Multiplikator för blå kanal (0 till 200, 100 = oförändrad) |
### sharpen {#sharpen}
Enkel skärpning som styrs av ett enda värde.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `value` | number | Skärpningsintensitet (0 till 100). Mappas till ett gaussiskt sigma på 0,5-10. |
### sharpen-advanced {#sharpen-advanced}
Avancerad skärpning med tre valbara metoder och ett valfritt förpass för brusreducering.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `method` | string | `adaptive`, `unsharp-mask` eller `high-pass` |
| `sigma` | number | Radie för gaussisk oskärpa, 0,5-10 (adaptiv) |
| `m1` | number | Skärpning av jämna ytor, 0-10 (adaptiv) |
| `m2` | number | Skärpning av texturerade ytor, 0-20 (adaptiv) |
| `x1` | number | Tröskel för jämnt/ojämnt, 0-10 (adaptiv) |
| `y2` | number | Max upplysning (halobegränsning), 0-50 (adaptiv) |
| `y3` | number | Max nedmörkning (halobegränsning), 0-50 (adaptiv) |
| `amount` | number | Intensitetsprocent, 0-500 (unsharp-mask) |
| `radius` | number | Oskärperadie, 0,1-5,0 (unsharp-mask) |
| `threshold` | number | Minsta kantljusstyrka, 0-255 (unsharp-mask) |
| `strength` | number | Blandningsstyrka, 0-100 (high-pass) |
| `kernelSize` | number | `3` eller `5` för 3x3-/5x5-kärna (high-pass) |
| `denoise` | string | Förpass för brusreducering: `off`, `light`, `medium` eller `strong` |
Parametrarna är metodspecifika. Ange endast de som är relevanta för den valda metoden.
### color-blindness {#color-blindness}
Simulera en färgseendedefekt med hjälp av en 3x3-matris för färgrekombination.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `type` | string | En av: `protanopia`, `deuteranopia`, `tritanopia`, `protanomaly`, `deuteranomaly`, `tritanomaly`, `achromatopsia`, `blueConeMonochromacy` |
### edit-metadata {#edit-metadata}
Skriv eller ta bort enskilda EXIF-/IPTC-metadatafält utan att ta bort hela blocket.
| Parameter | Typ | Beskrivning |
|---|---|---|
| `artist` | string | EXIF Artist-tagg |
| `copyright` | string | EXIF Copyright-tagg |
| `imageDescription` | string | EXIF ImageDescription-tagg |
| `software` | string | EXIF Software-tagg |
| `dateTime` | string | EXIF DateTime-tagg |
| `dateTimeOriginal` | string | EXIF DateTimeOriginal-tagg |
| `clearGps` | boolean | Ta bort alla GPS-taggar |
| `fieldsToRemove` | string[] | Lista över EXIF-fältnamn att radera |
Alla parametrar är valfria. Fält som listas i `fieldsToRemove` raderas från det befintliga EXIF-blocket. Fält som anges via de namngivna parametrarna skrivs (eller skrivs över). Binära/osäkra nycklar som MakerNote ignoreras tyst.
## Formatidentifiering {#format-detection}
Motorn identifierar automatiskt indataformat från filhuvuden, inte bara från filändelser. Det innebär att en `.jpg`-fil som egentligen är en PNG hanteras korrekt. Identifieringen använder en flerlagersansats: magiska byte först, sedan filändelse som reserv.
SnapOtter stöder **55+ indataformat** och **13 utdataformat**, inklusive 23 kamera-RAW-format från 20+ märken, professionella format (PSD, EPS, OpenEXR, HDR), moderna codecs (JPEG XL, AVIF, HEIC, QOI, JPEG 2000) och vetenskapliga/spelrelaterade format (FITS, DDS). Avkodning hanteras nativt av Sharp där det är möjligt, med automatisk reserv till ImageMagick, LibRaw och specialiserade CLI-avkodare.
Se sidan [Format som stöds](/sv/guide/supported-formats) för den fullständiga listan.
## Metadatautvinning {#metadata-extraction}
Verktyget `info` returnerar bildmetadata. Se [Bildinfo](/sv/tools/image/info) för den fullständiga fältreferensen.
```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 }
]
}
```
+702
View File
@@ -0,0 +1,702 @@
---
description: "Fullständig REST API-referens. Verktygsslutpunkter, batchbearbetning, pipelines, filbibliotek, autentisering, team och adminåtgärder."
i18n_source_hash: 8646977f7cc9
i18n_provenance: machine
i18n_output_hash: 4756237a0bdc
---
# REST API-referens {#rest-api-reference}
Interaktiva API-dokument med exempel på förfrågningar och svar finns på [http://localhost:1349/api/docs](http://localhost:1349/api/docs).
Maskinläsbara specifikationer:
- `/api/v1/openapi.yaml` - OpenAPI 3.1-specifikation
- `/llms.txt` - LLM-vänlig sammanfattning
- `/llms-full.txt` - Fullständiga LLM-vänliga dokument
## Autentisering {#authentication}
Alla slutpunkter kräver autentisering om inte `AUTH_ENABLED=false`.
### Sessionstoken {#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>"
```
Sessioner löper ut efter 7 dagar (konfigurerbart via `SESSION_DURATION_HOURS`).
### API-nycklar {#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>"
```
Nycklar har prefixet `si_` och lagras som scrypt-hashar - den råa nyckeln visas en gång och kan aldrig hämtas igen.
### Autentiseringsslutpunkter {#auth-endpoints}
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `POST` | `/api/auth/login` | Publik | Logga in, hämta sessionstoken |
| `POST` | `/api/auth/logout` | Auth | Förstör aktuell session |
| `GET` | `/api/auth/session` | Auth | Validera aktuell session |
| `POST` | `/api/auth/change-password` | Auth | Byt eget lösenord (ogiltigförklarar alla andra sessioner + API-nycklar) |
| `GET` | `/api/auth/users` | Admin | Lista alla användare |
| `POST` | `/api/auth/register` | Admin | Skapa en ny användare |
| `PUT` | `/api/auth/users/:id` | Admin | Uppdatera användarroll eller team |
| `POST` | `/api/auth/users/:id/reset-password` | Admin | Återställ användarens lösenord |
| `DELETE` | `/api/auth/users/:id` | Admin | Ta bort en användare |
| `GET` | `/api/v1/config/auth` | Publik | Kontrollera om autentisering är aktiverad (`{ authEnabled: bool }`) |
| `POST` | `/api/auth/mfa/enroll` | Auth | Starta TOTP MFA-registrering. Kräver enterprise-funktionen `mfa` |
| `POST` | `/api/auth/mfa/verify` | Auth | Bekräfta MFA-registrering med en TOTP-kod |
| `POST` | `/api/auth/mfa/complete` | Publik | Slutför en väntande MFA-inloggningsutmaning |
| `POST` | `/api/auth/mfa/disable` | Auth | Inaktivera MFA för aktuell användare |
| `POST` | `/api/auth/users/:id/mfa/reset` | Admin (`users:manage`) | Återställ MFA för en användare |
| `GET` | `/api/auth/oidc/login` | Publik | Starta OIDC-inloggning när OIDC är aktiverat |
| `GET` | `/api/auth/oidc/callback` | Publik | OIDC-auktoriseringsåterkallelse |
| `GET` | `/api/auth/saml/metadata` | Publik | SAML SP-metadata-XML när SAML är aktiverat |
| `GET` | `/api/auth/saml/login` | Publik | Starta SAML-inloggning |
| `POST` | `/api/auth/saml/callback` | Publik | SAML assertion consumer service |
När MFA är aktiverat för en användare returnerar `POST /api/auth/login` `{"requiresMfa":true,"mfaToken":"...","mfaRequired":true|false}` istället för en sessionstoken. Skicka den `mfaToken` plus en TOTP- eller återställningskod till `/api/auth/mfa/complete`.
### Behörigheter {#permissions}
| Behörighet | Admin | Användare |
|-----------|:-----:|:----:|
| Använda verktyg | ✓ | ✓ |
| Egna filer/pipelines/API-nycklar | ✓ | ✓ |
| Se alla användares filer/pipelines/nycklar | ✓ | - |
| Skriva inställningar | ✓ | - |
| Hantera användare och team | ✓ | - |
| Hantera varumärkesprofil | ✓ | - |
## Hälsokontroll {#health-check}
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/health` | Publik | Grundläggande hälsokontroll. Returnerar `{"status":"healthy","version":"..."}` med 200, eller `{"status":"unhealthy"}` med 503 om databasen inte kan nås. |
| `GET` | `/api/v1/readyz` | Publik | Beredskapssond. Kontrollerar PostgreSQL, Redis, diskutrymme och S3 när det är konfigurerat. Returnerar 503 när instansen inte bör ta emot trafik. |
| `GET` | `/api/v1/admin/health` | Admin (`system:health`) | Detaljerad diagnostik inklusive drifttid, lagringsläge, databasstatus, kötillstånd och GPU-tillgänglighet. |
## Använda verktyg {#using-tools}
Varje verktyg följer samma mönster:
```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>` är en av `image`, `video`, `audio`, `pdf` eller `files`.
- Uppladdning är `multipart/form-data`.
- `settings` är en JSON-sträng med verktygsspecifika alternativ.
- `clientJobId` är ett valfritt formulärfält för anropar-tillhandahållen förloppskorrelation.
- `fileId` är ett valfritt formulärfält som refererar till ett befintligt objekt i filbiblioteket. När det finns sparas den bearbetade utdatan som en ny version och svaret inkluderar `savedFileId`.
- **Snabba verktyg** returnerar vanligtvis 200 JSON: `{"jobId":"...","downloadUrl":"/api/v1/download/<jobId>/<filename>","originalSize":1234,"processedSize":567}`. Hämta den bearbetade filen från `downloadUrl`.
- **Alla köade verktyg** kan returnera 202 JSON om de är långvariga eller överskrider det synkrona väntefönstret: `{"jobId":"...","async":true}`. Anslut till SSE för förlopp, ladda sedan ner när det är klart (se [Förloppsspårning](#progress-tracking)).
- **Batch**-rutter returnerar ett ZIP-arkiv som strömmas direkt (med `X-Job-Id`-header) för verktyg som är registrerade i det generiska batchregistret.
## Verktygsreferens {#tools-reference}
### Konverteringsförinställningar {#conversion-presets}
Den delade katalogen innehåller 83 dedikerade slutpunkter för konverteringsförinställningar såsom `jpg-to-png`, `mov-to-mp4`, `m4a-to-mp3`, `pdf-to-jpg` och `excel-to-csv`. Förinställningar är förstklassiga verktygsrutter:
`POST /api/v1/tools/<section>/<presetId>`
Varje förinställning låser utdataformatet och delegerar till ett basverktyg såsom `convert`, `convert-video`, `extract-audio`, `convert-audio`, `image-to-pdf`, `pdf-to-image`, `svg-to-raster` eller `convert-spreadsheet`. Se [Konverteringsförinställningar](/sv/tools/conversion-presets) för den fullständiga rutttabellen och valfria inställningar.
### Grundläggande {#essentials}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `resize` | Ändra storlek | `width`, `height`, `fit` (cover/contain/fill/inside/outside), `percentage`, `withoutEnlargement`, plus 23 förinställningar för sociala medier |
| `crop` | Beskär | `left`, `top`, `width`, `height`, `unit` (px/procent) |
| `rotate` | Rotera och vänd | `angle`, `horizontal` (bool), `vertical` (bool) |
| `convert` | Konvertera | `format` (jpg/png/webp/avif/tiff/gif/heic/heif), `quality` |
| `compress` | Komprimera | `mode` (quality/targetSize), `quality` (1100), `targetSizeKb` |
### Optimering {#optimization}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `optimize-for-web` | Optimera för webben | `format` (webp/jpeg/avif/png), `quality`, `maxWidth`, `maxHeight`, `progressive`, `stripMetadata` |
| `strip-metadata` | Ta bort metadata | - |
| `edit-metadata` | Redigera metadata | `title`, `description`, `author`, `copyright`, `keywords`, `gps` (lat/lon), `dateTime` |
| `bulk-rename` | Massomdöp | `pattern` (stöder `{n}`, `{date}`, `{original}`), `startIndex`, `padding` |
| `image-to-pdf` | Bild till PDF | `pageSize` (A4/Letter/...), `orientation`, `margin`, `targetSize` ({value, unit}) |
| `favicon` | Favicon-generator | `padding`, `backgroundColor`, `borderRadius` - genererar alla standardstorlekar |
### Justeringar {#adjustments}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `adjust-colors` | Justera färger | `brightness`, `contrast`, `exposure`, `saturation`, `temperature`, `tint`, `hue`, `sharpness`, `red`, `green`, `blue`, `effect` (none/grayscale/sepia/invert) |
| `sharpening` | Skärpa | `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` | Ersätt färg | `sourceColor`, `targetColor` (ersättning), `makeTransparent`, `tolerance` |
| `color-blindness` | Simulering av färgblindhet | `simulationType` (protanopia/deuteranopia/tritanopia/protanomaly/deuteranomaly/tritanomaly/achromatopsia/blueConeMonochromacy, standard "deuteranomaly") |
| `duotone` | Duoton | `shadow` (hex), `highlight` (hex), `intensity` (0-100) |
| `pixelate` | Pixelera | `blockSize` (2-128), `region` ({left, top, width, height} för partiell pixelering) |
| `vignette` | Vinjett | `strength` (0.1-1), `color` (hex), `radius`, `softness`, `roundness`, `centerX`, `centerY` |
### AI-verktyg {#ai-tools}
Alla AI-verktyg körs på din hårdvara: CPU som standard, eller NVIDIA CUDA när en stödd NVIDIA-GPU är tillgänglig. Intel/AMD iGPU-acceleration via VA-API, Quick Sync eller OpenCL stöds inte för AI-inferens idag. Ingen internetanslutning krävs.
| Verktygs-ID | Namn | AI-modell | Nyckelinställningar |
|---------|------|---------|-------------|
| `remove-background` | Ta bort bakgrund | rembg (BiRefNet / U2-Net) | `model`, `backgroundType` (transparent/color/gradient/blur/image), `backgroundColor`, `gradientColor1`, `gradientColor2`, `gradientAngle`, `blurEnabled`, `blurIntensity`, `shadowEnabled`, `shadowOpacity` |
| `upscale` | Bilduppskalning | RealESRGAN | `scale` (2/4), `model`, `faceEnhance`, `denoise`, `format`, `quality` |
| `erase-object` | Objektsudd | LaMa (ONNX) | Mask skickas som andra fildel (fältnamn `mask`), `format`, `quality` |
| `ocr` | OCR / textextraktion | PaddleOCR / Tesseract | `quality` (fast/balanced/best), `language`, `enhance` |
| `blur-faces` | Ansikts-/PII-oskärpa | MediaPipe | `blurRadius`, `sensitivity` |
| `smart-crop` | Smart beskärning | 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` | Bildförbättring | Analysbaserad | `mode` (auto/exposure/contrast/color/sharpness), `strength` |
| `enhance-faces` | Ansiktsförbättring | GFPGAN / CodeFormer | `model` (gfpgan/codeformer), `strength`, `sensitivity`, `centerFace` |
| `colorize` | AI-färgläggning | DDColor | `intensity`, `model` |
| `noise-removal` | Brusreducering | Nivåindelad brusreducering | `tier` (quick/balanced/quality/maximum), `strength`, `detailPreservation`, `colorNoise`, `format`, `quality` |
| `red-eye-removal` | Borttagning av röda ögon | Ansiktslandmärke + färganalys | `sensitivity`, `strength` |
| `restore-photo` | Fotorestaurering | Flerstegspipeline | `mode` (auto/light/heavy), `scratchRemoval`, `faceEnhancement`, `fidelity`, `denoise`, `denoiseStrength`, `colorize` |
| `passport-photo` | Passfoto | MediaPipe-landmärken | Tvåfasflöde. Analys använder multipart `file`; generering använder JSON med `countryCode`, `bgColor`, `printLayout` (none/4x6/a4), landmärken, bilddimensioner |
| `content-aware-resize` | Innehållsmedveten storleksändring | Seam carving (caire) | `width`, `height`, `protectFaces`, `blurRadius`, `sobelThreshold`, `square` |
| `transparency-fixer` | PNG-transparensfixare | BiRefNet HR-matting | `defringe` (0-100), `outputFormat` (png/webp) |
| `background-replace` | Ersätt bakgrund | rembg (BiRefNet) | `backgroundType` (color/gradient), `color` (hex), `gradientColor1`, `gradientColor2`, `gradientAngle`, `feather` (0-20), `format` (png/webp) |
| `blur-background` | Gör bakgrund oskarp | rembg (BiRefNet) | `intensity` (1-100), `feather` (0-20), `format` (png/webp) |
| `ai-canvas-expand` | AI-utökning av arbetsyta | LaMa (outpainting) | `extendTop`, `extendRight`, `extendBottom`, `extendLeft` (px), `tier` (fast/balanced/high), `format`, `quality` |
### Vattenstämpel och överlägg {#watermark-overlay}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `watermark-text` | Textvattenstämpel | `text`, `font`, `fontSize`, `color`, `opacity`, `position`, `rotation`, `tile` |
| `watermark-image` | Bildvattenstämpel | `opacity`, `position`, `scale` - andra filen är vattenstämpeln |
| `text-overlay` | Textöverlägg | `text`, `font`, `fontSize`, `color`, `x`, `y`, `background`, `padding`, `borderRadius` |
| `compose` | Bildkomposition | `x`, `y`, `opacity`, `blend` - andra filen läggs som lager överst |
| `meme-generator` | Memgenerator | `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`. Stöder mallläge (JSON-kropp med `templateId`) eller anpassat bildläge (multipart med fil). |
### Verktyg {#utilities}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `info` | Bildinfo | - (returnerar bredd, höjd, format, storlek, kanaler, hasAlpha, DPI, EXIF) |
| `compare` | Bildjämförelse | `mode` (side-by-side/overlay/diff), `diffThreshold` - andra filen är jämförelsemålet |
| `find-duplicates` | Hitta dubbletter | `threshold` (perceptuellt hash-avstånd, standard 8) - flerfil |
| `color-palette` | Färgpalett | `count` (antal dominanta färger), `format` (hex/rgb) |
| `qr-generate` | QR-kodgenerator | `data`, `size`, `margin`, `colorDark`, `colorLight`, `errorCorrectionLevel`, `dotStyle`, `cornerStyle`, `logo` (valfri fil) |
| `barcode-read` | Streckkodsläsare | - (identifierar automatiskt QR, EAN, Code128, DataMatrix, osv.) |
| `image-to-base64` | Bild till Base64 | `format` (data-uri/plain), `mimeType` |
| `html-to-image` | HTML till bild | `url`, `format` (png/jpg/webp), `quality`, `fullPage`, `devicePreset` (desktop/tablet/mobile/custom), `viewportWidth`, `viewportHeight` |
| `histogram` | Histogram | `scale` (linear/log) - returnerar RGB-histogramdiagram + statistik per kanal |
| `lqip-placeholder` | LQIP-platshållare | `width` (4-64), `blur`, `strategy` (blur/pixelate/solid), `format` (webp/png/jpeg), `quality` |
| `barcode-generate` | Streckkodsgenerator | `text`, `type` (code128/ean13/upca/code39/itf14/datamatrix), `scale` (1-8), `includeText` (bool). JSON-kropp, ingen filuppladdning. |
### Layout och komposition {#layout-composition}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `collage` | Kollage / rutnät | `template` (25+ layouter), `gap`, `backgroundColor`, `borderRadius` - flerfil |
| `stitch` | Sy ihop / kombinera | `direction` (horizontal/vertical/grid), `gap`, `backgroundColor`, `alignment` - flerfil |
| `split` | Bilddelning | `mode` (grid/rows/cols), `rows`, `cols`, `tileWidth`, `tileHeight` |
| `border` | Ram och kant | `width`, `color`, `style` (solid/gradient/pattern), `borderRadius`, `padding`, `shadow` |
| `beautify` | Försköna skärmbild | `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` | Cirkelbeskärning | `zoom` (1-5), `offsetX`, `offsetY`, `borderWidth`, `borderColor`, `background` (transparent/hex), `outputSize` |
| `image-pad` | Bildutfyllnad | `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-ark | `columns` (1-16), `padding`, `background` (hex), `format` (png/webp/jpeg), `quality` - flerfil (2-64 bilder) |
### Format och konvertering {#format-conversion}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `svg-to-raster` | SVG till raster | `format` (png/jpeg/webp/avif/tiff/gif/heif), `width`, `height`, `scale`, `dpi`, `background` |
| `vectorize` | Bild till SVG | `colorMode` (bw/color), `threshold`, `colorPrecision`, `filterSpeckle`, `pathMode` (none/polygon/spline) |
| `gif-tools` | GIF-verktyg | `action` (resize/optimize/reverse/speed/extract-frames/rotate/add-text), åtgärdsspecifika parametrar |
| `gif-webp` | GIF/WebP-konverterare | `quality` (1-100), `lossless` (bool), `resizePercent` (10-100) |
### Videoverktyg {#video-tools}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `convert-video` | Konvertera video | `format` (mp4/mov/webm/avi/mkv), `quality` (high/balanced/small) |
| `compress-video` | Komprimera video | `quality` (light/balanced/strong), `resolution` (original/1080p/720p/480p) |
| `trim-video` | Trimma video | `startS`, `endS`, `precise` (bool, bildrutenoggrann klippning) |
| `mute-video` | Tysta video | - |
| `video-to-gif` | Video till GIF | `fps` (1-30), `width`, `startS`, `durationS` (max 60s) |
| `resize-video` | Ändra storlek på video | `width`, `height`, `preset` (custom/2160p/1440p/1080p/720p/480p/360p) |
| `crop-video` | Beskär video | `width`, `height`, `x`, `y` |
| `rotate-video` | Rotera video | `transform` (cw90/ccw90/180/hflip/vflip) |
| `change-fps` | Ändra FPS | `fps` (1-120) |
| `video-color` | Videofärg | `brightness`, `contrast`, `saturation`, `gamma` |
| `video-speed` | Videohastighet | `factor` (0.25-4), `keepPitch` (bool) |
| `reverse-video` | Baklänges video | - (max 5 minuter) |
| `video-loudnorm` | Normalisera ljud | - (EBU R128) |
| `aspect-pad` | Bildförhållandeutfyllnad | `target` (16:9/9:16/1:1/4:3/3:4), `color` (hex) |
| `blur-pad` | Oskärpeutfyllnad | `target` (16:9/9:16/1:1/4:3/3:4), `blur` (2-50) |
| `watermark-video` | Vattenstämpla video | `text`, `position`, `fontSize`, `opacity`, `color` |
| `stabilize-video` | Stabilisera video | `smoothing` (5-60, i bildrutor) |
| `gif-to-video` | GIF till video | `format` (mp4/webm/mov) |
| `video-to-webp` | Video till WebP | `fps`, `width`, `quality`, `loop` (bool) |
| `video-to-frames` | Video till bildrutor | `mode` (all/nth/timestamps), `n`, `timestamps`, `format` (png/jpg) |
| `merge-videos` | Slå ihop videor | - (flerfil, normaliserad till första videons upplösning) |
| `replace-audio` | Ersätt ljud | - (video + ljudfil, två filer) |
| `burn-subtitles` | Bränn in undertexter | `fontSize` (8-72) - video + undertextfil |
| `embed-subtitles` | Bädda in undertexter | `language` (ISO 639-2/B-kod) - video + undertextfil |
| `extract-subtitles` | Extrahera undertexter | - (ger SRT) |
| `images-to-video` | Bilder till video | `secondsPerImage` (0.5-10), `resolution` (1080p/720p/square), `fps` - flerfil |
| `video-metadata` | Rensa videometadata | - |
| `auto-subtitles` | Automatiska undertexter (AI) | `language` (auto/en/de/fr/es/zh/ja/ko/id/th/vi), `format` (srt/vtt) |
| `extract-audio` | Extrahera ljud | `format` (mp3/wav/m4a/ogg) |
### Ljudverktyg {#audio-tools}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `convert-audio` | Konvertera ljud | `format` (mp3/wav/ogg/flac/m4a), `bitrateKbps` (32-320) |
| `trim-audio` | Trimma ljud | `startS`, `endS` |
| `volume-adjust` | Justera volym | `gainDb` (-30 till 30) |
| `normalize-audio` | Normalisera ljud | - (EBU R128, -16 LUFS) |
| `fade-audio` | Tona ljud | `fadeInS` (0-30), `fadeOutS` (0-30) |
| `reverse-audio` | Baklänges ljud | - |
| `audio-speed` | Ljudhastighet | `factor` (0.25-4) |
| `pitch-shift` | Tonhöjdsändring | `semitones` (-12 till 12) |
| `audio-channels` | Ljudkanaler | `mode` (stereo-to-mono/mono-to-stereo/swap) |
| `silence-removal` | Ta bort tystnad | `thresholdDb` (-80 till -20), `minSilenceS` (0.1-5) |
| `noise-reduction` | Brusreducering | `strength` (light/medium/strong) |
| `merge-audio` | Slå ihop ljud | `format` (mp3/wav/flac/m4a) - flerfil |
| `split-audio` | Dela ljud | `mode` (time/parts/silence), `segmentS`, `parts`, `thresholdDb`, `minSilenceS` |
| `ringtone-maker` | Ringsignalskapare | `startS`, `durationS` (1-30) |
| `waveform-image` | Vågformsbild | `width`, `height`, `color` (hex) |
| `audio-metadata` | Ljudmetadata | `strip` (bool), `title`, `artist`, `album` |
| `transcribe-audio` | Transkribera ljud (AI) | `language` (auto/en/de/fr/es/zh/ja/ko/id/th/vi), `outputFormat` (txt/srt/vtt) |
### Dokumentverktyg {#document-tools}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `merge-pdf` | Slå ihop PDF:er | - (flerfil, upp till 20 PDF:er) |
| `split-pdf` | Dela PDF | `mode` (range/every), `range`, `everyN` (1-500) |
| `compress-pdf` | Komprimera PDF | `mode` (quality/targetSize), `quality` (1-100), `targetSizeKb` |
| `rotate-pdf` | Rotera PDF | `angle` (90/180/270), `range` (sidintervall) |
| `extract-pages` | Extrahera sidor | `range` (qpdf-syntax, t.ex. "1-5,8,10-z") |
| `remove-pages` | Ta bort sidor | `pages` (qpdf-intervall att ta bort) |
| `organize-pdf` | Ordna PDF | `order` (qpdf-sidordning, t.ex. "3,1,2,5-z") |
| `protect-pdf` | Skydda PDF | `userPassword`, `ownerPassword` (AES-256) |
| `unlock-pdf` | Lås upp PDF | `password` |
| `repair-pdf` | Reparera PDF | - |
| `linearize-pdf` | Webboptimera PDF | - (linjärisera för snabb webbvisning) |
| `grayscale-pdf` | Gråskala-PDF | - |
| `pdfa-convert` | Konvertera till PDF/A | - (arkiverings-PDF/A-2) |
| `crop-pdf` | Beskär PDF | `margin` (0-2000 punkter) |
| `nup-pdf` | N-up PDF | `perSheet` (2/3/4/8/9/12/16) |
| `booklet-pdf` | Häftes-PDF | `perSheet` (2/4/6/8) |
| `watermark-pdf` | Vattenstämpla PDF | `text`, `position`, `fontSize`, `opacity`, `rotation` |
| `pdf-page-numbers` | PDF-sidnummer | `position` (bl/bc/br/tl/tc/tr), `fontSize` |
| `flatten-pdf` | Platta ut PDF | - (fixerar formulär och kommentarer) |
| `redact-pdf` | Redigera bort i PDF | `terms` (string[]), `caseSensitive` (bool) |
| `sign-pdf` | Signera PDF | Anpassad multipart-rutt med PDF `file`, signaturfiler `sig0`, `sig1` och `placements` JSON-array |
| `pdf-to-text` | PDF till text | - |
| `pdf-to-word` | PDF till Word | - |
| `pdf-metadata` | PDF-metadata | `title`, `author`, `subject`, `keywords` |
| `convert-document` | Konvertera dokument | `format` (docx/odt/rtf/txt) |
| `convert-presentation` | Konvertera presentation | `format` (pptx/odp) |
| `convert-spreadsheet` | Konvertera kalkylark | `format` (xlsx/ods/csv) |
| `excel-to-pdf` | Excel till PDF | - |
| `word-to-pdf` | Word till PDF | - |
| `powerpoint-to-pdf` | PowerPoint till PDF | - |
| `html-to-pdf` | HTML till PDF | - (fjärresurser inaktiverade) |
| `markdown-to-docx` | Markdown till Word | - |
| `markdown-to-html` | Markdown till HTML | - |
| `markdown-to-pdf` | Markdown till PDF | - (fjärresurser inaktiverade) |
| `epub-convert` | Konvertera EPUB | `format` (pdf/docx/html/md) |
| `to-epub` | Konvertera till EPUB | - (accepterar .docx, .md, .html, .txt) |
| `ocr-pdf` | PDF OCR (AI) | `quality` (fast/balanced/best), `language` (auto/en/de/fr/es/zh/ja/ko), `pages` |
| `pdf-to-image` | PDF till bild | `pages` (all/range), `format`, `dpi`, `quality` |
| `pdf-to-jpg` | PDF till JPG | `pages`, `dpi`, `quality`, `colorMode` |
| `pdf-to-png` | PDF till PNG | `pages`, `dpi`, `quality`, `colorMode` |
| `pdf-to-tiff` | PDF till TIFF | `pages`, `dpi`, `quality`, `colorMode` |
### Filverktyg {#file-tools}
| Verktygs-ID | Namn | Nyckelinställningar |
|---------|------|-------------|
| `chart-maker` | Diagramskapare | `kind` (bar/line/pie), `title`, `width`, `height` |
| `csv-excel` | CSV till Excel | `sheet` (kalkylbladsnummer för XLSX-indata) - dubbelriktad |
| `csv-json` | CSV till JSON | `pretty` (bool) - dubbelriktad |
| `json-xml` | JSON till XML | `pretty` (bool) - dubbelriktad |
| `split-csv` | Dela CSV | `rowsPerFile` (1-1000000), `keepHeader` (bool) |
| `merge-csvs` | Slå ihop CSV:er | - (flerfil, matchande kolumner) |
| `yaml-json` | YAML / JSON | - (dubbelriktad) |
| `xml-to-csv` | XML till CSV | - (hittar automatiskt upprepade element) |
| `excel-to-csv` | Excel till CSV | dedikerad konverteringsförinställning som backas upp av `convert-spreadsheet` |
| `create-zip` | Skapa ZIP | - (flerfil, 2-50 filer) |
| `extract-zip` | Extrahera ZIP | - (bombskyddad) |
### HTML till bild {#html-to-image}
Fånga en webbsida som en bild. Till skillnad från andra verktyg accepterar denna slutpunkt `application/json` istället för multipart-formulärdata (ingen filuppladdning behövs).
**Slutpunkt:** `POST /api/v1/tools/image/html-to-image`
**Content-Type:** `application/json`
| Parameter | Typ | Standard | Beskrivning |
|-----------|------|---------|-------------|
| `url` | string | (obligatorisk) | URL att fånga (endast http/https) |
| `format` | string | `"png"` | Utdataformat: `jpg`, `png`, `webp` |
| `quality` | number | `90` | Kvalitet 1-100 (endast JPG/WebP) |
| `fullPage` | boolean | `false` | Fånga hela den rullningsbara sidan |
| `devicePreset` | string | `"desktop"` | `desktop`, `tablet`, `mobile`, `custom` |
| `viewportWidth` | number | `1280` | Anpassad visningsområdesbredd 320-3840 |
| `viewportHeight` | number | `720` | Anpassad visningsområdeshöjd 320-2160 |
**Exempel:**
```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"}'
```
**Svar:**
```json
{
"jobId": "uuid",
"downloadUrl": "/api/v1/download/{jobId}/screenshot.png",
"originalSize": 0,
"processedSize": 54321
}
```
### Verktygsunderrutter {#tool-sub-routes}
Vissa verktyg exponerar ytterligare slutpunkter utöver den vanliga `POST /api/v1/tools/<section>/<toolId>`:
| Metod | Sökväg | Beskrivning |
|--------|------|-------------|
| `GET` | `/api/v1/tools/popular` | Returnera populära verktygs-ID:n, med återgång till en kurerad standardlista när användningsdata är gles |
| `POST` | `/api/v1/tools/image/remove-background/effects` | Applicera bakgrundseffekter (color/gradient/blur/shadow) utan att köra AI på nytt. Använder cachad mask från den ursprungliga borttagningen. |
| `POST` | `/api/v1/tools/image/edit-metadata/inspect` | Läs befintlig EXIF/IPTC/XMP-metadata från en bild |
| `POST` | `/api/v1/tools/image/strip-metadata/inspect` | Inspektera metadatafält innan borttagning |
| `POST` | `/api/v1/tools/image/passport-photo/analyze` | Fas 1: AI-ansiktsdetektering + bakgrundsborttagning. Returnerar ansiktslandmärken och cachad data. |
| `POST` | `/api/v1/tools/image/passport-photo/generate` | Fas 2: Beskär, ändra storlek och panelindela med cachad analys. Ingen ny AI-körning. |
| `POST` | `/api/v1/tools/image/gif-tools/info` | Hämta GIF-metadata (antal bildrutor, dimensioner, varaktighet) |
| `POST` | `/api/v1/tools/pdf/pdf-to-image/info` | Hämta PDF-metadata (antal sidor, dimensioner) |
| `POST` | `/api/v1/tools/pdf/pdf-to-image/preview` | Generera en förhandsvisning av en specifik PDF-sida |
| `POST` | `/api/v1/tools/pdf/pdf-to-jpg/info` | Hämta PDF-metadata för den dedikerade JPG-förinställningen |
| `POST` | `/api/v1/tools/pdf/pdf-to-jpg/preview` | Generera en förhandsvisning av en PDF-sida med JPG-förinställning |
| `POST` | `/api/v1/tools/pdf/pdf-to-png/info` | Hämta PDF-metadata för den dedikerade PNG-förinställningen |
| `POST` | `/api/v1/tools/pdf/pdf-to-png/preview` | Generera en förhandsvisning av en PDF-sida med PNG-förinställning |
| `POST` | `/api/v1/tools/pdf/pdf-to-tiff/info` | Hämta PDF-metadata för den dedikerade TIFF-förinställningen |
| `POST` | `/api/v1/tools/pdf/pdf-to-tiff/preview` | Generera en förhandsvisning av en PDF-sida med TIFF-förinställning |
| `POST` | `/api/v1/tools/image/svg-to-raster/batch` | Batchkonvertera flera SVG:er till raster |
| `POST` | `/api/v1/tools/image/image-enhancement/analyze` | Analysera bildkvalitet och returnera förbättringsrekommendationer |
| `POST` | `/api/v1/tools/image/optimize-for-web/preview` | Lättviktsförhandsvisning för live-parameterjustering. Returnerar optimerad bild med storleksheaders. |
## Batchbearbetning {#batch-processing}
Applicera ett generiskt batchaktiverat verktyg på flera filer samtidigt. Returnerar ett ZIP-arkiv. Anpassade flerfils- eller flerstegsrutter, såsom PDF-signering, PDF OCR och PDF-till-bild-förinställningsrutter, använder sitt eget slutpunktskontrakt istället för den generiska `/batch`-rutten.
```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}'
```
Samtidighet styrs av `CONCURRENT_JOBS` (standard: automatiskt identifierad från CPU-kärnor). `MAX_BATCH_SIZE` begränsar antalet filer per batch (standard: 100; sätt 0 för obegränsat).
## Pipelines {#pipelines}
### Kör en pipeline {#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}}]}'
```
Varje stegs utdata är nästa stegs indata. Pipelines tillåter 20 steg som standard, konfigurerbart via `MAX_PIPELINE_STEPS`. Sätt `MAX_PIPELINE_STEPS=0` för att ta bort gränsen.
### Spara och hantera pipelines {#save-and-manage-pipelines}
| Metod | Sökväg | Beskrivning |
|--------|------|-------------|
| `POST` | `/api/v1/pipeline/save` | Spara en namngiven pipeline (`name`, `description`, `steps[]`) |
| `GET` | `/api/v1/pipeline/list` | Lista sparade pipelines (admins ser alla; användare ser sina egna) |
| `DELETE` | `/api/v1/pipeline/:id` | Ta bort (ägare eller admin) |
| `GET` | `/api/v1/pipeline/tools` | Lista verktygs-ID:n som är giltiga för pipeline-steg |
## Förloppsspårning {#progress-tracking}
Långvariga jobb, köade verktyg, batchjobb och pipelines sänder realtidsförlopp via Server-Sent Events. Förloppsströmmen är publik och identifieras med jobb-ID, så klienter behöver inte skicka en Authorization-header för att läsa den.
```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
```
Händelseformat:
```
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":[]}
```
Du kan begära avbrytning av ett köat eller körande jobb med `POST /api/v1/jobs/:jobId/cancel`. Svaret är `{"canceled":true|false}`.
## Filbibliotek {#file-library}
Persistent fillagring med versionshistorik.
| Metod | Sökväg | Beskrivning |
|--------|------|-------------|
| `POST` | `/api/v1/upload` | Ladda upp filer till arbetsytan (tillfällig bearbetning) |
| `POST` | `/api/v1/files/upload` | Ladda upp filer till det persistenta filbiblioteket |
| `POST` | `/api/v1/files/save-result` | Spara ett verktygsbearbetningsresultat som en ny filversion |
| `GET` | `/api/v1/files` | Lista sparade filer (sidindelat, med sökning) |
| `GET` | `/api/v1/files/:id` | Hämta filmetadata + versionskedja |
| `GET` | `/api/v1/files/:id/download` | Ladda ner fil |
| `GET` | `/api/v1/files/:id/thumbnail` | Hämta 300px JPEG-miniatyr |
| `DELETE` | `/api/v1/files` | Massradera filer och deras versionskedjor (kropp: `{ ids: [...] }`) |
| `POST` | `/api/v1/fetch-urls` | Hämta fjärr-URL:er till arbetsytan för URL-baserade importer |
| `POST` | `/api/v1/preview` | Generera en webbläsarkompatibel WebP-förhandsvisning (för HEIC/HEIF/RAW-format) |
| `GET` | `/api/v1/files/:id/preview` | Strömma en cachad eller genererad webbläsarkompatibel förhandsvisning för en sparad PDF, ett Office-dokument, en video- eller ljudfil |
| `POST` | `/api/v1/preview/generate` | Generera en on-demand MP4- eller MP3-förhandsvisning för en uppladdad mediefil utan att spara den först |
| `GET` | `/api/v1/download/:jobId/:filename` | Ladda ner en bearbetad fil från en arbetsyta |
För att automatiskt spara ett verktygsresultat till biblioteket, inkludera `fileId` som ett multipart-formulärfält som refererar till en befintlig biblioteksfil. Det bearbetade resultatet sparas som en ny version.
## Hantering av API-nycklar {#api-key-management}
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `POST` | `/api/v1/api-keys` | Auth | Generera ny nyckel - visas en gång |
| `GET` | `/api/v1/api-keys` | Auth | Lista nycklar (name, id, lastUsedAt - inte den råa nyckeln) |
| `DELETE` | `/api/v1/api-keys/:id` | Auth | Ta bort nyckel |
## Team {#teams}
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/teams` | Admin (`teams:manage`) | Lista team |
| `POST` | `/api/v1/teams` | Admin (`teams:manage`) | Skapa team |
| `PUT` | `/api/v1/teams/:id` | Admin (`teams:manage`) | Byt namn på team |
| `DELETE` | `/api/v1/teams/:id` | Admin (`teams:manage`) | Ta bort team (kan inte ta bort standardteamet eller team med medlemmar) |
## Inställningar {#settings}
Körtidskonfiguration i nyckel-värde-format (läses av alla autentiserade användare, skrivs endast av admin).
| Metod | Sökväg | Beskrivning |
|--------|------|-------------|
| `GET` | `/api/v1/settings` | Hämta alla inställningar |
| `PUT` | `/api/v1/settings` | Massuppdatera inställningar (JSON-kropp med nyckel-värde-par) |
| `GET` | `/api/v1/settings/:key` | Hämta en specifik inställning via nyckel |
Kända nycklar: `disabledTools` (JSON-array av verktygs-ID:n), `enableExperimentalTools` (bool-sträng), `loginAttemptLimit` (nummer).
## Inställningar (per användare) {#preferences}
Per-användarinställningar är separata från instansinställningar. Alla autentiserade användare kan läsa och uppdatera sin egen inställningskarta.
| Metod | Sökväg | Beskrivning |
|--------|------|-------------|
| `GET` | `/api/v1/preferences` | Hämta den aktuella användarens inställningar som `{ "preferences": { ... } }` |
| `PUT` | `/api/v1/preferences` | Infoga eller uppdatera en eller flera inställningsnycklar för den aktuella användaren |
## Roller {#roles}
Anpassad rollhantering med granulära behörigheter.
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/roles` | Admin (`audit:read`) | Lista alla roller med antal användare |
| `POST` | `/api/v1/roles` | Admin (`security:manage`) | Skapa en anpassad roll (`name`, `description`, `permissions`) |
| `PUT` | `/api/v1/roles/:id` | Admin (`security:manage`) | Uppdatera en anpassad roll (kan inte ändra inbyggda roller) |
| `DELETE` | `/api/v1/roles/:id` | Admin (`security:manage`) | Ta bort en anpassad roll (kan inte ta bort inbyggda roller; berörda användare återgår till `user`-rollen) |
Tillgängliga behörigheter (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`.
## Granskningslogg {#audit-log}
Slutpunkt endast för admin för granskning av säkerhetsrelevanta åtgärder.
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/audit-log` | Admin (`audit:read`) | Sidindelad granskningslogg med valfria filter |
Frågeparametrar:
| Parameter | Beskrivning |
|-----------|-------------|
| `page` | Sidnummer (standard: 1) |
| `limit` | Poster per sida (standard: 50, max: 100) |
| `action` | Filtrera efter åtgärdstyp (t.ex. `ROLE_CREATED`, `ROLE_DELETED`) |
| `ip` | Filtrera efter käll-IP-adress |
| `from` | Filtrera poster efter detta ISO 8601-datum |
| `to` | Filtrera poster före detta ISO 8601-datum |
## Analys {#analytics}
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/config/analytics` | Publik | Hämta den effektiva analyskonfigurationen (PostHog-nyckel, Sentry DSN, samplingsfrekvens). Nycklar, DSN och instans-ID är tomma när analys är avstängt, antingen från kompileringstidsbakningen eller instansens `analyticsEnabled`-inställning. |
| `POST` | `/api/v1/feedback` | Auth | Skicka explicit användarfeedback till det konfigurerade PostHog-projektet som `feedback_submitted`. Rutten respekterar analysgrindpunkten, begränsar antalet inskick, tar bort kontaktfält om inte `contactOk` är true, och accepterar aldrig filinnehåll, filnamn, uppladdningssökvägar eller rå privat feltext. När analys är inaktiverad returnerar den `{ "ok": true, "accepted": false }`. |
| `PUT` | `/api/v1/settings` | Admin (`settings:write`) | Ställ in den instansomfattande opt-outen. Skicka en JSON-kropp `{ "analyticsEnabled": "false" }` för att stänga av analys för alla, eller `"true"` för att slå på den igen. |
## Funktioner / AI-buntar {#features-ai-bundles}
Hantera AI-funktionsbuntar (installera/avinstallera AI-modellpaket i Docker-miljön). Föredra slutpunkten för installation på verktygsnivå när du aktiverar ett verktyg från anpassad automatisering: vissa AI-verktyg behöver mer än en delad bunt, och denna slutpunkt hoppar över redan installerade buntar och köar endast de saknade.
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/features` | Auth | Lista alla funktionsbuntar och deras installationsstatus |
| `POST` | `/api/v1/admin/features/:bundleId/install` | Admin (`features:manage`) | Installera en funktionsbunt (asynkron, returnerar `jobId` för förloppsspårning) |
| `POST` | `/api/v1/admin/tools/:toolId/features/install` | Admin (`features:manage`) | Installera varje bunt som ett verktyg kräver; returnerar köad/överhoppad status per bunt |
| `POST` | `/api/v1/admin/features/:bundleId/uninstall` | Admin (`features:manage`) | Avinstallera en funktionsbunt och rensa upp modellfiler |
| `GET` | `/api/v1/admin/features/disk-usage` | Admin (`features:manage`) | Hämta total diskanvändning för AI-modeller |
| `POST` | `/api/v1/admin/features/import` | Admin (`features:manage`) | Importera ett offline-AI-buntarkiv |
## Adminåtgärder {#admin-operations}
Driftsslutpunkter för observerbarhet, support, användningsrapportering och backupstatus.
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/admin/log-level` | Admin (`settings:write`) | Läs den aktuella körtidsloggnivån |
| `POST` | `/api/v1/admin/log-level` | Admin (`settings:write`) | Ändra körtidsloggnivån (`fatal`, `error`, `warn`, `info`, `debug`, `trace` eller `silent`) |
| `GET` | `/api/v1/metrics` | Admin (`system:health`) | Prometheus-mätvärden i textformat |
| `GET` | `/api/v1/admin/support-bundle` | Admin (`system:health`) | Ladda ner en redigerad diagnostisk support-bunt-ZIP |
| `GET` | `/api/v1/admin/usage` | Admin (`audit:read`) | Data för användningsdashboarden, med valfri `days`-frågeparameter |
| `GET` | `/api/v1/admin/backup-status` | Admin (`system:health`) | Läs metadata för senaste backup och färskhetsstatus |
| `POST` | `/api/v1/admin/backup-status` | Admin (`system:health`) | Registrera en slutförd backup (`type`, valfri `sizeBytes`, valfri `notes`) |
## Enterprise-API:er {#enterprise-apis}
Dessa rutter är licensgrindade av sin relaterade enterprise-funktion. De kräver fortfarande den angivna SnapOtter-behörigheten.
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/enterprise/audit/export` | Admin (`audit:read`) | Exportera granskningsposter som JSON eller CSV med filter |
| `GET` | `/api/v1/enterprise/config/export` | Admin (`system:health`) | Exportera redigerad instanskonfiguration, anpassade roller och team |
| `POST` | `/api/v1/enterprise/config/import` | Admin (`system:health`) | Importera konfiguration, med valfri torrkörning |
| `GET` | `/api/v1/enterprise/ip-allowlist` | Admin (`security:manage`) | Läs konfigurerad CIDR-tillåtningslista |
| `PUT` | `/api/v1/enterprise/ip-allowlist` | Admin (`security:manage`) | Uppdatera CIDR-tillåtningslista med förhindrande av självutlåsning |
| `GET` | `/api/v1/enterprise/legal-hold` | Admin (`compliance:manage`) | Lista rättsliga spärrar för användare och team |
| `PUT` | `/api/v1/enterprise/legal-hold` | Admin (`compliance:manage`) | Applicera eller häv en rättslig spärr på en användare eller ett team |
| `POST` | `/api/v1/enterprise/scim/token` | Admin (`users:manage`) | Generera en SCIM-bärartoken, returneras en gång |
| `DELETE` | `/api/v1/enterprise/scim/token` | Admin (`users:manage`) | Återkalla den aktuella SCIM-bärartoken |
| `GET` | `/api/v1/enterprise/siem/config` | Admin (`webhooks:manage`) | Läs SIEM-vidarebefordringskonfiguration |
| `PUT` | `/api/v1/enterprise/siem/config` | Admin (`webhooks:manage`) | Uppdatera SIEM-vidarebefordringskonfiguration |
| `GET` | `/api/v1/enterprise/webhooks` | Admin (`webhooks:manage`) | Lista webhook-destinationer |
| `POST` | `/api/v1/enterprise/webhooks` | Admin (`webhooks:manage`) | Skapa en webhook-destination |
| `PUT` | `/api/v1/enterprise/webhooks/:index` | Admin (`webhooks:manage`) | Uppdatera en webhook-destination |
| `DELETE` | `/api/v1/enterprise/webhooks/:index` | Admin (`webhooks:manage`) | Ta bort en webhook-destination |
| `POST` | `/api/v1/enterprise/webhooks/:index/test` | Admin (`webhooks:manage`) | Skicka en test-webhook-nyttolast |
| `POST` | `/api/v1/enterprise/users/:id/export` | Admin (`compliance:manage`) | Starta ett GDPR-användarexportjobb |
| `GET` | `/api/v1/enterprise/users/:id/export/:jobId` | Admin (`compliance:manage`) | Läs GDPR-exportstatus och nedladdnings-URL |
| `DELETE` | `/api/v1/enterprise/users/:id/purge` | Admin (`compliance:manage`) | Rensa permanent en användares data efter bekräftelse |
| `DELETE` | `/api/v1/enterprise/teams/:id/purge` | Admin (`compliance:manage`) | Rensa permanent ett teams data efter bekräftelse |
| `GET` | `/api/v1/admin/version` | Admin (`system:health`) | Läs metadata för app-, build-, Node- och schemaversion |
| `GET` | `/api/v1/admin/migrations/pending` | Admin (`system:health`) | Jämför paketerade migreringar med tillämpade migreringar |
| `GET` | `/api/v1/admin/upgrade-check` | Admin (`system:health`) | Kör kontroller av uppgraderingsberedskap |
### SCIM 2.0 {#scim-2-0}
SCIM-upptäcktsslutpunkter är publika. Användar- och gruppslutpunkter kräver SCIM-bärartoken som genererades ovan.
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/scim/v2/ServiceProviderConfig` | Publik | SCIM-serverfunktioner |
| `GET` | `/api/v1/scim/v2/Schemas` | Publik | SCIM-schemaupptäckt |
| `GET` | `/api/v1/scim/v2/ResourceTypes` | Publik | SCIM-resurstypsupptäckt |
| `GET` | `/api/v1/scim/v2/Users` | SCIM-token | Lista användare, med valfritt SCIM-filter |
| `POST` | `/api/v1/scim/v2/Users` | SCIM-token | Skapa en användare |
| `GET` | `/api/v1/scim/v2/Users/:id` | SCIM-token | Hämta en användare |
| `PUT` | `/api/v1/scim/v2/Users/:id` | SCIM-token | Ersätt en användare |
| `DELETE` | `/api/v1/scim/v2/Users/:id` | SCIM-token | Mjukt inaktivera en användare |
| `GET` | `/api/v1/scim/v2/Groups` | SCIM-token | Lista team som SCIM-grupper |
| `POST` | `/api/v1/scim/v2/Groups` | SCIM-token | Skapa ett team |
| `GET` | `/api/v1/scim/v2/Groups/:id` | SCIM-token | Hämta ett team |
| `PUT` | `/api/v1/scim/v2/Groups/:id` | SCIM-token | Ersätt ett team och gruppmedlemskap |
| `DELETE` | `/api/v1/scim/v2/Groups/:id` | SCIM-token | Ta bort ett team |
## Memmallar {#meme-templates}
Stödjande API för memgeneratorverktyget.
| Metod | Sökväg | Åtkomst | Beskrivning |
|--------|------|--------|-------------|
| `GET` | `/api/v1/meme-templates` | Auth | Lista alla tillgängliga memmallar med textrutepositioner |
| `GET` | `/api/v1/meme-templates/full/:filename` | Auth | Servera mallbild i full storlek |
| `GET` | `/api/v1/meme-templates/thumbs/:filename` | Auth | Servera mallminiatyr |
| `GET` | `/api/v1/meme-templates/fonts/:filename` | Auth | Servera typsnittsfil som används för rendering av memtext |
## Felsvar {#error-responses}
Alla fel returnerar JSON:
```json
{
"error": "Human-readable message",
"code": "MACHINE_READABLE_CODE"
}
```
| Status | Betydelse |
|--------|---------|
| 400 | Ogiltig förfrågan / validering misslyckades |
| 401 | Inte autentiserad |
| 403 | Otillräckliga behörigheter |
| 404 | Resurs hittades inte |
| 413 | Filen för stor (se `MAX_UPLOAD_SIZE_MB`) |
| 422 | Bearbetning misslyckades efter validering |
| 429 | Hastighetsbegränsad (se `RATE_LIMIT_PER_MIN`) |
| 501 | Nödvändig AI-funktionsbunt är inte installerad (`FEATURE_NOT_INSTALLED`) |
| 500 | Internt serverfel |