Dispatch-Eingang und Workflow
Ablauf
-
Webhook
POST /api/dispatch/inboundlegt einDispatchIteman und stößt die KI-Analyse an (/api/dispatch/[id]/analyze). -
Die KI füllt u. a. vor: Triage (Eingangskategorie, ob das Dev-Team nötig ist, strukturierte Dev-Übergabe, nächste Schritte für MEC, Rückfragen an den Absender) sowie bei redaktionellem Bedarf: Inhaltstyp, Center-Zuordnung (
centerIdsin Reihenfolge der Plausibilität,centerMatchNote,centerMatchAmbiguous), Kanäle, Zuständigkeit (User-ID), Fristen, Dringlichkeit, Teaser, Social-Caption (ersetzt manuelles Nachhaken und Gmail-Tags). Die Center-Liste im Prompt ist alphabetisch — das Modell darf nicht willkürlich das erste Element wählen; unbekannte UUIDs werden serverseitig verworfen (sanitizeAndSyncCenters). -
„Entwurf erstellen“ erzeugt
ContentIntent+ContentDraft(source: dispatch, StatusPENDING) — kein direktesNews; der Entwurf gehört genau einem gewählten Center. Bei mehreren angehakten Centern legt die Oberfläche fest, für welches Center angelegt wird (Standard: wahrscheinlichstes laut KI-Reihenfolge incenterIds). -
Redakteure bearbeiten und genehmigen unter Workflow & Freigaben (
/dashboard/workflow). Deep-Link:?highlight=<contentDraftId>. Im Dashboard verlinken Dispatch, Workflow und Content Planner denselben Redaktionsfluss (drei Schritte, aktuelle Seite markiert). Entwurf löschen:DELETE /api/content/drafts/[draftId]— Session erforderlich; setztDispatchItem.contentDraftIdfür diesen Entwurf aufnullund löscht denContentDraft(der verknüpfteContentIntentbleibt ohne Entwurf bestehen). -
Bei Genehmigung legt
executeContentDraftdie echte Entität an (z. B.News). Anschließend:DispatchItem.status→PUBLISHED- bei gesetztem
preferredPublishAt: optionalContentSchedule(News,date_range) für den Content Planner
Felder / Prisma: Es werden nur die in
executeContentDraft(apps/dashboard/src/app/api/content/drafts/[draftId]/route.ts) explizit gesetzten Spalten befüllt — nicht die vollen Dashboard-Masken. Offer: Entwurf-JSONvalidFrom/validTo(oderstartDate/endDate) →Offer.startDate/Offer.endDate. Job: u. a.typeaustype,departmentoderemploymentType; langer Text auscontent→requirements(kein Prisma-Feldcontentam Job). Shop: Das Prisma-Modell hatshopChainId, keinchainSlug; im Entwurf könnenchainSlug,chainId(UUID der Kette) odershopChainIdstehen — beim Anlegen wird aufgelöst bzw. das Ketten-Feld weggelassen.openingHoursals Objekt wird als JSON-String gespeichert (nicht"[object Object]"). Service: EntwurfopeningHoursebenfalls JSON-serialisieren wenn nötig. Fehlende SEO-, Hero- oder Shop-Verknüpfungen nach Freigabe in der jeweiligen Content-Bearbeiten-Ansicht ergänzen.
Dispatch-Detail (/dashboard/dispatch/[id])
- Status: In der Registerkarte Zuordnung ist jeder Status aus dem Enum wählbar und wird mit Speichern & Zuweisen per
PATCH /api/dispatch/[id]gespeichert — inkl. Eingang (INBOX), um einen Fall wieder in die Eingangs-Spalte der Board-Ansicht zu legen.
KI-Analyse (Dispatch & allgemein)
- E-Mail-Inhalt für die KI:
POST /api/dispatch/[id]/analyzezieht den Klartext ausbodyText; istbodyHtml(z. B. PostmarkHtmlBody) deutlich länger oder der Plaintext nur ein Stub, wirdhtmlToPlainText(bodyHtml)verwendet, damit nicht nur der «erste» Plaintext-Block analysiert wird. Optional:DISPATCH_ANALYZE_MAX_BODY_CHARS(Standard 24 000, min 4 000, max 80 000); sehr lange Mails werden mit Kopf+Schwanz und Mittelteil-Hinweis gekürzt. Bei Legacy-Modellen mit 8k-Kontext (gpt-4ohne „o“/Turbo) wird die Mail automatisch stärker gekürzt (max. 10 000 Zeichen), undmax_tokensfür die Antwort auf 3072 begrenzt — sonst liefert die APIcontext_length_exceeded(z. B. wennmax_tokens8192 gesetzt war). Empfehlung in der KI-Konfiguration:gpt-4o-minio. Ä. Größere Modelle: bis 8192 Completion-Tokens. In Development liefert die Route bei 500 zusätzlichdetailmit der Fehlermeldung. - Felder in
aiSuggestion(Auszug):intakeCategory,primaryOwner,needsDevTeam,mecNextSteps,questionsForSender,devHandoff(Titel, Problem, URLs, Repro,suspectedLayer, Priorität),centerIds/centerNames(Mehrfachtreffer möglich, Reihenfolge = beste Vermutung zuerst),centerMatchNote(Begründung aus Mail),centerMatchAmbiguous, dazu die bisherigen Content-Felder (typenews/offer/eventodernonewenn kein Post). Ziel: kleines MEC-Team kann Mails ohne langes Ermitteln zuordnen. Zusätzlich optionalcustomerCommunication: strukturierter Vorschlag für persönliche Rückmeldung an den Absender (Betreff, E-Mail-Text, Kanalhinweis) — wird bei „Entwurf erstellen“ inContentDraft.dataübernommen, damit Betreuer die Beziehungspflege nicht verlieren. - Manueller Workflow (ohne neue DB-Spalte): Unter
aiSuggestion.workflow—handoffToDev(boolean),handoffToDevAt(ISO, gesetzt beim ersten Aktivieren),handoffNote(optional). Wird überPATCH /api/dispatch/[id]mit BodyworkflowPatchgespeichert; bei Re-Analyse bleibtworkflowdurch Merge erhalten (siehedispatch-workflow.ts). - Dispatch-Übersicht: Filter nach Triage-Kategorie (
intakeCategory), „Dev nötig / übergeben“ kombiniertneedsDevTeamoderworkflow.handoffToDev. - Dispatch:
POST /api/dispatch/[id]/analyzenutzt die globale KI-Konfiguration (getAIConfig) und den zentralen HTTP-ClientopenAIChatCompletion(apps/dashboard/src/lib/openai-chat.ts). Leere oder relativebaseUrlin der DB würden früher zufetch("/chat/completions")führen – der Client normalisiert aufhttps://api.openai.com/v1bzw.OPENAI_API_BASE_URL. Unterstützt das konfigurierte Modell keinen OpenAI-JSON-Mode (response_format: json_object, z. B. älteresgpt-4), wird automatisch ein zweiter Aufruf ohne JSON-Mode ausgeführt; die Antwort wird wie Klartext in JSON geparst (inkl. Markdown-Codeblöcken). - Allgemein (Dashboard):
POST /api/ai/chat– Session erforderlich, Body:messages[], optionalcenterId,model,temperature,max_tokens,response_format. Antwort:{ success, content }.
Umgebung
DISPATCH_WEBHOOK_SECRET– optional, HeaderX-Dispatch-Secretfür Inbound und ggf. interne Trigger.
Legacy
Ältere Einträge können contentDraftId noch als frühere News-ID führen; neue Einträge verwenden die ContentDraft-ID bis zur Freigabe, danach wird die ID ggf. auf die veröffentlichte Content-ID aktualisiert.
Nutzungsstatistik: Seitenaufrufe werden anonymisiert erfasst. Im Umami-Dashboard nach diesem Pfad filtern: /en/developer-guide/dispatch-und-workflow