全部產品
Search
文件中心

Alibaba Cloud Model Studio:代碼能力(Qwen-Coder)

更新時間:Dec 05, 2025

Qwen-Coder 是專用於代碼任務的語言模型。通過 API,您可以調用模型執行代碼產生、代碼補全,並通過工具調用(Function Calling)與外部系統互動。

快速開始

前提條件

以下樣本將示範如何調用 Qwen-Coder 模型編寫一個尋找質數的 Python 函數。

OpenAI相容

Python

請求樣本

import os
from openai import OpenAI

client = OpenAI(
    # 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    # 此處以qwen3-coder-plus為例,可按需更換模型名稱。
    model="qwen3-coder-plus", 
    messages=[
        {'role': 'system', 'content': 'You are a helpful assistant.'},
        {'role': 'user', 'content': '請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。'}],
)
print(completion.choices[0].message.content)

返回結果

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

Node.js

請求樣本

import OpenAI from "openai";

const client = new OpenAI(
    {
        // 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 若沒有配置環境變數,請用百鍊API Key將下行替換為:apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const completion = await client.chat.completions.create({
        model: "qwen3-coder-plus",  //此處以qwen3-coder-plus為例,可按需更換模型名稱。
        messages: [
            { role: "system", content: "You are a helpful assistant." },
            { role: "user", content: "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。" }
        ],
    });
    console.log(completion.choices[0].message.content);
}

main();

返回結果

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

curl

請求樣本

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions

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-coder-plus",
    "messages": [
        {
            "role": "system",
            "content": "You are a helpful assistant."
        },
        {
            "role": "user", 
            "content": "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。"
        }
    ]
}'

返回結果

