Streaming pattern'leri
Generation pipeline ve chat endpoint'inden Server-Sent Events — event şekilleri, reconnect, abort.
İki endpoint stream eder:
POST /v1/personas?stream=true— altı adımlı generation pipeline.POST /v1/chat/sessions/{id}/messages?stream=true— chat yanıtları.
İkisi de Server-Sent Events konuşur. Aynı envelope, farklı event tipleri.
Generation event'leri
event: step.started data: { step: "soul_draft" }
event: step.completed data: { step: "soul_draft", durationMs, model }
event: pipeline.completed data: { personaId, durationMs }
Altı adım sırayla step.started + step.completed yayar; terminal
pipeline.completed final persona ID'yi taşır.
Chat event'leri
event: token data: { delta: "Anlat..." }
event: token data: { delta: " bana" }
event: completed data: { messageId, driftScore, driftThreshold }
Token'lar sırayla stream eder; completed bir kez gelir, drift
envelope'la.
Okuma döngüsü (TypeScript)
const res = await fetch(url, { method: 'POST', headers, body });
const reader = res.body!.getReader();
const decoder = new TextDecoder();
let buf = '';
while (true) {
const { value, done } = await reader.read();
if (done) break;
buf += decoder.decode(value, { stream: true });
let idx;
while ((idx = buf.indexOf('\n\n')) !== -1) {
const frame = buf.slice(0, idx);
buf = buf.slice(idx + 2);
const lines = frame.split('\n');
const event = lines.find((l) => l.startsWith('event:'))?.slice(6).trim();
const data = lines.find((l) => l.startsWith('data:'))?.slice(5).trim();
if (event === 'token') process.stdout.write(JSON.parse(data!).delta);
}
}SDK bunu sana yapar — bkz. client.chat.streamMessage() ve
client.personas.createStream().
Abort
fetch'e bir AbortController.signal geç. Client disconnect ettiği
an Moonborn faturalandırmayı durdurur.
Reconnect
SSE'nin built-in resume'i yok. Client'ın stream ortasında düşerse,
generation/reply sunucu tarafında zaten çalışıyor — generation için
GET /v1/personas/{id} veya chat için
GET /v1/chat/sessions/{id}/messages ile yeniden çek. Stream'i
retry etme.
Tarif
Her tier.