Respons Streaming
Respons Streaming memungkinkan Anda menerima output secara real time saat model sedang menghasilkan jawaban, sehingga meningkatkan pengalaman pengguna dan kecepatan yang dirasakan.
Cara Kerja#
诺玛AI menggunakan protokol Server-Sent Events (SSE) untuk menerapkan Respons Streaming:
- Klien menetapkan `stream: true` saat mengirim permintaan
- Server mengembalikan potongan konten yang dihasilkan secara bertahap (chunk)
- Setiap chunk dikirim melalui SSE dengan awalan `data: `
- Saat proses selesai, server mengirim `data: [DONE]`
Streaming Protokol OpenAI#
cURL
Kode
curl https://as.apinoma.com/v1/chat/completions \
-H "Authorization: Bearer $APINOMA_API_KEY" \
-H "Content-Type: application/json" \
-N \
-d '{
"model": "openai/gpt-4o",
"messages": [{"role": "user", "content": "Tulis puisi tentang pemrograman"}],
"stream": true
}'Python
TypeScript
Streaming Protokol Anthropic#
Python
Kode
import anthropic
client = anthropic.Anthropic(
base_url="https://as.apinoma.com/anthropic",
api_key="<APINOMA_API_KEY_ANDA>"
)
with client.messages.stream(
model="anthropic/claude-sonnet-4.6",
max_tokens=1024,
messages=[{"role": "user", "content": "Tulis puisi tentang pemrograman"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)TypeScript
Streaming + Function Calling#
Respons Streaming juga mendukung skenario Pemanggilan Fungsi. Model akan lebih dulu mengalirkan permintaan panggilan alat; setelah Anda memprosesnya, percakapan dapat dilanjutkan:
Kode
stream = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": "Bagaimana cuaca di Jakarta hari ini?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Mengambil cuaca untuk kota tertentu",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "Nama kota"}
},
"required": ["city"]
}
}
}],
stream=True
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.tool_calls:
# Tangani panggilan alat
print(f"Memanggil alat: {delta.tool_calls[0].function}")
elif delta.content:
print(delta.content, end="", flush=True)Penanganan Error dan Koneksi Ulang#
Koneksi streaming dapat terputus karena masalah jaringan. Sebaiknya terapkan logika koneksi ulang.
Kode
import time
def stream_with_retry(client, max_retries=3, **kwargs):
for attempt in range(max_retries):
try:
stream = client.chat.completions.create(stream=True, **kwargs)
for chunk in stream:
yield chunk
return # Berhasil selesai
except Exception as e:
if attempt < max_retries - 1:
wait = 2 ** attempt # Backoff eksponensial
print(f"\nKoneksi terputus, {wait}s lalu coba lagi...")
time.sleep(wait)
else:
raise ePraktik Terbaik#
- Selalu tetapkan timeout — hindari menunggu tanpa batas
- Tangani chunk yang tidak lengkap — beberapa chunk mungkin tidak memiliki content
- Terapkan mekanisme koneksi ulang — gunakan strategi exponential backoff
- Gunakan `flush` di frontend — pastikan konten tampil segera
Terakhir diperbarui pada 23 Juni 2026