Voice drift'i ele al
Drift eşiğini ayarla, uyarı davranışını seç, webhook ile kalite kontrol kuyruğuna bağla, başarısız gönderimleri yeniden gönder.
Bir karakter uzun konuşmalarda yavaş yavaş "genel asistan" tonuna kayabilir. Moonborn her sohbet yanıtının yanına bir drift zarfı (envelope) ekler — yanıtın karakterin voice fingerprint'inden ne kadar uzaklaştığını söyleyen küçük bir JSON. Bu rehber o skoru operasyonel bir şeye dönüştürür: doğru eşik, doğru uyarı davranışı, webhook ile kalite kontrol (QA) kuyruğuna bağlanma, başarısız gönderimleri yeniden gönderme.
Bir persona ile sohbet oturumu kur rehberinde drift zarfını gördün. Burada onunla ne yapacağını kurarsın.
Bu rehberi bitirdiğinde
- Çalışma alanı ve persona kapsamında drift eşiğini ayarlayabileceksin.
warn/auto_recover/blockdavranışlarından ürün ihtiyacına uygun olanı seçebileceksin.persona.audit_failedwebhook'una abone olup imzasını doğrulayabileceksin.- Webhook kesintisinden sonra başarısız gönderimleri elle yeniden gönderebileceksin.
Ön koşul: API anahtarı, en az bir persona ve test edebileceğin bir sohbet oturumu.
1. Doğru eşiği seç
Varsayılan engine.pipeline.drift_detection.threshold = 0.30 orta yol bir tercihtir. Yüzeyin ne kadar toleranslı olduğuna göre ayarla:
| Yüzey | Önerilen eşik | Neden |
|---|---|---|
| Müşteri desteği, marka kanalı | 0.20 | Karakter daha disiplinli kalmalı; küçük sapma bile işaretlensin |
| Varsayılan — sohbet ürünü, asistan | 0.30 | Dengeli; çoğu yanıt geçer, açık sapmalar tutulur |
| Yaratıcı rol-yapma, oyun NPC'leri | 0.40 – 0.45 | Karakterin doğaçlama yapmasına izin verir; sadece büyük kaymalarda işaret |
await client.config.setItem({
key: 'engine.pipeline.drift_detection.threshold',
value: 0.2,
scope: 'workspace',
scopeId: 'ws_...',
});2. Uyarı davranışını seç
engine.pipeline.drift_detection.action_on_alert değeri eşik aşıldığında ne olacağını belirler:
Yanıt kullanıcıya gider. driftAlert: true kayda
düşer, persona.audit_failed webhook'u tetiklenir.Tipik desenler:
- Müşteri desteği —
auto_recover+ webhook ile üst makama iletme (yanıt yine gider ama kalite ekibi görür) - Yaratıcı oyun —
warn+ arayüz rozeti ("bu mesajda karakter biraz dışına çıktı") - Uyumluluk-kritik alan —
block+ elle inceleme akışı
await client.config.setItem({
key: 'engine.pipeline.drift_detection.action_on_alert',
value: 'auto_recover',
scope: 'workspace',
scopeId: 'ws_...',
});3. persona.audit_failed webhook'una abone ol
Drift uyarısı tetiklendiğinde (ve diğer denetim hatalarında) persona.audit_failed olayı atılır. Uç noktanı (endpoint) abone et:
const hook = await client.webhooks.create({
url: 'https://your-app.com/webhooks/moonborn',
events: ['persona.audit_failed'],
description: 'Drift escalations → CX QA queue',
});
console.log('Bu gizli anahtar (secret) bir kerelik döner. Şimdi sakla:', hook.signingSecret);4. İmzayı doğrula
Her gönderim X-Moonborn-Signature başlığını taşır. Uç noktanda zaman-güvenli (timing-safe) karşılaştırma yap:
import crypto from 'node:crypto';
export function verifyMoonbornSignature(
rawBody: string,
signatureHeader: string,
secret: string,
): boolean {
const expected = crypto
.createHmac('sha256', secret)
.update(rawBody)
.digest('hex');
const expectedHeader = `sha256=${expected}`;
if (expectedHeader.length !== signatureHeader.length) return false;
return crypto.timingSafeEqual(
Buffer.from(expectedHeader),
Buffer.from(signatureHeader),
);
}Beklenen yük (payload):
{
"id": "evt_01H...",
"type": "persona.audit_failed",
"occurredAt": "2026-05-16T12:00:00Z",
"data": {
"personaId": "per_01H...",
"sessionId": "ses_01H...",
"messageId": "msg_01H...",
"driftScore": 0.41,
"driftThreshold": 0.30,
"reason": "voice_drift"
}
}Bu olayı kalite kontrol kuyruğuna, Slack uyarısına veya olay müdahale el kitabına (runbook) bağla — ekibinin sahiplendiği akış neyse.
5. Kesinti sonrası yeniden gönderim
Webhook'lar başarısız olduğunda Moonborn beş kez üstel geri çekilme (exponential backoff) ile yeniden dener (1dk → 2dk → 5dk → 30dk → 2sa), sonra dead-letter (ölü mektup) kuyruğuna düşer. Uç noktan tekrar ayaktayken eski gönderimleri elle yeniden gönderebilirsin:
const failed = await client.webhooks.listDeliveries({
webhookId: hook.id,
status: 'failed',
});
for (const d of failed.data) {
await client.webhooks.replayDelivery({
webhookId: hook.id,
deliveryId: d.id,
});
}Başardın
Eşiğin doğru değerde, uyarı davranışı ürün ihtiyacına uygun, webhook abone, imza doğrulaması yerinde ve yeniden gönderim yolu açıksa drift ele alma akışın tamamdır.
Sonraki adım
driftScore'un arkasında neyin ölçüldüğü, eşiklerin neye göre kalibre edildiği.
Destek, oyun ve marka kanalı için daha keskin eşik ayarları.
Tüm olay tipleri, yük şemaları ve yeniden deneme davranışları.
HMAC imza formatı, gönderim paneli, dead-letter kuyruğu.