幫助中心
  • 操作指南(模型)
  • 使用者指南(應用)
  • API參考
  • API參考(應用)
  • 使用者指南(模型/香港)
  • API參考(模型/香港)
首頁 Alibaba Cloud Model Studio 操作指南(模型) 模型體驗 視覺理解 視覺推理

視覺推理

更新時間:
Copy as MD
產品

視覺推理模型能夠先輸出思考過程,再輸出回答內容,適用於處理複雜的視覺分析任務,如解讀數學題、分析圖表資料或複雜視頻理解等任務。

效果樣本

QVQ Logo
視覺推理
以上組件僅供您參考,並未真實發送請求。

支援的模型

  • Qwen3.7

    • 混合思考模型:qwen3.7-plus、qwen3.7-plus-2026-05-26

  • Qwen3.6

    • 混合思考模型:qwen3.6-plus、qwen3.6-plus-2026-04-02、qwen3.6-flash、qwen3.6-flash-2026-04-16、qwen3.6-35b-a3b

  • Qwen3.5

    • 混合思考模型:qwen3.5-plus、qwen3.5-plus-2026-02-15、qwen3.5-flash、qwen3.5-flash-2026-02-23、qwen3.5-397b-a17b、qwen3.5-122b-a10b、qwen3.5-27b、qwen3.5-35b-a3b

  • Qwen3-VL

    • 混合思考模型:qwen3-vl-plus、qwen3-vl-plus-2025-12-19、qwen3-vl-plus-2025-09-23、qwen3-vl-flash、qwen3-vl-flash-2025-10-15

    • 僅思考模型:qwen3-vl-235b-a22b-thinking、qwen3-vl-32b-thinking、qwen3-vl-30b-a3b-thinking、qwen3-vl-8b-thinking

  • QVQ

    • 僅思考模型:qvq-max系列、qvq-plus系列

  • Kimi

    • 混合思考模型:kimi-k2.6、kimi-k2.5

使用方式

  • 思考過程: 阿里雲百鍊提供混合思考和僅思考兩種視覺推理模型。

    • 混合思考模型:可通過enable_thinking控制其思考行為:

      • 設定為 true,開啟思考,模型將先輸出思考過程,再輸出最終回複。Qwen3.6、Qwen3.5系列模型預設為true。

      • 設定為 false,關閉思考,模型將直接產生回複。qwen3-vl-plus、qwen3-vl-flash系列模型預設為false。

    • 僅思考模型:模型總會在回複前進行思考,且無法關閉。

  • 輸出方式:視覺推理模型包含詳細的思考過程,為避免因響應內容過長導致逾時,建議使用流式輸出。

    • Qwen3.6、Qwen3.5、Qwen3-VL、kimi-k2.6、kimi-k2.5、stepfun/step-3.7-flash系列支援流式和非流式兩種方式。

    • QVQ系列僅支援流式輸出。

  • System Prompt使用建議: 

    • 對於單次或簡單的對話調用:為獲得最佳推理效果,建議不設定 System Message。可將模型角色設定、輸出格式要求等指令通過 User Message 傳入。

    • 對於構建 Agent 、實現工具調用等複雜應用:可使用 System Message 來定義模型的角色、能力和行為架構,以確保其穩定性和可靠性。

快速開始

前提條件

  • 已擷取 API Key並配置API Key到環境變數。

  • 如果通過 SDK 進行調用,需安裝最新版SDK,其中 DashScope Python SDK 版本不低於1.24.6,DashScope Java SDK 版本不低於 2.21.10。

下列樣本示範如何調用 qvq-max模型,對一張包含數學題的圖片進行求解,並以流式輸出的方式分別列印思考過程和最終回複。

OpenAI相容

Python

from openai import OpenAI
import os

# 初始化OpenAI用戶端
client = OpenAI(
    # 各地區的API Key不同。擷取連結:https://bailian.console.alibabacloud.com/?tab=model#/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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"  # 請將WorkspaceId替換為業務空間ID
)

reasoning_content = ""  # 定義完整思考過程
answer_content = ""     # 定義完整回複
is_answering = False   # 判斷是否結束思考過程並開始回複

# 建立聊天完成請求
completion = client.chat.completions.create(
    model="qvq-max",  # 此處以 qvq-max 為例,可按需更換模型名稱
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"
                    },
                },
                {"type": "text", "text": "這道題怎麼解答?"},
            ],
        },
    ],
    stream=True,
    # 解除以下注釋會在最後一個chunk返回Token使用量
    # stream_options={
    #     "include_usage": True
    # }
)

print("\n" + "=" * 20 + "思考過程" + "=" * 20 + "\n")

for chunk in completion:
    # 如果chunk.choices為空白,則列印usage
    if not chunk.choices:
        print("\nUsage:")
        print(chunk.usage)
    else:
        delta = chunk.choices[0].delta
        # 列印思考過程
        if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
            print(delta.reasoning_content, end='', flush=True)
            reasoning_content += delta.reasoning_content
        else:
            # 開始回複
            if delta.content != "" and is_answering is False:
                print("\n" + "=" * 20 + "完整回複" + "=" * 20 + "\n")
                is_answering = True
            # 列印回複過程
            print(delta.content, end='', flush=True)
            answer_content += delta.content

# print("=" * 20 + "完整思考過程" + "=" * 20 + "\n")
# print(reasoning_content)
# print("=" * 20 + "完整回複" + "=" * 20 + "\n")
# print(answer_content)

Node.js

import OpenAI from "openai";
import process from 'process';

// 初始化 openai 用戶端
const openai = new OpenAI({
    apiKey: process.env.DASHSCOPE_API_KEY, // 從環境變數讀取, 各地區的API Key不同。擷取連結:https://bailian.console.alibabacloud.com/?tab=model#/api-key
    // 以下為新加坡地區base_url,若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1       
    baseURL: 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1'
});

let reasoningContent = '';
let answerContent = '';
let isAnswering = false;

let messages = [
    {
        role: "user",
        content: [
        { type: "image_url", image_url: { "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg" } },
        { type: "text", text: "解答這道題" },
    ]
}]

