feat: llms.txt (AI-readable docs), job delete, friendly missing-source error
- /llms.txt: public machine-readable capability/API/MCP doc for agents. - Job delete action + queue button for terminal jobs; cleans objects. - process.ts: clear 'Quelle nicht mehr vorhanden' message instead of raw EISDIR/ENOENT when a source was purged. - Docs corrected: Picdrop 'missing images' was web-UI sorting, not PNG; JPG delivery kept as size/perf improvement. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XNQ8ghPfzAfsyVYd6HgFb6
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
import type { APIRoute } from 'astro';
|
||||
|
||||
export const prerender = false;
|
||||
|
||||
/**
|
||||
* Maschinen-/KI-lesbare Kurzdoku unter /llms.txt (öffentlich, ohne Geheimnisse).
|
||||
* Beschreibt Zweck, Fähigkeiten und die HTTP-/MCP-Schnittstelle von Klarbild,
|
||||
* damit ein KI-Agent das Tool ohne Weboberfläche bedienen kann.
|
||||
*/
|
||||
const BODY = `# Klarbild
|
||||
|
||||
> Selbst gehostetes KI-Bildwerkzeug: verwandelt Screenshots und Fundstücke in
|
||||
> saubere, druckfertige Bilder (bereinigen, freistellen, exakte Fotoformate,
|
||||
> The-Frame-Querformat, Sticker mit Kontur), liefert an Picdrop (SFTP/FTPS)
|
||||
> aus und sichert auf beliebige Backup-Ziele (z. B. NAS). Bedienung über Web,
|
||||
> Telegram-Bot und HTTP-API/MCP.
|
||||
|
||||
Basis-URL: https://klarbild.heidrich-digital.de
|
||||
Sprache der Oberfläche: Deutsch. Stack: Astro 5 (SSR) · Postgres · sharp · pg-boss.
|
||||
|
||||
## Authentifizierung (für Agenten)
|
||||
- Header: \`Authorization: Bearer <API-Token>\` (Admin → „Automatisierung / MCP-Zugriff").
|
||||
- Der Token gilt für \`/api/*\` — NICHT für \`/api/admin/*\` (nur per Login-Session).
|
||||
- Ohne Token/Session antworten API-Routen mit 401.
|
||||
|
||||
## Kernbegriffe
|
||||
- Modus (mode): \`each\` (Screenshot bereinigen/freistellen/formatieren),
|
||||
\`compose\` (ein Bild umwandeln ODER mehrere kombinieren, mit Textbeschreibung),
|
||||
\`generate\` (neues Bild allein aus Text).
|
||||
- Aufgaben (tasks, nur bei each): \`clean\`, \`cutout\`, \`format\`, \`contour\`.
|
||||
- Rezept (recipe): gespeicherte Voreinstellung. Auftrag (job): ein Stapel; Position (item): ein Bild.
|
||||
- Auftrags-Status: queued, running, paused, done, failed, cancelled. \`failed\` = alle Positionen fehlgeschlagen.
|
||||
|
||||
## Formate (output_format)
|
||||
- Feste Schlüssel: 9x13,10x15,13x18,15x20,20x30,30x40,30x45,40x50,40x60,50x70,60x90,
|
||||
A4,A3,A2,20x20,30x30, theframe (3840x2160), hochformat (2160x3840), keep (Original behalten).
|
||||
- Freie Formate ohne Vorgabe: \`BREITExHOEHE\` in cm (z. B. \`25x35\`) oder \`sticker<N>\`
|
||||
für N×N cm (z. B. \`sticker5\` = 5×5 cm). Grenze 300 cm. Exakte Pixel: round(cm/2.54*dpi).
|
||||
- Dateiformat (output_ext): \`png\` (verlustfrei, Transparenz) oder \`jpg\` (klein, Picdrop-freundlich).
|
||||
JPG nur ohne Transparenz; freigestellte Motive bleiben immer PNG. Global (Admin) oder pro Rezept.
|
||||
|
||||
## HTTP-API (Auswahl, JSON)
|
||||
- GET /api/health — Status (öffentlich).
|
||||
- GET /api/me — aktueller Nutzer/Rechte.
|
||||
- GET /api/models — verfügbare Bildmodelle (Qualitätsstufen).
|
||||
- GET /api/recipes — Rezepte/Presets auflisten.
|
||||
- POST /api/recipes — Rezept anlegen. Body u. a.: name, mode, tasks[], output_format,
|
||||
orientation(portrait|landscape), crop_mode(crop|extend), dpi, contour_mm, output_ext(png|jpg|null),
|
||||
delivery(library|picdrop|both), picdrop_gallery, delivery_target_id.
|
||||
- DELETE /api/recipes/:id — Rezept löschen.
|
||||
- GET /api/delivery-targets — Auslieferungs-/Backup-Ziele.
|
||||
- POST /api/jobs — Auftrag starten. Body: { recipe, mode, delivery, private,
|
||||
prompt_text?(compose/generate), sources:[{source_path, filename}] }. Antwort: { jobId }.
|
||||
- GET /api/jobs — letzte Aufträge. GET /api/jobs/:id — Auftrag + Positionen (inkl. error_message, finished_at).
|
||||
- POST /api/jobs/:id/{pause|resume|cancel|retry-failed|delete}.
|
||||
- POST /api/items/:id/{retry|reuse|alternative}.
|
||||
- GET /api/items/:id/file — Ergebnisbild. Query: ?thumb=1 (Vorschau), ?preview=1 (kleines JPG fürs Vollbild),
|
||||
?download=1 (als Datei), ?src=1 (Quelle). Content-Type wird aus den Magic Bytes bestimmt (PNG/JPG/WEBP).
|
||||
|
||||
## MCP-Server (für Assistenten)
|
||||
Werkzeug \`klarbild\` (mcp/klarbild-mcp.mjs), nutzt denselben API-Token:
|
||||
- list_recipes — verfügbare Rezepte.
|
||||
- process_images — Bilder (lokaler Ordner / URLs) mit einem Rezept verarbeiten lassen.
|
||||
- job_status — Fortschritt/Ergebnis eines Auftrags abfragen.
|
||||
|
||||
## Auslieferung
|
||||
- Picdrop = SFTP/FTPS-Ziel; Galerie = Unterordner unter dem Basispfad. Voller Pfad = Basisordner + Galerie
|
||||
(wird erst beim Ausliefern zusammengesetzt). Standard-Galerie „POSTER LEA"; „The Frame" → „TheFrame-Backgrounds".
|
||||
- Nicht-transparente Ergebnisse gehen als JPG an Picdrop (kleiner, zuverlässiger).
|
||||
- Optionaler .md-Metadaten-Beileger je Ziel schaltbar (Picdrop/NAS/Zusatzziel).
|
||||
|
||||
## Datenschutz
|
||||
- Private Session (job.private=true): kein Bibliothekseintrag, keine Auslieferung/Sicherung,
|
||||
kein gespeicherter Prompt; Ergebnis wird nach kurzer Zeit gelöscht.
|
||||
- Sichtbarkeit global steuerbar (nur eigene / alle sehen alles); Admin sieht alles.
|
||||
|
||||
Weitere Doku (menschlich): In-App /anleitung und /changelog.
|
||||
`;
|
||||
|
||||
export const GET: APIRoute = async () =>
|
||||
new Response(BODY, { headers: { 'Content-Type': 'text/plain; charset=utf-8', 'Cache-Control': 'public, max-age=3600' } });
|
||||
Reference in New Issue
Block a user