All Products
Search
Document Center

Alibaba Cloud Model Studio:Deep research (Qwen-Deep-Research)

Last Updated:Sep 09, 2026

Mengotomatisasi penelitian kompleks melalui perencanaan, beberapa putaran pencarian web, dan pembuatan laporan terstruktur, serta mengumpulkan dan mensintesis informasi tanpa upaya manual.

CatatanDokumen ini hanya berlaku untuk wilayah Tiongkok daratan (Beijing). Untuk menggunakan model ini, gunakan API key dari wilayah Tiongkok daratan (Beijing).

Memulai

Dapatkan API key dan ekspor API key sebagai Variabel lingkungan. Jika Anda menggunakan SDK untuk melakukan panggilan, instal DashScope SDK.

Model ini menggunakan alur kerja dua langkah: langkah pertanyaan lanjutan (model mengklarifikasi cakupan penelitian Anda) dan langkah deep research (model melakukan pencarian, analisis, dan menghasilkan laporan). Pertanyaan lanjutan memungkinkan model memahami secara tepat apa yang harus diteliti sebelum memulai proses penelitian yang panjang.

Saat ini, model tidak mendukung DashScope SDK untuk Java atau panggilan API yang kompatibel dengan OpenAI.

import os
import dashscope

# 以下为华北2(北京)地域的URL,各地域的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'

# Konfigurasikan API key
# Jika tidak disetel, ganti baris berikut dengan Kunci API Model Studio Anda (format: sk-xxx)
API_KEY = os.getenv('DASHSCOPE_API_KEY')

def call_deep_research_model(messages, step_name):
    print(f"\n=== {step_name} ===")

    try:
        responses = dashscope.Generation.call(
            api_key=API_KEY,
            model="qwen-deep-research",
            messages=messages,
            # Model qwen-deep-research saat ini hanya mendukung keluaran streaming
            stream=True
            # incremental_output=True Tambahkan parameter ini untuk keluaran inkremental
        )

        return process_responses(responses, step_name)

    except Exception as e:
        print(f"Terjadi kesalahan saat memanggil API: {e}")
        return ""

# Menampilkan konten fase
def display_phase_content(phase, content, status):
    if content:
        print(f"\n[{phase}] {status}: {content}")
    else:
        print(f"\n[{phase}] {status}")