{
    "choices": [
        {
            "message": {
                "content": "def find_prime_numbers(n):\n    if n <= 2:\n        return []\n    \n    primes = []\n    \n    for num in range(2, n):\n        is_prime = True\n        for i in range(2, int(num ** 0.5) + 1):\n            if num % i == 0:\n                is_prime = False\n                break\n        if is_prime:\n            primes.append(num)\n    \n    return primes",
                "role": "assistant"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 96,
        "completion_tokens": 90,
        "total_tokens": 186,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1761615592,
    "system_fingerprint": null,
    "model": "qwen3-coder-plus",
    "id": "chatcmpl-3de690bd-ae7f-461d-8eb6-d65b0577e803"
}

DashScope

Python

請求樣本

import dashscope
import os

# 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
    {
        "role": "system",
        "content": "You are a helpful assistant."
    },
    {
        "role": "user",
        "content": "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。"
    }
]

response = dashscope.Generation.call(
    # 新加坡地區和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key = "sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 此處以qwen3-coder-plus為例,可按需更換模型名稱。
    model="qwen3-coder-plus",
    messages=messages,
    result_format="message"
)

if response.status_code == 200:
    print(response.output.choices[0].message.content)
else:
    print(f"HTTP返回碼:{response.status_code}")
    print(f"錯誤碼:{response.code}")
    print(f"錯誤資訊:{response.message}")

返回結果

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

Java

請求樣本

import java.util.Arrays;
import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
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 com.alibaba.dashscope.protocol.Protocol;


public class Main {
    public static GenerationResult callWithMessage()
            throws NoApiKeyException, ApiException, InputRequiredException {
        String apiKey = System.getenv("DASHSCOPE_API_KEY");
        // 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/api/v1
        Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
        Message sysMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content("You are a helpful assistant.").build();
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content("請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。").build();
        // 此處以qwen3-coder-plus為例,可按需更換模型名稱。
        GenerationParam param = GenerationParam.builder()
                .apiKey(apiKey)
                .model("qwen3-coder-plus")
                .messages(Arrays.asList(sysMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        return gen.call(param);
    }
    public static void main(String[] args){
        try {
            GenerationResult result = callWithMessage();
            System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent());
        } catch (ApiException | NoApiKeyException | InputRequiredException e) {
            System.err.println("請求異常: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

返回結果

def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes

curl

請求樣本

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation

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": "qwen3-coder-plus",
    "input":{
        "messages":[      
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。"
            }
        ]
    },
    "parameters": {
        "result_format": "message"
    }
}'

返回結果

{
    "output": {
        "choices": [
            {
                "message": {
                    "content": "def find_prime_numbers(n):\n    if n <= 2:\n        return []\n    \n    primes = []\n    \n    for num in range(2, n):\n        is_prime = True\n        for i in range(2, int(num ** 0.5) + 1):\n            if num % i == 0:\n                is_prime = False\n                break\n        if is_prime:\n            primes.append(num)\n    \n    return primes",
                    "role": "assistant"
                },
                "finish_reason": "stop"
            }
        ]
    },
    "usage": {
        "total_tokens": 186,
        "output_tokens": 90,
        "input_tokens": 96,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "request_id": "b1b8d1f8-0d26-4651-a466-66eefa0e7c51"
}

模型選型

Qwen-Coder 已升級至Qwen3系列,支援高達 100 萬 Tokens 的上下文視窗,提供多款模型,以滿足您在不同情境下對效能、響應速度和成本的差異化需求。

選型建議

  • qwen3-coder-plus:代碼能力最強的模型,適用於產生複雜專案、深度代碼審查等高品質要求的任務。

  • qwen3-coder-flash:速度更快,成本更低,是兼顧效能與成本的高性價比選擇,適用於對響應速度敏感的情境。

模型的名稱、上下文、價格、快照版本等資訊請參見模型列表;並發限流條件請參考限流

核心能力

流式輸出

為提升互動體驗並降低長耗時請求的逾時風險,您可以通過設定 stream=True 參數來啟用流式輸出。模型將以資料區塊(Chunk)的形式持續返回產生的內容,而非等待全部內容產生完畢後一次性返回。

OpenAI相容

Python

請求樣本

import os
from openai import OpenAI

client = OpenAI(
    # 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3-coder-plus",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。"}
    ],
    stream=True,
    # 在最後一個chunk中擷取本次請求的Token用量
    stream_options={"include_usage": True}
)

content_parts = []
print("="*20+"回複內容"+"="*20)

for chunk in completion:
    # 最後一個chunk不包含choices,但包含usage資訊
    if chunk.choices:
        # delta.content可能為None,使用`or ""`避免拼接時出錯
        content = chunk.choices[0].delta.content or ""
        print(content, end="", flush=True)
        content_parts.append(content)
    elif chunk.usage:
        print("\n"+"="*20+"Token消耗"+"="*20)
        print(f"輸入 Tokens: {chunk.usage.prompt_tokens}")
        print(f"輸出 Tokens: {chunk.usage.completion_tokens}")
        print(f"總計 Tokens: {chunk.usage.total_tokens}")

full_response = "".join(content_parts)
# 如需擷取完整響應字串,請取消下行注釋
# print(f"\n--- 完整回複 ---\n{full_response}")

返回結果

====================回複內容====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token消耗====================
輸入 Tokens: 66
輸出 Tokens: 89
總計 Tokens: 155

Node.js

請求樣本

import OpenAI from "openai";

const client = new OpenAI(
    {
        // 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 若沒有配置環境變數,請用百鍊API Key將下行替換為:apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 以下是新加坡地區base_url,如果使用北京地區的模型,需要將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const stream = await client.chat.completions.create({
        model: "qwen3-coder-plus",
        messages: [
            { role: "system", content: "You are a helpful assistant." },
            { role: "user", content: "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。" },
        ],
        stream: true,
        // 在最後一個chunk中擷取本次請求的Token用量
        stream_options: { include_usage: true },
    });

    const contentParts = [];
    console.log("=".repeat(20) + "回複內容" + "=".repeat(20));
    
    for await (const chunk of stream) {
        // 最後一個chunk不包含choices,但包含usage資訊
        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) {
            // 請求結束,列印Token用量
            console.log("\n"+"=".repeat(20) + "Token消耗" + "=".repeat(20));
            console.log(`輸入 Tokens: ${chunk.usage.prompt_tokens}`);
            console.log(`輸出 Tokens: ${chunk.usage.completion_tokens}`);
            console.log(`總計 Tokens: ${chunk.usage.total_tokens}`);
        }
    }
    
    const fullResponse = contentParts.join("");
    // 如需擷取完整響應字串,請取消下行注釋
    // console.log(`\n--- 完整回複 ---\n${fullResponse}`);
}

main();

返回結果

====================回複內容====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token消耗====================
輸入 Tokens: 66
輸出 Tokens: 89
總計 Tokens: 155

curl

請求樣本

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions

curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
--no-buffer \
-d '{
    "model": "qwen3-coder-plus",
    "messages": [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。"}
    ],
    "stream": true,
    "stream_options": {"include_usage": true}
}'

返回結果

data: {"choices":[{"delta":{"content":"","role":"assistant"},"index":0,"logprobs":null,"finish_reason":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[{"finish_reason":null,"logprobs":null,"delta":{"content":"def"},"index":0}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[{"delta":{"content":" find_prime_numbers(n"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

......

data: {"choices":[{"delta":{"content":" primes"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[{"finish_reason":"stop","delta":{"content":""},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":66,"completion_tokens":89,"total_tokens":155,"prompt_tokens_details":{"cached_tokens":0}},"created":1763085409,"system_fingerprint":null,"model":"qwen3-coder-plus","id":"chatcmpl-61f94113-f29b-4f7d-9730-551749d40ef4"}

data: [DONE]

DashScope

Python

請求樣本

import os
from http import HTTPStatus
import dashscope
from dashscope import Generation

# 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。"},
]

responses = Generation.call(
    # 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen3-coder-plus",
    messages=messages,
    result_format="message",
    stream=True,
    # 增量輸出,每個資料區塊僅包含新產生的內容
    incremental_output=True,
)

content_parts = []
print("="*20+"回複內容"+"="*20+"\n", 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)

        if resp.output.choices[0].finish_reason == "stop":
            print("\n"+"=" * 20 + "Token消耗" + "=" * 20)
            print(f"輸入 Tokens: {resp.usage.input_tokens}")
            print(f"輸出 Tokens: {resp.usage.output_tokens}")
            print(f"總計 Tokens: {resp.usage.total_tokens}")
    else:
        print(f"HTTP返回碼:{resp.status_code}")
        print(f"錯誤碼:{resp.code}")
        print(f"錯誤資訊:{resp.message}")
full_response = "".join(content_parts)
# 如需擷取完整響應字串,請取消下行注釋
# print(f"\n--- 完整回複 ---\n{full_response}")

返回結果

====================回複內容====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token消耗====================
輸入 Tokens: 66
輸出 Tokens: 89
總計 Tokens: 155

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) {
        String apiKey = System.getenv("DASHSCOPE_API_KEY");

        // 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/api/v1
        Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");
        CountDownLatch latch = new CountDownLatch(1);

        GenerationParam param = GenerationParam.builder()
                .apiKey(apiKey)
                .model("qwen3-coder-plus")
                .messages(Arrays.asList(
                        Message.builder()
                                .role(Role.USER.getValue())
                                .content("請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。")
                                .build()
                ))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .incrementalOutput(true) // 開啟增量輸出,流式返回,每個資料區塊僅包含新產生的內容
                .build();
        try {
            Flowable<GenerationResult> result = gen.streamCall(param);
            StringBuilder fullContent = new StringBuilder();
            System.out.println("====================回複內容====================");
            result
                    .subscribeOn(Schedulers.io()) // IO線程執行請求
                    .observeOn(Schedulers.computation()) // 計算線程處理響應
                    .subscribe(
                            // onNext: 處理每個響應片段
                            message -> {
                                String content = message.getOutput().getChoices().get(0).getMessage().getContent();
                                String finishReason = message.getOutput().getChoices().get(0).getFinishReason();
                                // 輸出內容
                                System.out.print(content);
                                fullContent.append(content);
                                // 當 finishReason 不為 null 時,表示是最後一個 chunk,輸出用量資訊
                                if (finishReason != null && !"null".equals(finishReason)) {
                                    System.out.println("\n====================Token消耗====================");
                                    System.out.println("輸入 Tokens: " + message.getUsage().getInputTokens());
                                    System.out.println("輸出 Tokens: " + message.getUsage().getOutputTokens());
                                    System.out.println("總計 Tokens: " + message.getUsage().getTotalTokens());
                                }
                                System.out.flush(); // 立即重新整理輸出
                            },
                            // onError: 處理錯誤
                            error -> {
                                System.err.println("\n請求失敗: " + error.getMessage());
                                latch.countDown();
                            },
                            // onComplete: 完成回調
                            () -> {
                                System.out.println(); // 換行
                                // 如需擷取完整響應字串,請取消下行注釋
                                // System.out.println("完整響應: " + fullContent.toString());
                                latch.countDown();
                            }
                    );
            // 主線程等待非同步任務完成
            latch.await();
        } catch (Exception e) {
            System.err.println("請求異常: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

返回結果

====================回複內容====================
def find_prime_numbers(n):
    if n <= 2:
        return []
    
    primes = []
    for num in range(2, n):
        is_prime = True
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(num)
    
    return primes
====================Token消耗====================
輸入 Tokens: 66
輸出 Tokens: 89
總計 Tokens: 155

curl

請求樣本

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation

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": "qwen3-coder-plus",
    "input":{
        "messages":[      
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "請編寫一個Python函數 find_prime_numbers,該函數接受一個整數 n 作為參數,並返回一個包含所有小於 n 的質數(素數)的列表。不要輸出非代碼的內容和Markdown的代碼塊。"
            }
        ]
    },
    "parameters": {
        "result_format": "message",
        "incremental_output":true
    }
}'

返回結果

id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"def","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":67,"output_tokens":1,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":" find_prime_numbers(n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":71,"output_tokens":5,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

id:3
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"):\n    if n","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":75,"output_tokens":9,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

...

id:26
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":" primes","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":155,"output_tokens":89,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

id:27
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":"","role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":155,"output_tokens":89,"input_tokens":66,"prompt_tokens_details":{"cached_tokens":0}},"request_id":"fadfc21b-4411-40d5-b143-8c3573284c42"}

調用工具(Function Calling)

為使模型能夠與外部環境互動(例如,讀寫檔案、調用 API、操作資料庫),您可以為其提供一系列工具。模型會根據您的指令,決定是否以及如何調用這些工具。詳情請參見Function Calling

完整的工具調用流程包括:

  1. 定義工具並發起請求:在請求中定義好工具列表,並向模型提出需要藉助工具完成的任務。

  2. 執行工具:解析模型返回的 tool_calls,並調用您本地已實現的對應工具函數來執行任務。

  3. 返回執行結果:將工具的執行結果封裝成特定格式,再次發送給模型,讓其基於結果完成最終任務。

以下樣本將示範如何引導模型產生代碼,並使用 write_file 工具將其儲存到本地檔案。

OpenAI相容

Python

請求樣本

import os
import json
from openai import OpenAI

client = OpenAI(
    # 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

tools = [
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "將內容寫入指定檔案,若檔案不存在則建立。",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "目標檔案的相對或絕對路徑"
                    },
                    "content": {
                        "type": "string",
                        "description": "寫入檔案的字串內容"
                    }
                },
                "required": ["path", "content"]
            }
        }
    }
]

# 工具函數實現
def write_file(path: str, content: str) -> str:
    """寫入檔案內容"""
    try:
        # 確保目錄存在
        os.makedirs(os.path.dirname(path),
                    exist_ok=True) if os.path.dirname(path) else None
        with open(path, 'w', encoding='utf-8') as f:
            f.write(content)
        return f"成功: 檔案 '{path}' 已寫入"
    except Exception as e:
        return f"錯誤: 寫入檔案時發生異常 - {str(e)}"


messages = [{"role": "user", "content": "寫一個python代碼,快速排序,命名為quick_sort.py"}]

completion = client.chat.completions.create(
    model="qwen3-coder-plus",
    messages=messages,
    tools=tools
)

assistant_output = completion.choices[0].message
if assistant_output.content is None:
    assistant_output.content = ""
messages.append(assistant_output)

# 如果不需要調用工具,直接輸出內容
if assistant_output.tool_calls is None:
    print(f"無需調用工具,直接回複:{assistant_output.content}")
else:
    # 進入工具調用迴圈
    while assistant_output.tool_calls is not None:
        for tool_call in assistant_output.tool_calls:
            tool_call_id = tool_call.id
            func_name = tool_call.function.name
            arguments = json.loads(tool_call.function.arguments)
            print(f"正在調用工具 [{func_name}],參數:{arguments}")
            # 執行工具
            tool_result = write_file(**arguments)
            # 構造工具返回資訊
            tool_message = {
                "role": "tool",
                "tool_call_id": tool_call_id,
                "content": tool_result,
            }
            print(f"工具返回:{tool_message['content']}")
            messages.append(tool_message)
        # 再次調用模型,擷取總結後的自然語言回複
        response = client.chat.completions.create(
            model="qwen3-coder-plus",
            messages=messages,
            tools=tools
        )
        assistant_output = response.choices[0].message
        if assistant_output.content is None:
            assistant_output.content = ""
        messages.append(assistant_output)
    print(f"模型最終回複:{assistant_output.content}")

返回結果

正在調用工具 [write_file],參數:{'content': 'def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\"__main__\\":\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\"Original list:\\", example_list)\\n    sorted_list = quick_sort(example_list)\\n    print(\\"Sorted list:\\", sorted_list)', 'path': 'quick_sort.py'}
工具返回:成功: 檔案 'quick_sort.py' 已寫入
模型最終回複:好的,已經為你建立了名為 `quick_sort.py` 的檔案,其中包含了快速排序的 Python 實現。你可以運行這個檔案查看樣本輸出。如果需要進一步修改或解釋,請告訴我!

Node.js

請求樣本

import OpenAI from "openai";
import fs from "fs/promises";
import path from "path";

const client = new OpenAI({
    // 新加坡和北京地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    // 若沒有配置環境變數,請用百鍊API Key將下行替換為:apiKey: "sk-xxx",
    apiKey: process.env.DASHSCOPE_API_KEY,
    // 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
    baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
});

const tools = [
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "將內容寫入指定檔案,若檔案不存在則建立。",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "目標檔案的相對或絕對路徑"
                    },
                    "content": {
                        "type": "string",
                        "description": "寫入檔案的字串內容"
                    }
                },
                "required": ["path", "content"]
            }
        }
    }
];

// 工具函數實現
async function write_file(filePath, content) {
    try {
        // 為安全起見,檔案寫入功能已預設禁用,如需使用請取消注釋並確保路徑安全
        // const dir = path.dirname(filePath);
        // if (dir) {
        //     await fs.mkdir(dir, { recursive: true });
        // }
        // await fs.writeFile(filePath, content, "utf-8");
        return `成功: 檔案 '${filePath}' 已寫入`;
    } catch (error) {
        return `錯誤: 寫入檔案時發生異常 - ${error.message}`;
    }
}

const messages = [{"role": "user", "content": "寫一個python代碼,快速排序,命名為quick_sort.py"}];

async function main() {
    const completion = await client.chat.completions.create({
        model: "qwen3-coder-plus",
        messages: messages,
        tools: tools
    });

    let assistant_output = completion.choices[0].message;
    // 確保 content 不是 null
    if (!assistant_output.content) assistant_output.content = "";
    messages.push(assistant_output);

    // 如果不需要調用工具,直接輸出內容
    if (!assistant_output.tool_calls) {
        console.log(`無需調用工具,直接回複:${assistant_output.content}`);
    } else {
        // 進入工具調用迴圈
        while (assistant_output.tool_calls) {
            for (const tool_call of assistant_output.tool_calls) {
                const tool_call_id = tool_call.id;
                const func_name = tool_call.function.name;
                const args = JSON.parse(tool_call.function.arguments);
                console.log(`正在調用工具 [${func_name}],參數:`, args);
                // 執行工具
                const tool_result = await write_file(args.path, args.content);
                // 構造工具返回資訊
                const tool_message = {
                    "role": "tool",
                    "tool_call_id": tool_call_id,
                    "content": tool_result
                };
                console.log(`工具返回:${tool_message.content}`);
                messages.push(tool_message);
            }
            // 再次調用模型,擷取總結後的自然語言回複
            const response = await client.chat.completions.create({
                model: "qwen3-coder-plus",
                messages: messages,
                tools: tools
            });
            assistant_output = response.choices[0].message;
            if (!assistant_output.content) assistant_output.content = "";
            messages.push(assistant_output);
        }
        console.log(`模型最終回複:${assistant_output.content}`);
    }
}

main();

返回結果

正在調用工具 [write_file],參數: {
  content: 'def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\"__main__\\":\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\"Original list:\\", example_list)\\n    sorted_list = quick_sort(example_list)\\n    print(\\"Sorted list:\\", sorted_list)',
  path: 'quick_sort.py'
}
工具返回:成功: 檔案 'quick_sort.py' 已寫入
模型最終回複:已成功建立 `quick_sort.py` 檔案,其中包含快速排序的 Python 實現。你可以運行該檔案以查看樣本列表的排序結果。如果需要進一步修改或解釋,請告訴我!

curl

請求樣本

該樣本展示了工具調用流程的第一步:發起請求並獲得模型的工具調用意圖。

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions

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-coder-plus",
    "messages": [
        {
            "role": "user", 
            "content": "寫一個python代碼,快速排序,命名為quick_sort.py"
        }
    ],
    "tools": [
        {
            "type": "function",
            "function": {
                "name": "write_file",
                "description": "將內容寫入指定檔案,若檔案不存在則建立。",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "path": {
                            "type": "string",
                            "description": "目標檔案的相對或絕對路徑"
                        },
                        "content": {
                            "type": "string",
                            "description": "寫入檔案的字串內容"
                        }
                    },
                    "required": ["path", "content"]
                }
            }
        }
    ]
}'

返回結果

{
    "choices": [
        {
            "message": {
                "content": "",
                "role": "assistant",
                "tool_calls": [
                    {
                        "index": 0,
                        "id": "call_0ca7505bb6e44471a40511e5",
                        "type": "function",
                        "function": {
                            "name": "write_file",
                            "arguments": "{\"content\": \"def quick_sort(arr):\\\\n    if len(arr) <= 1:\\\\n        return arr\\\\n    pivot = arr[len(arr) // 2]\\\\n    left = [x for x in arr if x < pivot]\\\\n    middle = [x for x in arr if x == pivot]\\\\n    right = [x for x in arr if x > pivot]\\\\n    return quick_sort(left) + middle + quick_sort(right)\\\\n\\\\nif __name__ == \\\\\\\"__main__\\\\\\\":\\\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\\\n    print(\\\\\\\"Original list:\\\\\\\", example_list)\\\\n    sorted_list = quick_sort(example_list)\\\\n    print(\\\\\\\"Sorted list:\\\\\\\", sorted_list)\", \"path\": \"quick_sort.py\"}"
                        }
                    }
                ]
            },
            "finish_reason": "tool_calls",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 494,
        "completion_tokens": 193,
        "total_tokens": 687,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1761620025,
    "system_fingerprint": null,
    "model": "qwen3-coder-plus",
    "id": "chatcmpl-20e96159-beea-451f-b3a4-d13b218112b5"
}

DashScope

Python

請求樣本

import os
import json
import dashscope

# 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

tools = [
    {
        "type": "function",
        "function": {
            "name": "write_file",
            "description": "將內容寫入指定檔案,若檔案不存在則建立。",
            "parameters": {
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "目標檔案的相對或絕對路徑"
                    },
                    "content": {
                        "type": "string",
                        "description": "寫入檔案的字串內容"
                    }
                },
                "required": ["path", "content"]
            }
        }
    }
]

# 工具函數實現
def write_file(path: str, content: str) -> str:
    """寫入檔案內容"""
    try:
        # 為安全起見,檔案寫入功能已預設禁用,如需使用請取消注釋並確保路徑安全
        # os.makedirs(os.path.dirname(path),exist_ok=True) if os.path.dirname(path) else None
        # with open(path, 'w', encoding='utf-8') as f:
        #     f.write(content)
        return f"成功: 檔案 '{path}' 已寫入"
    except Exception as e:
        return f"錯誤: 寫入檔案時發生異常 - {str(e)}"


messages = [{"role": "user", "content": "寫一個python代碼,快速排序,命名為quick_sort.py"}]

response = dashscope.Generation.call(
    # 若沒有配置環境變數,請用百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3-coder-plus',
    messages=messages,
    tools=tools,
    result_format='message'
)

if response.status_code == 200:
    assistant_output = response.output.choices[0].message
    messages.append(assistant_output)

    # 如果不需要調用工具,直接輸出內容
    if "tool_calls" not in assistant_output or not assistant_output["tool_calls"]:
        print(f"無需調用工具,直接回複:{assistant_output['content']}")
    else:
        # 進入工具調用迴圈
        while "tool_calls" in assistant_output and assistant_output["tool_calls"]:
            for tool_call in assistant_output["tool_calls"]:
                func_name = tool_call["function"]["name"]
                arguments = json.loads(tool_call["function"]["arguments"])
                tool_call_id = tool_call.get("id")
                print(f"正在調用工具 [{func_name}],參數:{arguments}")
                # 執行工具
                tool_result = write_file(**arguments)
                # 構造工具返回資訊
                tool_message = {
                    "role": "tool",
                    "content": tool_result,
                    "tool_call_id": tool_call_id
                }
                print(f"工具返回:{tool_message['content']}")
                messages.append(tool_message)
            # 再次調用模型,擷取總結後的自然語言回複
            response = dashscope.Generation.call(
                api_key=os.getenv('DASHSCOPE_API_KEY'),
                model='qwen3-coder-plus',
                messages=messages,
                tools=tools,
                result_format='message'
            )
            if response.status_code == 200:
                print(f"模型最終回複:{response.output.choices[0].message.content}")
                assistant_output = response.output.choices[0].message
                messages.append(assistant_output)
            else:
                print(f"總結回複時執行錯誤:{response}")
                break
else:
    print(f"執行錯誤:{response}")

返回結果

正在調用工具 [write_file],參數:{'content': 'def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\"__main__\\":\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\"Original list:\\", example_list)\\n    sorted_list = quick_sort(example_list)\\n    print(\\"Sorted list:\\", sorted_list)', 'path': 'quick_sort.py'}
工具返回:成功: 檔案 'quick_sort.py' 已寫入
模型最終回複:已成功建立 `quick_sort.py` 檔案,其中包含快速排序的 Python 實現。你可以運行該檔案以查看樣本列表的排序結果。如果需要進一步修改或解釋,請告訴我!

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 com.alibaba.dashscope.protocol.Protocol;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.tools.FunctionDefinition;
import com.alibaba.dashscope.tools.ToolCallBase;
import com.alibaba.dashscope.tools.ToolCallFunction;
import com.alibaba.dashscope.tools.ToolFunction;
import com.alibaba.dashscope.utils.JsonUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    /**
     * 寫入檔案內容
     * @param arguments 模型傳入的、包含工具所需參數的JSON字串。
     * @return 工具執行後的結果字串。
     */
    public static String writeFile(String arguments) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode argsNode = objectMapper.readTree(arguments);
            String path = argsNode.get("path").asText();
            String content = argsNode.get("content").asText();

            // 為安全起見,檔案寫入功能已預設禁用,如需使用請取消注釋並確保路徑安全
            // File file = new File(path);
            // File parentDir = file.getParentFile();
            // if (parentDir != null && !parentDir.exists()) {
            //     parentDir.mkdirs();
            // }
            // Files.write(Paths.get(path), content.getBytes(StandardCharsets.UTF_8));
            return "成功: 檔案 '" + path + "' 已寫入";
        } catch (Exception e) {
            return "錯誤: 寫入檔案時發生異常 - " + e.getMessage();
        }
    }

    public static void main(String[] args) {
        try {
            // 定義工具參數模式
            String writePropertyParams =
                    "{\"type\":\"object\",\"properties\":{\"path\":{\"type\":\"string\",\"description\":\"目標檔案的相對或絕對路徑\"},\"content\":{\"type\":\"string\",\"description\":\"寫入檔案的字串內容\"}},\"required\":[\"path\",\"content\"]}";

            FunctionDefinition writeFileFunction = FunctionDefinition.builder()
                    .name("write_file")
                    .description("將內容寫入指定檔案,若檔案不存在則建立。")
                    .parameters(JsonUtils.parseString(writePropertyParams).getAsJsonObject())
                    .build();

            // 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/api/v1
            Generation gen = new Generation(Protocol.HTTP.getValue(), "https://dashscope-intl.aliyuncs.com/api/v1");

            String userInput = "寫一個python代碼,快速排序,命名為quick_sort.py";
            List<Message> messages = new ArrayList<>();
            messages.add(Message.builder().role(Role.USER.getValue()).content(userInput).build());

            // 首次調用模型
            GenerationParam param = GenerationParam.builder()
                    .model("qwen3-coder-plus")
                    .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                    .messages(messages)
                    .tools(Arrays.asList(ToolFunction.builder().function(writeFileFunction).build()))
                    .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                    .build();

            GenerationResult result = gen.call(param);
            Message assistantOutput = result.getOutput().getChoices().get(0).getMessage();
            messages.add(assistantOutput);

            // 如果不需要調用工具,直接輸出內容
            if (assistantOutput.getToolCalls() == null || assistantOutput.getToolCalls().isEmpty()) {
                System.out.println("無需調用工具,直接回複:" + assistantOutput.getContent());
            } else {
                // 進入工具調用迴圈
                while (assistantOutput.getToolCalls() != null && !assistantOutput.getToolCalls().isEmpty()) {
                    for (ToolCallBase toolCall : assistantOutput.getToolCalls()) {
                        ToolCallFunction functionCall = (ToolCallFunction) toolCall;
                        String funcName = functionCall.getFunction().getName();
                        String arguments = functionCall.getFunction().getArguments();
                        System.out.println("正在調用工具 [" + funcName + "],參數:" + arguments);

                        // 執行工具
                        String toolResult = writeFile(arguments);

                        // 構造工具返回資訊
                        Message toolMessage = Message.builder()
                                .role("tool")
                                .toolCallId(toolCall.getId())
                                .content(toolResult)
                                .build();
                        System.out.println("工具返回:" + toolMessage.getContent());
                        messages.add(toolMessage);
                    }

                    // 再次調用模型,擷取總結後的自然語言回複
                    param.setMessages(messages);
                    result = gen.call(param);
                    assistantOutput = result.getOutput().getChoices().get(0).getMessage();
                    messages.add(assistantOutput);
                }
                System.out.println("模型最終回複:" + assistantOutput.getContent());
            }

        } catch (NoApiKeyException | InputRequiredException e) {
            System.err.println("錯誤: " + e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

返回結果

正在調用工具 [write_file],參數:{"content": "def quick_sort(arr):\\n    if len(arr) <= 1:\\n        return arr\\n    pivot = arr[len(arr) // 2]\\n    left = [x for x in arr if x < pivot]\\n    middle = [x for x in arr if x == pivot]\\n    right = [x for x in arr if x > pivot]\\n    return quick_sort(left) + middle + quick_sort(right)\\n\\nif __name__ == \\\"__main__\\\":\\n    example_array = [3, 6, 8, 10, 1, 2, 1]\\n    print(\\\"Original array:\\\", example_array)\\n    sorted_array = quick_sort(example_array)\\n    print(\\\"Sorted array:\\\", sorted_array)", "path": "quick_sort.py"}
工具返回:成功: 檔案 'quick_sort.py' 已寫入
模型最終回複:已成功為您建立了快速排序的Python代碼檔案 `quick_sort.py`。該檔案包含一個 `quick_sort` 函數和一個樣本用法,您可以在終端或編輯器中運行它來測試快速排序功能。

curl

請求樣本

該樣本展示了工具調用流程的第一步:發起請求並獲得模型的工具調用意圖。

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation

curl --location "https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/text-generation/generation" \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header "Content-Type: application/json" \
--data '{
    "model": "qwen3-coder-plus",
    "input": {
        "messages": [{
            "role": "user",
            "content": "寫一個python代碼,快速排序,命名為quick_sort.py"
        }]
    },
    "parameters": {
        "result_format": "message",
        "tools": [
        {
            "type": "function",
            "function": {
                "name": "write_file",
                "description": "將內容寫入指定檔案,若檔案不存在則建立。",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "path": {
                            "type": "string",
                            "description": "目標檔案的相對或絕對路徑"
                        },
                        "content": {
                            "type": "string",
                            "description": "寫入檔案的字串內容"
                        }
                    },
                    "required": ["path", "content"]
                }
            }
        }
    ]
    }
}'

返回結果

{
    "output": {
        "choices": [
            {
                "finish_reason": "tool_calls",
                "message": {
                    "role": "assistant",
                    "tool_calls": [
                        {
                            "function": {
                                "name": "write_file",
                                "arguments": "{\"content\": \"def quick_sort(arr):\\\\n    if len(arr) <= 1:\\\\n        return arr\\\\n    pivot = arr[len(arr) // 2]\\\\n    left = [x for x in arr if x < pivot]\\\\n    middle = [x for x in arr if x == pivot]\\\\n    right = [x for x in arr if x > pivot]\\\\n    return quick_sort(left) + middle + quick_sort(right)\\\\n\\\\nif __name__ == \\\\\\\"__main__\\\\\\\":\\\\n    example_list = [3, 6, 8, 10, 1, 2, 1]\\\\n    print(\\\\\\\"Original list:\\\\\\\", example_list)\\\\n    sorted_list = quick_sort(example_list)\\\\n    print(\\\\\\\"Sorted list:\\\\\\\", sorted_list), \"path\": \"quick_sort.py\"}"
                            },
                            "index": 0,
                            "id": "call_645b149bbd274e8bb3789aae",
                            "type": "function"
                        }
                    ],
                    "content": ""
                }
            }
        ]
    },
    "usage": {
        "total_tokens": 684,
        "output_tokens": 193,
        "input_tokens": 491,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "request_id": "d2386acd-fce3-9d0f-8015-c5f3a8bf9f5c"
}

代碼補全

Qwen-Coder 支援兩種代碼補全方式,請根據您的需求選擇:

  • 首碼續寫(Partial Mode):適用於所有 Qwen-Coder 模型和地區,支援首碼補全,實現簡單,推薦使用。

  • Completions介面:僅支援中國(北京)地區qwen2.5-coder 系列模型。支援首碼補全和前尾碼補全。

首碼續寫 (Partial Mode)

此功能用於在您寫了一半的代碼(首碼)基礎上,讓模型自動完成剩餘部分。

通過在 messages 列表中加入一個 role 為 assistant 的訊息,並設定 partial: true 來實現。assistant 訊息的 content 即為您提供的代碼首碼。詳情請參見首碼續寫

OpenAI相容

Python

請求樣本

import os
from openai import OpenAI


client = OpenAI(
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3-coder-plus",
    messages=[{
        "role": "user",
        "content": "請幫我寫一個python代碼產生100以內的素數。不要輸出非代碼的內容和Markdown的代碼塊。"
    },
    {
        "role": "assistant",
        "content": "def generate_prime_number",
        "partial": True
    }]
    )
print(completion.choices[0].message.content)

返回結果

(n):
    primes = []
    for i in range(2, n+1):
        is_prime = True
        for j in range(2, int(i**0.5)+1):
            if i % j == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(i)
    return primes

prime_numbers = generate_prime_number(100)
print(prime_numbers)

Node.js

請求樣本

import OpenAI from "openai";

const client = new OpenAI(
    {
        // 若沒有配置環境變數,請用百鍊API Key將下行替換為:apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        // 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const completion = await client.chat.completions.create({
        model: "qwen3-coder-plus",
        messages: [
            { role: "user", content: "請幫我寫一個python代碼產生100以內的素數。不要輸出非代碼的內容和Markdown的代碼塊。" },
            { role: "assistant", content: "def generate_prime_number", partial: true}
        ],
    });
    console.log(completion.choices[0].message.content);
}

main();

返回結果

(n):
    primes = []
    for i in range(2, n+1):
        is_prime = True
        for j in range(2, int(i**0.5)+1):
            if i % j == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(i)
    return primes

prime_numbers = generate_prime_number(100)
print(prime_numbers)

curl

請求樣本

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions

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-coder-plus",
    "messages": [{
        "role": "user",
        "content": "請幫我寫一個python代碼產生100以內的素數。不要輸出非代碼的內容和Markdown的代碼塊。"
    },
    {
        "role": "assistant",
        "content": "def generate_prime_number",
        "partial": true
    }]
}'

