Panggilan API pertama & streaming
Panggilan API biasa menunggu sampai seluruh jawaban selesai baru mengembalikan hasil. Untuk jawaban panjang, itu terasa lambat di mata pengguna — streaming memecah masalah ini.
Intisari
- Panggilan non-streaming menunggu model selesai generate seluruh jawaban baru mengembalikan respons — sederhana, tapi terasa lambat untuk jawaban panjang.
- Streaming mengirim token demi token begitu dihasilkan, lewat server-sent events (SSE) — inilah efek 'mengetik' yang dilihat di ChatGPT/Claude.
- Streaming tidak membuat model menghasilkan jawaban lebih cepat secara total — ia membuat waktu sampai token pertama terlihat (time-to-first-token) jauh lebih pendek.
- Untuk proses latar belakang (batch job, ekstraksi data) yang tidak ada manusia menunggu di layar, non-streaming biasanya lebih sederhana dan cukup.
- Streaming punya bentuk event terstruktur (
message_start,content_block_delta,message_stop, dst) yang harus di-parse, bukan cuma teks mentah.
Non-streaming: sederhana, tapi menunggu
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Jelaskan apa itu RAG dalam 5 paragraf"}],
)
print(response.content[0].text) # baru tercetak setelah SELURUH jawaban selesai
Kode ini menunggu sampai model selesai menghasilkan seluruh jawaban — bisa beberapa detik untuk jawaban panjang — baru mengembalikan apa pun. Untuk proses backend yang tidak ada manusia menonton layar (job batch, pipeline ekstraksi data), ini biasanya cukup dan lebih sederhana kodenya.
Streaming: token demi token
Untuk aplikasi yang berhadapan langsung dengan pengguna — chatbot, asisten menulis — pengguna tidak mau menatap layar kosong selama lima detik. Streaming mengirim jawaban token demi token begitu dihasilkan, lewat mekanisme HTTP bernama server-sent events (SSE): koneksi tetap terbuka, server mengirim potongan data satu per satu.
with client.messages.stream(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Jelaskan apa itu RAG dalam 5 paragraf"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True) # tercetak sepotong-sepotong, secara real-time
Streaming tidak mempercepat model. Total waktu sampai jawaban lengkap selesai kurang lebih sama. Yang berubah adalah persepsi kecepatan: pengguna melihat kata pertama muncul dalam <1 detik, bukan menunggu 5 detik layar kosong lalu semuanya muncul sekaligus. Metrik yang dipakai untuk mengukur ini disebut time-to-first-token (TTFT), dan ia jadi salah satu metrik observability penting yang dibahas lagi di Fase 7.
Bentuk event di balik streaming
Di level HTTP mentah, streaming bukan cuma "teks yang dipotong-potong" — ia deretan event terstruktur.
Kalau kamu memakai SDK resmi, ini semua ditangani otomatis lewat stream.text_stream seperti di
atas. Tapi penting tahu bentuknya untuk debugging atau saat membangun integrasi custom:
event: message_start
data: {"type": "message_start", "message": {...}}
event: content_block_delta
data: {"type": "content_block_delta", "delta": {"type": "text_delta", "text": "RAG"}}
event: content_block_delta
data: {"type": "content_block_delta", "delta": {"type": "text_delta", "text": " adalah"}}
event: message_stop
data: {"type": "message_stop"}
| Kebutuhan | Pakai |
|---|---|
| Chatbot, asisten interaktif | Streaming — pengguna menunggu di layar |
| Job batch, pipeline data, ekstraksi terstruktur | Non-streaming — tidak ada yang menonton, kodenya lebih sederhana |
| Tool use / agent dengan banyak langkah | Bergantung — sering non-streaming di tiap langkah internal, streaming hanya di respons final ke pengguna |
Konsekuensi arsitektur di sisi backend: handler HTTP yang mem-proxy streaming dari provider LLM ke browser harus ikut mempertahankan koneksi terbuka selama proses berlangsung — ini memengaruhi pilihan timeout server, load balancer, dan bagaimana frontend menangani koneksi yang terputus di tengah jalan. Ini salah satu alasan arsitektur backend AI berbeda dari CRUD API biasa, dibahas lagi di Fase 2 dan 6.
Latihan: jalankan kedua versi kode di atas (streaming & non-streaming) dengan prompt yang
sama, dan ukur dengan time.time(): (1) waktu sampai karakter pertama muncul di layar, dan
(2) waktu sampai selesai total. Bandingkan angkanya antara dua pendekatan.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.