# Memproses respons
def process_responses(responses, step_name):
    current_phase = None
    phase_content = ""
    research_goal = ""
    web_sites = []
    references = []
    keepalive_shown = False  # Bendera untuk memeriksa apakah prompt KeepAlive telah ditampilkan

    for response in responses:
        # Periksa kode status respons
        if hasattr(response, 'status_code') and response.status_code != 200:
            print(f"Kode respons HTTP: {response.status_code}")
            if hasattr(response, 'code'):
                print(f"Kode error: {response.code}")
            if hasattr(response, 'message'):
                print(f"Pesan error: {response.message}")
            print("Untuk informasi lebih lanjut, lihat: https://www.alibabacloud.com/help/en/model-studio/error-code")
            continue

        if hasattr(response, 'output') and response.output:
            message = response.output.get('message', {})
            phase = message.get('phase')
            content = message.get('content', '')
            status = message.get('status')
            extra = message.get('extra', {})

            # Deteksi perubahan fase
            if phase != current_phase:
                if current_phase and phase_content:
                    # Menampilkan deskripsi penyelesaian berbeda berdasarkan fase dan nama langkah
                    if step_name == "Step 1: Model query confirmation" and current_phase == "answer":
                        print(f"\n Fase konfirmasi kueri selesai")
                    else:
                        print(f"\n Fase {current_phase} selesai")
                current_phase = phase
                phase_content = ""
                keepalive_shown = False  # Reset bendera prompt KeepAlive

                # Menampilkan deskripsi berbeda berdasarkan fase dan nama langkah
                if step_name == "Step 1: Model query confirmation" and phase == "answer":
                    print(f"\n Memasuki fase konfirmasi kueri")
                else:
                    print(f"\n Memasuki fase {phase}")

            # Memproses informasi referensi dalam fase Answer
            if phase == "answer":
                if extra.get('deep_research', {}).get('references'):
                    new_references = extra['deep_research']['references']
                    if new_references and new_references != references:  # Hindari tampilan duplikat
                        references = new_references
                        print(f"\n   Referensi ({len(references)}):")
                        for i, ref in enumerate(references, 1):
                            print(f"     {i}. {ref.get('title', 'Tidak ada judul')}")
                            if ref.get('url'):
                                print(f"        URL: {ref['url']}")
                            if ref.get('description'):
                                print(f"        Deskripsi: {ref['description'][:100]}...")
                            print()

            # Memproses informasi khusus dalam fase WebResearch
            # Catatan: Model qwen-deep-research-2025-12-15 menggunakan status streamingThinking
            # alih-alih streamingQueries dan streamingWebResult
            if phase == "WebResearch":
                if extra.get('deep_research', {}).get('research'):
                    research_info = extra['deep_research']['research']

                    # Memproses status streamingThinking (model snapshot) atau streamingQueries (model mainline)
                    if status in ("streamingThinking", "streamingQueries"):
                        if 'researchGoal' in research_info:
                            goal = research_info['researchGoal']
                            if goal:
                                research_goal += goal
                                print(f"\n   Tujuan penelitian: {goal}", end='', flush=True)

                    # Memproses status streamingWebResult (model mainline)
                    # Model snapshot menggabungkan status ini menggunakan streamingThinking
                    elif status == "streamingWebResult":
                        if 'webSites' in research_info:
                            sites = research_info['webSites']
                            if sites and sites != web_sites:  # Hindari tampilan duplikat
                                web_sites = sites
                                print(f"\n   Ditemukan {len(sites)} situs web relevan:")
                                for i, site in enumerate(sites, 1):
                                    print(f"     {i}. {site.get('title', 'Tidak ada judul')}")
                                    print(f"        Deskripsi: {site.get('description', 'Tidak ada deskripsi')[:100]}...")
                                    print(f"        URL: {site.get('url', 'Tidak ada tautan')}")
                                    if site.get('favicon'):
                                        print(f"        Ikon: {site['favicon']}")
                                    print()

                    # Memproses status WebResultFinished
                    elif status == "WebResultFinished":
                        print(f"\n   Pencarian web selesai. Ditemukan {len(web_sites)} sumber referensi.")
                        if research_goal:
                            print(f"   Tujuan penelitian: {research_goal}")

            # Mengakumulasi dan menampilkan konten
            if content:
                phase_content += content
                # Menampilkan konten secara real-time
                print(content, end='', flush=True)

            # Menampilkan perubahan status fase
            if status and status != "typing":
                print(f"\n   Status: {status}")

                # Menampilkan deskripsi status
                if status == "streamingThinking":
                    print("   → Mendekomposisi tugas penelitian dan meringkas konten web (fase WebResearch)")
                elif status == "streamingQueries":
                    print("   → Menghasilkan tujuan penelitian dan kueri pencarian (fase WebResearch)")
                elif status == "streamingWebResult":
                    print("   → Melakukan pencarian, membaca halaman web, dan eksekusi kode (fase WebResearch)")
                elif status == "WebResultFinished":
                    print("   → Fase pencarian web selesai (fase WebResearch)")

            # Saat status finished, tampilkan konsumsi token
            if status == "finished":
                if hasattr(response, 'usage') and response.usage:
                    usage = response.usage
                    print(f"\n    Statistik konsumsi token:")
                    print(f"      Token input: {usage.get('input_tokens', 0)}")
                    print(f"      Token output: {usage.get('output_tokens', 0)}")
                    print(f"      ID Permintaan: {response.get('request_id', 'Tidak diketahui')}")

            if phase == "KeepAlive":
                # Hanya tampilkan prompt saat pertama kali memasuki fase KeepAlive
                if not keepalive_shown:
                    print("Langkah saat ini selesai. Mempersiapkan langkah berikutnya.")
                    keepalive_shown = True
                continue

    if current_phase and phase_content:
        if step_name == "Step 1: Model query confirmation" and current_phase == "answer":
            print(f"\n Fase konfirmasi kueri selesai")
        else:
            print(f"\n Fase {current_phase} selesai")

    return phase_content

