Çoklu karakterli sahneler
Personalar arasında tipli ilişkiler tanımla, birden çok konuşmacılı bir oturum aç ve seslerin birbirine çökmemesini sağlayarak sahne turlarını orkestre et.
İki ya da daha fazla personalı bir sahne, tek-personalı chat'ten farklı bir runtime. Sesler ayrı kalmalı, ilişkiler okunabilir kalmalı ve kullanıcı (ya da kim orkestre ediyorsa) kimin ne zaman konuşacağını kontrol etmeli. Bu tutorial bu üç meseleyi bağlar.
1. İki persona yarat
const mert = await client.personas.createPersona({
intent: 'İstanbul\'dan 34 yaşında bir kurucu. Parlak ama huzursuz.',
workspaceId: 'ws_...',
});
const leyla = await client.personas.createPersona({
intent:
'Berlin\'de 32 yaşında bir design lead. Keskin, prensipli, kurumsal jargondan alerji.',
workspaceId: 'ws_...',
});2. İlişkiyi deklare et
POST /v1/personas/{id}/relationships
ensemble graph'ına bir edge yazar.
Runtime her çoklu-persona turunda bu graph'a danışır.
await client.personas.createRelationship({
personaId: mert.id,
with: leyla.id,
type: 'ex-lover',
note: "Aynı çeyrekte hem bir şirketi hem bir ortaklığı paylaşıp ayrılan eş-kurucular. Saygılı ama temkinli.",
});Edge default'ta çift yönlü. Her iki persona da paylaşılan bir oturum içinde konuştuklarında diğerinden haberdar.
3. Çoklu-persona oturumunu aç
const session = await client.chat.createSession({
personaId: mert.id,
ensemble: [leyla.id],
metadata: { sceneId: 'pitch-meeting-q3' },
});ensemble sahnedeki ek personaların dizisi. Runtime hepsini bilir;
her turda konuşmacıyı sen seçersin.
4. Turları sürdür
const mertSays = await client.chat.sendMessage({
sessionId: session.id,
speaker: mert.id,
content: 'All-hands\'te ne olduğunu anlat.',
});
const leylaSays = await client.chat.sendMessage({
sessionId: session.id,
speaker: leyla.id,
content: 'Ne olduğunu zaten biliyorsun. Beni neden buraya çağırıyorsun?',
});speaker alanı cevap vermesi gereken persona ID'si. Prompt assembly
konuşmacının tam layer dokümanını artı ilgili ilişki edge'lerini içerir
(Leyla konuşur → Mert'in ex-lover edge'i enjekte edilir).
Her yanıt yine kendi drift envelope'unu taşır, konuşmacının fingerprint'ine karşı skorlanır — paylaşılan bir sahne baseline'ına değil. Sesler ayrı ayrı ölçülebilir kalır.
5. Yakınsamayı izle
Uzun sahnelerde sesler birbirine doğru kayabilir. Periyodik olarak distinctiveness'ı yeniden kontrol et:
const distance = await client.consistency.compare({
fromPersonaId: mert.id,
toPersonaId: leyla.id,
});
if (distance.value < 0.25) {
console.warn('Sesler yakınsıyor — fingerprint\'leri tazele ya da yeniden prompt et');
}6. Orkestrasyon senin
Moonborn tur sırasını, sahne state'ini ya da branching narrative'i yönetmez. Bu meseleler senin uygulama kodunda ya da agent framework'ünde yaşar. Yukarıdaki ürün yüzeyi karakter katmanı.
Game maker'lar için bu tipik olarak Moonborn'u bir sahne state machine'i (XState, kendi enum-tabanlın) ile eşlemek demek. UX araştırmacıları için her personaya aynı sorunun sırayla sorulduğu bir panel scripting demek.
Sonraki
- Production pattern'leri: Game NPC orchestration use case.
- Synthetic panel kurma: Synthetic user panel tutorial.
- Ensemble API reference.