Skip to main content
Generasi teks

Streaming output

Pada aplikasi chat real-time atau generasi teks panjang, waktu tunggu yang lama dapat menurunkan pengalaman pengguna dan memicu timeout di sisi server, sehingga menyebabkan tugas gagal. Streaming output mengatasi masalah ini dengan terus-menerus mengembalikan fragmen teks saat model menghasilkannya.

Cara kerja

Streaming output menggunakan protokol Server-Sent Events (SSE). Setelah permintaan streaming dimulai, server membentuk koneksi HTTP persisten dengan klien. Setiap kali model menghasilkan blok teks (disebut chunk), server segera mendorongnya melalui koneksi tersebut. Setelah seluruh konten dihasilkan, server mengirimkan sinyal akhir. Klien mendengarkan aliran event dan menerima serta memproses chunk teks secara real-time—misalnya, merender karakter satu per satu pada antarmuka. Ini berbeda dari panggilan non-streaming yang mengembalikan seluruh konten sekaligus.
Komponen di atas hanya sebagai referensi dan tidak mengirimkan permintaan aktual.

Billing

Streaming output menggunakan aturan penagihan yang sama dengan panggilan non-streaming, yaitu dikenakan biaya berdasarkan jumlah token input dan token output dalam permintaan. Jika permintaan terputus, token output hanya dihitung untuk bagian yang telah dihasilkan sebelum server menerima permintaan penghentian.

Cara menggunakan

Edisi open-source Qwen3, edisi komersial dan open-source QwQ, QVQ, dan Qwen-Omni hanya mendukung streaming output.

Langkah 1: Konfigurasikan Kunci API Anda dan pilih wilayah

Anda harus telah memperoleh Kunci API dan mengonfigurasikannya sebagai variabel lingkungan.
Mengonfigurasi Kunci API Anda sebagai variabel lingkungan (DASHSCOPE_API_KEY) lebih aman daripada melakukan hardcoding di kode Anda.

Langkah 2: Lakukan permintaan streaming

  • Kompatibel dengan OpenAI
  • DashScope
  • Cara mengaktifkan Atur stream ke true.
  • Lihat penggunaan token Protokol OpenAI tidak mengembalikan informasi penggunaan token secara default. Atur stream_options={"include_usage": true} agar chunk data terakhir yang dikembalikan mencakup informasi penggunaan token.
  • Python
  • Node.js
  • curl
import os
from openai import OpenAI

# 1. Persiapan: Inisialisasi client
client = OpenAI(
    # Konfigurasikan Kunci API menggunakan variabel lingkungan untuk menghindari hardcoding.
    api_key=os.environ["DASHSCOPE_API_KEY"],
    # Kunci API terikat erat pada wilayah. Pastikan base_url sesuai dengan wilayah Kunci API Anda.
    # URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL bervariasi berdasarkan wilayah.
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

# 2. Lakukan permintaan streaming
completion = client.chat.completions.create(
    model="qwen-plus",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Please introduce yourself"}
    ],
    stream=True,
    stream_options={"include_usage": True}
)

# 3. Tangani respons streaming
# Simpan fragmen respons dalam daftar. Menggabungkannya di akhir lebih efisien daripada penggabungan string berulang.
content_parts = []
print("AI: ", end="", flush=True)

for chunk in completion:
    if chunk.choices:
        content = chunk.choices[0].delta.content or ""
        print(content, end="", flush=True)
        content_parts.append(content)
    elif chunk.usage:
        print("\n--- Request usage ---")
        print(f"Input Tokens: {chunk.usage.prompt_tokens}")
        print(f"Output Tokens: {chunk.usage.completion_tokens}")
        print(f"Total Tokens: {chunk.usage.total_tokens}")

full_response = "".join(content_parts)
# print(f"\n--- Full response ---\n{full_response}")

Respons

AI: Hello! I am Qwen, a large-scale language model independently developed by Tongyi Lab under Alibaba Group. I can answer questions, create content such as stories, official documents, emails, scripts, perform logical reasoning, programming, express opinions, play games, and more. I support multiple languages, including but not limited to Chinese, English, German, French, and Spanish. If you have any questions or need help, feel free to ask me anytime!
--- Request usage ---
Input Tokens: 26
Output Tokens: 87
Total Tokens: 113

Streaming output untuk model multimodal

Model multimodal mendukung penambahan gambar, audio, dan konten lain ke dalam percakapan. Implementasi streaming output-nya berbeda dari model teks saja dalam hal-hal berikut:
  • Konstruksi pesan pengguna: Input model multimodal tidak hanya mencakup teks, tetapi juga gambar, audio, dan informasi multimodal lainnya.
  • Antarmuka SDK DashScope: Gunakan antarmuka MultiModalConversation di SDK Python DashScope. Gunakan kelas MultiModalConversation di SDK Java DashScope.