async function main() {
    try {
        const stream = await openai.chat.completions.create({
            model: 'qvq-max',
            messages: messages,
            stream: true
        });

        console.log('\n' + '='.repeat(20) + '思考過程' + '='.repeat(20) + '\n');

        for await (const chunk of stream) {
            if (!chunk.choices?.length) {
                console.log('\nUsage:');
                console.log(chunk.usage);
                continue;
            }

            const delta = chunk.choices[0].delta;

            // 處理思考過程
            if (delta.reasoning_content) {
                process.stdout.write(delta.reasoning_content);
                reasoningContent += delta.reasoning_content;
            }
            // 處理正式回複
            else if (delta.content) {
                if (!isAnswering) {
                    console.log('\n' + '='.repeat(20) + '完整回複' + '='.repeat(20) + '\n');
                    isAnswering = true;
                }
                process.stdout.write(delta.content);
                answerContent += delta.content;
            }
        }
    } catch (error) {
        console.error('Error:', error);
    }
}

main();

點擊查看思考過程和完整回複

====================思考過程====================

好的,我現在要解決這個關於長方體和正方體的表面積和體積的問題。首先,我需要仔細看一下題目,確保自己理解每個部分的要求。

題目是要求分別計算兩個圖形的表面積和體積。第一個圖形是一個長方體,第二個是一個正方體。單位都是厘米,每題6分,共12分。看起來這是一個數學作業題,可能來自小學或初中階段的幾何內容。

首先,我需要回憶一下長方體和正方體的表面積和體積的計算公式。對於長方體來說,表面積的公式是:\( 2(ab + bc + ac) \),其中a、b、c分別是長、寬、高。而體積則是 \( abc \)。對於正方體來說,因為所有邊長相等,所以表面積是 \( 6a^2 \),體積是 \( a^3 \)。

現在來看第一個圖形,這是一個長方體,給出的尺寸是長4cm,寬3cm,高2cm。我需要先計算它的表面積。根據公式,代入數值:

表面積 = \( 2(4×3 + 3×2 + 4×2) \)
        = \( 2(12 + 6 + 8) \)
        = \( 2×26 \)
        = 52 cm²

接下來是體積,同樣代入數值:

體積 = \( 4×3×2 \)
      = 24 cm³

然後是第二個圖形,這是一個正方體,邊長為3cm。表面積計算如下:

表面積 = \( 6×3^2 \)
        = \( 6×9 \)
        = 54 cm²

體積則是:

體積 = \( 3^3 \)
      = 27 cm³

不過,我需要檢查一下是否有可能出錯的地方。比如,在計算長方體的表面積時,有沒有可能把某個面的面積算錯了?或者在乘法的時候有沒有算錯數字?

比如,長方體的三個不同的面分別是4×3,3×2,4×2。這三個面的面積分別是12,6,8。加起來是26,乘以2得到52,這應該是正確的。體積的話,4×3=12,再乘以2就是24,沒錯。

正方體的話,每個面都是3×3=9,六個面就是54,體積是3×3×3=27,也沒有問題。

所以最終的答案應該是:

1. 方體的表面積是52平方厘米,體積是24立方厘米。
2. 方體的表面積是54平方厘米,體積是27立方厘米。

不過,我需要確認題目中的圖形是否有其他隱藏的資訊或者可能的陷阱。例如,有時候題目可能會給出一些虛線或者陰影部分,但在這個情況下,圖片中的長方體和正方體看起來都是標準的,沒有特別的標記。因此,我認為我的計算是正確的。

====================完整回複====================

### 解答:

**1. 方體(長4cm,寬3cm,高2cm)**
- **表面積**:
  \[
  2 \times (4 \times 3 + 3 \times 2 + 4 \times 2) = 2 \times (12 + 6 + 8) = 2 \times 26 = 52 \, \text{cm}^2
  \]
- **體積**:
  \[
  4 \times 3 \times 2 = 24 \, \text{cm}^3
  \]

**2. 方體(邊長3cm)**
- **表面積**:
  \[
  6 \times 3^2 = 6 \times 9 = 54 \, \text{cm}^2
  \]
- **體積**:
  \[
  3^3 = 27 \, \text{cm}^3
  \]

**答案:**
1. 方體的表面積為 \(52 \, \text{cm}^2\),體積為 \(24 \, \text{cm}^3\)。
2. 方體的表面積為 \(54 \, \text{cm}^2\),體積為 \(27 \, \text{cm}^3\)。

HTTP

# ======= 重要提示 =======
# 以下為新加坡地區base_url,若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions    
# 各地區的API Key不同。擷取連結:https://bailian.console.alibabacloud.com/?tab=model#/api-key
# === 執行時請刪除該注釋 ===

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "model": "qvq-max",
    "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"
          }
        },
        {
          "type": "text",
          "text": "請解答這道題"
        }
      ]
    }
  ],
    "stream":true,
    "stream_options":{"include_usage":true}
}'

點擊查看思考過程和完整回複

