Langsung ke konten utama

Ringkasan

Streaming memungkinkan Anda menerima output parsial saat output tersebut dihasilkan, yang meningkatkan latensi yang dirasakan dan pengalaman pengguna. Untuk integrasi baru bergaya OpenAI, utamakan Responses streaming terlebih dahulu. Jika framework Anda masih menggunakan Chat Completions streaming, LemonData juga mendukung jalur kompatibilitas tersebut.

Direkomendasikan: Responses Streaming

curl https://api.lemondata.cc/v1/responses \
  -H "Authorization: Bearer sk-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-5.4",
    "input": "Write a short poem.",
    "stream": true
  }'

Streaming Chat Completions

Jika framework Anda masih mengharapkan chunk SSE dari /v1/chat/completions, itu juga berfungsi:
stream = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Write a short poem"}],
    stream=True
)

for chunk in stream:
    content = chunk.choices[0].delta.content
    if content:
        print(content, end="", flush=True)

Kondisi Akhir Stream

Kondisi penyelesaian yang umum:
  • response.completed untuk stream Responses API
  • finish_reason: "stop" untuk stream Chat Completions
  • finish_reason: "length" saat batas token tercapai
  • event pemanggilan tool/function saat model ingin menggunakan tool

Pola Aplikasi Web

async function streamChat(message) {
  const response = await fetch('https://api.lemondata.cc/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer sk-your-api-key',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      model: 'gpt-4o',
      messages: [{ role: 'user', content: message }],
      stream: true
    })
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    const chunk = decoder.decode(value);
    const lines = chunk.split('\\n').filter(line => line.startsWith('data: '));

    for (const line of lines) {
      const data = line.slice(6);
      if (data === '[DONE]') return;
      const parsed = JSON.parse(data);
      const content = parsed.choices?.[0]?.delta?.content;
      if (content) {
        document.getElementById('output').textContent += content;
      }
    }
  }
}

Praktik Terbaik

Gunakan /v1/responses jika SDK atau aplikasi Anda sudah mendukungnya. Pertahankan streaming /v1/chat/completions untuk integrasi yang didorong oleh kebutuhan kompatibilitas.
Tambahkan chunk delta ke UI atau terminal saat chunk tersebut tiba alih-alih menunggu respons penuh.
Perlakukan gangguan jaringan dan pemutusan koneksi upstream sebagai mode kegagalan yang normal, dan lakukan koneksi ulang dengan hati-hati untuk sesi yang berjalan lama.