API Qwen bersifat tanpa status dan tidak menyimpan riwayat percakapan. Untuk mengimplementasikan percakapan multi-putaran, Anda harus mengirimkan riwayat percakapan dalam setiap permintaan. Anda juga dapat menggunakan strategi seperti pemotongan (truncation), ringkasan (summarization), dan pengambilan (retrieval) untuk mengelola konteks secara efisien serta mengurangi konsumsi token.
Topik ini menjelaskan cara mengimplementasikan percakapan multi-putaran menggunakan antarmuka Chat Completion yang kompatibel dengan OpenAI atau DashScope. API Responses menyediakan alternatif yang lebih mudah digunakan; lihat Kompatibel dengan OpenAI - Responses.
Cara kerja
Untuk mengimplementasikan percakapan multi-putaran, Anda harus mempertahankan array messages. Pada setiap putaran, tambahkan pertanyaan terbaru pengguna dan tanggapan model ke array tersebut. Kemudian, gunakan array yang telah diperbarui sebagai input untuk permintaan berikutnya.
Contoh berikut menunjukkan bagaimana keadaan array messages berubah selama percakapan multi-putaran:
Putaran pertama
Tambahkan pertanyaan pengguna ke array
messages.// Gunakan model teks [ {"role": "user", "content": "Rekomendasikan film fiksi ilmiah tentang eksplorasi luar angkasa."} ] // Gunakan model multimodal, misalnya Qwen-VL // {"role": "user", // "content": [{"type": "image_url","image_url": {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"}}, // {"type": "text", "text": "Produk apa saja yang ditampilkan dalam gambar ini?"}] // }Putaran kedua
Tambahkan tanggapan model dan pertanyaan terbaru pengguna ke array
messages.// Gunakan model teks [ {"role": "user", "content": "Rekomendasikan film fiksi ilmiah tentang eksplorasi luar angkasa."}, {"role": "assistant", "content": "Saya merekomendasikan 'XXX'. Ini adalah karya fiksi ilmiah klasik."}, {"role": "user", "content": "Siapa sutradara film ini?"} ] // Gunakan model multimodal, misalnya Qwen-VL //[ // {"role": "user", "content": [ // {"type": "image_url","image_url": {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"}}, // {"type": "text", "text": "Produk apa saja yang ditampilkan dalam gambar ini?"}]}, // {"role": "assistant", "content": "Gambar tersebut menampilkan tiga item: sepasang overall biru muda, kaus lengan pendek bergaris biru-putih, dan sepasang sepatu kets putih."}, // {"role": "user", "content": "Gaya apa itu?"} //]
Mulai
Kompatibel dengan OpenAI
Python
import os
from openai import OpenAI
def get_response(messages):
client = OpenAI(
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/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"),
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
# Untuk daftar model, lihat https://www.alibabacloud.com/help/en/model-studio/getting-started/models
completion = client.chat.completions.create(model="qwen-plus", messages=messages)
return completion
# Inisialisasi array messages
messages = [
{
"role": "system",
"content": """Anda adalah penjual di toko ponsel Bailian. Tugas Anda adalah merekomendasikan ponsel kepada pengguna. Ponsel memiliki dua parameter: ukuran layar (termasuk 6,1 inci, 6,5 inci, dan 6,7 inci) dan resolusi (termasuk 2K dan 4K).
Anda hanya boleh menanyakan satu parameter kepada pengguna dalam satu waktu. Jika pengguna tidak memberikan informasi lengkap, Anda perlu mengajukan pertanyaan lanjutan untuk mendapatkan parameter yang hilang. Setelah semua parameter terkumpul, Anda harus mengatakan: Saya telah memahami maksud pembelian Anda. Mohon tunggu.""",
}
]
assistant_output = "Selamat datang di toko ponsel Bailian. Ukuran layar apa yang Anda cari?"
print(f"Output model: {assistant_output}\n")
while "Saya telah memahami maksud pembelian Anda" not in assistant_output:
user_input = input("Silakan masukkan: ")
# Tambahkan pertanyaan pengguna ke daftar messages
messages.append({"role": "user", "content": user_input})
assistant_output = get_response(messages).choices[0].message.content
# Tambahkan tanggapan model ke daftar messages
messages.append({"role": "assistant", "content": assistant_output})
print(f"Output model: {assistant_output}")
print("\n")Node.js
import OpenAI from "openai";
import { createInterface } from 'readline/promises';
// Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
const BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
// Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
const openai = new OpenAI({
apiKey: process.env.DASHSCOPE_API_KEY,
baseURL: BASE_URL
});
async function getResponse(messages) {
try {
const completion = await openai.chat.completions.create({
// Untuk daftar model, lihat https://www.alibabacloud.com/help/en/model-studio/getting-started/models
model: "qwen-plus",
messages: messages,
});
return completion.choices[0].message.content;
} catch (error) {
console.error("Error fetching response:", error);
throw error; // Melempar kembali exception untuk ditangani oleh lapisan atas
}
}
// Inisialisasi array messages
const messages = [
{
"role": "system",
"content": `Anda adalah penjual di toko ponsel Bailian. Tugas Anda adalah merekomendasikan ponsel kepada pengguna. Ponsel memiliki dua parameter: ukuran layar (termasuk 6,1 inci, 6,5 inci, dan 6,7 inci) dan resolusi (termasuk 2K dan 4K).
Anda hanya boleh menanyakan satu parameter kepada pengguna dalam satu waktu. Jika pengguna tidak memberikan informasi lengkap, Anda perlu mengajukan pertanyaan lanjutan untuk mendapatkan parameter yang hilang. Setelah semua parameter terkumpul, Anda harus mengatakan: Saya telah memahami maksud pembelian Anda. Mohon tunggu.`,
}
];
let assistant_output = "Selamat datang di toko ponsel Bailian. Ukuran layar apa yang Anda cari?";
console.log(assistant_output);
const readline = createInterface({
input: process.stdin,
output: process.stdout
});
(async () => {
while (!assistant_output.includes("Saya telah memahami maksud pembelian Anda")) {
const user_input = await readline.question("Silakan masukkan: ");
messages.push({ role: "user", content: user_input});
try {
const response = await getResponse(messages);
assistant_output = response;
messages.push({ role: "assistant", content: assistant_output });
console.log(assistant_output);
console.log("\n");
} catch (error) {
console.error("Terjadi kesalahan saat mengambil respons:", error);
}
}
readline.close();
})();curl
# ======= Penting =======
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
# === Hapus komentar ini sebelum eksekusi ===
curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-plus",
"messages":[
{
"role": "system",
"content": "Anda adalah asisten yang membantu."
},
{
"role": "user",
"content": "Halo"
},
{
"role": "assistant",
"content": "Halo, saya Qwen."
},
{
"role": "user",
"content": "Apa yang bisa Anda lakukan?"
}
]
}'DashScope
Python
Kode contoh berikut menunjukkan penjual toko ponsel yang melakukan percakapan multi-putaran dengan pelanggan untuk menentukan maksud pembelian mereka, lalu mengakhiri sesi.
import os
from dashscope import Generation
import dashscope
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
def get_response(messages):
response = Generation.call(
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/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"),
# Untuk daftar model, lihat https://www.alibabacloud.com/help/en/model-studio/getting-started/models
model="qwen-plus",
messages=messages,
result_format="message",
)
return response
messages = [
{
"role": "system",
"content": """Anda adalah penjual di toko ponsel Bailian. Tugas Anda adalah merekomendasikan ponsel kepada pengguna. Ponsel memiliki dua parameter: ukuran layar (termasuk 6,1 inci, 6,5 inci, dan 6,7 inci) dan resolusi (termasuk 2K dan 4K).
Anda hanya boleh menanyakan satu parameter kepada pengguna dalam satu waktu. Jika pengguna tidak memberikan informasi lengkap, Anda perlu mengajukan pertanyaan lanjutan untuk mendapatkan parameter yang hilang. Setelah semua parameter terkumpul, Anda harus mengatakan: Saya telah memahami maksud pembelian Anda. Mohon tunggu.""",
}
]
assistant_output = "Selamat datang di toko ponsel Bailian. Ukuran layar apa yang Anda cari?"
print(f"Output model: {assistant_output}\n")
while "Saya telah memahami maksud pembelian Anda" not in assistant_output:
user_input = input("Silakan masukkan: ")
# Tambahkan pertanyaan pengguna ke daftar messages
messages.append({"role": "user", "content": user_input})
assistant_output = get_response(messages).output.choices[0].message.content
# Tambahkan tanggapan model ke daftar messages
messages.append({"role": "assistant", "content": assistant_output})
print(f"Output model: {assistant_output}")
print("\n")Java
import java.util.ArrayList;
import java.util.List;
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 java.util.Scanner;
import com.alibaba.dashscope.protocol.Protocol;
public class Main {
public static GenerationParam createGenerationParam(List<Message> messages) {
return GenerationParam.builder()
// Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/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"))
// Untuk daftar model, lihat https://www.alibabacloud.com/help/en/model-studio/getting-started/models
.model("qwen-plus")
.messages(messages)
.resultFormat(GenerationParam.ResultFormat.MESSAGE)
.build();
}
public static GenerationResult callGenerationWithMessages(GenerationParam param) throws ApiException, NoApiKeyException, InputRequiredException {
// Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1
Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
return gen.call(param);
}
public static void main(String[] args) {
try {
List<Message> messages = new ArrayList<>();
messages.add(createMessage(Role.SYSTEM, "Anda adalah asisten yang membantu."));
for (int i = 0; i < 3;i++) {
Scanner scanner = new Scanner(System.in);
System.out.print("Silakan masukkan: ");
String userInput = scanner.nextLine();
if ("exit".equalsIgnoreCase(userInput)) {
break;
}
messages.add(createMessage(Role.USER, userInput));
GenerationParam param = createGenerationParam(messages);
GenerationResult result = callGenerationWithMessages(param);
System.out.println("Output model: "+result.getOutput().getChoices().get(0).getMessage().getContent());
messages.add(result.getOutput().getChoices().get(0).getMessage());
}
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
e.printStackTrace();
}
System.exit(0);
}
private static Message createMessage(Role role, String content) {
return Message.builder().role(role.getValue()).content(content).build();
}
}curl
# ======= Penting =======
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
# === Hapus komentar ini sebelum eksekusi ===
curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-plus",
"input":{
"messages":[
{
"role": "system",
"content": "Anda adalah asisten yang membantu."
},
{
"role": "user",
"content": "Halo"
},
{
"role": "assistant",
"content": "Halo, saya Qwen."
},
{
"role": "user",
"content": "Apa yang bisa Anda lakukan?"
}
]
}
}'Percakapan multi-putaran dengan model multimodal
Bagian ini berlaku untuk model Qwen-VL, Kimi-K2.5. Untuk detail implementasi
Qwen-Omni, lihat omni-modal.Qwen-VL-OCR dan Qwen3-Omni-Captioner dirancang untuk tugas single-turn spesifik dan tidak mendukung percakapan multi-putaran.
Model multimodal mendukung penambahan konten seperti gambar dan audio ke dalam percakapan. Implementasi percakapan multi-putaran untuk model-model ini berbeda dari model teks dalam hal-hal berikut:
Konstruksi pesan pengguna: Pesan pengguna untuk model multimodal dapat berisi informasi multimodal, seperti gambar dan audio, selain teks.
Antarmuka SDK DashScope: Saat menggunakan SDK Python DashScope, panggil antarmuka
MultiModalConversation. Saat menggunakan SDK Java DashScope, panggil kelasMultiModalConversation.
Kompatibel dengan OpenAI
Python
from openai import OpenAI
import os
client = OpenAI(
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/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"),
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
)
messages = [
{"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"
},
},
{"type": "text", "text": "Produk apa saja yang ditampilkan dalam gambar ini?"},
],
}
]
completion = client.chat.completions.create(
model="qwen3-vl-plus", # Anda dapat mengganti ini dengan model multimodal lain dan menyesuaikan messages sesuai kebutuhan
messages=messages,
)
print(f"Output putaran pertama: {completion.choices[0].message.content}")
assistant_message = completion.choices[0].message
messages.append(assistant_message.model_dump())
messages.append({
"role": "user",
"content": [
{
"type": "text",
"text": "Gaya apa itu?"
}
]
})
completion = client.chat.completions.create(
model="qwen3-vl-plus",
messages=messages,
)
print(f"Output putaran kedua: {completion.choices[0].message.content}")Node.js
import OpenAI from "openai";
const openai = new OpenAI(
{
// Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/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,
// Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/compatible-mode/v1
baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
}
);
let messages = [
{
role: "user", content: [
{ type: "image_url", image_url: { "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png" } },
{ type: "text", text: "Produk apa saja yang ditampilkan dalam gambar ini?" },
]
}]
async function main() {
let response = await openai.chat.completions.create({
model: "qwen3-vl-plus", // Anda dapat mengganti ini dengan model multimodal lain dan menyesuaikan messages sesuai kebutuhan
messages: messages
});
console.log(`Output putaran pertama: ${response.choices[0].message.content}`);
messages.push(response.choices[0].message);
messages.push({"role": "user", "content": "Tulis puisi yang menggambarkan adegan ini"});
response = await openai.chat.completions.create({
model: "qwen3-vl-plus",
messages: messages
});
console.log(`Output putaran kedua: ${response.choices[0].message.content}`);
}
main()curl
# ======= Penting =======
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# === Hapus komentar ini sebelum eksekusi ===
curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "qwen3-vl-plus",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"
}
},
{
"type": "text",
"text": "Produk apa saja yang ditampilkan dalam gambar ini?"
}
]
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "Gambar tersebut menampilkan tiga item: sepasang overall biru muda, kaus lengan pendek bergaris biru-putih, dan sepasang sepatu kets putih."
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "Gaya apa itu?"
}
]
}
]
}'DashScope
Python
import os
from dashscope import MultiModalConversation
import dashscope
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
messages = [
{
"role": "user",
"content": [
{
"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"
},
{"text": "Produk apa saja yang ditampilkan dalam gambar ini?"},
],
}
]
response = MultiModalConversation.call(
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen3-vl-plus', # Anda dapat mengganti ini dengan model multimodal lain dan menyesuaikan messages sesuai kebutuhan
messages=messages
)
print(f"Output model putaran pertama {response.output.choices[0].message.content[0]['text']}")
messages.append(response['output']['choices'][0]['message'])
user_msg = {"role": "user", "content": [{"text": "Gaya apa itu?"}]}
messages.append(user_msg)
response = MultiModalConversation.call(
# Jika variabel lingkungan belum dikonfigurasi, harap ganti baris berikut dengan: api_key="sk-xxx",
api_key=os.getenv('DASHSCOPE_API_KEY'),
model='qwen3-vl-plus',
messages=messages
)
print(f"Output model putaran kedua {response.output.choices[0].message.content[0]['text']}")Java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
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 com.alibaba.dashscope.utils.Constants;
public class Main {
static {
// Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1
Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
}
private static final String modelName = "qwen3-vl-plus"; // Anda dapat mengganti ini dengan model multimodal lain dan menyesuaikan messages sesuai kebutuhan
public static void MultiRoundConversationCall() throws ApiException, NoApiKeyException, UploadFileException {
MultiModalConversation conv = new MultiModalConversation();
MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(Collections.singletonMap("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"),
Collections.singletonMap("text", "Produk apa saja yang ditampilkan dalam gambar ini?"))).build();
List<MultiModalMessage> messages = new ArrayList<>();
messages.add(userMessage);
MultiModalConversationParam param = MultiModalConversationParam.builder()
// Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/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(modelName)
.messages(messages)
.build();
MultiModalConversationResult result = conv.call(param);
System.out.println("Output putaran pertama: "+result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text")); // tambahkan hasil ke percakapan
messages.add(result.getOutput().getChoices().get(0).getMessage());
MultiModalMessage msg = MultiModalMessage.builder().role(Role.USER.getValue())
.content(Arrays.asList(Collections.singletonMap("text", "Gaya apa itu?"))).build();
messages.add(msg);
param.setMessages((List)messages);
result = conv.call(param);
System.out.println("Output putaran kedua: "+result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text")); }
public static void main(String[] args) {
try {
MultiRoundConversationCall();
} catch (ApiException | NoApiKeyException | UploadFileException e) {
System.out.println(e.getMessage());
}
System.exit(0);
}
}curl
# ======= Penting =======
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation
# === Hapus komentar ini sebelum eksekusi ===
curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
"model": "qwen3-vl-plus",
"input":{
"messages":[
{
"role": "user",
"content": [
{"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20251031/ownrof/f26d201b1e3f4e62ab4a1fc82dd5c9bb.png"},
{"text": "Produk apa saja yang ditampilkan dalam gambar ini?"}
]
},
{
"role": "assistant",
"content": [
{"text": "Gambar tersebut menampilkan tiga item: sepasang overall biru muda, kaus lengan pendek bergaris biru-putih, dan sepasang sepatu kets putih."}
]
},
{
"role": "user",
"content": [
{"text": "Gaya apa itu?"}
]
}
]
}
}'Percakapan Multi-putaran untuk Model Reasoning
Model reasoning mengembalikan dua bidang: reasoning_content (proses berpikir) dan content (tanggapan). Saat memperbarui array messages, simpan hanya bidang content dan abaikan bidang reasoning_content.
[
{"role": "user", "content": "Rekomendasikan film fiksi ilmiah tentang eksplorasi luar angkasa."},
{"role": "assistant", "content": "Saya merekomendasikan 'XXX'. Ini adalah karya fiksi ilmiah klasik."}, # Jangan tambahkan bidang reasoning_content saat menambahkan ke konteks
{"role": "user", "content": "Siapa sutradara film ini?"}
]Untuk informasi lebih lanjut tentang model reasoning, lihat pemikiran mendalam, pemahaman visual, dan penalaran visual.
Untuk informasi lebih lanjut tentang mengimplementasikan percakapan multi-putaran dengan Qwen3-Omni-Flash (mode berpikir), lihat omni-modal.
Kompatibel dengan OpenAI
Python
Kode contoh
from openai import OpenAI
import os
# Inisialisasi klien OpenAI
client = OpenAI(
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/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"),
base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
)
messages = []
conversation_idx = 1
while True:
reasoning_content = "" # Definisikan proses berpikir lengkap
answer_content = "" # Definisikan tanggapan lengkap
is_answering = False # Tentukan apakah akan mengakhiri proses berpikir dan mulai merespons
print("="*20+f"Putaran Percakapan {conversation_idx}"+"="*20)
conversation_idx += 1
user_msg = {"role": "user", "content": input("Masukkan pesan Anda: ")}
messages.append(user_msg)
# Buat permintaan chat completion
completion = client.chat.completions.create(
# Anda dapat mengganti ini dengan model pemikiran mendalam lain sesuai kebutuhan
model="qwen-plus",
messages=messages,
extra_body={"enable_thinking": True},
stream=True,
# stream_options={
# "include_usage": True
# }
)
print("\n" + "=" * 20 + "Proses Berpikir" + "=" * 20 + "\n")
for chunk in completion:
# Jika chunk.choices kosong, cetak penggunaan
if not chunk.choices:
print("\nPenggunaan:")
print(chunk.usage)
else:
delta = chunk.choices[0].delta
# Cetak proses berpikir
if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
print(delta.reasoning_content, end='', flush=True)
reasoning_content += delta.reasoning_content
else:
# Mulai merespons
if delta.content != "" and is_answering is False:
print("\n" + "=" * 20 + "Tanggapan Lengkap" + "=" * 20 + "\n")
is_answering = True
# Cetak proses respons
print(delta.content, end='', flush=True)
answer_content += delta.content
# Tambahkan konten tanggapan model ke konteks
messages.append({"role": "assistant", "content": answer_content})
print("\n")Node.js
Kode contoh
import OpenAI from "openai";
import process from 'process';
import readline from 'readline/promises';
// Inisialisasi antarmuka readline
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// Inisialisasi klien openai
const openai = new OpenAI({
// Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
apiKey: process.env.DASHSCOPE_API_KEY, // Baca dari variabel lingkungan
baseURL: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1'
});
let reasoningContent = '';
let answerContent = '';
let isAnswering = false;
let messages = [];
let conversationIdx = 1;
async function main() {
while (true) {
console.log("=".repeat(20) + `Putaran Percakapan ${conversationIdx}` + "=".repeat(20));
conversationIdx++;
// Baca input pengguna
const userInput = await rl.question("Masukkan pesan Anda: ");
messages.push({ role: 'user', content: userInput });
// Reset state
reasoningContent = '';
answerContent = '';
isAnswering = false;
try {
const stream = await openai.chat.completions.create({
// Anda dapat mengganti ini dengan model pemikiran mendalam lain sesuai kebutuhan
model: 'qwen-plus',
messages: messages,
enable_thinking: true,
stream: true,
// stream_options:{
// include_usage: true
// }
});
console.log("\n" + "=".repeat(20) + "Proses Berpikir" + "=".repeat(20) + "\n");
for await (const chunk of stream) {
if (!chunk.choices?.length) {
console.log('\nPenggunaan:');
console.log(chunk.usage);
continue;
}
const delta = chunk.choices[0].delta;
// Proses proses berpikir
if (delta.reasoning_content) {
process.stdout.write(delta.reasoning_content);
reasoningContent += delta.reasoning_content;
}
// Proses respons formal
if (delta.content) {
if (!isAnswering) {
console.log('\n' + "=".repeat(20) + "Tanggapan Lengkap" + "=".repeat(20) + "\n");
isAnswering = true;
}
process.stdout.write(delta.content);
answerContent += delta.content;
}
}
// Tambahkan tanggapan lengkap ke riwayat pesan
messages.push({ role: 'assistant', content: answerContent });
console.log("\n");
} catch (error) {
console.error('Kesalahan:', error);
}
}
}
// Jalankan program
main().catch(console.error);HTTP
Kode contoh
curl
# ======= Penting =======
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# === Hapus komentar ini sebelum eksekusi ===
curl -X POST https://dashscope-intl.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": "Halo"
},
{
"role": "assistant",
"content": "Halo! Senang bertemu Anda. Ada yang bisa saya bantu?"
},
{
"role": "user",
"content": "Siapa Anda?"
}
],
"stream": true,
"stream_options": {
"include_usage": true
},
"enable_thinking": true
}'DashScope
Python
Kode contoh
import os
import dashscope
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = "https://dashscope-intl.aliyuncs.com/api/v1/"
messages = []
conversation_idx = 1
while True:
print("=" * 20 + f"Putaran Percakapan {conversation_idx}" + "=" * 20)
conversation_idx += 1
user_msg = {"role": "user", "content": input("Masukkan pesan Anda: ")}
messages.append(user_msg)
response = dashscope.Generation.call(
# 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'),
# Contoh ini menggunakan qwen-plus. Anda dapat menggantinya dengan model pemikiran mendalam lain sesuai kebutuhan
model="qwen-plus",
messages=messages,
enable_thinking=True,
result_format="message",
stream=True,
incremental_output=True
)
# Definisikan proses berpikir lengkap
reasoning_content = ""
# Definisikan tanggapan lengkap
answer_content = ""
# Tentukan apakah akan mengakhiri proses berpikir dan mulai merespons
is_answering = False
print("=" * 20 + "Proses Berpikir" + "=" * 20)
for chunk in response:
# Jika proses berpikir dan tanggapan keduanya kosong, abaikan
if (chunk.output.choices[0].message.content == "" and
chunk.output.choices[0].message.reasoning_content == ""):
pass
else:
# Jika sedang dalam proses 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 sedang dalam proses tanggapan
elif chunk.output.choices[0].message.content != "":
if not is_answering:
print("\n" + "=" * 20 + "Tanggapan Lengkap" + "=" * 20)
is_answering = True
print(chunk.output.choices[0].message.content, end="",flush=True)
answer_content += chunk.output.choices[0].message.content
# Tambahkan konten tanggapan model ke konteks
messages.append({"role": "assistant", "content": answer_content})
print("\n")
# Untuk mencetak proses berpikir lengkap dan tanggapan lengkap, hapus komentar dan jalankan kode berikut
# print("=" * 20 + "Proses Berpikir Lengkap" + "=" * 20 + "\n")
# print(f"{reasoning_content}")
# print("=" * 20 + "Tanggapan Lengkap" + "=" * 20 + "\n")
# print(f"{answer_content}")Java
Kode contoh
// Versi SDK DashScope >= 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 java.util.List;
import com.alibaba.dashscope.protocol.Protocol;
public class Main {
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) {
if (message != null && message.getOutput() != null
&& message.getOutput().getChoices() != null
&& !message.getOutput().getChoices().isEmpty()
&& message.getOutput().getChoices().get(0) != null
&& message.getOutput().getChoices().get(0).getMessage() != null) {
String reasoning = message.getOutput().getChoices().get(0).getMessage().getReasoningContent();
String content = message.getOutput().getChoices().get(0).getMessage().getContent();
if (reasoning != null && !reasoning.isEmpty()) {
reasoningContent.append(reasoning);
if (isFirstPrint) {
System.out.println("====================Proses Berpikir====================");
isFirstPrint = false;
}
System.out.print(reasoning);
}
if (content != null && !content.isEmpty()) {
finalContent.append(content);
if (!isFirstPrint) {
System.out.println("\n====================Tanggapan Lengkap====================");
isFirstPrint = true;
}
System.out.print(content);
}
}
}
private static GenerationParam buildGenerationParam(List<Message> messages) {
return GenerationParam.builder()
// Jika Anda belum mengonfigurasi variabel lingkungan, ganti baris berikut dengan Kunci API Model Studio Anda: .apiKey("sk-xxx")
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
// Contoh ini menggunakan qwen-plus. Anda dapat menggantinya dengan nama model lain sesuai kebutuhan.
.model("qwen-plus")
.enableThinking(true)
.messages(messages)
.incrementalOutput(true)
.resultFormat("message")
.build();
}
public static void streamCallWithMessage(Generation gen, List<Message> messages)
throws NoApiKeyException, ApiException, InputRequiredException {
GenerationParam param = buildGenerationParam(messages);
Flowable<GenerationResult> result = gen.streamCall(param);
result.doOnError(throwable -> logger.error("Terjadi kesalahan dalam pemrosesan aliran: {}", throwable.getMessage(), throwable))
.blockingForEach(Main::handleGenerationResult);
}
public static void main(String[] args) {
try {
// Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1
Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
Message userMsg1 = Message.builder()
.role(Role.USER.getValue())
.content("Halo")
.build();
Message assistantMsg = Message.builder()
.role(Role.ASSISTANT.getValue())
.content("Halo! Senang bertemu Anda. Ada yang bisa saya bantu?")
.build();
Message userMsg2 = Message.builder()
.role(Role.USER.getValue())
.content("Siapa Anda")
.build();
List<Message> messages = Arrays.asList(userMsg1, assistantMsg, userMsg2);
streamCallWithMessage(gen, messages);
} catch (ApiException | NoApiKeyException | InputRequiredException e) {
logger.error("Terjadi pengecualian: {}", e.getMessage(), e);
} catch (Exception e) {
logger.error("Terjadi kesalahan tak terduga: {}", e.getMessage(), e);
} finally {
// Pastikan program keluar secara normal
System.exit(0);
}
}
}HTTP
Kode contoh
curl
# ======= Penting =======
# Kunci API bervariasi berdasarkan wilayah. Untuk mendapatkan kunci API, lihat https://www.alibabacloud.com/help/en/model-studio/get-api-key
# Jika Anda menggunakan model di wilayah China (Beijing), ganti base_url dengan: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation
# === Hapus komentar ini sebelum eksekusi ===
curl -X POST "https://dashscope-intl.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": "Halo"
},
{
"role": "assistant",
"content": "Halo! Senang bertemu Anda. Ada yang bisa saya bantu?"
},
{
"role": "user",
"content": "Siapa Anda?"
}
]
},
"parameters":{
"enable_thinking": true,
"incremental_output": true,
"result_format": "message"
}
}'Mulai Beroperasi
Percakapan multi-putaran dapat mengonsumsi banyak token dan mungkin melebihi panjang konteks maksimum model, yang dapat menyebabkan kesalahan. Strategi berikut dapat membantu Anda mengelola konteks secara efektif dan mengendalikan biaya.
1. Manajemen konteks
Array messages bertambah panjang seiring setiap putaran percakapan dan akhirnya dapat melebihi batas token model. Gunakan metode berikut untuk mengelola panjang konteks selama percakapan.
1.1. Pemotongan konteks
Saat riwayat percakapan menjadi terlalu panjang, simpan hanya N putaran percakapan terbaru. Metode ini mudah diimplementasikan tetapi menyebabkan kehilangan informasi percakapan sebelumnya.
1.2. Ringkasan bergulir
Untuk memampatkan riwayat percakapan secara dinamis dan mengontrol panjang konteks tanpa kehilangan informasi inti, ringkas konteks seiring berjalannya percakapan:
a. Saat riwayat percakapan mencapai panjang tertentu, misalnya 70% dari panjang konteks maksimum, ekstrak bagian awal riwayat tersebut, misalnya separuh pertama. Kemudian, buat panggilan API terpisah ke model untuk menghasilkan "ringkasan memori" dari bagian tersebut.
b. Saat menyusun permintaan berikutnya, ganti riwayat percakapan yang panjang dengan "ringkasan memori" dan tambahkan putaran percakapan terbaru.
1.3. Pengambilan berbasis vektor
Ringkasan bergulir dapat menyebabkan kehilangan informasi. Untuk memungkinkan model mengingat kembali informasi relevan dari volume besar riwayat percakapan, beralihlah dari pengiriman konteks linier ke pengambilan berdasarkan permintaan:
a. Setelah setiap putaran percakapan, simpan percakapan tersebut dalam database vektor.
b. Saat pengguna mengajukan pertanyaan, ambil catatan percakapan yang relevan berdasarkan kemiripan.
c. Gabungkan catatan percakapan yang diambil dengan input pengguna terbaru dan kirimkan konten gabungan tersebut ke model.
2. Pengendalian biaya
Jumlah token input meningkat seiring setiap putaran percakapan, yang secara signifikan menaikkan biaya. Gunakan strategi manajemen biaya berikut.
2.1. Kurangi token input
Gunakan strategi manajemen konteks yang dijelaskan sebelumnya untuk mengurangi token input dan menurunkan biaya.
2.2. Gunakan model yang mendukung cache konteks
Saat membuat permintaan percakapan multi-putaran, konten dalam array messages diproses dan ditagih berulang kali. Alibaba Cloud Model Studio menyediakan fitur cache konteks untuk model seperti qwen-max dan qwen-plus. Fitur ini dapat mengurangi biaya dan meningkatkan kecepatan respons. Kami menyarankan agar Anda memprioritaskan penggunaan model yang mendukung cache konteks.
Fitur cache konteks diaktifkan secara otomatis. Tidak diperlukan perubahan kode.
Kode kesalahan
Jika panggilan gagal, lihat Pesan kesalahan untuk troubleshooting.