Skip to content

AI Co-Pilot

Phase 5+ liefert AI-assistierte Operationen für Editoren — direkt im Visual Editor und über die REST-API.

Setup: ein API-Key, dann läuft's

Peacock ist KI-fähig, aber liefert keinen API-Key mit — du wählst Provider + Modell selbst.

Schritt 1 — Anthropic-Key besorgen

console.anthropic.com → "API Keys" → "Create Key". Der Key beginnt mit sk-ant-....

Schritt 2 — In Peacock eintragen

bash
# apps/api/.env (Self-Host)
ANTHROPIC_API_KEY=sk-ant-XXXXXXXXXXXXXXXXXXXXXXXX
PEACOCK_AI_MODEL=claude-sonnet-4-6   # optional; ist der Default

Nach dem Setzen Octane neu starten (php artisan octane:reload).

Schritt 3 — Prüfen, ob's funktioniert

bash
curl -H "Authorization: Bearer $PEACOCK_TOKEN" \
  https://peacock.example.com/v1/spaces/$SPACE/ai/status
json
{
  "data": {
    "configured": true,
    "provider": "anthropic",
    "model": "claude-sonnet-4-6",
    "configure_hint": null
  }
}

Sobald "configured": true erscheint, blendet die Admin-UI die AI-Aktionen automatisch ein. Bevor du einen Key gesetzt hast, zeigt der Editor statt der AI-Buttons den Hinweis "AI off — Set ANTHROPIC_API_KEY in apps/api/.env and restart the API server." — keine 500er, keine kryptischen Anthropic-Fehler, einfach klar, was zu tun ist.

Backend-Endpoints (POST /ai/text, /ai/translate, …) geben in dem Zustand 503 Service Unavailable mit {"error":"ai_not_configured"} zurück. Damit ist der "kein-Key" Pfad ein definierter Zustand, kein Crash.

Cloud-Hosting

Für peacock-cms.webhoch.com legt der Operator den Key zentral fest. Aus der Admin-UI ist die Konfiguration heute nicht änderbar (Phase 9: Self-Service per-Space API-Keys mit encrypted casts).

Approval-Modi pro Space

Jeder Space hat ein Feld ai_approval_mode mit drei möglichen Werten:

ModusVerhalten
autoAI-Mutationen laufen sofort durch. AI-Job ist auto_applied.
reviewAI schlägt vor → Eintrag im Audit-Log mit pending. Mensch approves/rejects via Admin.
read_onlyAI-Endpunkte geben 403 zurück. Useful für Production-Spaces, in denen nur autorisierte Menschen schreiben dürfen.

Default für neue Spaces via OnboardingController: review.

Wechseln: PATCH /v1/spaces/{slug} mit {"ai_approval_mode": "auto"}.

Eingebaute Actions

Alle Actions erzeugen genau einen AiJob-Eintrag pro Aufruf — keine stillen Sub-Calls.

Generate Text

POST /v1/spaces/{slug}/ai/text

json
{
  "prompt": "Schreib einen marketing-tauglichen Lead-Absatz für ein Astro-CMS, das auf Open-Source-Werte setzt. Max 80 Wörter, Du-Form.",
  "context": { "story_uuid": "01HF..." }
}

Antwort:

json
{
  "data": {
    "text": "Peacock CMS ist Open Source, von Grund auf...",
    "model": "claude-sonnet-4-7",
    "total_tokens": 234,
    "ai_job_id": 42
  }
}

Translate Field

POST /v1/spaces/{slug}/ai/translate

json
{
  "text": "Willkommen bei uns",
  "source_locale": "de-AT",
  "target_locale": "en-GB"
}

Generate Alt Text

POST /v1/spaces/{slug}/ai/alt-text

json
{ "asset_uuid": "01HF..." }

Liest das Bild via Vision-Modell, gibt einen prägnanten Alt-Text zurück.

Generate SEO Meta

POST /v1/spaces/{slug}/ai/seo-meta

json
{ "story_uuid": "01HF..." }

Antwort:

json
{
  "data": {
    "title": "Über uns — Acme Webhoch",
    "description": "Wir bauen seit 2008 stabile Web-Apps für österreichische Mittelständler...",
    "model": "claude-sonnet-4-7"
  }
}

POST /v1/spaces/{slug}/ai/internal-links

Gibt 3-5 thematisch passende Story-Pfade aus dem Space zurück.

Stream Text (SSE)

GET /v1/spaces/{slug}/ai/stream?prompt=...

Server-Sent Events stream, token-by-token. Im Admin gerendert via EventSource-Listener für sofortiges Feedback bei längeren Generations.

Audit Log

Alle AI-Aktionen landen in ai_jobs. Admin → Sidebar-Tab "AI Audit" zeigt:

#42  generate_seo_meta    pending     2026-05-20 · 234 tok · claude-sonnet-4-7
     [Preview…]                                     [Approve]  [Reject]

Filter: approval_status (all / pending / approved / rejected / auto_applied). Sortierung: neueste zuerst.

POST /v1/spaces/{slug}/ai-jobs/{id}/approve resp. /reject flippt den Status. Bei Approve wird der proposed_patch (ein JSON-Patch-Objekt) tatsächlich auf das Target-Objekt angewendet.

Provider Drivers

Provider-Abstraktion via AiProvider-Interface:

  • AnthropicDriver (Claude Sonnet 4.7) — Default. Pricing pro 1M Tokens.
  • OpenAiDriver (GPT-4o-mini, GPT-4o) — alternativ.

Switch via config('peacock.ai.driver') in der API.

Self-Host nutzt deinen eigenen API-Key (ANTHROPIC_API_KEY / OPENAI_API_KEY als ENV); SaaS-Plan bringt ein gemanagter Quota mit, dessen Verbrauch pro Tenant getrackt wird.

Quota-Tracking

ai_jobs.total_tokens pro Tenant aggregiert ergibt den monatlichen Verbrauch. Bei Quota-Überschreitung gibt der AiController 429 zurück mit Reset-Header.

Agent Schedules

Cron-getriebene AI-Tasks pro Space. Beispiel: Jede Nacht alle Stories mit status=draft älter als 7 Tage durchgehen und automatisch SEO-Meta vorschlagen (pending-Approval).

json
{
  "name": "weekly-seo-audit",
  "cron": "0 3 * * MON",
  "action": "generate_seo_meta_batch",
  "params": { "filter": { "status": "draft", "older_than_days": 7 } }
}

peacock:run-agents Artisan-Command läuft im Laravel-Scheduler everyMinute()->withoutOverlapping() und queued die Jobs.

MCP-Server (externe Agenten)

Claude Code, ChatGPT, Cursor — alle, die das Model Context Protocol sprechen — können Peacock-Spaces via apps/mcp-server lesen + mutieren. Audit-Log + Approval-Mode gilt genauso wie bei Menschen.

Siehe MCP.