Skip to main content
專項模型

代碼能力(Qwen-Coder)

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

推薦使用最新的通用模型替代 Qwen-Coder 模型,請參見文本產生選擇適合您情境的模型。

快速開始

API 使用前提:已擷取與配置 API Key並完成配置API Key到環境變數。如果通過SDK調用,需要安裝 OpenAI 或 DashScope SDK 以下樣本將示範如何調用qwen3-coder-next模型編寫一個尋找質數的 Python 函數。
  • OpenAI相容-Chat Completions API
  • DashScope
  • Python
  • Node.js
  • curl
請求樣本
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"),
    # 請將{WorkspaceId}替換為業務空間ID
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3-coder-next",
    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

核心能力

調用工具

為使模型能夠與外部環境互動(例如,讀寫檔案、調用 API、操作資料庫),您可以為其提供一系列工具。模型會根據您的指令,決定是否以及如何調用這些工具。詳情請參見Function Calling 完整的工具調用流程包括:
  1. 定義工具並發起請求:在請求中定義好工具列表,並向模型提出需要藉助工具完成的任務。
  2. 執行工具:解析模型返回的 tool_calls,並調用您本地已實現的對應工具函數來執行任務。
  3. 返回執行結果:將工具的執行結果封裝成特定格式,再次發送給模型,讓其基於結果完成最終任務。
以下樣本將示範如何引導模型產生代碼,並使用 write_file 工具將其儲存到本地檔案。
  • OpenAI相容-Chat Completions API
  • DashScope
  • Python
  • Node.js
  • curl
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"),
    # 請將{WorkspaceId}替換為業務空間ID
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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-next",
    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:
    # 進入工具調用迴圈(限制最大迭代次數,避免無限迴圈導致成本或逾時問題)
    max_rounds = 10
    current_round = 0
    while assistant_output.tool_calls is not None and current_round < max_rounds:
        current_round += 1
        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-next",
            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 實現。你可以運行這個檔案查看樣本輸出。如果需要進一步修改或解釋,請告訴我!

代碼補全

Qwen-Coder 支援兩種代碼補全方式,請根據您的需求選擇:
  • 首碼續寫(Partial Mode):適用於所有 Qwen-Coder 模型和地區,支援首碼補全,實現簡單,推薦使用。
  • Completions介面:僅支援華北2(北京)的qwen-coder-turbo 模型。支援首碼補全和前尾碼補全。

首碼續寫 (Partial Mode)

此功能用於在您寫了一半的代碼(首碼)基礎上,讓模型自動完成剩餘部分。 通過在 messages 列表中加入一個 role 為 assistant 的訊息,並設定 partial: true 來實現。assistant 訊息的 content 即為您提供的代碼首碼。詳情請參見首碼續寫
  • OpenAI相容
  • DashScope
  • Python
  • Node.js
  • curl
請求樣本
import os
from openai import OpenAI

client = OpenAI(
    # 若沒有配置環境變數,請用阿里雲百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 請將{WorkspaceId}替換為業務空間ID
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3-coder-next",
    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)

Completions 介面

Completions 介面僅適用華北2(北京)地區的模型,需使用華北2(北京)地區的API Key
支援的模型: 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(
    # 請將{WorkspaceId}替換為業務空間ID
    base_url="https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
    api_key=os.getenv("DASHSCOPE_API_KEY")
)

completion = client.completions.create(
  model="qwen-coder-turbo",
  prompt="<|fim_prefix|>def quick_sort(arr):<|fim_suffix|>",
)

print(completion.choices[0].text)

應用於生產環境

為最佳化千問代碼模型的使用效率並降低成本,可參考以下建議:
  • 啟用流式輸出: 設定 stream=True 可以即時返回中間結果,降低逾時風險,提升使用者體驗。
  • 降低溫度參數: 代碼產生任務通常要求結果的確定性和準確性。建議降低 temperature 參數,以減少產生結果的隨機性。
  • 使用支援上下文緩衝的模型: 在包含大量重複首碼的情境(如代碼補全、代碼審查),推薦使用支援上下文緩衝的模型,以有效降低開銷。
  • 控制工具數量:為確保模型調用的效率和成本效益,建議單次傳入的工具tools數量不超過20個。傳入大量工具描述會消耗過多輸入Token,這不僅會增加費用、降低響應速度,還會加大模型選擇正確工具的難度,詳情可參見Function Calling

計費與限流

  • 基本計費:根據每次請求的輸入 Token 數和輸出 Token 數計費。不同模型的單價不同,具體價格請參考模型列表
  • 特殊計費項目
    • 階梯計費qwen3-coder 系列模型採取階梯計費。當單次請求的輸入Token數達到特定階梯後,該請求的全部輸入和輸出Token均按此階梯的單價計費。
    • 上下文緩衝:對於支援上下文緩衝的模型,當多次請求包含大量重複輸入時(如代碼審查),緩衝機制可顯著降低成本。命中隱式緩衝的輸入文本按單價的 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消耗的方法,請參考Qwen CodeClaude Code文檔。您可開啟免費額度用完即停功能,以避免免費額度耗盡後產生額外費用。 您也可以購買 AI 編碼套餐,採用固定月費,提供月度請求額度,支援在AI工具中使用,詳情請參見Coding Plan概述

如何查看模型調用量?

模型調用完一小時後,在模型監控(新加坡北京)版面設定查詢條件(例如,選擇時間範圍、業務空間等),再在模型列表地區找到目標模型並單擊操作列的监控,即可查看該模型的調用統計結果。具體請參見模型監控文檔。
資料按小時更新,高峰期可能有小時級延遲,請您耐心等待。
image

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

可參考以下方法:
  1. 提示詞約束: 在提示詞中明確指示,例如:“只傳回碼,不要包含任何解釋、注釋或 markdown 標記。”
  2. 設定stop序列: 使用 stop=["\n# 解釋:", "說明", "Explanation:", "Note:"] 等片語,在模型開始產生解釋性文字時提前終止,詳情請參見千問 API 參考
Token Plan
用量統計與效能監控
資產中心
服務支援