Theme
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 DefaultNach 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/statusjson
{
"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:
| Modus | Verhalten |
|---|---|
auto | AI-Mutationen laufen sofort durch. AI-Job ist auto_applied. |
review | AI schlägt vor → Eintrag im Audit-Log mit pending. Mensch approves/rejects via Admin. |
read_only | AI-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"
}
}Suggest Internal Links
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.