data: {"choices":[{"delta":{"content":null,"role":"assistant","reasoning_content":""},"index":0,"logprobs":null,"finish_reason":null}],"object":"chat.completion.chunk","usage":null,"created":1742983020,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-ab4f3963-2c2a-9291-bda2-65d5b325f435"}

data: {"choices":[{"finish_reason":null,"delta":{"content":null,"reasoning_content":"好的"},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983020,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-ab4f3963-2c2a-9291-bda2-65d5b325f435"}

data: {"choices":[{"delta":{"content":null,"reasoning_content":","},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983020,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-ab4f3963-2c2a-9291-bda2-65d5b325f435"}

data: {"choices":[{"delta":{"content":null,"reasoning_content":"我現在"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983020,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-ab4f3963-2c2a-9291-bda2-65d5b325f435"}

data: {"choices":[{"delta":{"content":null,"reasoning_content":"要"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983020,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-ab4f3963-2c2a-9291-bda2-65d5b325f435"}

data: {"choices":[{"delta":{"content":null,"reasoning_content":"解決"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983020,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-ab4f3963-2c2a-9291-bda2-65d5b325f435"}
.....
data: {"choices":[{"delta":{"content":"方"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983095,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-23d30959-42b4-9f24-b7ab-1bb0f72ce265"}

data: {"choices":[{"delta":{"content":"厘米"},"finish_reason":null,"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983095,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-23d30959-42b4-9f24-b7ab-1bb0f72ce265"}

data: {"choices":[{"finish_reason":"stop","delta":{"content":"","reasoning_content":null},"index":0,"logprobs":null}],"object":"chat.completion.chunk","usage":null,"created":1742983095,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-23d30959-42b4-9f24-b7ab-1bb0f72ce265"}

data: {"choices":[],"object":"chat.completion.chunk","usage":{"prompt_tokens":544,"completion_tokens":590,"total_tokens":1134,"completion_tokens_details":{"text_tokens":590},"prompt_tokens_details":{"text_tokens":24,"image_tokens":520}},"created":1742983095,"system_fingerprint":null,"model":"qvq-max","id":"chatcmpl-23d30959-42b4-9f24-b7ab-1bb0f72ce265"}

data: [DONE]

DashScope

說明

使用 DashScope 方式調用 QVQ 模型:

  • incremental_output 參數預設為 true,且不支援設定為 false,僅支援增量流式返回。

  • result_format參數預設為"message",且不支援設定為"text"

Python

import os
import dashscope
from dashscope import MultiModalConversation

# 以下為新加坡地區base_url,若使用北京地區模型,需要將base_url換成 https://dashscope.aliyuncs.com/api/v1      
dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'  # 請將WorkspaceId替換為業務空間ID
messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"},
            {"text": "解答這道題?"}
        ]
    }
]

response = MultiModalConversation.call(
    # 各地區的API Key不同。擷取連結:https://bailian.console.alibabacloud.com/?tab=model#/api-key
    # 若沒有配置環境變數,請用百鍊API Key將下行替換為:api_key="sk-xxx",
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qvq-max",  # 此處以qvq-max為例,可按需更換模型名稱。
    messages=messages,
    stream=True,
)

# 定義完整思考過程
reasoning_content = ""
# 定義完整回複
answer_content = ""
# 判斷是否結束思考過程並開始回複
is_answering = False

print("=" * 20 + "思考過程" + "=" * 20)

for chunk in response:
    # 如果思考過程與回複皆為空白,則忽略
    message = chunk.output.choices[0].message
    reasoning_content_chunk = message.get("reasoning_content", None)
    if (chunk.output.choices[0].message.content == [] and
        reasoning_content_chunk == ""):
        pass
    else:
        # 如果當前為思考過程
        if reasoning_content_chunk != None and chunk.output.choices[0].message.content == []:
            print(chunk.output.choices[0].message.reasoning_content, end="")
            reasoning_content += chunk.output.choices[0].message.reasoning_content
        # 如果當前為回複
        elif chunk.output.choices[0].message.content != []:
            if not is_answering:
                print("\n" + "=" * 20 + "完整回複" + "=" * 20)
                is_answering = True
            print(chunk.output.choices[0].message.content[0]["text"], end="")
            answer_content += chunk.output.choices[0].message.content[0]["text"]

# 如果您需要列印完整思考過程與完整回複,請將以下代碼解除注釋後運行
# print("=" * 20 + "完整思考過程" + "=" * 20 + "\n")
# print(f"{reasoning_content}")
# print("=" * 20 + "完整回複" + "=" * 20 + "\n")
# print(f"{answer_content}")

點擊查看思考過程和完整回複

====================思考過程====================
好的,我現在要解決這個關於長方體和正方體的表面積和體積的問題。首先,我需要仔細看一下題目,確保自己理解每個部分的要求。

題目是要求分別計算兩個圖形的表面積和體積。第一個圖形是一個長方體,第二個是一個正方體。單位都是厘米,每題6分,共12分。看起來這是一個數學作業題,可能來自小學或初中階段的幾何內容。

首先,我需要回憶一下長方體和正方體的表面積和體積的計算公式。對於長方體來說,表面積的公式是:\( 面積 = 2(ab + bc + ac) \),其中a、b、c分別是長、寬、高。而體積則是:\( 體積 = abc \)。對於正方體來說,因為所有邊長相等,所以表面積是:\( 面積 = 6a^2 \),體積是:\( 體積 = a^3 \)。

現在來看第一個圖形,這是一個長方體,給出的尺寸是長4cm,寬3cm,高2cm。我需要先確認這些數值是否正確對應到公式中的各個變數。通常,長方體的三個維度可以任意命名,但為了方便計算,我們可以將最長的邊作為長度,中間的作為寬度,最短的作為高度。不過在這裡,題目中已經明確標註了各個邊的長度,所以直接使用即可。

接下來,計算第一個長方體的表面積。根據公式,代入數值:

\( 面積 = 2(4×3 + 3×2 + 4×2) \)

先計算括弧內的每一項:

\( 4×3 = 12 \)
\( 3×2 = 6 \)
\( 4×2 = 8 \)

然後將這些結果相加:

\( 12 + 6 + 8 = 26 \)

再乘以2:

\( 2 × 26 = 52 \)

所以,第一個長方體的表面積是52平方厘米。

接下來計算體積:

\( 體積 = 4 × 3 × 2 = 24 \)

所以,體積是24立方厘米。

現在看第二個圖形,這是一個正方體,所有邊長都是3cm。因此,表面積的計算為:

\( 面積 = 6 × 3^2 = 6 × 9 = 54 \)

體積則是:

\( 體積 = 3^3 = 27 \)

所以,正方體的表面積是54平方厘米,體積是27立方厘米。

在計算過程中,需要注意單位的一致性,題目中給出的單位是厘米,所以最終結果的單位應該是平方厘米和立方厘米。此外,要確保沒有計算錯誤,比如乘法和加法的順序是否正確,特別是長方體的表面積計算時,容易漏掉某一項或者計算錯誤。

另外,檢查是否有其他可能的誤解,比如是否混淆了長、寬、高的位置,但在這個問題中,由於題目已經明確標註了各個邊的長度,所以應該不會有這個問題。同時,正方體的所有邊長相等,所以無需擔心不同的邊長帶來的複雜性。

總結一下,第一個長方體的表面積是52平方厘米,體積是24立方厘米;第二個正方體的表面積是54平方厘米,體積是27立方厘米。

====================完整回複====================
### 解答:

**1. 方體(長4cm,寬3cm,高2cm)**

- **表面積**:
  \[
  面積 = 2(ab + bc + ac) = 2(4×3 + 3×2 + 4×2) = 2(12 + 6 + 8) = 2×26 = 52 \, \text{cm}^2
  \]

- **體積**:
  \[
  體積 = abc = 4×3×2 = 24 \, \text{cm}^3
  \]

**2. 方體(邊長3cm)**

- **表面積**:
  \[
  面積 = 6a^2 = 6×3^2 = 6×9 = 54 \, \text{cm}^2
  \]

- **體積**:
  \[
  體積 = a^3 = 3^3 = 27 \, \text{cm}^3
  \]

**答案:**
1. 方體的表面積為 \(52 \, \text{cm}^2\),體積為 \(24 \, \text{cm}^3\)。
2. 方體的表面積為 \(54 \, \text{cm}^2\),體積為 \(27 \, \text{cm}^3\)。

Java

// dashscope SDK的版本 >= 2.19.0
import java.util.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import io.reactivex.Flowable;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.exception.InputRequiredException;
import java.lang.System;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    static {
       // 以下為新加坡地區base_url,若使用北京地區模型,需要將base_url換成 https://dashscope.aliyuncs.com/api/v1      
        Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
    }
    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    private static StringBuilder reasoningContent = new StringBuilder();
    private static StringBuilder finalContent = new StringBuilder();
    private static boolean isFirstPrint = true;

    private static void handleGenerationResult(MultiModalConversationResult message) {
        String re = message.getOutput().getChoices().get(0).getMessage().getReasoningContent();
        String reasoning = Objects.isNull(re)?"":re; // 預設值

        List<Map<String, Object>> content = message.getOutput().getChoices().get(0).getMessage().getContent();
        if (!reasoning.isEmpty()) {
            reasoningContent.append(reasoning);
            if (isFirstPrint) {
                System.out.println("====================思考過程====================");
                isFirstPrint = false;
            }
            System.out.print(reasoning);
        }

        if (Objects.nonNull(content) && !content.isEmpty()) {
            Object text = content.get(0).get("text");
            finalContent.append(content.get(0).get("text"));
            if (!isFirstPrint) {
                System.out.println("\n====================完整回複====================");
                isFirstPrint = true;
            }
            System.out.print(text);
        }
    }
    public static MultiModalConversationParam buildMultiModalConversationParam(MultiModalMessage Msg)  {
        return MultiModalConversationParam.builder()
                // 各地區的API Key不同。擷取連結:https://bailian.console.alibabacloud.com/?tab=model#/api-key
                // 若沒有配置環境變數,請用百鍊API Key將下行替換為:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                // 此處以 qvq-max 為例,可按需更換模型名稱
                .model("qvq-max")
                .messages(Arrays.asList(Msg))
                .incrementalOutput(true)
                .build();
    }

    public static void streamCallWithMessage(MultiModalConversation conv, MultiModalMessage Msg)
            throws NoApiKeyException, ApiException, InputRequiredException, UploadFileException {
        MultiModalConversationParam param = buildMultiModalConversationParam(Msg);
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(message -> {
            handleGenerationResult(message);
        });
    }
    public static void main(String[] args) {
        try {
            MultiModalConversation conv = new MultiModalConversation();
            MultiModalMessage userMsg = MultiModalMessage.builder()
                    .role(Role.USER.getValue())
                    .content(Arrays.asList(Collections.singletonMap("image", "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"),
                            Collections.singletonMap("text", "請解答這道題")))
                    .build();
            streamCallWithMessage(conv, userMsg);
//             列印最終結果
//            if (reasoningContent.length() > 0) {
//                System.out.println("\n====================完整回複====================");
//                System.out.println(finalContent.toString());
//            }
        } catch (ApiException | NoApiKeyException | UploadFileException | InputRequiredException e) {
            logger.error("An exception occurred: {}", e.getMessage());
        }
        System.exit(0);
    }
}

點擊查看思考過程和完整回複

====================思考過程====================
嗯,我現在要解決這個題目,計算兩個圖形的表面積和體積。首先,我需要仔細看一下題目給出的圖片。第一個圖形是一個長方體,第二個是正方體。題目要求分別計算它們的表面積和體積,單位是厘米。

先看第一個圖形,長方體。它的尺寸應該是長、寬、高。根據圖片上的標註,長是4厘米,寬是3厘米,高是2厘米。對吧?那長方體的表面積公式我記得是2乘以(長×寬 + 長×高 + 寬×高)。然後體積就是長乘寬乘高。讓我再確認一下公式是否正確。沒錯,表面積確實是六個面的面積之和,而每個相對的面面積相等,所以用這個公式是對的。

那代入數值的話,表面積應該是2×(4×3 + 4×2 + 3×2)。先算括弧裡面的:4×3=12,4×2=8,3×2=6。加起來是12+8+6=26。然後乘以2就是52平方厘米。體積的話,4×3×2=24立方厘米。這部分應該沒問題。

接下來是第二個圖形,正方體。所有邊長都是3厘米。正方體的表面積是6乘以邊長的平方,因為有六個相同的正方形面。體積則是邊長的三次方。所以表面積應該是6×3²=6×9=54平方厘米。體積是3³=27立方厘米。這裡要注意單位,題目裡已經說明單位是厘米,所以結果直接寫成平方厘米和立方厘米就行。

不過,我得再檢查一遍有沒有哪裡出錯。比如,長方體的各個邊是否對應正確。圖片上長方體的長度看起來確實比寬度長,所以長是4,寬是3,高是2。正方體的話,三個維度都是3,沒問題。計算的時候有沒有算錯數字?比如,長方體的表面積計算中,各個乘積是否正確,加法有沒有錯誤。比如4×3=12,4×2=8,3×2=6,加起來是26,乘以2是52,沒錯。體積4×3×2=24,正確。正方體的表面積6×9=54,體積27,也沒問題。

可能需要注意的地方是單位,題目裡明確說單位是cm,所以答案後面要加上正確的單位符號。另外,題目要求每題6分,共12分,但這裡只有兩題,所以每題各佔6分。不過這不影響計算過程,只是提醒自己不要漏掉任何步驟或者單位。

總結一下,第一個圖形的表面積是52平方厘米,體積24立方厘米;第二個圖形的表面積54平方厘米,體積27立方厘米。應該就是這樣了。

====================完整回複====================
**答案:**

1. **長方體**  
   - **表面積**:\(2 \times (4 \times 3 + 4 \times 2 + 3 \times 2) = 2 \times 26 = 52\) 平方厘米  
   - **體積**:\(4 \times 3 \times 2 = 24\) 立方厘米  

2. **正方體**  
   - **表面積**:\(6 \times 3^2 = 6 \times 9 = 54\) 平方厘米  
   - **體積**:\(3^3 = 27\) 立方厘米  

**解析:**  
- 長方體的表面積通過計算六個面的總面積得到,體積為長寬高的乘積。  
- 正方體的表面積為六個相同正方形面的面積之和,體積為邊長的立方。  
- 單位均為厘米,符合題目要求。

HTTP

curl

# ======= 重要提示 =======
# 以下為新加坡地區base_url,若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation       
# 各地區的API Key不同。擷取連結:https://bailian.console.alibabacloud.com/?tab=model#/api-key
# === 執行時請刪除該注釋 ===

curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'X-DashScope-SSE: enable' \
-d '{
    "model": "qvq-max",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"image": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"},
                    {"text": "請解答這道題"}
                ]
            }
        ]
    }
}'

點擊查看思考過程和完整回複

id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[],"reasoning_content":"好的","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":547,"input_tokens_details":{"image_tokens":520,"text_tokens":24},"output_tokens":3,"input_tokens":544,"output_tokens_details":{"text_tokens":3},"image_tokens":520},"request_id":"f361ae45-fbef-9387-9f35-1269780e0864"}

id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[],"reasoning_content":",","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":548,"input_tokens_details":{"image_tokens":520,"text_tokens":24},"output_tokens":4,"input_tokens":544,"output_tokens_details":{"text_tokens":4},"image_tokens":520},"request_id":"f361ae45-fbef-9387-9f35-1269780e0864"}

id:3
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[],"reasoning_content":"我現在","role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":549,"input_tokens_details":{"image_tokens":520,"text_tokens":24},"output_tokens":5,"input_tokens":544,"output_tokens_details":{"text_tokens":5},"image_tokens":520},"request_id":"f361ae45-fbef-9387-9f35-1269780e0864"}
.....
id:566
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"方"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1132,"input_tokens_details":{"image_tokens":520,"text_tokens":24},"output_tokens":588,"input_tokens":544,"output_tokens_details":{"text_tokens":588},"image_tokens":520},"request_id":"758b0356-653b-98ac-b4d3-f812437ba1ec"}

id:567
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"厘米"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"total_tokens":1133,"input_tokens_details":{"image_tokens":520,"text_tokens":24},"output_tokens":589,"input_tokens":544,"output_tokens_details":{"text_tokens":589},"image_tokens":520},"request_id":"758b0356-653b-98ac-b4d3-f812437ba1ec"}

id:568
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[],"role":"assistant"},"finish_reason":"stop"}]},"usage":{"total_tokens":1134,"input_tokens_details":{"image_tokens":520,"text_tokens":24},"output_tokens":590,"input_tokens":544,"output_tokens_details":{"text_tokens":590},"image_tokens":520},"request_id":"758b0356-653b-98ac-b4d3-f812437ba1ec"}

核心能力

開啟/關閉思考過程

對於需要詳細推理過程的情境(如解題、分析報告),可通過 enable_thinking開啟思考過程。以下樣本展示如何開啟思考過程。

OpenAI 相容

enable_thinking 和 thinking_budget 是非 OpenAI 標準參數。在不同語言的 SDK 中傳遞方式存在差異:

  • Python SDK: 必須通過 extra_body 字典傳遞。

  • Node.js SDK: 可作為頂層參數直接傳遞。

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=os.getenv("DASHSCOPE_API_KEY"),
    # 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成https://dashscope-us.aliyuncs.com/compatible-mode/v1
    # 若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"  # 請將WorkspaceId替換為業務空間ID
)

reasoning_content = ""  # 定義完整思考過程
answer_content = ""     # 定義完整回複
is_answering = False   # 判斷是否結束思考過程並開始回複
enable_thinking = True
# 建立聊天完成請求
completion = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"
                    },
                },
                {"type": "text", "text": "這道題怎麼解答?"},
            ],
        },
    ],
    stream=True,
    # enable_thinking 參數開啟思考過程,thinking_budget 參數設定最大推理過程 Token 數
    # qwen3.5-plus、qwen3-vl-plus、qwen3-vl-flash可通過enable_thinking開啟或關閉思考(其中qwen3.5-plus預設開啟)、對於qwen3-vl-235b-a22b-thinking等帶thinking尾碼的模型,enable_thinking僅支援設定為開啟,對其他Qwen-VL模型均不適用
    extra_body={
        'enable_thinking': enable_thinking
        },

    # 解除以下注釋會在最後一個chunk返回Token使用量
    # stream_options={
    #     "include_usage": True
    # }
)