返回結果

{
    "choices": [
        {
            "message": {
                "content": "(n):\n    primes = []\n    for num in range(2, n + 1):\n        is_prime = True\n        for i in range(2, int(num ** 0.5) + 1):\n            if num % i == 0:\n                is_prime = False\n                break\n        if is_prime:\n            primes.append(num)\n    return primes\n\nprime_numbers = generate_prime_number(100)\nprint(prime_numbers)",
                "role": "assistant"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 38,
        "completion_tokens": 93,
        "total_tokens": 131,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1761634556,
    "system_fingerprint": null,
    "model": "qwen3-coder-plus",
    "id": "chatcmpl-c108050a-bb6d-4423-9d36-f64aa6a32976"
}

DashScope

Python

請求樣本

from http import HTTPStatus
import dashscope
import os

# 以下為新加坡地區base_url,若使用北京地區的模型,需將base_url替換為:https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [{
    "role": "user",
    "content": "請幫我寫一個python代碼產生100以內的素數,不要輸出非代碼的內容和Markdown的代碼塊。"
},
{
    "role": "assistant",
    "content": "def generate_prime_number",
    "partial": True
}]
response = dashscope.Generation.call(
    # 若沒有配置環境變數,請用百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3-coder-plus',
    messages=messages,
    result_format='message',  
)
if response.status_code == HTTPStatus.OK:
    print(response.output.choices[0].message.content)
else:
    print(f"HTTP返回碼:{response.status_code}")
    print(f"錯誤碼:{response.code}")
    print(f"錯誤資訊:{response.message}")

返回結果

(n):
    primes = []
    for i in range(2, n+1):
        is_prime = True
        for j in range(2, int(i**0.5)+1):
            if i % j == 0:
                is_prime = False
                break
        if is_prime:
            primes.append(i)
    return primes

prime_numbers = generate_prime_number(100)
print(prime_numbers)

curl

請求樣本

以下為新加坡地區url,若使用北京地區的模型,需將url替換為:https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation

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": "qwen3-coder-plus",
    "input":{
        "messages":[{
            "role": "user",
            "content": "請幫我寫一個python代碼產生100以內的素數,不要輸出非代碼的內容和Markdown的代碼塊。"
        },
        {
            "role": "assistant",
            "content": "def generate_prime_number",
            "partial": true
        }]
    },
    "parameters": {
        "result_format": "message"
    }
}'

