Uygulamayı aç
Moonborn — Developers

Voice drift'i yönet

Eşikleri ayarla, `persona.audit_failed` webhook'unu QA kuyruğuna bağla ve (opsiyonel) flag'lenmiş yanıtların kullanıcıya hiç ulaşmaması için auto-recovery'i aç.

Drift, bir personanın voice fingerprint'i ile az önce söylediği şey arasındaki açıklık. Her chat yanıtı bu açıklığı bir skor olarak taşır. Bu tutorial skoru operasyonel bir şeye çevirir: ayarlanmış bir eşik, bir webhook aboneliği ve opsiyonel bir auto-recovery yolu.

1. Eşiği ayarla

Default engine.pipeline.drift_detection.threshold = 0.30 orta yol bir tercih. Marka açısından kritik yüzeyler için sıkılaştır:

curl -X POST https://api.moonborn.co/v1/config/engine.pipeline.drift_detection.threshold \
  -H "Authorization: Bearer $MOONBORN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "value": 0.20, "scope": "workspace", "scopeId": "ws_..." }'
await client.config.setItem({
  key: 'engine.pipeline.drift_detection.threshold',
  value: 0.2,
  scope: 'workspace',
  scopeId: 'ws_...',
});

Persona başı override'lar personanın runtime contract'ında yaşar — org'daki bir persona katı bir destek temsilcisi, diğeri gevşek bir yaratıcı arkadaşken işe yarar.

2. Alert aksiyonunu seç

engine.pipeline.drift_detection.action_on_alert şunları kabul eder:

  • warn (default) — yanıt gider, alert loglanır, webhook tetiklenir.
  • auto_recover — Moonborn fingerprint'i yeniden enjekte ederek bir kez regenerate eder, hangi yanıt daha düşük skorlarsa onu gönderir.
  • block — caller 409 Conflict ile drift envelope alır; downstream karar verir.

Müşteri desteği için auto_recover artı webhook eskalasyonu yaygın pattern. Yaratıcı oyun için warn artı UI badge yeter.

3. Webhook'a abone ol

persona.audit_failed drift eşiği tetiklendiğinde (diğer audit hatalarıyla birlikte) tetiklenir. POST /v1/webhooks ile abone ol:

const hook = await client.webhooks.createWebhook({
  url: 'https://your-app.com/webhooks/moonborn',
  events: ['persona.audit_failed'],
  description: 'Drift escalations → CX QA queue',
});
 
console.log('Bu secret\'ı bir kerelik sakla:', hook.signingSecret);

Signing secret tam olarak bir kez döner. Sakla; sonraki delivery'ler HMAC ile imzalanır (header X-Moonborn-Signature).

4. Doğrula ve aksiyon al

import crypto from 'node:crypto';
 
export function verify(rawBody: string, signature: string, secret: string): boolean {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(`sha256=${expected}`),
    Buffer.from(signature),
  );
}

Drift alert payload'u şuna benzer:

{
  "id": "evt_01H...",
  "type": "persona.audit_failed",
  "occurredAt": "2026-05-16T12:00:00Z",
  "data": {
    "personaId": "persona_01H...",
    "sessionId": "sess_01H...",
    "messageId": "msg_01H...",
    "driftScore": 0.41,
    "driftThreshold": 0.30,
    "reason": "voice_drift"
  }
}

Bunu QA kuyruğuna, ops Slack kanalına ya da incident runbook'una bağla — ekibinin sahiplendiği pipeline ne ise.

5. Outage sırasında delivery'leri replay et

Webhook'lar beş kez exponential backoff ile retry yapar (1dk → 2dk → 5dk → 30dk → 2sa), sonra dead-letter queue'ya gider. Dashboard'dan ya da API ile manuel replay:

const deliveries = await client.webhooks.listDeliveries({
  webhookId: hook.id,
  status: 'failed',
});
for (const d of deliveries) {
  await client.webhooks.replayDelivery({
    webhookId: hook.id,
    deliveryId: d.id,
  });
}

Sonraki