if enable_thinking:
    print("\n" + "=" * 20 + "思考過程" + "=" * 20 + "\n")

for chunk in completion:
    # 如果chunk.choices為空白,則列印usage
    if not chunk.choices:
        print("\nUsage:")
        print(chunk.usage)
    else:
        delta = chunk.choices[0].delta
        # 列印思考過程
        if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
            print(delta.reasoning_content, end='', flush=True)
            reasoning_content += delta.reasoning_content
        else:
            # 開始回複
            if delta.content != "" and is_answering is False:
                print("\n" + "=" * 20 + "完整回複" + "=" * 20 + "\n")
                is_answering = True
            # 列印回複過程
            print(delta.content, end='', flush=True)
            answer_content += delta.content

# print("=" * 20 + "完整思考過程" + "=" * 20 + "\n")
# print(reasoning_content)
# print("=" * 20 + "完整回複" + "=" * 20 + "\n")
# print(answer_content)
import OpenAI from "openai";

// 初始化 openai 用戶端
const openai = 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-us.aliyuncs.com/compatible-mode/v1
 //  若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1
  baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"  // 請將WorkspaceId替換為業務空間ID
});

let reasoningContent = '';
let answerContent = '';
let isAnswering = false;
let enableThinking = true;

let messages = [
    {
        role: "user",
        content: [
        { type: "image_url", image_url: { "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg" } },
        { type: "text", text: "解答這道題" },
    ]
}]

