ドキュメントセンター
 
すべてのプロダクト
Search
  • ドキュメントセンター
  • Alibaba Cloud Model Studio
  • 操作ガイド (モデル)
  • モデル プレイグラウンド
  • 視覚理解
  • 視覚的推論

このプロダクト

  • このプロダクト
  • すべてのプロダクト

    Alibaba Cloud Model Studio:視覚的推論

    ドキュメントセンター

    Alibaba Cloud Model Studio:視覚的推論

    最終更新日:Apr 23, 2026

    視覚的推論モデルは、回答を提供する前に思考プロセスを生成するため、数学の問題解決、チャート分析、動画理解などの複雑な視覚分析タスクに最適です。

    例

    QVQ Logo
    視覚的推論
    上記のコンポーネントはデモンストレーションのみを目的としており、実際のリクエストは送信されません。

    サポートされているモデル

    • 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

    使用方法

    • 思考プロセス: Model Studio は、ハイブリッド思考と思考専用の 2 種類の視覚的推論モデルを提供します。

      • ハイブリッド思考モデル: 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 シリーズは、ストリーミング出力と非ストリーミング出力の両方をサポートしています。

      • QVQ シリーズはストリーミング出力のみをサポートしています。

    • システムプロンプトの推奨事項: 

      • シングルターンまたはシンプルな会話: 最良の推論結果を得るには、 System Message を設定しないでください。代わりに、ロールの定義や出力フォーマットの要件などの命令を User Message で渡してください。

      • エージェントの構築やツール呼び出しの実装などの複雑なアプリケーションの場合: System Message を使用して、モデルのロール、機能、および動作のフレームワークを定義し、モデルの安定性と信頼性を確保します。

    クイックスタート

    前提条件

    • API キーを取得し、環境変数として設定していること。

    • SDK の最新バージョン。DashScope Python SDK v1.24.6 以降、および DashScope Java SDK v2.21.10 以降が必要です。

    以下の例では、qvq-max モデルを呼び出してイメージから数学の問題を解き、ストリーミング出力を使用して思考プロセスと完全な応答を別々に出力します。

    OpenAI 互換

    Python

    from openai import OpenAI
    import os
    
    # OpenAI クライアントを初期化します。
    client = OpenAI(
        # API キーはリージョンによって異なります。キーの取得先: https://bailian.console.alibabacloud.com/?tab=model#/api-key
        # 環境変数が設定されていない場合は、Model Studio の API キーに置き換えます: api_key="sk-xxx"
        api_key = os.getenv("DASHSCOPE_API_KEY"),
        # これはシンガポールリージョンのベース URL です。中国 (北京) の場合は、base_url を "https://dashscope.aliyuncs.com/compatible-mode/v1" に変更してください。       
        base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    )
    
    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,
        # 最後のチャンクでトークン使用量を返すには、次の行のコメントを解除します。
        # stream_options={
        #     "include_usage": True
        # }
    )
    
    print("\n" + "=" * 20 + "思考プロセス" + "=" * 20 + "\n")
    
    for chunk in completion:
        # chunk.choices が空の場合は、使用量を出力します。
        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 キーはリージョンによって異なります。キーの取得先: https://bailian.console.alibabacloud.com/?tab=model#/api-key
        // これはシンガポールリージョンのベース URL です。中国 (北京) の場合は、base_url を 'https://dashscope.aliyuncs.com/compatible-mode/v1' に変更してください。       
        baseURL: 'https://dashscope-intl.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();

    思考プロセスと応答

    ====================思考プロセス====================
    
    承知いたしました。この問題は直方体と立方体の表面積と体積に関するものです。まず、各部分の要件を理解するために、問題を注意深く確認する必要があります。
    
    この問題では、2つの図形の表面積と体積をそれぞれ計算するよう求められています。1つ目の図形は直方体、2つ目は立方体です。単位はすべてセンチメートルで、各問題は6点、合計12点です。これは、小学校か中学校の幾何学の宿題のようです。
    
    まず、直方体と立方体の表面積と体積の公式を思い出す必要があります。直方体の場合、表面積の公式は \( 2(ab + bc + ac) \) で、a、b、c はそれぞれ長さ、幅、高さです。体積は \( abc \) です。立方体の場合、すべての辺の長さが等しいため、表面積は \( 6a^2 \)、体積は \( a^3 \) です。
    
    では、最初の図形、長さ 4 cm、幅 3 cm、高さ 2 cm の直方体を見てみましょう。まず表面積を計算します。値を公式に代入します:
    
    表面積 = \( 2(4×3 + 3×2 + 4×2) \)
            = \( 2(12 + 6 + 8) \)
            = \( 2×26 \)
            = 52 cm²
    
    次に体積です。同様に値を代入します:
    
    体積 = \( 4×3×2 \)
          = 24 cm³
    
    次に、2つ目の図形、辺の長さが 3 cm の立方体です。表面積は次のように計算されます:
    
    表面積 = \( 6×3^2 \)
            = \( 6×9 \)
            = 54 cm²
    
    そして体積は:
    
    体積 = \( 3^3 \)
          = 27 cm³
    
    ただし、間違いがないか確認する必要があります。例えば、直方体の表面積を計算する際に、いずれかの面の面積を計算し間違えていないか、あるいは掛け算でミスをしていないかなどです。
    
    例えば、直方体の3つの異なる面は 4×3、3×2、4×2 です。これらの面の面積はそれぞれ 12、6、8 です。これらを足すと 26 になり、2 を掛けると 52 となるので、正しいはずです。体積については、4×3=12、それに 2 を掛けると 24 となり、これも正しいです。
    
    立方体については、各面は 3×3=9 で、6つの面があるので合計は 54 です。体積は 3×3×3=27 で、これも正しいです。
    
    したがって、最終的な答えは次のようになります:
    
    1. 直方体の表面積は 52 平方センチメートル、体積は 24 立方センチメートルです。
    2. 立方体の表面積は 54 平方センチメートル、体積は 27 立方センチメートルです。
    
    ただし、問題の図に隠された情報や潜在的なトラップがないか確認する必要があります。例えば、問題には破線や網掛け部分が含まれることがありますが、この場合、画像内の直方体と立方体は標準的なもので、特別な印はありません。したがって、私の計算は正しいと考えられます。
    
    ====================完全な応答====================
    
    ### 解法:
    
    **1. 直方体 (長さ 4 cm、幅 3 cm、高さ 2 cm)**
    - **表面積**:
      \[
      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. 立方体 (辺の長さ 3 cm)**
    - **表面積**:
      \[
      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

    # ======= 重要事項 =======
    # この URL はシンガポールリージョン用です。中国 (北京) の場合は、URL を 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions' に変更してください。    
    # API キーはリージョンによって異なります。キーの取得先: https://bailian.console.alibabacloud.com/?tab=model#/api-key
    # === 実行前にこのコメントを削除してください ===
    
    curl --location 'https://dashscope-intl.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":"Okay"},"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":" I"},"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":" need"},"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":" to"},"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":"cm"},"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 SDK で QVQ モデルを呼び出す場合:

    • incremental_output パラメーターはデフォルトで true であり、false には設定できません。増分出力のみがサポートされています。

    • result_format パラメーターのデフォルトは "message" で、"text" には設定できません。

    Python

    import os
    import dashscope
    from dashscope import MultiModalConversation
    
    # これはシンガポールリージョンのベース URL を設定します。中国 (北京) の場合は、この値を 'https://dashscope.aliyuncs.com/api/v1' に変更してください。      
    dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
    messages = [
        {
            "role": "user",
            "content": [
                {"image": "https://img.alicdn.com/imgextra/i1/O1CN01gDEY8M1W114Hi3XcN_!!6000000002727-0-tps-1024-406.jpg"},
                {"text": "この問題をどうやって解きますか?"}
            ]
        }
    ]
    
    response = MultiModalConversation.call(
        # API キーはリージョンによって異なります。キーの取得先: https://bailian.console.alibabacloud.com/?tab=model#/api-key
        # 環境変数が設定されていない場合は、次の行を Model Studio の API キーに置き換えます: 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}")

    思考プロセスと応答

    ====================思考プロセス====================
    承知いたしました。この問題は直方体と立方体の表面積と体積を計算するものです。まず、各設問の要件を正確に理解するため、問題を注意深く確認します。
    
    この問題では、2つの図形の表面積と体積をそれぞれ計算するよう求められています。1つ目の図形は直方体、2つ目は立方体です。単位はすべてセンチメートルで、各問題は6点、合計12点です。これは、小学校か中学校の幾何学の宿題のようです。
    
    まず、直方体と立方体の表面積と体積の公式を思い出す必要があります。直方体の場合、表面積の公式は \( Area = 2(ab + bc + ac) \) で、a、b、c はそれぞれ長さ、幅、高さです。体積は \( Volume = abc \) です。立方体の場合、すべての辺の長さが等しいため、表面積は \( Area = 6a^2 \)、体積は \( Volume = a^3 \) です。
    
    では、最初の図形、長さ 4 cm、幅 3 cm、高さ 2 cm の直方体を見てみましょう。まず、これらの値が公式の変数に正しく対応しているか確認する必要があります。通常、直方体の3つの次元は任意に名付けることができますが、便宜上、最も長い辺を長さ、中間の辺を幅、最も短い辺を高さと考えることができます。しかし、この問題では各辺の長さが明確に示されているため、そのまま使用できます。
    
    次に、最初の直方体の表面積を計算します。値を公式に代入します:
    
    \( Area = 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 平方センチメートルです。
    
    次に、体積を計算します:
    
    \( Volume = 4 × 3 × 2 = 24 \)
    
    したがって、体積は 24 立方センチメートルです。
    
    次に、2つ目の図形、すべての辺の長さが 3 cm の立方体を見てみましょう。したがって、表面積の計算は次のようになります:
    
    \( Area = 6 × 3^2 = 6 × 9 = 54 \)
    
    そして体積は:
    
    \( Volume = 3^3 = 27 \)
    
    したがって、立方体の表面積は 54 平方センチメートル、体積は 27 立方センチメートルです。
    
    計算中、単位の一貫性に注意する必要があります。問題で与えられた単位はセンチメートルなので、最終結果は平方センチメートルと立方センチメートルでなければなりません。また、特に直方体の表面積を計算する際には、項を見落としたり計算ミスをしたりしやすいため、掛け算と足し算の順序など、計算エラーがないことを確認する必要があります。
    
    さらに、長さ、幅、高さが正しく特定されているかなど、他の誤解の可能性がないか確認します。しかし、この問題では各辺の長さが明確に示されているため、これは問題にならないはずです。また、立方体の場合、すべての辺の長さが等しいため、辺の長さが異なることによる複雑さはありません。
    
    要約すると、最初の直方体の表面積は 52 平方センチメートル、体積は 24 立方センチメートルです。2つ目の立方体の表面積は 54 平方センチメートル、体積は 27 立方センチメートルです。
    
    ====================完全な応答====================
    ### 解法:
    
    **1. 直方体 (長さ 4 cm、幅 3 cm、高さ 2 cm)**
    
    - **表面積**:
      \[
      Area = 2(ab + bc + ac) = 2(4×3 + 3×2 + 4×2) = 2(12 + 6 + 8) = 2×26 = 52 \, \text{cm}^2
      \]
    
    - **体積**:
      \[
      Volume = abc = 4×3×2 = 24 \, \text{cm}^3
      \]
    
    **2. 立方体 (辺の長さ 3 cm)**
    
    - **表面積**:
      \[
      Area = 6a^2 = 6×3^2 = 6×9 = 54 \, \text{cm}^2
      \]
    
    - **体積**:
      \[
      Volume = 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 v2.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 {
        static {
           // これはシンガポールリージョンのベース URL を設定します。中国 (北京) の場合は、この値を "https://dashscope.aliyuncs.com/api/v1" に変更してください。      
            Constants.baseHttpApiUrl="https://dashscope-intl.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; // 値が null の場合は空の文字列を使用します
    
            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 キーはリージョンによって異なります。キーの取得先: https://bailian.console.alibabacloud.com/?tab=model#/api-key
                    // 環境変数が設定されていない場合は、次の行を Model Studio の API キーに置き換えます: .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);
        }
    }

    思考プロセスと応答

    ====================思考プロセス====================
    うーん、この問題を解くには、2つの図形の表面積と体積を計算する必要があります。まず、問題で提供されている画像を注意深く確認する必要があります。最初の図形は直方体で、2つ目は立方体です。問題では、それぞれの表面積と体積をセンチメートル単位で計算するように求められています。
    
    最初の図形、直方体を見てみましょう。その寸法は、長さ、幅、高さである必要があります。画像のラベルによると、長さは 4 cm、幅は 3 cm、高さは 2 cm です。そうですよね?直方体の表面積の公式は、2 × (長さ × 幅 + 長さ × 高さ + 幅 × 高さ) だったと記憶しています。そして、体積は長さ × 幅 × 高さです。公式が正しいか再確認してみましょう。はい、表面積は確かに6つの面の面積の合計であり、向かい合う面の面積は等しいので、この公式は正しいです。
    
    では、値を代入すると、表面積は 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 立方センチメートルです。この部分は正しいはずです。
    
    次は2つ目の図形、立方体です。すべての辺の長さは 3 cm です。立方体の表面積は、6つの同一の正方形の面を持つため、辺の長さの2乗の6倍です。体積は辺の長さの3乗です。したがって、表面積は 6×3²=6×9=54 平方センチメートルになるはずです。体積は 3³=27 立方センチメートルです。ここで単位に注意する必要があります。問題では単位が cm と記載されているので、結果は平方センチメートルと立方センチメートルで記述する必要があります。
    
    ただし、何か間違いを犯していないか再確認すべきです。例えば、直方体の辺は正しく特定されているでしょうか?画像では、直方体の長さは幅よりも長く見えるので、長さは4、幅は3、高さは2です。立方体については、3つの次元すべてが3であり、問題ありません。計算ミスはなかったでしょうか?例えば、直方体の表面積の計算で、積は正しいか、足し算は正しいか?例えば、4×3=12、4×2=8、3×2=6、足して26、2を掛けて52、正しいです。体積 4×3×2=24 も正しいです。立方体については、表面積 6×9=54 と体積 27 も正しいです。
    
    注意すべき点として、単位があります。問題では単位が cm と明確に記載されているので、答えには正しい単位記号を追加する必要があります。また、問題には各問題が6点、合計12点と記載されていますが、問題は2つしかないので、それぞれ6点です。これは計算プロセスには影響しませんが、手順や単位を省略しないようにという注意喚起です。
    
    要約すると、最初の図形の表面積は 52 平方センチメートル、体積は 24 立方センチメートルです。2つ目の図形の表面積は 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\) 立方センチメートル  
    
    **説明:**  
    - 直方体の表面積は、その6つの面の総面積を計算することで得られ、その体積は長さ、幅、高さの積です。  
    - 立方体の表面積は、その6つの同一の正方形の面の面積の合計であり、その体積は辺の長さの3乗です。  
    - すべての単位は、問題の要件に従ってセンチメートルです。

    HTTP

    Curl

    # ======= 重要事項 =======
    # この URL はシンガポールリージョン用です。中国 (北京) の場合は、URL を 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' に変更してください。       
    # API キーはリージョンによって異なります。キーの取得先: https://bailian.console.alibabacloud.com/?tab=model#/api-key
    # === 実行前にこのコメントを削除してください ===
    
    curl -X POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H 'Content-Type: application/json' \
    -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":"Okay","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":" I"},"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":"cubic"}],"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":"centimeters"}],"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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    )
    
    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 パラメーターは推論プロセスの最大トークン数を設定します。
        # qwen3.5-plus、qwen3-vl-plus、および qwen3-vl-flash モデルでは、enable_thinking を使用して思考を有効または無効にできます (qwen3.5-plus ではデフォルトで有効です)。qwen3-vl-235b-a22b-thinking のように 'thinking' サフィックスを持つモデルの場合、enable_thinking は true にしか設定できません。このパラメーターは他の Qwen-VL モデルには適用されません。
        extra_body={
            'enable_thinking': enable_thinking
            },
    
        # 最後のチャンクでトークン使用量を返すには、以下をコメント解除します。
        # stream_options={
        #     "include_usage": True
        # }
    )
    
    if enable_thinking:
        print("\n" + "=" * 20 + "思考プロセス" + "=" * 20 + "\n")
    
    for chunk in completion:
        # chunk.choices が空の場合は、使用量を出力します。
        if not chunk.choices:
            print("\nUsage:")
            print(chunk.usage)
        else:
            delta = chunk.choices[0].delta
            # 思考プロセスを出力します。
            if hasattr(delta, 'reasoning_content') and delta.reasoning_content is not 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
                # ストリーミング中に応答を出力します。
                if delta.content:
                    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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
      // 環境変数が設定されていない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えます: 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://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    });
    
    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 では、`enable_thinking` のような非標準パラメーターは `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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
    # === 実行前にこのコメントを削除してください ===
    
    curl --location 'https://dashscope-intl.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://dashscope-intl.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(
        # 環境変数が設定されていない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えます: api_key="sk-xxx",
        # API キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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 は true にしか設定できません。このパラメーターは他の 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 (not chunk.output.choices[0].message.content and not reasoning_content_chunk):
            pass
        else:
            # 現在のチャンクが思考プロセスの一部である場合。
            if reasoning_content_chunk and not 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 v2.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://dashscope-intl.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(text);
                if (!isFirstPrint) {
                    System.out.println("\n====================完全な応答====================");
                    isFirstPrint = true;
                }
                System.out.print(text);
            }
        }
        public static MultiModalConversationParam buildMultiModalConversationParam(MultiModalMessage Msg)  {
            return MultiModalConversationParam.builder()
                    // 環境変数が設定されていない場合は、次の行を Alibaba Cloud Model Studio の API キーに置き換えます: .apiKey("sk-xxx")
                    // API キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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://dashscope-intl.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 パラメーターを使用して、モデルが生成するトークンの数を制限できます。思考プロセスがこの制限を超えると、コンテンツは切り捨てられ、モデルはすぐに最終的な回答の生成を開始します。デフォルトでは、thinking_budget は、モデルの最大の Chain-of-Thought の長さに設定されています。詳細については、「モデルリスト」をご参照ください。

    重要

    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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    )
    
    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 パラメーターは思考プロセスの最大トークン数を設定します。
        # qwen3.5-plus、qwen3-vl-plus、および qwen3-vl-flash では、enable_thinking を使用して思考を有効または無効にできます (qwen3.5-plus ではデフォルトで有効)。'thinking' サフィックスを持つモデル (例:qwen3-vl-235b-a22b-thinking) では、enable_thinking を有効にする必要があります。このパラメーターは他の Qwen-VL モデルには適用されません。
        extra_body={
            'enable_thinking': enable_thinking,
            "thinking_budget": 81920},
    
        # 最後のチャンクでトークン使用量を返すには、以下をコメント解除します。
        # stream_options={
        #     "include_usage": True
        # }
    )
    
    if enable_thinking:
        print("\n" + "=" * 20 + "思考プロセス" + "=" * 20 + "\n")
    
    for chunk in completion:
        # chunk.choices が空の場合は、使用量を出力します。
        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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
      // DASHSCOPE_API_KEY 環境変数が設定されていない場合は、API キーを直接設定します: 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://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    });
    
    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,
              // 注: Python SDK とは異なり、Node.js SDK は enable_thinking のような非標準パラメーターを 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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/model-studio/get-api-key をご参照ください。
    # === 実行前にこのコメントを削除してください ===
    
    curl --location 'https://dashscope-intl.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://dashscope-intl.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(
        # DASHSCOPE_API_KEY 環境変数が設定されていない場合は、API キーを直接設定します: api_key="sk-xxx",
        # API キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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 ではデフォルトで有効)。'thinking' サフィックスを持つモデル (例:qwen3-vl-235b-a22b-thinking) では、enable_thinking を有効にする必要があります。このパラメーターは他の Qwen-VL モデルには適用されません。
        enable_thinking=enable_thinking,
        # thinking_budget パラメーターは思考プロセスの最大トークン数を設定します。
        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 v2.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://dashscope-intl.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; // null の場合は空の文字列に設定
    
            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 キーは DASHSCOPE_API_KEY 環境変数から読み取られます。あるいは、直接渡すこともできます: .apiKey("sk-xxx")
                    // API キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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 キーはリージョンによって異なります。API キーを取得するには、https://www.alibabacloud.com/help/ja/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://dashscope-intl.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
        }
    }'

    その他の使用方法

    推論に加えて、視覚的推論モデルには視覚理解モデルのすべての機能が含まれており、これらを組み合わせてより複雑なシナリオを処理できます。

    • 複数画像の理解

    • 動画の理解

    • 高解像度画像の処理

    • ローカルファイルの受け渡し (Base64 エンコーディングまたはファイルパス)

    課金

    総コスト = (入力トークン × 入力トークン単価) + (出力トークン × 出力トークン単価)

    • 思考プロセス (reasoning_content) は出力トークンとして課金されます。思考モード中にモデルが思考プロセスを出力しない場合は、ノンシンキングモードの料金で課金されます。

    • 画像と動画のトークン計算方法の詳細については、「画像と動画の理解」をご参照ください。

    API

    視覚的推論モデルの入力および出力パラメーターについては、「Qwen」をご参照ください。

    エラーコード

    モデルの呼び出しが失敗し、エラーメッセージが返された場合は、「エラーメッセージ」を参照して解決してください。

    ありがとうございます。フィードバックを受け取りました。