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 dengan panggilan non-streaming yang mengembalikan seluruh konten sekaligus.
Komponen di atas hanya sebagai referensi dan tidak mengirimkan permintaan aktual.
Penagihan
Streaming output menggunakan aturan penagihan yang sama dengan panggilan non-streaming, yaitu 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: Buat permintaan streaming
Kompatibel dengan OpenAI
-
Cara mengaktifkan
Atur
streamketrue. -
Lihat penggunaan token
Protokol OpenAI secara default tidak mengembalikan informasi penggunaan token. Atur
stream_options={"include_usage": true}agar chunk data terakhir yang dikembalikan mencakup informasi penggunaan token.
Python
import os
from openai import OpenAI
# 1. Persiapan: Inisialisasi klien
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 berbeda-beda tergantung wilayah.
base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
# 2. Buat 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--- Penggunaan permintaan ---")
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--- Respons lengkap ---\n{full_response}")
Respons
AI: Halo! Saya Qwen, sebuah model bahasa skala besar yang dikembangkan secara mandiri oleh Tongyi Lab di bawah Alibaba Group. Saya dapat menjawab pertanyaan, membuat konten seperti cerita, dokumen resmi, email, skrip, melakukan penalaran logis, pemrograman, menyatakan pendapat, bermain game, dan banyak lagi. Saya mendukung berbagai bahasa, termasuk tetapi tidak terbatas pada Mandarin, Inggris, Jerman, Prancis, dan Spanyol. Jika Anda memiliki pertanyaan atau memerlukan bantuan, jangan ragu untuk bertanya kepada saya kapan saja!
--- Penggunaan Permintaan ---
Token Input: 26
Token Output: 87
Total Token: 113
Node.js
import OpenAI from "openai";
async function main() {
// 1. Persiapan: Inisialisasi klien
// Konfigurasikan Kunci API menggunakan variabel lingkungan untuk menghindari hardcoding.
if (!process.env.DASHSCOPE_API_KEY) {
throw new Error("Setel variabel lingkungan DASHSCOPE_API_KEY");
}
// Kunci API terikat erat pada wilayah. Pastikan baseURL sesuai dengan wilayah Kunci API Anda.
// URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda-beda tergantung wilayah.
const client = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY,
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
});
try {
// 2. Buat permintaan streaming
const stream = await client.chat.completions.create({
model: "qwen-plus",
messages: [
{ role: "system", content: "You are a helpful assistant." },
{ role: "user", content: "Please introduce yourself" },
],
stream: true,
// Tujuan: Dapatkan penggunaan token pada chunk terakhir.
stream_options: { include_usage: true },
});
// 3. Tangani respons streaming
const contentParts = [];
process.stdout.write("AI: ");
for await (const chunk of stream) {
// Chunk terakhir tidak berisi choices tetapi mencakup informasi penggunaan.
if (chunk.choices && chunk.choices.length > 0) {
const content = chunk.choices[0]?.delta?.content || "";
process.stdout.write(content);
contentParts.push(content);
} else if (chunk.usage) {
// Permintaan selesai. Cetak penggunaan token.
console.log("\n--- Penggunaan permintaan ---");
console.log(`Input Tokens: ${chunk.usage.prompt_tokens}`);
console.log(`Output Tokens: ${chunk.usage.completion_tokens}`);
console.log(`Total Tokens: ${chunk.usage.total_tokens}`);
}
}
const fullResponse = contentParts.join("");
// console.log(`\n--- Respons lengkap ---\n${fullResponse}`);
} catch (error) {
console.error("Permintaan gagal:", error);
}
}
main();
Respons
AI: Halo! Saya Qwen, sebuah model bahasa skala besar yang dikembangkan secara mandiri oleh Tongyi Lab di bawah Alibaba Group. Saya dapat menjawab pertanyaan, membuat konten seperti cerita, dokumen resmi, email, skrip, melakukan penalaran logis, pemrograman, menyatakan pendapat, bermain game, dan banyak lagi. Saya mendukung berbagai bahasa, termasuk namun tidak terbatas pada Bahasa Mandarin, Inggris, Jerman, Prancis, dan Spanyol. Jika Anda memiliki pertanyaan atau memerlukan bantuan, jangan ragu untuk bertanya kepada saya kapan saja!
--- Penggunaan Permintaan ---
Token Input: 26
Token Output: 89
Total Token: 115
curl
Permintaan
# ======= Catatan penting =======
# Pastikan variabel lingkungan DASHSCOPE_API_KEY telah disetel
# Kunci API berbeda-beda tergantung wilayah. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# === Hapus komentar ini sebelum menjalankan ===
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
--no-buffer \
-d '{
"model": "qwen-plus",
"messages": [
{"role": "user", "content": "Who are you?"}
],
"stream": true,
"stream_options": {"include_usage": true}
}'
Respons
Respons mengikuti protokol SSE. Setiap baris yang diawali dengan data: merepresentasikan chunk data.
data: {"choices":[{"delta":{"content":"","role":"assistant"},"index":0,"logprobs":null,"finish_reason":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[{"finish_reason":null,"delta":{"content":"I am"},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[{"delta":{"content":" from"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[{"delta":{"content":" Alibaba"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[{"delta":{"content":"'s large-scale language"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[{"delta":{"content":" model, my name is Qwen"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[{"delta":{"content":"."},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[{"finish_reason":"stop","delta":{"content":""},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":22,"completion_tokens":17,"total_tokens":39},"created":1726132850,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-428b414f-fdd4-94c6-b179-8f576ad653a8"}
data: [DONE]
-
data:: Muatan pesan, biasanya berupa string JSON. -
[DONE]: Menandakan akhir dari seluruh respons streaming.
DashScope
-
Cara mengaktifkan
Metode untuk mengaktifkan streaming output bervariasi tergantung SDK atau alat yang digunakan:
-
SDK Python: Atur parameter
streamkeTrue. -
SDK Java: Gunakan antarmuka
streamCall. -
cURL: Atur header
X-DashScope-SSEkeenable.
-
-
Aktifkan output inkremental
Protokol DashScope mendukung output streaming inkremental maupun non-inkremental:
-
Inkremental (direkomendasikan): Setiap chunk data hanya berisi konten yang baru dihasilkan. Atur
incremental_outputketrueuntuk mengaktifkan output streaming inkremental.Contoh: ["I love","eating","apples"]
-
Non-inkremental: Setiap chunk data berisi seluruh konten yang telah dihasilkan sebelumnya, sehingga membuang lebar pita jaringan dan meningkatkan beban pemrosesan klien. Atur
incremental_outputkefalseuntuk mengaktifkan output streaming non-inkremental.Contoh: ["I love","I love eating","I love eating apples"]
-
-
Lihat penggunaan token
Setiap chunk data mencakup informasi penggunaan token secara real-time.
Python
import os
from http import HTTPStatus
import dashscope
from dashscope import Generation
# 1. Persiapan: Konfigurasikan Kunci API dan wilayah
# Konfigurasikan Kunci API menggunakan variabel lingkungan untuk menghindari hardcoding.
try:
dashscope.api_key = os.environ["DASHSCOPE_API_KEY"]
except KeyError:
raise ValueError("Setel variabel lingkungan DASHSCOPE_API_KEY")
# Kunci API terikat erat pada wilayah. Pastikan base_url sesuai dengan wilayah Kunci API Anda.
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"
# 2. Buat permintaan streaming
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Please introduce yourself"},
]
try:
responses = Generation.call(
model="qwen-plus",
messages=messages,
result_format="message",
stream=True,
# Penting: Atur ke True untuk output inkremental, yang menawarkan kinerja lebih baik.
incremental_output=True,
)
# 3. Tangani respons streaming
content_parts = []
print("AI: ", end="", flush=True)
for resp in responses:
if resp.status_code == HTTPStatus.OK:
content = resp.output.choices[0].message.content
print(content, end="", flush=True)
content_parts.append(content)
# Periksa apakah ini paket terakhir
if resp.output.choices[0].finish_reason == "stop":
usage = resp.usage
print("\n--- Penggunaan permintaan ---")
print(f"Input Tokens: {usage.input_tokens}")
print(f"Output Tokens: {usage.output_tokens}")
print(f"Total Tokens: {usage.total_tokens}")
else:
# Tangani kesalahan
print(
f"\nPermintaan gagal: request_id={resp.request_id}, code={resp.code}, message={resp.message}"
)
break
full_response = "".join(content_parts)
# print(f"\n--- Respons lengkap ---\n{full_response}")
except Exception as e:
print(f"Terjadi kesalahan tak dikenal: {e}")
Respons
AI: Halo! Saya Qwen, sebuah model bahasa skala besar yang dikembangkan secara mandiri oleh Tongyi Lab di bawah Alibaba Group. Saya dapat membantu Anda menjawab pertanyaan, membuat konten seperti cerita, dokumen resmi, email, skrip, melakukan penalaran logis, pemrograman, menyatakan pendapat, bermain game, dan banyak lagi. Saya mendukung berbagai bahasa, termasuk namun tidak terbatas pada bahasa Mandarin, Inggris, Jerman, Prancis, dan Spanyol. Jika Anda memiliki pertanyaan atau memerlukan bantuan, jangan ragu untuk bertanya kepada saya kapan saja!
--- Penggunaan permintaan ---
Token Input: 26
Token Output: 91
Total Token: 117
Java
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import io.reactivex.Flowable;
import io.reactivex.schedulers.Schedulers;
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import com.alibaba.dashscope.protocol.Protocol;
public class Main {
public static void main(String[] args) {
// 1. Dapatkan Kunci API
String apiKey = System.getenv("DASHSCOPE_API_KEY");
if (apiKey == null || apiKey.isEmpty()) {
System.err.println("Setel variabel lingkungan DASHSCOPE_API_KEY");
return;
}
// 2. Inisialisasi instance Generation
// Kunci API terikat erat pada wilayah. Pastikan baseUrl sesuai dengan wilayah Kunci API Anda.
Generation gen = new Generation(Protocol.HTTP.getValue(), "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1");
CountDownLatch latch = new CountDownLatch(1);
// 3. Bangun parameter permintaan
GenerationParam param = GenerationParam.builder()
.apiKey(apiKey)
.model("qwen-plus")
.messages(Arrays.asList(
Message.builder()
.role(Role.USER.getValue())
.content("Introduce yourself")
.build()
))
.resultFormat(GenerationParam.ResultFormat.MESSAGE)
.incrementalOutput(true) // Aktifkan output inkremental untuk streaming
.build();
// 4. Lakukan panggilan streaming dan tangani respons
try {
Flowable<GenerationResult> result = gen.streamCall(param);
StringBuilder fullContent = new StringBuilder();
System.out.print("AI: ");
result
.subscribeOn(Schedulers.io()) // Jalankan permintaan pada thread IO
.observeOn(Schedulers.computation()) // Proses respons pada thread komputasi
.subscribe(
// onNext: Tangani setiap fragmen respons
message -> {
String content = message.getOutput().getChoices().get(0).getMessage().getContent();
String finishReason = message.getOutput().getChoices().get(0).getFinishReason();
// Keluarkan konten
System.out.print(content);
fullContent.append(content);
// Ketika finishReason tidak null, itu menandakan chunk terakhir. Keluarkan info penggunaan.
if (finishReason != null && !"null".equals(finishReason)) {
System.out.println("\n--- Penggunaan permintaan ---");
System.out.println("Input Tokens: " + message.getUsage().getInputTokens());
System.out.println("Output Tokens: " + message.getUsage().getOutputTokens());
System.out.println("Total Tokens: " + message.getUsage().getTotalTokens());
}
System.out.flush(); // Segera flush output
},
// onError: Tangani kesalahan
error -> {
System.err.println("\nPermintaan gagal: " + error.getMessage());
latch.countDown();
},
// onComplete: Callback penyelesaian
() -> {
System.out.println(); // Baris baru
// System.out.println("Respons lengkap: " + fullContent.toString());
latch.countDown();
}
);
// Thread utama menunggu tugas async selesai
latch.await();
System.out.println("Eksekusi program selesai");
} catch (Exception e) {
System.err.println("Pengecualian permintaan: " + e.getMessage());
e.printStackTrace();
}
}
}
Respons
AI: Hello! I am Qwen, a large-scale language model independently developed by Tongyi Lab under Alibaba Group. I can help you 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!
--- Penggunaan permintaan ---
Input Tokens: 26
Output Tokens: 91
Total Tokens: 117
curl
Permintaan
# ======= Catatan penting =======
# Pastikan variabel lingkungan DASHSCOPE_API_KEY telah disetel
# Kunci API berbeda-beda tergantung wilayah. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda-beda tergantung wilayah.
# === Hapus komentar ini sebelum menjalankan ===
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/text-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-DashScope-SSE: enable" \
-d '{
"model": "qwen-plus",
"input":{
"messages":[
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Who are you?"
}
]
},
"parameters": {
"result_format": "message",
"incremental_output":true
}
}'
Respons
Respons mengikuti format Server-Sent Events (SSE). Setiap pesan mencakup:
-
id: Nomor chunk data.
-
event: Jenis event, selalu "result".
-
Informasi kode status HTTP.
-
data: Data berformat JSON.
id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"I am","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":27,"output_tokens":1,"input_tokens":26,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"d30a9914-ac97-9102-b746-ce0cb35e3fa2"}
id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"Qwen","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":30,"output_tokens":4,"input_tokens":26,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"d30a9914-ac97-9102-b746-ce0cb35e3fa2"}
id:3
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":" from Alibaba","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":33,"output_tokens":7,"input_tokens":26,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"d30a9914-ac97-9102-b746-ce0cb35e3fa2"}
...
id:13
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"or need help, feel free to","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":90,"output_tokens":64,"input_tokens":26,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"d30a9914-ac97-9102-b746-ce0cb35e3fa2"}
id:14
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"ask me!","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":92,"output_tokens":66,"input_tokens":26,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"d30a9914-ac97-9102-b746-ce0cb35e3fa2"}
id:15
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":92,"output_tokens":66,"input_tokens":26,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"d30a9914-ac97-9102-b746-ce0cb35e3fa2"}
Keluaran streaming untuk model multimodal
Model multimodal mendukung penambahan gambar, audio, dan konten lain ke dalam percakapan. Implementasi keluaran streaming-nya berbeda dari model teks saja dalam hal-hal berikut:
-
Konstruksi pesan pengguna: Input model multimodal mencakup tidak hanya 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 keluaran streaming karena output-nya dapat mencakup teks atau audio serta konten multimodal lainnya. Penguraian hasilnya berbeda dari model lain. Untuk detailnya, lihat Omni-modal.
Kompatibel dengan OpenAI
Python
from openai import OpenAI
import os
client = OpenAI(
# Kunci API berbeda tiap 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 berbeda tiap 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-nya
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": "Adegan apa yang digambarkan dalam gambar ini?"}]}],
stream=True,
# stream_options={"include_usage": True}
)
full_content = ""
print("Konten keluaran streaming:")
for chunk in completion:
# Jika stream_options.include_usage bernilai True, field choices pada chunk terakhir adalah daftar kosong dan harus dilewati (token usage 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"Konten lengkap: {full_content}")Node.js
import OpenAI from "openai";
const openai = new OpenAI(
{
// Kunci API berbeda tiap 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: apiKey: "sk-xxx"
apiKey: process.env.DASHSCOPE_API_KEY,
// URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
}
);
const completion = await openai.chat.completions.create({
model: "qwen3-vl-plus", // Ganti dengan model multimodal lain sesuai kebutuhan dan sesuaikan messages-nya
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": "Adegan apa yang digambarkan dalam gambar ini?"}]}],
stream: true,
// stream_options: { include_usage: true },
});
let fullContent = ""
console.log("Konten keluaran streaming:")
for await (const chunk of completion) {
// Jika stream_options.include_usage bernilai true, field choices pada chunk terakhir adalah array kosong dan harus dilewati (token usage dapat diperoleh melalui chunk.usage)
if (chunk.choices[0] && chunk.choices[0].delta.content != null) {
fullContent += chunk.choices[0].delta.content;
console.log(chunk.choices[0].delta.content);
}
}
console.log(`Konten output lengkap: ${fullContent}`)curl
# ======= Catatan penting =======
# URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
# Kunci API berbeda tiap wilayah. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# === Hapus komentar ini sebelum menjalankan ===
curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen3-vl-plus",
"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": "Adegan apa yang digambarkan dalam gambar ini?"
}
]
}
],
"stream":true,
"stream_options":{"include_usage":true}
}'DashScope
Python
import os
from dashscope import MultiModalConversation
import dashscope
# URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'
messages = [
{
"role": "user",
"content": [
{"image": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"},
{"text": "Adegan apa yang digambarkan dalam gambar ini?"}
]
}
]
responses = MultiModalConversation.call(
# Kunci API berbeda tiap 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"),
model='qwen3-vl-plus', # Ganti dengan model multimodal lain sesuai kebutuhan dan sesuaikan messages-nya
messages=messages,
stream=True,
incremental_output=True)
full_content = ""
print("Konten keluaran streaming:")
for response in responses:
if response["output"]["choices"][0]["message"].content:
print(response.output.choices[0].message.content[0]['text'])
full_content += response.output.choices[0].message.content[0]['text']
print(f"Konten lengkap: {full_content}")Java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import io.reactivex.Flowable;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
// URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
public static void streamCall()
throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
// harus membuat map yang mutable.
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(Collections.singletonMap("image", "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"),
Collections.singletonMap("text", "Adegan apa yang digambarkan dalam gambar ini?"))).build();
MultiModalConversationParam param = MultiModalConversationParam.builder()
// Kunci API berbeda tiap 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: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen3-vl-plus") // Ganti dengan model multimodal lain sesuai kebutuhan dan sesuaikan messages-nya
.messages(Arrays.asList(userMessage))
.incrementalOutput(true)
.build();
Flowable<MultiModalConversationResult> result = conv.streamCall(param);
result.blockingForEach(item -> {
try {
List<Map<String, Object>> content = item.getOutput().getChoices().get(0).getMessage().getContent();
// Periksa apakah konten ada dan tidak kosong
if (content != null && !content.isEmpty()) {
System.out.println(content.get(0).get("text"));
}
} catch (Exception e){
System.exit(0);
}
});
}
public static void main(String[] args) {
try {
streamCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}curl
# ======= Catatan penting =======
# Kunci API berbeda tiap wilayah. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda tiap wilayah.
# === Hapus komentar ini sebelum menjalankan ===
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'X-DashScope-SSE: enable' \
-d '{
"model": "qwen3-vl-plus",
"input":{
"messages":[
{
"role": "user",
"content": [
{"image": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"},
{"text": "Adegan apa yang digambarkan dalam gambar ini?"}
]
}
]
},
"parameters": {
"incremental_output": true
}
}'Keluaran streaming untuk model berpikir
Model berpikir pertama kali mengembalikan reasoning_content (proses berpikir), lalu mengembalikan content (tanggapan). Tentukan apakah tahap saat ini merupakan tahap berpikir atau memberikan tanggapan berdasarkan status paket data.
Untuk detail mengenai model berpikir, lihat Deep thinking, Image and video understanding, Visual reasoning.
Untuk implementasi keluaran streaming Qwen3-Omni-Flash (mode berpikir), lihat Omni-modal.
Kompatibel dengan OpenAI
Berikut adalah format respons saat memanggil mode berpikir model qwen-plus menggunakan OpenAI Python SDK 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 tanggapan
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_contenttidak None dancontentadalahNone, tahap saat ini adalah berpikir. -
Jika
reasoning_contentadalah None dancontenttidakNone, tahap saat ini adalah memberikan tanggapan. -
Jika keduanya
None, tahapnya tetap sama seperti paket sebelumnya.
Python
Kode contoh
from openai import OpenAI
import os
# Inisialisasi klien 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 lainnya 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 = "" # Tanggapan lengkap
is_answering = False # Apakah sedang dalam tahap memberikan tanggapan
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 memberikan tanggapan
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
Tanggapan
====================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?
Node.js
Kode contoh
import OpenAI from "openai";
import process from 'process';
// Inisialisasi klien openai
const openai = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY, // Baca dari variabel lingkungan
baseURL: 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1'
});
let reasoningContent = '';
let answerContent = '';
let isAnswering = false;
async function main() {
try {
const messages = [{ role: 'user', content: 'Who are you' }];
const stream = await openai.chat.completions.create({
// Ganti dengan model Qwen3 lainnya atau model QwQ sesuai kebutuhan
model: 'qwen-plus',
messages,
stream: true,
// Parameter enable_thinking mengaktifkan proses berpikir. Parameter ini tidak berpengaruh pada model qwen3-30b-a3b-thinking-2507, qwen3-235b-a22b-thinking-2507, dan QwQ.
enable_thinking: true
});
console.log('\n' + '='.repeat(20) + 'Thought process' + '='.repeat(20) + '\n');
for await (const chunk of stream) {
if (!chunk.choices?.length) {
console.log('\nUsage:');
console.log(chunk.usage);
continue;
}
const delta = chunk.choices[0].delta;
// Kumpulkan hanya konten berpikir
if (delta.reasoning_content !== undefined && delta.reasoning_content !== null) {
if (!isAnswering) {
process.stdout.write(delta.reasoning_content);
}
reasoningContent += delta.reasoning_content;
}
// Menerima konten, mulai memberikan tanggapan
if (delta.content !== undefined && delta.content) {
if (!isAnswering) {
console.log('\n' + '='.repeat(20) + 'Full response' + '='.repeat(20) + '\n');
isAnswering = true;
}
process.stdout.write(delta.content);
answerContent += delta.content;
}
}
} catch (error) {
console.error('Error:', error);
}
}
main();
Tanggapan
====================Thought process====================
Okay, the user asked "Who are you," so I need to state my identity. First, I should clearly say I am Qwen, a large-scale language model developed by Alibaba Cloud. Next, mention my main functions, like answering questions, creating text, logical reasoning, etc. Also emphasize my multilingual support, including Chinese and English, so users know I can handle requests in different languages. Additionally, explain my application scenarios, such as helping with learning, work, and daily life. However, since the user's question is direct, detailed information might not be necessary—keep it concise. Also, ensure a friendly tone and invite further questions. Check for any missing key information, like my version or latest updates, but the user probably doesn't need that much detail. Finally, confirm the response is accurate and error-free.
====================Full response====================
I am Qwen, a large-scale language model independently developed by Tongyi Lab under Alibaba Group. I can handle various tasks like answering questions, creating text, logical reasoning, and programming, supporting multiple languages including Chinese and English. If you have any questions or need help, feel free to tell me anytime!
HTTP
Kode contoh
curl
Untuk model open-source Qwen3, atur enable_thinking ke true untuk mengaktifkan mode berpikir. Parameter enable_thinking tidak berpengaruh pada model qwen3-30b-a3b-thinking-2507, qwen3-235b-a22b-thinking-2507, QwQ .
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-plus",
"messages": [
{
"role": "user",
"content": "Who are you"
}
],
"stream": true,
"stream_options": {
"include_usage": true
},
"enable_thinking": true
}'
Tanggapan
data: {"choices":[{"delta":{"content":null,"role":"assistant","reasoning_content":""},"index":0,"logprobs":null,"finish_reason":null}],"object":"chat.completion.chunk","usage":null,"created":1745485391,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-e2edaf2c-8aaf-9e54-90e2-b21dd5045503"}
.....
data: {"choices":[{"finish_reason":"stop","delta":{"content":"","reasoning_content":null},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1745485391,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-e2edaf2c-8aaf-9e54-90e2-b21dd5045503"}
data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":10,"completion_tokens":360,"total_tokens":370},"created":1745485391,"system_fingerprint":null,"model":"qwen-plus","id":"chatcmpl-e2edaf2c-8aaf-9e54-90e2-b21dd5045503"}
data: [DONE]
DashScope
Berikut adalah format respons streaming saat memanggil mode berpikir model qwen-plus menggunakan DashScope Python SDK:
# Tahap berpikir
...
{"role": "assistant", "content": "", "reasoning_content": "High information density,"}
{"role": "assistant", "content": "", "reasoning_content": "making users feel helped."}
# Tahap tanggapan
{"role": "assistant", "content": "I am Qwen", "reasoning_content": ""}
{"role": "assistant", "content": ", developed by Tongyi Lab", "reasoning_content": ""}
...
-
Jika
reasoning_contentbukan "", dancontentadalah "", tahap saat ini adalah berpikir. -
Jika
reasoning_contentadalah "", dancontentbukan "", tahap saat ini adalah memberikan tanggapan. -
Jika keduanya "", tahapnya tetap sama seperti paket sebelumnya.
Python
Kode contoh
import os
from dashscope import Generation
import dashscope
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/"
messages = [{"role": "user", "content": "Who are you?"}]
completion = Generation.call(
# Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: api_key = "sk-xxx",
api_key=os.getenv("DASHSCOPE_API_KEY"),
# Ganti dengan model berpikir mendalam lainnya sesuai kebutuhan
model="qwen-plus",
messages=messages,
result_format="message", # Model open-source Qwen3 hanya mendukung "message"; untuk pengalaman lebih baik, kami sarankan mengatur ini ke "message" juga untuk model lainnya.
# Aktifkan pemikiran mendalam. Parameter ini tidak berpengaruh pada model qwen3-30b-a3b-thinking-2507, qwen3-235b-a22b-thinking-2507, dan QwQ.
enable_thinking=True,
stream=True,
incremental_output=True, # Model open-source Qwen3 hanya mendukung true; untuk pengalaman lebih baik, kami sarankan mengatur ini ke true juga untuk model lainnya.
)
# Definisikan proses berpikir lengkap
reasoning_content = ""
# Definisikan tanggapan lengkap
answer_content = ""
# Tentukan apakah sudah selesai berpikir dan mulai memberikan tanggapan
is_answering = False
print("=" * 20 + "Thought process" + "=" * 20)
for chunk in completion:
# Jika proses berpikir dan tanggapan keduanya kosong, lewati
if (
chunk.output.choices[0].message.content == ""
and chunk.output.choices[0].message.reasoning_content == ""
):
pass
else:
# Jika saat ini dalam tahap berpikir
if (
chunk.output.choices[0].message.reasoning_content != ""
and chunk.output.choices[0].message.content == ""
):
print(chunk.output.choices[0].message.reasoning_content, end="", flush=True)
reasoning_content += chunk.output.choices[0].message.reasoning_content
# Jika saat ini dalam tahap tanggapan
elif chunk.output.choices[0].message.content != "":
if not is_answering:
print("\n" + "=" * 20 + "Full response" + "=" * 20)
is_answering = True
print(chunk.output.choices[0].message.content, end="", flush=True)
answer_content += chunk.output.choices[0].message.content
# Untuk mencetak proses berpikir lengkap dan tanggapan lengkap, hapus komentar baris berikut dan jalankan
# print("=" * 20 + "Full thought process" + "=" * 20 + "\n")
# print(f"{reasoning_content}")
# print("=" * 20 + "Full response" + "=" * 20 + "\n")
# print(f"{answer_content}")
Tanggapan
====================Thought process====================
Okay, the user asked: "Who are you?" I need to answer this question. First, clarify my identity as Qwen, a large-scale language model developed by Alibaba Cloud. Next, explain my functions and purposes, like answering questions, creating text, logical reasoning, etc. Also, emphasize my goal of being a helpful assistant.
Keep the expression conversational, avoiding professional jargon or complex sentence structures. Add friendly phrases like "Hello there~" to make the conversation natural. Also, ensure accuracy and don't omit key points like my developer, main functions, and usage scenarios.
Consider possible follow-up questions from the user, such as specific application examples or technical details, so subtly hint at further inquiries in the response. For example, mention "Whether it's everyday questions or professional issues, I'll do my best to help," which is both comprehensive and open-ended.
Finally, check for fluency, repetition, or redundant information to keep the response concise. Maintain a balance between friendliness and professionalism so users feel both approachable and reliable.
====================Full response====================
Hello there~ I'm Qwen, a large-scale language model developed by Alibaba Cloud. I can answer questions, create text, perform logical reasoning, programming, and more, aiming to provide help and support. Whether it's everyday questions or professional issues, I'll do my best to help. How can I assist you?
Java
Kode contoh
// dashscope SDK versi >= 2.19.4
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import io.reactivex.Flowable;
import java.lang.System;
import com.alibaba.dashscope.utils.Constants;
public class Main {
static {
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
}
private static final Logger logger = LoggerFactory.getLogger(Main.class);
private static StringBuilder reasoningContent = new StringBuilder();
private static StringBuilder finalContent = new StringBuilder();
private static boolean isFirstPrint = true;
private static void handleGenerationResult(GenerationResult message) {
String reasoning = message.getOutput().getChoices().get(0).getMessage().getReasoningContent();
String content = message.getOutput().getChoices().get(0).getMessage().getContent();
if (!reasoning.isEmpty()) {
reasoningContent.append(reasoning);
if (isFirstPrint) {
System.out.println("====================Thought process====================");
isFirstPrint = false;
}
System.out.print(reasoning);
}
if (!content.isEmpty()) {
finalContent.append(content);
if (!isFirstPrint) {
System.out.println("\n====================Full response====================");
isFirstPrint = true;
}
System.out.print(content);
}
}
private static GenerationParam buildGenerationParam(Message userMsg) {
return GenerationParam.builder()
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Alibaba Cloud Model Studio Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.model("qwen-plus")
.enableThinking(true)
.incrementalOutput(true)
.resultFormat("message")
.messages(Arrays.asList(userMsg))
.build();
}
public static void streamCallWithMessage(Generation gen, Message userMsg)
throws NoApiKeyException, ApiException, InputRequiredException {
GenerationParam param = buildGenerationParam(userMsg);
Flowable<GenerationResult> result = gen.streamCall(param);
result.blockingForEach(message -> handleGenerationResult(message));
}
public static void main(String[] args) {
try {
Generation gen = new Generation();
Message userMsg = Message.builder().role(Role.USER.getValue()).content("Who are you?").build();
streamCallWithMessage(gen, userMsg);
// Cetak hasil akhir
// if (reasoningContent.length() > 0) {
// System.out.println("\n====================Full response====================");
// System.out.println(finalContent.toString());
// }
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
logger.error("An exception occurred: {}", e.getMessage());
}
System.exit(0);
}
}
Tanggapan
====================Thought process====================
Okay, the user asked "Who are you?", so I need to answer based on previous settings. First, my role is Qwen, a large-scale language model under Alibaba Group. Keep it conversational and simple.
The user might be new to me or confirming my identity. Start by directly stating who I am, then briefly explain my functions and purposes, like answering questions, creating text, programming, etc. Also mention multilingual support so users know I handle different languages.
Also, per guidelines, maintain human-like qualities, so use a friendly tone, maybe add emojis for warmth. Guide users to ask further questions or use my features, like asking what they need help with.
Avoid complex terms and keep it concise. Check for missing key points like multilingual support and specific capabilities. Ensure the response meets all requirements, including conversational style and simplicity.
====================Full response====================
Hello! I'm Qwen, a large-scale language model under Alibaba Group. I can answer questions, create text like stories, official documents, emails, scripts, perform logical reasoning, programming, express opinions, play games, and more. I'm proficient in multiple languages, including but not limited to Chinese, English, German, French, and Spanish. How can I help you?
HTTP
Kode contoh
curl
Untuk model berpikir hibrida, atur enable_thinking ke true untuk mengaktifkan mode berpikir. Parameter enable_thinking tidak berpengaruh pada model qwen3-30b-a3b-thinking-2507, qwen3-235b-a22b-thinking-2507, QwQ .
# ======= Catatan penting =======
# Kunci API berbeda-beda per wilayah. Dapatkan Kunci API Anda: https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# URL wilayah Singapura. Ganti {WorkspaceId} dengan ID ruang kerja aktual Anda. URL berbeda-beda per wilayah.
# === Hapus komentar ini sebelum menjalankan ===
curl -X POST "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/text-generation/generation" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-H "X-DashScope-SSE: enable" \
-d '{
"model": "qwen-plus",
"input":{
"messages":[
{
"role": "user",
"content": "Who are you?"
}
]
},
"parameters":{
"enable_thinking": true,
"incremental_output": true,
"result_format": "message"
}
}'
Tanggapan
id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"Hmm","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":14,"input_tokens":11,"output_tokens":3},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","reasoning_content":",","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":15,"input_tokens":11,"output_tokens":4},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:3
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"user","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":16,"input_tokens":11,"output_tokens":5},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:4
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"asked","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":17,"input_tokens":11,"output_tokens":6},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:5
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"\"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":18,"input_tokens":11,"output_tokens":7},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
......
id:358
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"help","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":373,"input_tokens":11,"output_tokens":362},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:359
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":",","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":374,"input_tokens":11,"output_tokens":363},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:360
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"welcome","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":375,"input_tokens":11,"output_tokens":364},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:361
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"anytime","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":376,"input_tokens":11,"output_tokens":365},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:362
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"tell","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":377,"input_tokens":11,"output_tokens":366},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:363
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"me","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":378,"input_tokens":11,"output_tokens":367},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:364
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"!","reasoning_content":"","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":378,"input_tokens":11,"output_tokens":367},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
id:365
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","reasoning_content":"","role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":378,"input_tokens":11,"output_tokens":367},"request_id":"25d58c29-c47b-9e8d-a0f1-d6c309ec58b1"}
Going live
-
Performance and resource management: 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. Dalam skenario konkurensi tinggi, pantau penggunaan deskriptor file untuk mencegah kehabisan sumber daya.
-
Client-side rendering: Pada antarmuka depan web, gunakan API
ReadableStreamdanTextDecoderStreamuntuk menangani dan melakukan rendering aliran event SSE secara lancar, sehingga memberikan pengalaman pengguna terbaik. -
-
Key metrics: Pantau Time to First Token (TTFT), metrik inti untuk pengalaman streaming. Pantau juga tingkat kesalahan API dan waktu respons rata-rata.
-
Alerting: Atur peringatan untuk tingkat kesalahan API yang tidak normal, terutama error 4xx dan 5xx.
-
-
Nginx proxy configuration: Jika menggunakan Nginx sebagai reverse proxy, buffering output default-nya (proxy_buffering) akan mengganggu sifat real-time dari respons streaming. Untuk memastikan data segera didorong ke klien, nonaktifkan fitur ini dengan mengatur
proxy_buffering offdalam file konfigurasi Nginx Anda.
Kode error
Jika pemanggilan model gagal dan mengembalikan pesan error, lihat Kode error 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 output streaming memengaruhi kualitas respons model?
J: Tidak. Namun, beberapa model hanya mendukung output streaming, dan panggilan non-streaming dapat menyebabkan error timeout. Kami merekomendasikan penggunaan output streaming.
T: Apa perbedaan antara panggilan non-streaming dan streaming?
J: Perbedaan utama:
-
Batas timeout: Panggilan non-streaming memiliki batas maksimum timeout tetap selama 300 detik. Jika model tidak selesai menghasilkan respons dalam 300 detik, permintaan akan mengalami timeout dan gagal.
-
Struktur output: Panggilan non-streaming mengembalikan respons lengkap (satu objek JSON) sekaligus. Panggilan streaming mengembalikan chunk data secara progresif melalui protokol SSE, dengan setiap chunk berisi bagian dari konten yang dihasilkan. Client harus menyusun chunk-chunk tersebut.
-
Kompatibilitas fitur: Keduanya mendukung fitur seperti JSON Mode dan Function Call tanpa perbedaan fungsional.
Kami merekomendasikan penggunaan output streaming untuk menghindari timeout dan meningkatkan pengalaman pengguna.
T: Apakah output streaming 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 disusun akan berupa JSON yang valid.