async function main() {
    try {
        const stream = await openai.chat.completions.create({
            model: 'qwen3.5-plus',
            messages: messages,
            stream: true,
          // 注意:在 Node.js SDK,enableThinking 這樣的非標準參數作為頂層屬性傳遞的,無需放在 extra_body 中
          enable_thinking: enableThinking

        });

        if (enableThinking){console.log('\n' + '='.repeat(20) + '思考過程' + '='.repeat(20) + '\n');}

        for await (const chunk of stream) {
            if (!chunk.choices?.length) {
                console.log('\nUsage:');
                console.log(chunk.usage);
                continue;
            }

            const delta = chunk.choices[0].delta;

            // 處理思考過程
            if (delta.reasoning_content) {
                process.stdout.write(delta.reasoning_content);
                reasoningContent += delta.reasoning_content;
            }
            // 處理正式回複
            else if (delta.content) {
                if (!isAnswering) {
                    console.log('\n' + '='.repeat(20) + '完整回複' + '='.repeat(20) + '\n');
                    isAnswering = true;
                }
                process.stdout.write(delta.content);
                answerContent += delta.content;
            }
        }
    } catch (error) {
        console.error('Error:', error);
    }
}

main();
# ======= 重要提示 =======
# 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成https://dashscope-us.aliyuncs.com/compatible-mode/v1/chat/completions
# 若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
# 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# === 執行時請刪除該注釋 ===

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "model": "qwen3.5-plus",
    "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"
          }
        },
        {
          "type": "text",
          "text": "請解答這道題"
        }
      ]
    }
  ],
    "stream":true,
    "stream_options":{"include_usage":true},
    "enable_thinking": true
}'

