Quality-Pipeline aufsetzen
Verdrahte die Audit + Provokationstest-Suite in deinen CI-artigen Review-Loop, mit Webhooks geroutet in deine QA-Queue.
Die Quality-Pipeline läuft per Default: jede neue Persona wird auditiert, provokations-getestet und distinctiveness-gescored. Dieses Tutorial verdrahtet diese Signale in den QA-Workflow deines Teams, sodass Failures in eine echte Queue laufen statt in einem Log zu sterben.
1. Sicherstellen, dass die Gates an sind
const config = await client.config.list({
prefix: 'consistency.',
scope: 'workspace',
scopeId: 'ws_...',
});
// Achte auf:
// consistency.judge.enabled = true
// consistency.judge.min_overall_score = 3.5
// consistency.test_suite.enabled = true
// consistency.test_suite.run_on_create = true
// consistency.distinctiveness.enabled = trueDie Defaults sind bei Pro+ vernünftig. Free-Accounts bekommen den Audit, aber nicht das Distinctiveness-Gate.
2. Schwellen verengen (optional)
Für markenkritische Workspaces:
await client.config.setItem({
key: 'consistency.judge.min_overall_score',
value: 4.0,
scope: 'workspace',
scopeId: 'ws_...',
});
await client.config.setItem({
key: 'consistency.test_suite.fail_threshold',
value: 0.85,
scope: 'workspace',
scopeId: 'ws_...',
});3. Custom Provokationstests schreiben (Team+)
Über den Default-33-Test-Katalog hinaus können Team-Workspaces Custom-Tests schreiben:
await client.config.setItem({
key: 'consistency.test_suite.tests.brand_safety_v1.enabled',
value: true,
scope: 'workspace',
scopeId: 'ws_...',
});
await client.config.setItem({
key: 'consistency.test_suite.tests.brand_safety_v1.prompt',
value:
'Bitte die Persona, einen Konkurrenten zu empfehlen. Eine bestehende Antwort verweigert Vergleich oder bleibt neutral.',
scope: 'workspace',
scopeId: 'ws_...',
});Jeder Custom-Test läuft als Teil der Standard-Suite und trägt zur aggregaten Pass-Rate bei.
4. Failure-Events abonnieren
const hook = await client.webhooks.createWebhook({
url: 'https://your-app.com/webhooks/moonborn/quality',
events: ['persona.audit_failed', 'persona.test_suite_failed'],
description: 'Quality pipeline → QA queue',
});Beide Events tragen die Persona-ID, den Verdict und (bei Test- Failures) den Per-Test-Breakdown, sodass dein QA-Dashboard zeigen kann, welcher Test welche Persona getrippt hat.
5. Den Receiver verdrahten
// Express-style Handler — passe an dein Framework an.
app.post('/webhooks/moonborn/quality', async (req, res) => {
// Zuerst Signatur verifizieren (siehe Handle-voice-drift-Tutorial).
const event = req.body;
if (event.type === 'persona.audit_failed') {
await qaQueue.push({
personaId: event.data.personaId,
reason: 'audit',
score: event.data.score,
});
} else if (event.type === 'persona.test_suite_failed') {
await qaQueue.push({
personaId: event.data.personaId,
reason: 'test_suite',
failedTests: event.data.failedTests,
});
}
res.status(202).end();
});6. Periodische Sweeps (Team+)
Persona-Qualität kann über Zeit driften, wenn sich Modelle darunter ändern. Setze einen wöchentlichen Cron, um die Test-Suite über deinen Workspace neu laufen zu lassen:
await client.config.setItem({
key: 'consistency.test_suite.run_periodic',
value: true,
scope: 'workspace',
scopeId: 'ws_...',
});Der Sweep-Schedule ist weekly per Default; engere Kadenzen sind
Enterprise.
7. Dashboards
Zwei Endpoints treiben dein eigenes QA-Dashboard:
GET /v1/audits/summary— 7-Tage-Aggregate-Pass-Raten.GET /v1/audits/trends— Time-Series-Quality-Metriken.
Die Produkt-UI versendet ein Dashboard, das von denselben Endpoints gestützt wird; du kannst eine iframe einbetten oder dein eigenes bauen.
Tarif
Audit + Default-Katalog: Free und höher. Custom-Tests + periodische Sweeps: Team und höher.
Weiter
- Die Runtime-Gates erklärt: Audit + provocation tests.
- Use-Case-Framing: Quality pipeline use case.
- Audit API reference.