def main():
    # Periksa API key
    if not API_KEY:
        print("Error: Variabel lingkungan DASHSCOPE_API_KEY belum disetel")
        print("Setel variabel lingkungan atau modifikasi variabel API_KEY langsung di kode")
        return

    print("Pengguna memulai percakapan: Teliti penerapan artificial intelligence dalam pendidikan")

    # Langkah 1: Konfirmasi kueri model
    # Model menganalisis pertanyaan pengguna dan mengajukan pertanyaan klarifikasi untuk menentukan arah penelitian
    messages = [{'role': 'user', 'content': 'Teliti penerapan artificial intelligence dalam pendidikan'}]
    step1_content = call_deep_research_model(messages, "Step 1: Model query confirmation")

    # Langkah 2: Deep research
    # Berdasarkan konfirmasi kueri dari Langkah 1, model melakukan proses penelitian lengkap
    messages = [
        {'role': 'user', 'content': 'Teliti penerapan artificial intelligence dalam pendidikan'},
        {'role': 'assistant', 'content': step1_content},  # Menyertakan konten konfirmasi kueri model
        {'role': 'user', 'content': 'Saya terutama fokus pada pembelajaran personalisasi dan penilaian cerdas'}
    ]

    call_deep_research_model(messages, "Step 2: Deep research")
    print("\n Penelitian selesai!")

if __name__ == "__main__":
    main()
echo "Step 1: Model query confirmation"
# 以下为华北2(北京)地域的URL,各地域的URL不同。
curl --location 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "Teliti penerapan artificial intelligence dalam pendidikan",
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

echo -e "\n\n"
echo "Step 2: Deep research"
# 以下为华北2(北京)地域的URL,各地域的URL不同。
curl --location 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "Teliti penerapan artificial intelligence dalam pendidikan",
                "role": "user"
            },
            {
                "content": "Beritahu saya skenario penerapan spesifik artificial intelligence dalam pendidikan yang ingin Anda fokuskan?",
                "role": "assistant"
            },
            {
                "content": "Saya terutama fokus pada pembelajaran personalisasi",
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

Spesifikasi

Model

Jendela konteks (token)

Input maksimum (token)

Output maksimum (token)

qwen-deep-research

1.000.000

997.952

32.768

qwen-deep-research-2025-12-15

Catatanqwen-deep-research: model mainline yang terus diperbarui. qwen-deep-research-2025-12-15: versi snapshot dengan kedalaman, kualitas, dan MCP tool calling yang ditingkatkan. Keduanya mendukung image input dan ditagih secara terpisah.

Kemampuan inti

Lacak kemajuan melalui phase (tugas saat ini) dan status (kemajuan tugas).

Pertanyaan lanjutan dan pembuatan laporan (phase: "answer")

Menganalisis kueri Anda, mengajukan pertanyaan klarifikasi untuk menentukan cakupan, dan menghasilkan laporan penelitian akhir.

Nilai status:

  • typing: Menghasilkan konten teks
  • finished: Pembuatan konten teks selesai
Perencanaan penelitian (phase: "ResearchPlanning")

Membuat kerangka penelitian dari kueri Anda.

Nilai status:

  • typing: Menghasilkan rencana penelitian
  • finished: Rencana penelitian selesai
Pencarian web (phase: "WebResearch")

Menjalankan beberapa putaran pencarian web dan analisis konten. WebResultFinished menandakan akhir setiap putaran. finished menandakan akhir fase.

Nilai status:

  • streamingThinking: Mendekomposisi tugas penelitian dan meringkas konten web (khusus untuk qwen-deep-research-2025-12-15, menggantikan streamingQueries dan streamingWebResult)
  • streamingQueries: Menghasilkan kueri pencarian (hanya untuk qwen-deep-research)
  • streamingWebResult: Melakukan pencarian web dan menganalisis konten web (hanya untuk qwen-deep-research)
  • WebResultFinished: Putaran pencarian selesai
  • finished: Fase pencarian web selesai

Koneksi keepalive (fase: "KeepAlive")

Mempertahankan koneksi antara tugas-tugas berdurasi panjang. Abaikan fase ini dan lanjutkan pemrosesan.

Image input

Kedua model mendukung image input. Model menganalisis gambar dan memasukkan konten tersebut ke dalam penelitiannya. Gunakan format array untuk bidang content, dengan melewatkan objek image dan text bersamaan.

  • Format yang didukung: JPEG, PNG, BMP, WEBP. Maksimal 10 MB per gambar.
  • Maksimal 5 gambar per permintaan. Mendukung URL publik dan encoding Base64.
  • Format respons identik dengan permintaan teks saja. Model menghasilkan laporan berdasarkan konten gambar.
Contoh permintaan
import os
import dashscope

# 以下为华北2(北京)地域的URL,各地域的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'

API_KEY = os.getenv('DASHSCOPE_API_KEY')

messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://example.aliyuncs.com/example.png"},
            {"text": "Analisis tren data dalam grafik ini dan lakukan penelitian mendalam mengenai temuan utamanya"}
        ]
    }
]