DashScope

import os
import dashscope
from dashscope import MultiModalConversation

# 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成https://dashscope-us.aliyuncs.com/api/v1
# 若使用北京地區模型,需要將base_url換成 https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"

enable_thinking = True

messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"},
            {"text": "解答這道題?"}
        ]
    }
]

response = MultiModalConversation.call(
    # 若沒有配置環境變數,請用百鍊API Key將下行替換為:api_key="sk-xxx",
    # 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen3.5-plus",  
    messages=messages,
    stream=True,
    # enable_thinking 參數開啟思考過程
    # qwen3.5-plus、qwen3-vl-plus、qwen3-vl-flash可通過enable_thinking開啟或關閉思考(其中qwen3.5-plus預設開啟),對於qwen3-vl-235b-a22b-thinking等帶thinking尾碼的模型,enable_thinking僅支援設定為開啟,對其他Qwen-VL模型均不適用
    enable_thinking=enable_thinking

)

# 定義完整思考過程
reasoning_content = ""
# 定義完整回複
answer_content = ""
# 判斷是否結束思考過程並開始回複
is_answering = False

if enable_thinking:
    print("=" * 20 + "思考過程" + "=" * 20)

for chunk in response:
    # 如果思考過程與回複皆為空白,則忽略
    message = chunk.output.choices[0].message
    reasoning_content_chunk = message.get("reasoning_content", None)
    if (chunk.output.choices[0].message.content == [] and
        reasoning_content_chunk == ""):
        pass
    else:
        # 如果當前為思考過程
        if reasoning_content_chunk != None and chunk.output.choices[0].message.content == []:
            print(chunk.output.choices[0].message.reasoning_content, end="")
            reasoning_content += chunk.output.choices[0].message.reasoning_content
        # 如果當前為回複
        elif chunk.output.choices[0].message.content != []:
            if not is_answering:
                print("\n" + "=" * 20 + "完整回複" + "=" * 20)
                is_answering = True
            print(chunk.output.choices[0].message.content[0]["text"], end="")
            answer_content += chunk.output.choices[0].message.content[0]["text"]

# 如果您需要列印完整思考過程與完整回複,請將以下代碼解除注釋後運行
# print("=" * 20 + "完整思考過程" + "=" * 20 + "\n")
# print(f"{reasoning_content}")
# print("=" * 20 + "完整回複" + "=" * 20 + "\n")
# print(f"{answer_content}")
// dashscope SDK的版本 >= 2.21.10
import java.util.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import io.reactivex.Flowable;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.exception.InputRequiredException;
import java.lang.System;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    // 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成 https://dashscope-us.aliyuncs.com/api/v1
    // 若使用北京地區模型,需要將base_url換成 https://dashscope.aliyuncs.com/api/v1
    static {Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";}

    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    private static StringBuilder reasoningContent = new StringBuilder();
    private static StringBuilder finalContent = new StringBuilder();
    private static boolean isFirstPrint = true;

    private static void handleGenerationResult(MultiModalConversationResult message) {
        String re = message.getOutput().getChoices().get(0).getMessage().getReasoningContent();
        String reasoning = Objects.isNull(re)?"":re; // 預設值

        List<Map<String, Object>> content = message.getOutput().getChoices().get(0).getMessage().getContent();
        if (!reasoning.isEmpty()) {
            reasoningContent.append(reasoning);
            if (isFirstPrint) {
                System.out.println("====================思考過程====================");
                isFirstPrint = false;
            }
            System.out.print(reasoning);
        }

        if (Objects.nonNull(content) && !content.isEmpty()) {
            Object text = content.get(0).get("text");
            finalContent.append(content.get(0).get("text"));
            if (!isFirstPrint) {
                System.out.println("\n====================完整回複====================");
                isFirstPrint = true;
            }
            System.out.print(text);
        }
    }
    public static MultiModalConversationParam buildMultiModalConversationParam(MultiModalMessage Msg)  {
        return MultiModalConversationParam.builder()
                // 若沒有配置環境變數,請用百鍊API Key將下行替換為:.apiKey("sk-xxx")
                // 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")
                .messages(Arrays.asList(Msg))
                .enableThinking(true)
                .incrementalOutput(true)
                .build();
    }

    public static void streamCallWithMessage(MultiModalConversation conv, MultiModalMessage Msg)
            throws NoApiKeyException, ApiException, InputRequiredException, UploadFileException {
        MultiModalConversationParam param = buildMultiModalConversationParam(Msg);
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(message -> {
            handleGenerationResult(message);
        });
    }
    public static void main(String[] args) {
        try {
            MultiModalConversation conv = new MultiModalConversation();
            MultiModalMessage userMsg = MultiModalMessage.builder()
                    .role(Role.USER.getValue())
                    .content(Arrays.asList(Collections.singletonMap("image", "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"),
                            Collections.singletonMap("text", "請解答這道題")))
                    .build();
            streamCallWithMessage(conv, userMsg);
//             列印最終結果
//            if (reasoningContent.length() > 0) {
//                System.out.println("\n====================完整回複====================");
//                System.out.println(finalContent.toString());
//            }
        } catch (ApiException | NoApiKeyException | UploadFileException | InputRequiredException e) {
            logger.error("An exception occurred: {}", e.getMessage());
        }
        System.exit(0);
    }
}
# ======= 重要提示 =======
# 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成 https://dashscope-us.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation
# 若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation
# === 執行時請刪除該注釋 ===

curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'X-DashScope-SSE: enable' \
-d '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"image": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"},
                    {"text": "請解答這道題"}
                ]
            }
        ]
    },
    "parameters":{
        "enable_thinking": true,
        "incremental_output": true
    }
}'

限制思考長度

為避免視覺推理模型輸出過於冗長的思考過程,可使用 thinking_budget 參數限制思考過程產生的最大 Token 數。當思考過程超過該限制時,內容將被截斷,模型會立即開始產生最終答案。thinking_budget 預設值為模型的最大思維鏈長度,請參見模型列表。

重要

thinking_budget 參數支援Qwen3.6、Qwen3.5、Qwen3-VL(思考模式)、kimi-k2.6、kimi-k2.5(思考模式)。

OpenAI 相容

thinking_budget非 OpenAI 標準參數,若使用 OpenAI Python SDK 請通過 extra_body傳入。

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=os.getenv("DASHSCOPE_API_KEY"),
    # 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成https://dashscope-us.aliyuncs.com/compatible-mode/v1
    # 若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"  # 請將WorkspaceId替換為業務空間ID
)

reasoning_content = ""  # 定義完整思考過程
answer_content = ""     # 定義完整回複
is_answering = False   # 判斷是否結束思考過程並開始回複
enable_thinking = True
# 建立聊天完成請求
completion = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"
                    },
                },
                {"type": "text", "text": "這道題怎麼解答?"},
            ],
        },
    ],
    stream=True,
    # enable_thinking 參數開啟思考過程,thinking_budget 參數設定最大推理過程 Token 數
    # qwen3.5-plus、qwen3-vl-plus、qwen3-vl-flash可通過enable_thinking開啟或關閉思考(其中qwen3.5-plus預設開啟)、對於qwen3-vl-235b-a22b-thinking等帶thinking尾碼的模型,enable_thinking僅支援設定為開啟,對其他Qwen-VL模型均不適用
    extra_body={
        'enable_thinking': enable_thinking,
        "thinking_budget": 81920},

    # 解除以下注釋會在最後一個chunk返回Token使用量
    # stream_options={
    #     "include_usage": True
    # }
)

if enable_thinking:
    print("\n" + "=" * 20 + "思考過程" + "=" * 20 + "\n")

for chunk in completion:
    # 如果chunk.choices為空白,則列印usage
    if not chunk.choices:
        print("\nUsage:")
        print(chunk.usage)
    else:
        delta = chunk.choices[0].delta
        # 列印思考過程
        if hasattr(delta, 'reasoning_content') and delta.reasoning_content != None:
            print(delta.reasoning_content, end='', flush=True)
            reasoning_content += delta.reasoning_content
        else:
            # 開始回複
            if delta.content != "" and is_answering is False:
                print("\n" + "=" * 20 + "完整回複" + "=" * 20 + "\n")
                is_answering = True
            # 列印回複過程
            print(delta.content, end='', flush=True)
            answer_content += delta.content

# print("=" * 20 + "完整思考過程" + "=" * 20 + "\n")
# print(reasoning_content)
# print("=" * 20 + "完整回複" + "=" * 20 + "\n")
# print(answer_content)
import OpenAI from "openai";

// 初始化 openai 用戶端
const openai = 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-us.aliyuncs.com/compatible-mode/v1
  // 若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1
  baseURL: "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"  // 請將WorkspaceId替換為業務空間ID
});

let reasoningContent = '';
let answerContent = '';
let isAnswering = false;
let enableThinking = true;

let messages = [
    {
        role: "user",
        content: [
        { type: "image_url", image_url: { "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg" } },
        { type: "text", text: "解答這道題" },
    ]
}]

async function main() {
    try {
        const stream = await openai.chat.completions.create({
            model: 'qwen3.5-plus',
            messages: messages,
            stream: true,
          // 注意:在 Node.js SDK,enableThinking 這樣的非標準參數作為頂層屬性傳遞的,無需放在 extra_body 中
          enable_thinking: enableThinking,
          thinking_budget: 81920

        });

        if (enableThinking){console.log('\n' + '='.repeat(20) + '思考過程' + '='.repeat(20) + '\n');}

        for await (const chunk of stream) {
            if (!chunk.choices?.length) {
                console.log('\nUsage:');
                console.log(chunk.usage);
                continue;
            }

            const delta = chunk.choices[0].delta;

            // 處理思考過程
            if (delta.reasoning_content) {
                process.stdout.write(delta.reasoning_content);
                reasoningContent += delta.reasoning_content;
            }
            // 處理正式回複
            else if (delta.content) {
                if (!isAnswering) {
                    console.log('\n' + '='.repeat(20) + '完整回複' + '='.repeat(20) + '\n');
                    isAnswering = true;
                }
                process.stdout.write(delta.content);
                answerContent += delta.content;
            }
        }
    } catch (error) {
        console.error('Error:', error);
    }
}

main();
# ======= 重要提示 =======
# 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成https://dashscope-us.aliyuncs.com/compatible-mode/v1/chat/completions
# 若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions
# 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# === 執行時請刪除該注釋 ===

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "model": "qwen3.5-plus",
    "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"
          }
        },
        {
          "type": "text",
          "text": "請解答這道題"
        }
      ]
    }
  ],
    "stream":true,
    "stream_options":{"include_usage":true},
    "enable_thinking": true,
    "thinking_budget": 81920
}'

DashScope

import os
import dashscope
from dashscope import MultiModalConversation

# 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成 https://dashscope-us.aliyuncs.com/api/v1
# 若使用北京地區模型,需要將base_url換成 https://dashscope.aliyuncs.com/api/v1
dashscope.base_http_api_url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1"

enable_thinking = True

messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"},
            {"text": "解答這道題?"}
        ]
    }
]