返回結果

{
    "output": {
        "choices": [
            {
                "message": {
                    "content": "(n):\n    prime_list = []\n    for i in range(2, n+1):\n        is_prime = True\n        for j in range(2, int(i**0.5)+1):\n            if i % j == 0:\n                is_prime = False\n                break\n        if is_prime:\n            prime_list.append(i)\n    return prime_list\n\nprime_numbers = generate_prime_number(100)\nprint(prime_numbers)",
                    "role": "assistant"
                },
                "finish_reason": "stop"
            }
        ]
    },
    "usage": {
        "total_tokens": 131,
        "output_tokens": 92,
        "input_tokens": 39,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "request_id": "9917f629-e819-4519-af44-b0e677e94b2c"
}

Completions 介面

重要

Completions 介面僅適用中國(北京)地區的模型,需使用中國(北京)地區的API Key

支援的模型:

qwen2.5-coder-0.5b-instruct、qwen2.5-coder-1.5b-instruct、qwen2.5-coder-3b-instruct、qwen2.5-coder-7b-instruct、qwen2.5-coder-14b-instruct、qwen2.5-coder-32b-instruct、qwen-coder-turbo-0919、qwen-coder-turbo-latest、qwen-coder-turbo

Completions介面通過在 prompt 中使用特殊的 fim (Fill-in-the-Middle) 標籤來引導模型進行補全。

基於首碼補全

提示詞模板:

<|fim_prefix|>{prefix_content}<|fim_suffix|>
  • <|fim_prefix|><|fim_suffix|>為特殊 Token,用於指引模型進行文本的補全,無需修改。

  • {prefix_content}需要替換為傳入的首碼資訊,例如函數的名稱、輸入參數、使用說明等資訊。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=os.getenv("DASHSCOPE_API_KEY")
)