responses = dashscope.Generation.call(
    api_key=API_KEY,
    model="qwen-deep-research",
    messages=messages,
    stream=True
)

for response in responses:
    if hasattr(response, 'output') and response.output:
        message = response.output.get('message', {})
        content = message.get('content', '')
        if content:
            print(content, end='', flush=True)
curl --location 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": [
                    {"image": "https://example.aliyuncs.com/example.png"},
                    {"text": "Analisis tren data dalam grafik ini dan lakukan penelitian mendalam mengenai temuan utamanya"}
                ],
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research"
}'

MCP tool calling

CatatanMCP tool calling hanya didukung oleh qwen-deep-research-2025-12-15. qwen-deep-research tidak mendukung fitur ini.

Model Context Protocol (MCP) tool calling memungkinkan qwen-deep-research-2025-12-15 mengambil data dari sumber data privat atau spesifik domain selama fase WebResearch—seperti basis pengetahuan, dokumen internal, atau database proprietary—bersamaan dengan pencarian web standar. Teruskan konfigurasi server MCP melalui parameter research_tools. Format respons identik dengan panggilan standar.

Untuk detail tentang research_tools dan spesifikasi alat MCP, lihat Qwen-Deep-Research.

Contoh permintaan

import os
import dashscope

# 以下为华北2(北京)地域的URL,各地域的URL不同。
dashscope.base_http_api_url = 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1'

API_KEY = os.getenv('DASHSCOPE_API_KEY')

messages = [
    {
        "role": "user",
        "content": "Gunakan basis pengetahuan untuk mencari pengumuman pembaruan produk yang baru diterbitkan dan susun menjadi laporan penelitian"
    }
]

responses = dashscope.Generation.call(
    api_key=API_KEY,
    model="qwen-deep-research-2025-12-15",
    messages=messages,
    stream=True,
    enable_feedback=False,
    research_tools=[{
        "type": "mcp",
        "server_label": "my-server",
        "server_url": "https://your-mcp-server.example.com/sse",
        "allowed_tools": ["search", "fetch"],
        "authentication": {
            "bearer": "your_jwt_token_here"
        }
    }]
)

for response in responses:
    if hasattr(response, 'output') and response.output:
        message = response.output.get('message', {})
        content = message.get('content', '')
        if content:
            print(content, end='', flush=True)