response = MultiModalConversation.call(
    # 若沒有配置環境變數,請用百鍊API Key將下行替換為:api_key="sk-xxx",
    # 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model="qwen3.5-plus",  
    messages=messages,
    stream=True,
    # enable_thinking 參數開啟思考過程
    # qwen3.5-plus、qwen3-vl-plus、qwen3-vl-flash可通過enable_thinking開啟或關閉思考(其中qwen3.5-plus預設開啟),對於qwen3-vl-235b-a22b-thinking等帶thinking尾碼的模型,enable_thinking僅支援設定為開啟,對其他Qwen-VL模型均不適用
    enable_thinking=enable_thinking,
    # thinking_budget 參數設定最大推理過程 Token 數
    thinking_budget=81920,

)

# 定義完整思考過程
reasoning_content = ""
# 定義完整回複
answer_content = ""
# 判斷是否結束思考過程並開始回複
is_answering = False

if enable_thinking:
    print("=" * 20 + "思考過程" + "=" * 20)

for chunk in response:
    # 如果思考過程與回複皆為空白,則忽略
    message = chunk.output.choices[0].message
    reasoning_content_chunk = message.get("reasoning_content", None)
    if (chunk.output.choices[0].message.content == [] and
        reasoning_content_chunk == ""):
        pass
    else:
        # 如果當前為思考過程
        if reasoning_content_chunk != None and chunk.output.choices[0].message.content == []:
            print(chunk.output.choices[0].message.reasoning_content, end="")
            reasoning_content += chunk.output.choices[0].message.reasoning_content
        # 如果當前為回複
        elif chunk.output.choices[0].message.content != []:
            if not is_answering:
                print("\n" + "=" * 20 + "完整回複" + "=" * 20)
                is_answering = True
            print(chunk.output.choices[0].message.content[0]["text"], end="")
            answer_content += chunk.output.choices[0].message.content[0]["text"]

# 如果您需要列印完整思考過程與完整回複,請將以下代碼解除注釋後運行
# print("=" * 20 + "完整思考過程" + "=" * 20 + "\n")
# print(f"{reasoning_content}")
# print("=" * 20 + "完整回複" + "=" * 20 + "\n")
# print(f"{answer_content}")
// dashscope SDK的版本 >= 2.21.10
import java.util.*;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import io.reactivex.Flowable;

import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.exception.InputRequiredException;
import java.lang.System;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    // 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成 https://dashscope-us.aliyuncs.com/api/v1
    // 若使用北京地區模型,需要將base_url換成 https://dashscope.aliyuncs.com/api/v1
    static {Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";}

    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    private static StringBuilder reasoningContent = new StringBuilder();
    private static StringBuilder finalContent = new StringBuilder();
    private static boolean isFirstPrint = true;

    private static void handleGenerationResult(MultiModalConversationResult message) {
        String re = message.getOutput().getChoices().get(0).getMessage().getReasoningContent();
        String reasoning = Objects.isNull(re)?"":re; // 預設值

        List<Map<String, Object>> content = message.getOutput().getChoices().get(0).getMessage().getContent();
        if (!reasoning.isEmpty()) {
            reasoningContent.append(reasoning);
            if (isFirstPrint) {
                System.out.println("====================思考過程====================");
                isFirstPrint = false;
            }
            System.out.print(reasoning);
        }

        if (Objects.nonNull(content) && !content.isEmpty()) {
            Object text = content.get(0).get("text");
            finalContent.append(content.get(0).get("text"));
            if (!isFirstPrint) {
                System.out.println("\n====================完整回複====================");
                isFirstPrint = true;
            }
            System.out.print(text);
        }
    }
    public static MultiModalConversationParam buildMultiModalConversationParam(MultiModalMessage Msg)  {
        return MultiModalConversationParam.builder()
                // 若沒有配置環境變數,請用百鍊API Key將下行替換為:.apiKey("sk-xxx")
                // 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")
                .messages(Arrays.asList(Msg))
                .enableThinking(true)
                .thinkingBudget(81920)
                .incrementalOutput(true)
                .build();
    }

    public static void streamCallWithMessage(MultiModalConversation conv, MultiModalMessage Msg)
            throws NoApiKeyException, ApiException, InputRequiredException, UploadFileException {
        MultiModalConversationParam param = buildMultiModalConversationParam(Msg);
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(message -> {
            handleGenerationResult(message);
        });
    }
    public static void main(String[] args) {
        try {
            MultiModalConversation conv = new MultiModalConversation();
            MultiModalMessage userMsg = MultiModalMessage.builder()
                    .role(Role.USER.getValue())
                    .content(Arrays.asList(Collections.singletonMap("image", "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"),
                            Collections.singletonMap("text", "請解答這道題")))
                    .build();
            streamCallWithMessage(conv, userMsg);
//             列印最終結果
//            if (reasoningContent.length() > 0) {
//                System.out.println("\n====================完整回複====================");
//                System.out.println(finalContent.toString());
//            }
        } catch (ApiException | NoApiKeyException | UploadFileException | InputRequiredException e) {
            logger.error("An exception occurred: {}", e.getMessage());
        }
        System.exit(0);
    }
}
# ======= 重要提示 =======
# 各地區的API Key不同。擷取API Key:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# 以下為新加坡地區base_url,若使用維吉尼亞地區模型,需要將base_url換成 https://dashscope-us.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation
# 若使用北京地區模型,需要將base_url換成https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation 
# === 執行時請刪除該注釋 ===

curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'X-DashScope-SSE: enable' \
-d '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"image": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"},
                    {"text": "請解答這道題"}
                ]
            }
        ]
    },
    "parameters":{
        "enable_thinking": true,
        "incremental_output": true,
        "thinking_budget": 81920
    }
}'

更多用法

除了思考能力,視覺推理模型同樣具備視覺理解模型的全部功能,可組合使用以應對更複雜的情境:

  • 多圖理解

  • 視頻理解

  • 處理高解析度映像

  • 傳入本地檔案(Base 64 編碼或檔案路徑)

計費說明

總費用 = 輸入 Token 數 x 模型輸入單價 + 模型輸出 Token 數 x 模型輸出單價。

  • 思考過程(reasoning_content)會作為輸出內容的一部分,計入輸出 Token 併產生相應費用。若模型在思考模式下未輸出思考過程,按照非思考模式價格計費。

  • 映像或視頻計算token的方法請參見映像與視頻理解。

API參考

關於視覺推理模型的輸入輸出參數,請參見文本產生。

錯誤碼

如果模型調用失敗並返回報錯資訊,請參見錯誤碼進行解決。

上一篇:文字提取下一篇:圖片產生與編輯
该文章对您有帮助吗?