completion = client.completions.create(
  model="qwen2.5-coder-32b-instruct",
  prompt="<|fim_prefix|>def quick_sort(arr):<|fim_suffix|>",
)

print(completion.choices[0].text)
import OpenAI from "openai";

const client = new OpenAI(
    {
        // 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:apiKey: "sk-xxx",
        apiKey: process.env.DASHSCOPE_API_KEY,
        baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const completion = await client.completions.create({
        model: "qwen2.5-coder-32b-instruct",
        prompt: "<|fim_prefix|>def quick_sort(arr):<|fim_suffix|>",
    });
    console.log(completion.choices[0].text)
}

main();
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen2.5-coder-32b-instruct",
    "prompt": "<|fim_prefix|>def quick_sort(arr):<|fim_suffix|>"
}'

基於首碼和尾碼補全

提示詞模板

<|fim_prefix|>{prefix_content}<|fim_suffix|>{suffix_content}<|fim_middle|>
  • <|fim_prefix|><|fim_suffix|><|fim_middle|>為特殊 Token,用於指引模型進行文本的補全,無需修改。

  • {prefix_content}需要替換為傳入的首碼資訊,例如函數的名稱、輸入參數、使用說明等資訊。

  • {suffix_content}需要替換為傳入的尾碼資訊,例如函數的返回參數等資訊。

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=os.getenv("DASHSCOPE_API_KEY")
)