Untuk model multimodal, lihat Pemahaman gambar dan video, Ekstraksi teks, Pemahaman audio—Qwen3-Omni-Captioner, Kimi, dll. Model Qwen-Omni hanya mendukung streaming output karena output-nya dapat mencakup teks atau audio dan konten multimodal lainnya. Penguraian hasilnya berbeda dari model lain. Untuk detailnya, lihat Omni-modal.
  • Kompatibel dengan OpenAI
  • DashScope
Python
from openai import OpenAI
import os

client = OpenAI(
    # Kunci API berbeda berdasarkan wilayah. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL bervariasi berdasarkan wilayah.
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3-vl-plus",  # Ganti dengan model multimodal lain sesuai kebutuhan dan sesuaikan messages
    messages=[
        {"role": "user",
        "content": [{"type": "image_url",
                    "image_url": {"url": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"},},
                    {"type": "text", "text": "What scene is depicted in the image?"}]}],
    stream=True,
  # stream_options={"include_usage": True}
)
full_content = ""
print("Streaming output content:")
for chunk in completion:
    # Jika stream_options.include_usage adalah True, field choices pada chunk terakhir adalah daftar kosong dan harus dilewati (penggunaan token dapat diperoleh melalui chunk.usage)
    if chunk.choices and chunk.choices[0].delta.content != "":
        full_content += chunk.choices[0].delta.content
        print(chunk.choices[0].delta.content)
print(f"Full content: {full_content}")

Streaming output untuk model berpikir

Model berpikir pertama-tama mengembalikan reasoning_content (proses berpikir), lalu mengembalikan content (respons). Tentukan apakah tahap saat ini adalah berpikir atau merespons berdasarkan status paket data.
Untuk detail tentang model berpikir, lihat Pemikiran mendalam, Pemahaman gambar dan video, Penalaran visual.
Untuk implementasi streaming output Qwen3-Omni-Flash (mode berpikir), lihat Omni-modal.
  • Kompatibel dengan OpenAI
  • DashScope
Berikut adalah format respons saat memanggil mode berpikir model qwen-plus menggunakan SDK Python OpenAI dalam mode streaming:
# Tahap berpikir
...
ChoiceDelta(content=None, function_call=None, refusal=None, role=None, tool_calls=None, reasoning_content='Cover all key points while')
ChoiceDelta(content=None, function_call=None, refusal=None, role=None, tool_calls=None, reasoning_content='remaining natural and fluent.')
# Tahap respons
ChoiceDelta(content='Hello! I am **Qwen', function_call=None, refusal=None, role=None, tool_calls=None, reasoning_content=None)
ChoiceDelta(content='** (', function_call=None, refusal=None, role=None, tool_calls=None, reasoning_content=None)
...
  • Jika reasoning_content tidak None dan content adalah None, tahap saat ini adalah berpikir.
  • Jika reasoning_content adalah None dan content tidak None, tahap saat ini adalah merespons.
  • Jika keduanya adalah None, tahap tetap sama seperti paket sebelumnya.
  • Python
  • Node.js
  • HTTP

Kode contoh

from openai import OpenAI
import os

# Inisialisasi client OpenAI
client = OpenAI(
    # Jika Anda belum mengonfigurasi variabel lingkungan, ganti dengan Kunci API Alibaba Cloud Model Studio Anda: api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)

messages = [{"role": "user", "content": "Who are you"}]

completion = client.chat.completions.create(
    model="qwen-plus",  # Ganti dengan model berpikir mendalam lain sesuai kebutuhan
    messages=messages,
    # Parameter enable_thinking mengaktifkan proses berpikir. Parameter ini tidak berpengaruh pada model qwen3-30b-a3b-thinking-2507, qwen3-235b-a22b-thinking-2507, dan QwQ.
    extra_body={"enable_thinking": True},
    stream=True,
    # stream_options={
    #     "include_usage": True
    # },
)

reasoning_content = ""  # Proses berpikir lengkap
answer_content = ""  # Respons lengkap
is_answering = False  # Apakah sedang dalam tahap respons
print("\n" + "=" * 20 + "Thought process" + "=" * 20 + "\n")

for chunk in completion:
    if not chunk.choices:
        print("\nUsage:")
        print(chunk.usage)
        continue

    delta = chunk.choices[0].delta

    # Kumpulkan hanya konten berpikir
    if hasattr(delta, "reasoning_content") and delta.reasoning_content is not None:
        if not is_answering:
            print(delta.reasoning_content, end="", flush=True)
        reasoning_content += delta.reasoning_content

    # Menerima konten, mulai merespons
    if hasattr(delta, "content") and delta.content:
        if not is_answering:
            print("\n" + "=" * 20 + "Full response" + "=" * 20 + "\n")
            is_answering = True
        print(delta.content, end="", flush=True)
        answer_content += delta.content

Respons

====================Thought process====================

Okay, the user asked "Who are you," so I need to give an accurate and friendly answer. First, I should confirm my identity as Qwen, developed by Tongyi Lab under Alibaba Group. Next, explain my main functions, like answering questions, creating text, logical reasoning, etc. Keep the tone approachable and avoid overly technical terms so the user feels comfortable. Also, avoid complex jargon and ensure the answer is concise. Additionally, include some interactive elements to encourage further questions. Finally, check for any missing key information, such as my Chinese name "Tongyi Qianwen" and English name "Qwen," along with my company and lab. Make sure the response is comprehensive and meets user expectations.
====================Full response====================

Hello! I am Qwen, a large-scale language model independently developed by Tongyi Lab under Alibaba Group. I can answer questions, create text, perform logical reasoning, programming, and more, aiming to provide high-quality information and services. You can call me Qwen or simply Tongyi Qianwen. How can I help you?

Going live

  • Kinerja dan manajemen sumber daya: Pada layanan backend, mempertahankan koneksi HTTP persisten untuk setiap permintaan streaming mengonsumsi sumber daya. Konfigurasikan layanan Anda dengan ukuran kolam koneksi dan nilai timeout yang sesuai. Pada skenario konkurensi tinggi, pantau penggunaan deskriptor file untuk mencegah kehabisan.
  • Rendering sisi klien: Pada antarmuka depan web, gunakan API ReadableStream dan TextDecoderStream untuk menangani dan merender aliran event SSE dengan lancar, memberikan pengalaman pengguna terbaik.
  • Pemantauan model:
    • Metrik utama: Pantau Time to First Token (TTFT), metrik inti untuk pengalaman streaming. Juga pantau tingkat kesalahan API dan waktu respons rata-rata.
    • Peringatan: Atur peringatan untuk tingkat kesalahan API yang tidak normal, terutama kesalahan 4xx dan 5xx.
  • Konfigurasi proxy Nginx: Jika menggunakan Nginx sebagai reverse proxy, buffering output default-nya (proxy_buffering) mengganggu sifat real-time dari respons streaming. Untuk memastikan data didorong ke klien segera, nonaktifkan fitur ini dengan mengatur proxy_buffering off dalam file konfigurasi Nginx Anda.

Kode kesalahan

Jika panggilan model gagal dan mengembalikan pesan kesalahan, lihat Kode kesalahan untuk resolusi.

FAQ

T: Mengapa tidak ada informasi penggunaan dalam respons?

J: Protokol OpenAI tidak mengembalikan informasi penggunaan secara default. Atur parameter stream_options untuk menyertakan informasi penggunaan dalam paket terakhir yang dikembalikan.

T: Apakah mengaktifkan streaming output memengaruhi kualitas respons model?

J: Tidak. Namun, beberapa model hanya mendukung streaming output, dan panggilan non-streaming dapat menyebabkan kesalahan timeout. Kami merekomendasikan menggunakan streaming output.

T: Apa perbedaan antara panggilan non-streaming dan streaming?

J: Perbedaan utama:
  • Batas waktu timeout: Untuk panggilan non-streaming, timeout maksimum minimal 300 detik dan bervariasi berdasarkan wilayah dan model. Jika tidak selesai tepat waktu, permintaan akan dihentikan.
  • Struktur output: Panggilan non-streaming mengembalikan respons lengkap (objek JSON tunggal) sekaligus. Panggilan streaming mengembalikan chunk data secara progresif melalui protokol SSE, dengan setiap chunk berisi bagian dari konten yang dihasilkan. Klien harus merakit chunk-chunk tersebut.
  • Kompatibilitas fitur: Keduanya mendukung fitur seperti JSON Mode dan Function Call tanpa perbedaan fungsional.
Kami merekomendasikan menggunakan streaming output untuk menghindari timeout dan meningkatkan pengalaman pengguna.

T: Apakah streaming output mendukung JSON Mode (output terstruktur)?

J: Ya. Atur stream ke true dan response_format ke {"type": "json_object"} dalam permintaan. Model akan mengembalikan fragmen konten berformat JSON secara progresif. Output akhir yang dirakit akan menjadi JSON yang valid.
Rencana Token (Team Edition)
Model playground
Statistik dan Pemantauan
Asset Center
Dukungan layanan
Streaming output - Alibaba Cloud Model Studio