Streaming
Stream output model saat dihasilkan. Time-to-first-token di bawah satu detik, metadata guardrail lengkap pada event terakhir, dan penanganan error di tengah stream yang mulus.
Aktifkan streaming
Setel stream: true pada body request. Response memakai Server-Sent Events dengan Content-Type: text/event-stream. SDK OpenAI dan Anthropic menangani parsing SSE secara otomatis.
Python — OpenAI SDK
TypeScript — OpenAI SDK
cURL
Catatan proxy edge. Edge proxy kami meneruskan frame SSE begitu tiba — setiap chunk mereset timeout proxy, sehingga request streaming bertahan untuk completion sepanjang apa pun. Request non-streaming tunduk pada timeout proxy 100 detik; gunakan streaming untuk model yang berpikir lama (mis., R1, Opus).
Tiga endpoint mendukung streaming
Kirim stream:true pada salah satu endpoint ini dan gateway merespons dengan Server-Sent Events. Seluruh pipeline guardrail + metering berjalan identik di setiap jalur.
POST /v1/chat/completions— endpoint chat yang kompatibel dengan OpenAI. Chunk mengikuti formatchat.completion.chunkmilik OpenAI (ditampilkan di atas).POST /anthropic/v1/messages— endpoint Anthropic Messages. Frame mengikuti format event Anthropic (message_start → content_block_delta → message_stop), bukan chunk OpenAI. Lihat /docs/endpoints/anthropic-messages.POST /anoman/v1/playground/run— endpoint playground dashboard/studio yang menggerakkan alat compare 3 panel.
Anatomi chunk
Setiap frame adalah satu baris: data: <json> diikuti satu baris kosong. Stream diakhiri dengan data: [DONE]. Chunk mengikuti bentuk chat.completion.chunk milik OpenAI, kecuali frame kedua dari terakhir adalah blok metadata Anoman.
Format wire — contoh chunk
- Chunk pertama:
delta.role: "assistant"dengan konten kosong. - Chunk perantara:
delta.contenttoken demi token. - Chunk completion terakhir:
finish_reasonterisi +usagetotal. - Frame kedua dari terakhir:
{"_anoman": {...}}— hasil guardrail, region routing, cache hit, biaya, weighted token. - Terminator:
data: [DONE].
Ketika upstream putus di tengah jalan
Kegagalan pra-panggilan (auth, rate limit, blokir guardrail) mengembalikan error HTTP normal sebelum response SSE dibuka. Setelah streaming dimulai, status HTTP sudah 200 — jadi kegagalan upstream di tengah stream ditandai oleh frame error di dalam body stream:
Frame error di tengah stream
Klien Anda harus memeriksa setiap chunk yang di-parse untuk key error. Jika ada, perlakukan response sebagai gagal (jangan commit output parsial) dan terapkan logika retry normal Anda. SDK OpenAI otomatis melempar exception saat melihat frame ini.
Catatan konten parsial. Field
_anoman.completion_tokensmemberi tahu berapa banyak token penyelesaian yang dikeluarkan model sebelum kegagalan. Berguna untuk telemetri — dan untuk memutuskan apakah hasil parsial masih layak dipakai di UX Anda.
Tanpa SDK
Ketika Anda tidak bisa memakai SDK OpenAI/Anthropic — edge runtime, klien HTTP alternatif, proxy kustom — berikut parser SSE minimal:
TypeScript — raw fetch (tanpa SDK)
Menghentikan stream lebih awal
Menutup koneksi HTTP membatalkan panggilan upstream dalam ~50 ms. Token yang dihasilkan sebelum pembatalan tetap ditagih; dashboard mencatat pembatalan sebagai routing_mode: streaming_cancelled.
Python — batalkan di tengah stream
TypeScript — batalkan via AbortController
Identik dengan non-streaming
Streaming hanya mengubah cara byte sampai ke Anda — bukan apa yang gateway lakukan di sekitar panggilan. Setiap request melewati pipeline yang sama seperti request non-streaming.
- Guardrail berjalan sebelum token pertama. Pemeriksaan pra-panggilan (injection, PII, moderasi konten, policy) dieksekusi sebelum stream dibuka. Request yang diblokir tidak pernah mulai streaming — ia mengembalikan error HTTP biasa (mis. 403), bukan body SSE.
- Metering dicatat saat stream ditutup. Penggunaan token, weighted token, biaya, dan trace berasal dari usage final penyedia — angka yang sama seperti panggilan non-streaming. Stream yang dibatalkan tetap mencatat penggunaan parsial.
- Error tidak membocorkan apa pun. Kegagalan penyedia di tengah stream memancarkan frame error generik (
upstream_error) tanpa detail internal — pesan penyedia mentah hanya tersimpan di log server.
Keterbatasan yang diketahui
- Batch routing — request streaming selalu memakai jalur real-time. Batch ditujukan untuk beban kerja non-interaktif di mana SLA 5–30 menit dapat diterima sebagai ganti biaya ~50%.
- MCP per-tool RBAC — saat ini hanya diberlakukan pada response JSON. Jika alur kerja Anda butuh penolakan ketat per tool, panggil dengan
stream: falsesampai RBAC streaming dirilis. - Penulisan semantic cache terjadi saat stream ditutup, bukan per chunk. Cache hit memotong stream dan mengembalikan JSON (karena response penuh sudah diketahui).
Coba streaming di playground dashboard
Bandingkan 3 panel dengan output streaming berdampingan.