prefix_content = """def reverse_words_with_special_chars(s):
'''
反轉字串中的每個單詞(保留非字母字元的位置),並保持單詞順序。
    樣本:
    reverse_words_with_special_chars("Hello, world!") -> "olleH, dlrow!"
    參數:
        s (str): 輸入字串(可能包含標點符號)
    返回:
        str: 處理後的字串,單詞反轉但非字母字元位置不變
'''
"""

suffix_content = "return result"

completion = client.completions.create(
  model="qwen2.5-coder-32b-instruct",
  prompt=f"<|fim_prefix|>{prefix_content}<|fim_suffix|>{suffix_content}<|fim_middle|>",
)

print(completion.choices[0].text)
import OpenAI from 'openai';


const client = new OpenAI({
  baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
  apiKey: process.env.DASHSCOPE_API_KEY
});

const prefixContent = `def reverse_words_with_special_chars(s):
'''
反轉字串中的每個單詞(保留非字母字元的位置),並保持單詞順序。
    樣本:
    reverse_words_with_special_chars("Hello, world!") -> "olleH, dlrow!"
    參數:
        s (str): 輸入字串(可能包含標點符號)
    返回:
        str: 處理後的字串,單詞反轉但非字母字元位置不變
'''
`;

const suffixContent = "return result";