curl --location 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'X-DashScope-SSE: enable' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "messages": [
            {
                "content": "Gunakan basis pengetahuan untuk mencari pengumuman pembaruan produk yang baru diterbitkan dan susun menjadi laporan penelitian",
                "role": "user"
            }
        ]
    },
    "model": "qwen-deep-research-2025-12-15",
    "parameters": {
        "enable_feedback": false,
        "research_tools": [{
            "type": "mcp",
            "server_label": "my-server",
            "server_url": "https://your-mcp-server.example.com/sse",
            "allowed_tools": ["search", "fetch"],
            "authentication": {
                "bearer": "your_jwt_token_here"
            }
        }]
    }
}'

Penagihan

Model

Biaya input (per 1K token)

Biaya output (per 1K token)

Kuota gratis

qwen-deep-research

$0,007742

$0,023367

Tidak ada kuota gratis

qwen-deep-research-2025-12-15

Akan ditentukan

Akan ditentukan

Tidak ada kuota gratis

Penagihan didasarkan pada token input (pesan pengguna dan prompt sistem) dan token output (pertanyaan lanjutan, rencana penelitian, tujuan, kueri pencarian, dan laporan akhir). Kedua model ditagih secara terpisah.

Mulai produksi

Gunakan keluaran streaming

Model hanya mendukung keluaran streaming (stream=True). Satu tugas penelitian dapat berjalan selama beberapa menit melalui puluhan siklus pencarian-dan-baca iteratif, yang melebihi timeout permintaan sinkron. Gunakan streaming untuk menjaga koneksi tetap terbuka dan lacak kemajuan melalui bidang phase dan status.

Atasi error

Periksa kode status respons pada setiap chunk. Untuk kode status selain 200, baca bidang code dan message dan tangani sesuai kebutuhan.

Monitor penggunaan token

Saat status bernilai finished, ambil penggunaan token dari response.usage (token input, token output, dan ID permintaan).

Atasi keepalive koneksi

Fase KeepAlive mempertahankan koneksi antara tugas-tugas berdurasi panjang. Abaikan fase ini dan lanjutkan pemrosesan aliran.

FAQ

  • Mengapa bidang output kosong untuk beberapa chunk respons?

    Chunk awal hanya membawa metadata. Konten tiba di chunk berikutnya saat model menghasilkannya.

  • Bagaimana cara menentukan apakah suatu fase telah selesai?

    Fase selesai ketika status berubah menjadi finished.

  • Apakah model mendukung panggilan API yang kompatibel dengan OpenAI?

    Tidak. Panggilan API yang kompatibel dengan OpenAI tidak didukung.

  • Bagaimana perhitungan token input dan output?

    Token input mencakup pesan pengguna dan prompt sistem. Token output mencakup pertanyaan lanjutan, rencana penelitian, tujuan, kueri pencarian, dan laporan akhir.

  • Apa perbedaan antara qwen-deep-research dan qwen-deep-research-2025-12-15?

    qwen-deep-research: model mainline yang terus diperbarui. qwen-deep-research-2025-12-15: versi snapshot dengan kedalaman, kualitas, dan dukungan MCP yang ditingkatkan. Keduanya mendukung image input dan ditagih secara terpisah.

  • Bagaimana cara melewatkan gambar untuk penelitian?

    Gunakan format array untuk content: lewatkan {"image": "URL"} dan {"text": "deskripsi"} sebagai objek dalam array. Kedua model mendukung image input.

  • Bagaimana cara melewati pertanyaan lanjutan dan langsung ke penelitian?

    Setel enable_feedback ke false dalam parameters. Model akan melewati pertanyaan lanjutan dan langsung memulai penelitian.

Referensi API

Untuk parameter input dan output, lihat Qwen-Deep-Research.

Kode error

Jika pemanggilan model gagal dan mengembalikan pesan error, lihat Kode error untuk resolusi.

Batas laju

Lihat Batas laju.