Streaming balasan
Ikuti run secara langsung lewat Server-Sent Events:
GET /agent-runs/{runId}/eventsDi browser, pakai EventSource dengan credentials:
const es = new EventSource(`https://api.lexcetha.com/api/v1/agent-runs/${runId}/events`, { withCredentials: true });
let reply = '';
es.addEventListener('assistant.delta', (e) => { reply += JSON.parse(e.data).text; render(reply); });
es.addEventListener('approval.required', (e) => askUser(JSON.parse(e.data)));
es.addEventListener('run.completed', (e) => { render(JSON.parse(e.data).output); es.close(); });
es.addEventListener('run.failed', (e) => { showError(JSON.parse(e.data).message); es.close(); });
es.addEventListener('run.cancelled', () => es.close());Dari server, baca stream dengan client SSE apa pun beserta header Authorization: Bearer.
Event
Setiap event punya id yang terus bertambah, nama, dan payload data berformat JSON.
| Event | Data | Kapan |
|---|---|---|
run.started | { mode, botId } | Run dimulai |
assistant.delta | { text } | Potongan balasan berikutnya. Tambahkan ke teks sebelumnya. |
tool.proposed | { callId, toolSlug, arguments } | Bot ingin memakai tool (argumen disamarkan) |
approval.required | { approvalId, callId, toolSlug, risk, summary, expiresAt } | Tool perlu persetujuan Anda, lihat Approval |
run.waiting | { approvals: [approvalId] } | Run berhenti sampai approval itu diputuskan |
tool.started | { callId, toolSlug } | Tool sedang berjalan |
tool.completed | { callId, toolSlug, status, result? } | status adalah succeeded (dengan result), failed, denied, rejected, expired, connection_required, atau duplicate |
run.completed | { output, stopReason } | Selesai. output adalah balasan lengkap. |
run.failed | { code, message } | Berhenti karena error |
run.cancelled | {} | Dibatalkan |
run.completed, run.failed, dan run.cancelled adalah event terakhir: tutup stream setelahnya.
stopReason bernilai needs_setup ketika bot meminta Anda menghubungkan atau memasang sesuatu yang Anda tag; lihat Lampiran & tag.
Menyambung ulang
Koneksi bisa terputus. Sambungkan ulang dengan id event terakhir, dan stream berlanjut dari sana tanpa mengulang atau kehilangan apa pun:
EventSourcemengirimLast-Event-IDsecara otomatis.- Client lain bisa mengirim header
Last-Event-ID, atau?after={id}.
Server mengirim komentar setiap 15 detik agar koneksi tetap hidup, dan menutup stream setelah 30 menit; sambungkan ulang untuk melanjutkan dari titik terakhir.