async function main() {
  const completion = await client.completions.create({
    model: "qwen2.5-coder-32b-instruct",
    prompt: `<|fim_prefix|>${prefixContent}<|fim_suffix|>${suffixContent}<|fim_middle|>`
  });

  console.log(completion.choices[0].text);
}

main();
curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen2.5-coder-32b-instruct",
    "prompt": "<|fim_prefix|>def reverse_words_with_special_chars(s):\n\"\"\"\n反轉字串中的每個單詞(保留非字母字元的位置),並保持單詞順序。\n    樣本:\n    reverse_words_with_special_chars(\"Hello, world!\") -> \"olleH, dlrow!\"\n    參數:\n        s (str): 輸入字串(可能包含標點符號)\n    返回:\n        str: 處理後的字串,單詞反轉但非字母字元位置不變\n\"\"\"\n<|fim_suffix|>return result<|fim_middle|>"
}'

應用於生產環境

為最佳化通義千問代碼模型的使用效率並降低成本,可參考以下建議:

  • 啟用流式輸出: 設定 stream=True 可以即時返回中間結果,降低逾時風險,提升使用者體驗。

  • 降低溫度參數: 代碼產生任務通常要求結果的確定性和準確性。建議將 temperature 參數設定在 0.10.3 之間,以減少產生結果的隨機性。

  • 使用支援上下文緩衝的模型: 在包含大量重複首碼的情境(如代碼補全、代碼審查),推薦使用支援上下文緩衝的模型(如 qwen3-coder-plus 和 qwen3-coder-flash),以有效降低開銷。

  • 控制工具數量:為確保模型調用的效率和成本效益,建議單次傳入的工具tools數量不超過20個。傳入大量工具描述會消耗過多輸入Token,這不僅會增加費用、降低響應速度,還會加大模型選擇正確工具的難度,詳情可參見Function Calling

