App öffnen
Moonborn — Developers

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 = true

Die 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