計費與限流

  • 基本計費:根據每次請求的輸入 Token 數和輸出 Token 數計費。不同模型的單價不同,具體價格請參考模型列表

  • 特殊計費項目

    • 階梯計費qwen3-coder 系列模型採取階梯計費。當單次請求的輸入Token數達到特定階梯後,該請求的全部輸入和輸出Token均按此階梯的單價計費。

    • 上下文緩衝:對於支援上下文緩衝的模型(qwen3-coder-plusqwen3-coder-flash),當多次請求包含大量重複輸入時(如代碼審查),緩衝機制可顯著降低成本。命中隱式緩衝的輸入文本按單價的 20% 計費,命中顯式緩衝的輸入文本按單價的 10% 計費。詳情請參見上下文緩衝

    • 工具調用 (Function Calling):使用工具調用功能時,您在 tools 參數中定義的工具描述會作為輸入內容計入 Token 總量併產生費用。

  • 限流API調用受到每分鐘請求數(RPM)和每分鐘Token數(TPM)的雙重限制。詳情請參見限流

  • 免費額度(僅新加坡地區):從開通百鍊或模型申請通過之日起計算有效期間,有效期間90天內,Qwen-Coder各模型分別提供100萬Token的新人免費額度

API參考

關於通義千問代碼模型的輸入與輸出參數,請參見通義千問

常見問題

使用Qwen Code、Claude Code等開發工具時,為什麼會消耗大量 Token?

通過外部開發工具調用 Qwen-Coder 模型處理問題時,該工具可能會多次調用 API,從而消耗大量 Token。建議在具體的專案目錄下啟動工具,啟動目錄(如根目錄)中過多的檔案會增加 Token 消耗。您可開啟免費額度用完即停功能,以避免免費額度耗盡後產生額外費用。

如何查看模型調用量?

模型調用完一小時後,在模型觀測(新加坡北京版面設定查詢條件(例如,選擇時間範圍、業務空間等),再在模型列表地區找到目標模型並單擊操作列的監控,即可查看該模型的調用統計結果。具體請參見用量與效能觀測文檔。

資料按小時更新,高峰期可能有小時級延遲,請您耐心等待。

image

如何讓模型只輸出代碼,不包含任何解釋性文字?

可參考以下方法:

  1. 提示詞約束: 在提示詞中明確指示,例如:“只傳回碼,不要包含任何解釋、注釋或 markdown 標記。”

  2. 設定 stop 序列: 使用 stop=["\n# 解釋:", "說明", "Explanation:", "Note:"] 等片語,在模型開始產生解釋性文字時提前終止,詳情請參見通義千問 API 參考