すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Model Studio:画像および動画の理解

最終更新日:Mar 28, 2026

視覚理解モデルは、お客様が提供する画像および動画についての質問に回答します。画像キャプション、視覚質問応答(VQA)、オブジェクトのローカライズなど、単一または複数の画像入力に対応するタスクをサポートしています。

対応リージョン: シンガポール、米国 (バージニア)、中国 (北京)、中国 (香港)、ドイツ (フランクフルト)。各リージョンには、専用の API キー およびエンドポイントを使用してください。

オンラインで試す: Alibaba Cloud Model Studio コンソール にアクセスし、右上隅からリージョンを選択した後、Vision ページに移動します。

クイックスタート

前提条件

以下の例では、画像の内容を説明するためのモデル呼び出し方法を示します。詳細については、「ローカルファイルの渡し方」および「画像の制限事項」をご参照ください。

OpenAI 互換

Python

from openai import OpenAI
import os

client = OpenAI(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
)

completion = client.chat.completions.create(
    model="qwen3.5-plus",  # qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"
                    },
                },
                {"type": "text", "text": "この画像には何が描かれていますか?"},
            ],
        },
    ],
)
print(completion.choices[0].message.content)

応答

これはビーチで撮影された写真です。写真には、砂の上に座っている人物と犬が写っており、背景には海と空が広がっています。人物と犬は相互に触れ合っている様子で、犬の前足が人物の手の上に乗っています。フレームの右側から差し込む日差しが、シーンに温かみのある雰囲気を加えています。

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
  // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
  // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:apiKey: "sk-xxx"
  apiKey: process.env.DASHSCOPE_API_KEY,
  // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
  baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
});

async function main() {
  const response = await openai.chat.completions.create({
    model: "qwen3.5-plus",   // qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    messages: [
      {
        role: "user",
        content: [{
            type: "image_url",
            image_url: {
              "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"
            }
          },
          {
            type: "text",
            text: "この画像には何が描かれていますか?"
          }
        ]
      }
    ]
  });
  console.log(response.choices[0].message.content);
}
main()

応答

これはビーチで撮影された写真です。写真には、砂の上に座っている人物と犬が写っており、背景には海と空が広がっています。人物と犬は相互に触れ合っている様子で、犬の前足が人物の手の上に乗っています。フレームの右側から差し込む日差しが、シーンに温かみのある雰囲気を加えています。

curl

# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/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://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"}},
        {"type": "text", "text": "この画像には何が描かれていますか?"}
    ]
  }]
}'

応答

{
  "choices": [
    {
      "message": {
        "content": "これはビーチで撮影された写真です。写真には、砂の上に座っている人物と犬が写っており、背景には海と空が広がっています。人物と犬は相互に触れ合っている様子で、犬の前足が人物の手の上に乗っています。フレームの右側から差し込む日差しが、シーンに温かみのある雰囲気を加えています。",
        "role": "assistant"
      },
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null
    }
  ],
  "object": "chat.completion",
  "usage": {
    "prompt_tokens": 1270,
    "completion_tokens": 54,
    "total_tokens": 1324
  },
  "created": 1725948561,
  "system_fingerprint": null,
  "model": "qwen3.5-plus",
  "id": "chatcmpl-0fd66f46-b09e-9164-a84f-3ebbbedbac15"
}

DashScope

Python

import os
import dashscope

# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
{
    "role": "user",
    "content": [
    {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
    {"text": "この画像には何が描かれていますか?"}]
}]

response = dashscope.MultiModalConversation.call(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:api_key="sk-xxx"
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3.5-plus',   # qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    messages=messages
)

print(response.output.choices[0].message.content[0]["text"])

応答

これはビーチで撮影された写真です。写真には女性と犬が写っており、女性は砂の上に座り、笑顔で犬と触れ合っています。犬は首輪を着けており、女性の手とハイファイブしているように見えます。背景には海と空が広がっており、日差しが二人を照らして、温かみのある雰囲気を演出しています。

Java

import java.util.Arrays;
import java.util.Collections;

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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    
    // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    static {
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation(); 
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"),
                        Collections.singletonMap("text", "この画像には何が描かれていますか?"))).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")  // この例では qwen3.5-plus モデルを使用します。他のモデルに置き換えることもできます。利用可能なモデルの一覧については、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
                .messages(Arrays.asList(userMessage))
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

応答

これはビーチで撮影された写真です。写真にはチェック柄のシャツを着た人物と首輪を着けた犬が写っています。人物と犬は向かい合って座っており、相互に触れ合っている様子です。背景には海と空が広がっており、日差しが二人を照らして、温かみのある雰囲気を演出しています。

curl

# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-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' \
-d '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
                    {"text": "この画像には何が描かれていますか?"}
                ]
            }
        ]
    }
}'

応答

{
  "output": {
    "choices": [
      {
        "finish_reason": "stop",
        "message": {
          "role": "assistant",
          "content": [
            {
              "text": "これはビーチで撮影された写真です。写真にはチェック柄のシャツを着た人物と首輪を着けた犬が写っています。二人は砂の上に座っており、背景には海と空が広がっています。フレームの右側から差し込む日差しが、シーンに温かみのある雰囲気を加えています。"
            }
          ]
        }
      }
    ]
  },
  "usage": {
    "output_tokens": 55,
    "input_tokens": 1271,
    "image_tokens": 1247
  },
  "request_id": "ccf845a3-dc33-9cda-b581-20fe7dc23f70"
}

モデル選択

  • 推奨 Qwen3.5:最新世代の視覚理解モデルです。マルチモーダル推論、2D/3D 画像理解、複雑なドキュメント解析、視覚プログラミング、動画理解、マルチモーダルエージェント構築などのタスクに優れています。中国本土およびシンガポールのリージョンでご利用いただけます。

    • qwen3.5-plus:Qwen3.5 シリーズ中最も高性能なモデルであり、最高レベルの精度とパフォーマンスを必要とするタスクに推奨されます。

    • qwen3.5-flash:高速かつコスト効率の高いモデルで、パフォーマンスとコストのバランスが取れており、遅延の影響を受けやすいシナリオに最適です。

    • qwen3.5-397b-a17bqwen3.5-122b-a10bqwen3.5-27b、および qwen3.5-35b-a3b:Qwen3.5 シリーズのオープンソースモデルです。

  • Qwen3-VL シリーズは、高精度のオブジェクト認識およびローカライズ(3D 含む)、エージェントによるツール呼び出し、ドキュメントおよびウェブページの解析、複雑な問題解決、長尺動画の理解などのタスクにも適しています。

    • qwen3-vl-plus:Qwen3-VL シリーズ中最も強力なモデルです。

    • qwen3-vl-flash:高速かつコスト効率の高いモデルで、パフォーマンスとコストのバランスが取れており、遅延の影響を受けやすいシナリオに最適です。

  • Qwen2.5-VL シリーズは、シンプルな画像キャプションや短尺動画からの要約抽出などの汎用的なタスクに適しています。

    • qwen-vl-max(Qwen2.5-VL シリーズ):Qwen2.5-VL シリーズ中最も高性能なモデルです。

    • qwen-vl-plus(Qwen2.5-VL シリーズ):高速なモデルで、パフォーマンスとコストのバランスが取れています。

モデル名、コンテキスト、価格、スナップショットバージョンについては、「モデル一覧」をご参照ください。同時実行数の制限については、「レート制限」をご参照ください。

モデル機能比較

モデル

深層的思考

ツール呼び出し

コンテキストキャッシュ

構造化出力

言語

Qwen3.5 シリーズ

対応

対応

qwen3.5-plus および qwen3.5-flash の安定版のみ対応。

明示的なキャッシュのみ対応。

ノンシンキングモード対応

33 言語:中国語、日本語、韓国語、インドネシア語、ベトナム語、タイ語、英語、フランス語、ドイツ語、ロシア語、ポルトガル語、スペイン語、イタリア語、スウェーデン語、デンマーク語、チェコ語、ノルウェー語、オランダ語、フィンランド語、トルコ語、ポーランド語、スワヒリ語、ルーマニア語、セルビア語、ギリシャ語、カザフ語、ウズベク語、セブアノ語、アラビア語、ウルドゥー語、ペルシャ語、ヒンディー語/デーヴァナーガリー、ヘブライ語。

Qwen3-VL シリーズ

対応

対応

qwen3-vl-plus および qwen3-vl-flash の安定版のみ対応。

ノンシンキングモード対応

33 言語:中国語、日本語、韓国語、インドネシア語、ベトナム語、タイ語、英語、フランス語、ドイツ語、ロシア語、ポルトガル語、スペイン語、イタリア語、スウェーデン語、デンマーク語、チェコ語、ノルウェー語、オランダ語、フィンランド語、トルコ語、ポーランド語、スワヒリ語、ルーマニア語、セルビア語、ギリシャ語、カザフ語、ウズベク語、セブアノ語、アラビア語、ウルドゥー語、ペルシャ語、ヒンディー語/デーヴァナーガリー、ヘブライ語。

Qwen2.5-VL シリーズ

非対応

非対応

qwen-vl-max および qwen-vl-plus の安定版のみ対応。

qwen-vl-max および qwen-vl-plus の安定版および最新版のみ対応。

11 言語:中国語、英語、日本語、韓国語、アラビア語、ベトナム語、フランス語、ドイツ語、イタリア語、スペイン語、ロシア語。

機能

視覚質問応答(VQA)

人物、場所、動物、植物などを特定するなど、画像の内容を説明・分類します。

p1021359

太陽がまぶしい場合、この画像からどのアイテムを使えばよいですか?

太陽がまぶしい場合は、画像にあるピンク色のサングラスをご利用ください。サングラスは強い光を効果的に遮断し、紫外線による目の損傷を軽減し、明るい日差しの中でも快適な視界を確保しながら視力を保護します。

クリエイティブライティング

画像または動画の内容から、物語作成、コピーライティング、短尺動画の脚本制作などのクリエイティブなシナリオ向けに、鮮やかなテキスト説明を生成します。

vl-问答

この画像に基づいて、SNS 用の魅力的な投稿文を作成してください。

承知しました。この画像には豊かな中秋節の雰囲気が漂っており、古典的要素と現代的要素が巧みに融合しています。画像の主要な要素に基づき、以下にさまざまなスタイルの SNS 投稿文のアイデアをいくつかご提案いたします。

詩的・審美的スタイル

今宵、月は満ちて万人に輝く。秋の想いは君へと届く。嫦娥の飛翔と玉兎の薬——古来より続くロマンスが、今宵再び蘇る。この月明かりが君の帰りを照らし、私の最も深い願いを運んでくれますように。中秋節おめでとうございます!

温かみのある心のこもったスタイル

穏やかな中秋の夜、満月は満ちて家族の団欒を象徴します。花火を見上げ、月を眺め、月餅を味わい、あなたへの祝福を込めて。すべての希望と夢が叶いますように。皆さま、中秋節と家族団欒のお祝いをお楽しみください!

OCR および情報抽出

画像内のテキストや数式を認識したり、領収書、証明書、フォームなどのドキュメントから情報を抽出したりします。これらのモデルは、整形されたテキスト出力に対応しています。Qwen3.5 および Qwen3-VL モデルは、言語対応範囲を 33 言語まで拡大しています。対応言語の一覧については、「モデル機能比較」をご参照ください。

-q2cdz6jy89b6m3kp

画像から以下のフィールドを抽出してください:['請求書コード'、'請求書番号'、'宛先'、'燃油サーチャージ'、'運賃'、'旅行日'、'出発時刻'、'列車番号'、'座席番号']。結果を JSON 形式で出力してください。

{

"請求書コード": "221021325353",

"請求書番号": "10283819",

"宛先": "開発区",

"燃油サーチャージ": "2.0",

"運賃": "8.00<全額>",

"旅行日": "2013-06-29",

"出発時刻": "連番",

"列車番号": "040",

"座席番号": "371"

}

多分野の問題解決

画像に含まれる数学、物理、化学などの教科の問題を解きます。K-12 教育から大人の学習まで、教育用途に幅広く対応しています。

-5jwcstcvmdpqghaj

画像の数学の問題をステップ・バイ・ステップで解いてください。

-答案

視覚プログラミング

デザインのモックアップやウェブサイトのスクリーンショットなどの視覚入力から、HTML、CSS、JS コードを生成します。

code

私のスケッチに基づいて HTML および CSS を使用したウェブページを作成してください。メインのカラーテーマは黒にしてください。

code-预览

ウェブページのプレビュー

オブジェクトのローカライズ

2D および 3D のローカライズをサポートしており、オブジェクトの向き、視点の変化、被覆関係を判断できます。3D ローカライズは Qwen3-VL モデルの新機能です。

Qwen2.5-VL モデルは、480×480 ~ 2560×2560 ピクセルの解像度範囲内で堅牢なオブジェクトのローカライズを実現します。この範囲外では検出精度が低下し、バウンディングボックスの位置がずれることがあります。
ローカライズ結果を元の画像に描画する方法については、「よくある質問」をご参照ください。

2D ポジショニング

-530xdcos1lqkcfuy

  • バウンディングボックス座標を返す:画像内のすべての食品アイテムを検出し、JSON 形式でバウンディングボックス(bbox)座標を出力します。

  • 中心点座標を返す:画像内のすべての食品アイテムを点として検出し、XML 形式で点座標を出力します。

2D ポジショニング結果の可視化

-mu9podu1eyvph1zd

3D ポジショニング

3d

画像内の自動車を検出し、その 3D 位置を予測します。 JSON 出力:[{"bbox_3d": [x_center, y_center, z_center, x_size, y_size, z_size, roll, pitch, yaw], "label": "カテゴリ"}]

3D ポジショニング結果の可視化

3d-结果

ドキュメント解析

スキャン画像や画像ベースの PDF などの画像ベースのドキュメントを、QwenVL HTML 形式または QwenVL Markdown 形式に解析します。この形式では、テキストを正確に認識し、画像や表などの要素の位置情報を取得できます。Qwen3-VL モデルは、ドキュメントを Markdown 形式に解析する機能を追加しています。

推奨プロンプト:qwenvl html(HTML 形式で解析する場合)または qwenvl markdown(Markdown 形式で解析する場合)。

image

qwenvl markdown。

-结果

結果の可視化

動画理解

動画の内容を分析し、特定のイベントのタイムスタンプを特定したり、重要な時間帯の要約を生成したりします。

動画内の人物が実行する一連の動作を説明してください。結果を start_time、end_time、event フィールドを持つ JSON 形式で出力してください。タイムスタンプには HH:mm:ss 形式を使用します。

{

"events": [

{

"start_time": "00:00:00",

"end_time": "00:00:05",

"event": "人物が段ボール箱を持ち、テーブルに向かって歩き、それをテーブルの上に置きます。"

},

{

"start_time": "00:00:05",

"end_time": "00:00:15",

"event": "人物がスキャナーを取り、それを箱のラベルに向けてスキャンします。"

},

{

"start_time": "00:00:15",

"end_time": "00:00:21",

"event": "人物がスキャナーを元の場所に戻し、その後ノートブックに情報を記録するためにペンを取ります。"}]

}

コア機能

思考モードの有効化/無効化

  • qwen3.5qwen3-vl-plus、および qwen3-vl-flash シリーズのモデルは、推論後に応答するか、直接応答するかを選択できるハイブリッド思考モデルです。enable_thinking パラメーターを使用して、思考モードの有効化/無効化を制御できます。

    • true:思考モードを有効化します。qwen3.5 シリーズのデフォルト値は true です。

    • false:思考モードを無効化します。qwen3-vl-plus および qwen3-vl-flash シリーズのデフォルト値は false です。

  • thinking サフィックス付きのモデル(例:qwen3-vl-235b-a22b-thinking)は、専用の推論モデルです。応答前に必ず推論を実行し、この機能を無効化することはできません。

重要
  • モデル構成: ツール呼び出しを伴わない一般的な会話シナリオでは、最適なパフォーマンスを得るために、System Message を設定しないでください。代わりに、モデルの役割設定や出力フォーマット要件などの指示を User Message を通じて渡してください。

  • ストリーミング出力の使用: 思考モードを有効化すると、ストリーミング出力および非ストリーミング出力 の両方がサポートされます。長い応答によりタイムアウトが発生するのを防ぐために、ストリーミング出力を使用してください。

  • 思考長の制限: 深層的思考モデルは、冗長な推論を生成することがあります。thinking_budget パラメーターを使用して、推論の長さを制限できます。推論中に生成されるトークン数が thinking_budget を超えた場合、推論は途中で打ち切られ、モデルは即座に最終応答の生成を開始します。thinking_budget のデフォルト値は、モデルの最大 Chain-of-Thought 長です。「モデル一覧」をご参照ください。

OpenAI 互換

enable_thinking パラメーターは、標準の OpenAI パラメーターではありません。OpenAI Python SDK を使用する場合は、extra_body を介して渡してください。

import os
from openai import OpenAI

client = OpenAI(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    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,
    # `thinking mode` は `qwen3.5`/`qwen3-vl-plus`/`qwen3-vl-flash` で切り替え可能ですが、'thinking' サフィックス付きのモデルでは必須であり、その他の Qwen-VL モデルには適用されません。
    # `thinking_budget` パラメーターは、推論プロセスにおける最大トークン数を設定します。
    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("\n使用量:")
        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 is not None:
                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/zh/model-studio/get-api-key
  // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:apiKey: "sk-xxx"
  apiKey: process.env.DASHSCOPE_API_KEY,
  // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
  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,
          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('\n使用量:');
                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);
    }
}

main();
# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/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

# エンドポイントはリージョンによって異なります。お使いのリージョンに応じてエンドポイントを変更してください。
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(
    # 環境変数を設定していない場合は、次の行を Model Studio API キーに置き換えてください: api_key="sk-xxx",
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください: 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,
    # `思考モード` は `qwen3.5`/`qwen3-vl-plus`/`qwen3-vl-flash` で切り替え可能です。'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 is not 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 {
    // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    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()
                // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:.apiKey("sk-xxx")
                // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください: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("例外が発生しました:{}", e.getMessage());
        }
        System.exit(0);
    }
}
# ======= 重要 =======
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-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": "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
    }
}'

複数画像入力

視覚理解モデルでは、製品比較や複数ページのドキュメント処理などのタスクにおいて、単一のリクエストで複数の画像を渡すことができます。そのためには、user messagecontent 配列に複数の画像オブジェクトを含めます。

重要

画像の枚数は、テキストおよび画像の合計トークン数がモデルの最大入力トークン数を超えないように制限されます。

OpenAI 互換

Python

import os
from openai import OpenAI

client = OpenAI(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3.5-plus",  # qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    messages=[
        {"role": "user","content": [
            {"type": "image_url","image_url": {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},},
            {"type": "image_url","image_url": {"url": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png"},},
            {"type": "text", "text": "これらの画像には何が描かれていますか?"},
            ],
        }
    ],
)

print(completion.choices[0].message.content)

応答

画像 1 には、ビーチで相互に触れ合っている女性とラブラドール・レトリバーが描かれています。女性はチェック柄のシャツを着ており、砂の上に座って犬の前足とハイファイブしています。背景には波打ち際と空が広がっており、温かく心地よい雰囲気を演出しています。

画像 2 には、森を歩いているトラが描かれています。トラの毛並みは黒い縞模様入りのオレンジ色で、周囲は木々や植物で密集しており、地面には落ち葉が散らばっています。このシーンからは、野生の雰囲気が感じられます。

Node.js

import OpenAI from "openai";

const openai = new OpenAI(
    {
        // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:apiKey: "sk-xxx"
        apiKey: process.env.DASHSCOPE_API_KEY,
        // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const response = await openai.chat.completions.create({
        model: "qwen3.5-plus",  // qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
        messages: [
          {role: "user",content: [
            {type: "image_url",image_url: {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"}},
            {type: "image_url",image_url: {"url": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png"}},
            {type: "text", text: "これらの画像には何が描かれていますか?" },
        ]}]
    });
    console.log(response.choices[0].message.content);
}

main()

応答

最初の画像には、ビーチで相互に触れ合っている人物と犬が描かれています。人物はチェック柄のシャツを着ており、犬は首輪を着けています。二人はハイファイブまたはハンドシェイクをしているようです。

2 番目の画像には、森を歩いているトラが描かれています。トラの毛並みは黒い縞模様入りのオレンジ色で、背景は緑の木々や植物で構成されています。

curl

# ======= 重要 =======
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
  "model": "qwen3.5-plus",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"
          }
        },
        {
          "type": "image_url",
          "image_url": {
            "url": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png"
          }
        },
        {
          "type": "text",
          "text": "これらの画像には何が描かれていますか?"
        }
      ]
    }
  ]
}'

応答

{
  "choices": [
    {
      "message": {
        "content": "画像 1 には、ビーチで相互に触れ合っている女性とラブラドール・レトリバーが描かれています。女性はチェック柄のシャツを着ており、砂の上に座って犬の前足とハイファイブしています。背景には海と夕焼けの空が広がっており、非常に温かく調和の取れた雰囲気を演出しています。\n\n画像 2 には、森を歩いているトラが描かれています。トラの毛並みは黒い縞模様入りのオレンジ色で、前方へと歩き進んでいます。周囲は木々や植物で密集しており、地面には落ち葉が散らばっています。このシーンからは、野生の雰囲気と生命力が感じられます。",
        "role": "assistant"
      },
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null
    }
  ],
  "object": "chat.completion",
  "usage": {
    "prompt_tokens": 2497,
    "completion_tokens": 109,
    "total_tokens": 2606
  },
  "created": 1725948561,
  "system_fingerprint": null,
  "model": "qwen3.5-plus",
  "id": "chatcmpl-0fd66f46-b09e-9164-a84f-3ebbbedbac15"
}

DashScope

Python

import os
import dashscope

# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
            {"image": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png"},
            {"text": "これらの画像には何が描かれていますか?"}
        ]
    }
]

response = dashscope.MultiModalConversation.call(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:api_key="sk-xxx"
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3.5-plus', # qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/getting-started/models
    messages=messages
)

print(response.output.choices[0].message.content[0]["text"])

応答

これらの画像には自然のシーンにいる動物が描かれています。画像 1 には、ビーチで相互に触れ合っている人物と犬が描かれています。画像 2 には、森を歩いているトラが描かれています。

Java

import java.util.Arrays;
import java.util.Collections;
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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    static {
    // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        Collections.singletonMap("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"),
                        Collections.singletonMap("image", "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png"),
                        Collections.singletonMap("text", "これらの画像には何が描かれていますか?"))).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")  // qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
                .messages(Arrays.asList(userMessage))
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));    }
    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

応答

これらの画像には自然のシーンにいる動物が描かれています。

1. 最初の画像:女性と犬がビーチで相互に触れ合っています。女性はチェック柄のシャツを着ており、砂の上に座っており、犬は首輪を着けており、彼女の手とハイファイブしています。
2. 2 番目の画像:トラが森を歩いている様子が描かれています。トラの毛並みは黒い縞模様入りのオレンジ色で、背景には木々や落ち葉があります。

curl

# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# === 実行前にこのコメントを削除してください ===

curl --location 'https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241022/emyrja/dog_and_girl.jpeg"},
                    {"image": "https://dashscope.oss-cn-beijing.aliyuncs.com/images/tiger.png"},
                    {"text": "これらの画像には何が描かれていますか?"}
                ]
            }
        ]
    }
}'

応答

{
  "output": {
    "choices": [
      {
        "finish_reason": "stop",
        "message": {
          "role": "assistant",
          "content": [
            {
              "text": "これらの画像には自然のシーンにいる動物が描かれています。画像 1 には、ビーチで相互に触れ合っている人物と犬が描かれています。画像 2 には、森を歩いているトラが描かれています。"
            }
          ]
        }
      }
    ]
  },
  "usage": {
    "output_tokens": 81,
    "input_tokens": 1277,
    "image_tokens": 2497
  },
  "request_id": "ccf845a3-dc33-9cda-b581-20fe7dc23f70"
}

動画理解

視覚理解モデルは、動画ファイルまたは画像リスト(動画フレーム)から動画の内容を分析します。以下の例では、オンライン動画または URL で指定された画像リストを分析する方法を示します。動画または画像リストの枚数に関する制限については、「動画の制限事項」セクションをご参照ください。

最適なパフォーマンスを得るには、動画ファイルの分析には最新版または最近のスナップショット版のモデルをご利用ください。

動画ファイル

視覚理解モデルは、動画フレームのシーケンスを抽出することで内容分析を行います。フレーム抽出ポリシーは、以下の 2 つのパラメーターで制御できます。

  • fps:フレーム抽出頻度を制御します。1 秒あたり 秒ごとに 1 フレームを抽出します。有効値は [0.1, 10] です。デフォルト値は 2.0 です。

    • 高速で動きのあるシーンでは、より多くのディテールを捉えるために、より高い fps 値を設定してください。

    • 静止画または長尺の動画では、処理効率を向上させるために、より低い fps 値を設定することを検討してください。

  • max_frames:動画から抽出するフレーム数の上限を制限します。fps 値に基づいて計算されたフレーム総数がこの上限を超える場合、システムは max_frames の上限内に収まるよう、フレームを均等にサンプリングします。このパラメーターは DashScope SDK のみで利用可能です。

OpenAI 互換

OpenAI SDK または HTTP リクエストを使用して、視覚理解モデルに動画ファイルを直接提供する場合、ユーザー メッセージの "type" パラメーターを "video_url" に設定します。

Python

import os
from openai import OpenAI

client = OpenAI(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=[
        {
            "role": "user",
            "content": [
                # 動画ファイルを直接提供する場合、type を video_url に設定します。
                {
                    "type": "video_url",
                    "video_url": {
                        "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4"
                    },
                    "fps": 2
                },
                {
                    "type": "text",
                    "text": "この動画の内容は何ですか?"
                }
            ]
        }
    ]
)

print(completion.choices[0].message.content)

Node.js

import OpenAI from "openai";

const openai = new OpenAI(
    {
        // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:apiKey: "sk-xxx"
        apiKey: process.env.DASHSCOPE_API_KEY,
        // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

async function main() {
    const response = await openai.chat.completions.create({
        model: "qwen3.5-plus",
        messages: [
            {
                role: "user",
                content: [
                    // 動画ファイルを直接提供する場合、type を video_url に設定します。
                    {
                        type: "video_url",
                        video_url: {
                            "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4"
                        },
                        "fps": 2
                    },
                    {
                        type: "text",
                        text: "この動画の内容は何ですか?"
                    }
                ]
            }
        ]
    });

    console.log(response.choices[0].message.content);
}

main();

curl

# ======= 重要 =======
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
  -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "qwen3.5-plus",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "video_url",
            "video_url": {
              "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4"
            },
            "fps":2
          },
          {
            "type": "text",
            "text": "この動画の内容は何ですか?"
          }
        ]
      }
    ]
  }'

DashScope

Python

import dashscope
import os

# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
messages = [
    {"role": "user",
        "content": [
            # fps パラメーターはフレームレートを制御します。1 秒あたり 1/fps 秒ごとに 1 フレームを抽出します。詳細については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/use-qwen-by-calling-api?#2ed5ee7377fum
            {"video": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4","fps":2},
            {"text": "この動画の内容は何ですか?"}
        ]
    }
]

response = dashscope.MultiModalConversation.call(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:api_key ="sk-xxx"
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3.5-plus',
    messages=messages
)

print(response.output.choices[0].message.content[0]["text"])

Java

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {
   static {
            // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
            Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
        }
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        // fps パラメーターはフレームレートを制御します。1 秒あたり 1/fps 秒ごとに 1 フレームを抽出します。詳細については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/use-qwen-by-calling-api?#2ed5ee7377fum
        Map<String, Object> params = new HashMap<>();
        params.put("video", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4");
        params.put("fps", 2);
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        params,
                        Collections.singletonMap("text", "この動画の内容は何ですか?"))).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 中国 (北京) リージョンのモデルを使用する場合、そのリージョンの API キーを使用する必要があります。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")
                .messages(Arrays.asList(userMessage))
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

# ======= 重要事項 =======
# 構成はリージョンによって異なります。実際のリージョンに基づいて構成を変更してください。
# API キーはリージョンによって異なります。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-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' \
-d '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {"role": "user","content": [{"video": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241115/cqqkru/1.mp4","fps":2},
            {"text": "この画像に描かれているシーンは何ですか?"}]}]}
}'

画像リスト

動画を画像リスト(事前に抽出された動画フレーム)として提供する場合、fps パラメーターを使用して、フレーム間の時間間隔をモデルに通知します。これにより、イベントのシーケンス、持続時間、動的変化をより正確に理解できます。このモデルでは、fps パラメーターを使用して元の動画のフレーム抽出レート(1 秒あたり 秒ごとに 1 フレームを抽出)を指定できます。このパラメーターは Qwen3.5、Qwen3-VL、および Qwen2.5-VL モデルでサポートされています。

OpenAI 互換

OpenAI SDK または HTTP リクエストを使用して、動画を画像リストとして提供する場合、ユーザー メッセージの "type" パラメーターを "video" に設定します。

Python

import os
from openai import OpenAI

client = OpenAI(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3.5-plus", # qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/models
    messages=[{"role": "user","content": [
        # 画像リストを提供する場合、ユーザー メッセージの 'type' パラメーターは 'video' になります。
         {"type": "video","video": [
         "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
         "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
         "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
         "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"],
         "fps":2},
         {"type": "text","text": "この動画に示されているプロセスを説明してください。"},
    ]}]
)

print(completion.choices[0].message.content)

Node.js

// package.json で "type": "module" を指定していることを確認してください。
import OpenAI from "openai";

const openai = new OpenAI({
    // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:apiKey: "sk-xxx",
    apiKey: process.env.DASHSCOPE_API_KEY,
    // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
    baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
});

async function main() {
    const response = await openai.chat.completions.create({
        model: "qwen3.5-plus",  // qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/models
        messages: [{
            role: "user",
            content: [
                {
                    // 画像リストを提供する場合、ユーザー メッセージの 'type' パラメーターは 'video' になります。
                    type: "video",
                    video: [
                        "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
                        "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
                        "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
                        "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"],
                        "fps": 2
                },
                {
                    type: "text",
                    text: "この動画に示されているプロセスを説明してください。"
                }
            ]
        }]
    });
    console.log(response.choices[0].message.content);
}

main();

curl

# ======= 重要 =======
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen3.5-plus",
    "messages": [{"role": "user","content": [{"type": "video","video": [
                  "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
                  "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
                  "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
                  "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"],
                  "fps":2},
                {"type": "text","text": "この動画に示されているプロセスを説明してください。"}]}]
}'

DashScope

Python

import os
import dashscope

# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'
messages = [{"role": "user",
             "content": [
                  # 画像リストを提供する場合、fps パラメーターは Qwen3.5、Qwen3-VL、および Qwen2.5-VL モデルに適用されます。
                 {"video":["https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
                           "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
                           "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
                           "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"],
                   "fps":2},
                 {"text": "この動画に示されているプロセスを説明してください。"}]}]
response = dashscope.MultiModalConversation.call(
    # 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    # 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model='qwen3.5-plus',  # qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    messages=messages
)
print(response.output.choices[0].message.content[0]["text"])

Java

// DashScope SDK バージョン 2.21.10 以降が必要です。
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;

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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {
    static {
        // エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    private static final String MODEL_NAME = "qwen3.5-plus";  // qwen3.5-plus モデルを使用します。その他のモデルについては、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    public static void videoImageListSample() throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        // 画像リストを提供する場合、fps パラメーターは Qwen3.5、Qwen3-VL、および Qwen2.5-VL モデルに適用されます。
        Map<String, Object> params = new HashMap<>();
        params.put("video", Arrays.asList("https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
                        "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
                        "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
                        "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"));
        params.put("fps", 2);
        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(
                        params,
                        Collections.singletonMap("text", "この動画に示されているプロセスを説明してください。")))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                // 環境変数を設定していない場合は、次の行を Model Studio の API キーに置き換えます:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model(MODEL_NAME)
                .messages(Arrays.asList(userMessage)).build();
        MultiModalConversationResult result = conv.call(param);
        System.out.print(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            videoImageListSample();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご使用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには固有の API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-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' \
-d '{
  "model": "qwen3.5-plus",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "video": [
              "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/xzsgiz/football1.jpg",
              "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/tdescd/football2.jpg",
              "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/zefdja/football3.jpg",
              "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/aedbqh/football4.jpg"
            ],
            "fps":2
                 
          },
          {
            "text": "この動画に示されているプロセスを説明してください。"
          }
        ]
      }
    ]
  }
}'

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

視覚理解モデルでは、ローカルファイルをアップロードする方法として、Base64 エンコードによるアップロードと、ファイルパスを直接渡す方法の 2 つを提供しています。ファイルサイズや SDK の種類に応じて、適切な方法を選択できます。具体的な推奨事項については、「ファイルアップロード方法の選択方法」をご参照ください。どちらの方法も、「画像の制限事項」に記載されている要件を満たしている必要があります。

Base64 エンコーディングによるアップロード

ファイルを Base64 エンコードされた文字列に変換し、それをモデルに渡します。この方法は、OpenAI SDK および DashScope SDK、HTTP リクエストすべてで使用できます。

Base64 エンコードされた文字列を渡す手順(画像を例に説明)

  1. ファイルをエンコードします。ローカルの画像を Base64 エンコードされた文字列に変換します。

    画像を Base64 エンコーディングに変換するためのサンプルコード

    # ローカルファイルを Base64 エンコードされた文字列に変換します。
    import base64
    def encode_image(image_path):
        with open(image_path, "rb") as image_file:
            return base64.b64encode(image_file.read()).decode("utf-8")
    
    # "xxx/eagle.png" をローカル画像の絶対パスに置き換えます。
    base64_image = encode_image("xxx/eagle.png")
  2. Data URL を構築します。以下の形式を使用します:data:[MIME_type];base64,{base64_image}

    1. MIME_type を実際のメディアタイプに置き換えます。値は「対応画像フォーマット」表の MIME Type 列のエントリと一致している必要があります。例:image/jpeg または image/png

    2. base64_image は、前のステップで取得した Base64 エンコードされた文字列です。

  3. Data URLimage または image_url パラメーターに渡して、モデルを呼び出します。

ファイルパスによるアップロード

ローカルファイルのパスを直接モデルに渡します。この方法は、DashScope Python SDK および Java SDK のみでサポートされています。DashScope HTTP または OpenAI 互換のリクエストでは使用できません。

以下の表を使用して、プログラミング言語およびオペレーティングシステムに基づいてファイルパスを指定します。

ファイルパスの指定方法(画像を例に説明)

システム

SDK

ファイルパス

Linux または macOS

Python SDK

file://{絶対パス}

file:///home/images/test.png

Java SDK

Windows

Python SDK

file://{絶対パス}

file://D:/images/test.png

Java SDK

file:///{絶対パス}

file:///D:/images/test.pn

画像

ファイルパス

Python

import os
import dashscope

# エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# xxx/eagle.png をローカル画像の絶対パスに置き換えます。
local_path = "xxx/eagle.png"
image_path = f"file://{local_path}"
messages = [
                {'role':'user',
                'content': [{'image': image_path},
                            {'text': 'この画像には何が描かれていますか?'}]}]
response = dashscope.MultiModalConversation.call(
    # 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    # 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3.5-plus',  # この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルの一覧については、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    messages=messages)
print(response.output.choices[0].message.content[0]["text"])

Java

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    
    public static void callWithLocalFile(String localPath)
            throws ApiException, NoApiKeyException, UploadFileException {
        String filePath = "file://"+localPath;
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(new HashMap<String, Object>(){{put("image", filePath);}},
                        new HashMap<String, Object>(){{put("text", "この画像には何が描かれていますか?");}})).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
                // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を .apiKey("sk-xxx") に置き換えてください。
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")  // この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルの一覧については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/getting-started/models
                .messages(Arrays.asList(userMessage))
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));}

    public static void main(String[] args) {
        try {
            // xxx/eagle.png をローカル画像の絶対パスに置き換えます。
            callWithLocalFile("xxx/eagle.png");
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

Base64 エンコーディング

OpenAI 互換

Python

from openai import OpenAI
import os
import base64


# この関数はローカルファイルを Base64 エンコードされた文字列に変換します。
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

# xxx/eagle.png をローカル画像の絶対パスに置き換えます。
base64_image = encode_image("xxx/eagle.png")
client = OpenAI(
    # API キーはリージョンごとに異なります。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    # 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    # エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3.5-plus", # この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルの一覧については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/getting-started/models
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    # 注意:Base64 エンコードされたデータを渡す場合、data URI フォーマット(例:data:image/png;base64)が実際の画像フォーマットと一致している必要があります。
                    # PNG 画像: f"data:image/png;base64,{base64_image}"
                    # JPEG 画像:f"data:image/jpeg;base64,{base64_image}"
                    # WEBP 画像:f"data:image/webp;base64,{base64_image}"
                    "image_url": {"url": f"data:image/png;base64,{base64_image}"},
                },
                {"type": "text", "text": "この画像には何が描かれていますか?"},
            ],
        }
    ],
)
print(completion.choices[0].message.content)

Node.js

import OpenAI from "openai";
import { readFileSync } from 'fs';


const openai = new OpenAI(
    {
        // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を apiKey: "sk-xxx" に置き換えてください。
        apiKey: process.env.DASHSCOPE_API_KEY,
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

const encodeImage = (imagePath) => {
    const imageFile = readFileSync(imagePath);
    return imageFile.toString('base64');
  };
// xxx/eagle.png をローカル画像の絶対パスに置き換えます。
const base64Image = encodeImage("xxx/eagle.png")
async function main() {
    const completion = await openai.chat.completions.create({
        model: "qwen3.5-plus",  // この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルの一覧については、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
        messages: [
            {"role": "user",
            "content": [{"type": "image_url",
                            // 注意:Base64 エンコードされたデータを渡す場合、data URI フォーマット(例:data:image/png;base64)が実際の画像フォーマットと一致している必要があります。
                           // PNG 画像: `data:image/png;base64,${base64Image}`
                          // JPEG 画像:`data:image/jpeg;base64,${base64Image}`
                         // WEBP 画像:`data:image/webp;base64,${base64Image}`
                        "image_url": {"url": `data:image/png;base64,${base64Image}`},},
                        {"type": "text", "text": "この画像には何が描かれていますか?"}]}]
    });
    console.log(completion.choices[0].message.content);
} 

main();

curl

  • ファイルを Base64 エンコードされた文字列に変換する例については、「サンプルコード」をご参照ください。

  • コード内の Base64 エンコードされた文字列 "data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..." は、表示のために省略されています。実際のリクエストでは、完全なエンコード文字列を渡す必要があります。

# ======= 重要 =======
# 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/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": "data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA"}},
      {"type": "text", "text": "この画像には何が描かれていますか?"}
    ]
  }]
}'

DashScope

Python

import base64
import os
import dashscope

# エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# この関数はローカルファイルを Base64 エンコードされた文字列に変換します。
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")


# xxxx/eagle.png をローカル画像の絶対パスに置き換えます。
base64_image = encode_image("xxxx/eagle.png")

messages = [
    {
        "role": "user",
        "content": [
            # 注意:Base64 エンコードされたデータを渡す場合、data URI フォーマット(例:data:image/png;base64)が実際の画像フォーマットと一致している必要があります。
            # PNG 画像: f"data:image/png;base64,{base64_image}"
            # JPEG 画像:f"data:image/jpeg;base64,{base64_image}"
            # WEBP 画像:f"data:image/webp;base64,{base64_image}"
            {"image": f"data:image/png;base64,{base64_image}"},
            {"text": "この画像には何が描かれていますか?"},
        ],
    },
]

response = dashscope.MultiModalConversation.call(
    // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    // 環境変数を設定していない場合、API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model="qwen3.5-plus",  // この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルの一覧については、こちらをご参照ください:https://www.alibabacloud.com/help/model-studio/getting-started/models
    messages=messages,
)
print(response.output.choices[0].message.content[0]["text"])

Java

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Base64;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.alibaba.dashscope.aigc.multimodalconversation.*;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }

    private static String encodeImageToBase64(String imagePath) throws IOException {
        Path path = Paths.get(imagePath);
        byte[] imageBytes = Files.readAllBytes(path);
        return Base64.getEncoder().encodeToString(imageBytes);
    }

    public static void callWithLocalFile(String localPath) throws ApiException, NoApiKeyException, UploadFileException, IOException {

        String base64Image = encodeImageToBase64(localPath); // Base64 エンコード済み

        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        new HashMap<String, Object>() {{ put("image", "data:image/png;base64," + base64Image); }},
                        new HashMap<String, Object>() {{ put("text", "この画像には何が描かれていますか?"); }}
                )).build();

        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")
                .messages(Arrays.asList(userMessage))
                .build();

        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }

    public static void main(String[] args) {
        try {
            // xxx/eagle.png をローカル画像の絶対パスに置き換えます。
            callWithLocalFile("xxx/eagle.png");
        } catch (ApiException | NoApiKeyException | UploadFileException | IOException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

  • ファイルを Base64 エンコードされた文字列に変換する例については、「サンプルコード」をご参照ください。

  • コード内の Base64 エンコードされた文字列 "data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..." は、表示のために省略されています。実際のリクエストでは、完全なエンコード文字列を渡す必要があります。

# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {
             "role": "user",
             "content": [
               {"image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..."},
               {"text": "この画像には何が描かれていますか?"}
                ]
            }
        ]
    }
}'

動画ファイル

この例では、ローカルファイル test.mp4 を使用します。

ファイルパス

Python

import os
import dashscope

// エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

// xxx/test.mp4 をローカル動画ファイルの絶対パスに置き換えます。
local_path = "xxx/test.mp4"
video_path = f"file://{local_path}"
messages = [
                {'role':'user',
                // fps パラメーターは 1 秒あたりに抽出するフレーム数を指定します。
                'content': [{'video': video_path,"fps":2},
                            {'text': 'この動画には何が描かれていますか?'}]}]
response = MultiModalConversation.call(
    // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3.5-plus',  
    messages=messages)
print(response.output.choices[0].message.content[0]["text"])

Java

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    
    public static void callWithLocalFile(String localPath)
            throws ApiException, NoApiKeyException, UploadFileException {
        String filePath = "file://"+localPath;
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(new HashMap<String, Object>()
                                       {{
                                           put("video", filePath); // fps パラメーターは 1 秒あたりに抽出するフレーム数を指定します。
                                           put("fps", 2);
                                       }}, 
                        new HashMap<String, Object>(){{put("text", "この動画には何が描かれていますか?");}})).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
                // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を .apiKey("sk-xxx") に置き換えてください。
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")  
                .messages(Arrays.asList(userMessage))
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));}

    public static void main(String[] args) {
        try {
            // xxx/test.mp4 をローカル動画ファイルの絶対パスに置き換えます。
            callWithLocalFile("xxx/test.mp4");
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

Base64 エンコーディング

OpenAI 互換

Python

from openai import OpenAI
import os
import base64


// エンコード関数:ローカルファイルを Base64 エンコードされた文字列に変換します。
def encode_video(video_path):
    with open(video_path, "rb") as video_file:
        return base64.b64encode(video_file.read()).decode("utf-8")

// xxx/test.mp4 をローカル動画ファイルの絶対パスに置き換えます。
base64_video = encode_video("xxx/test.mp4")
client = OpenAI(
    // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3.5-plus",  
    messages=[
        {
            "role": "user",
            "content": [
                {
                    // Base64 エンコードされた動画データの場合、type は "video_url" を使用します。
                    "type": "video_url",
                    "video_url": {"url": f"data:video/mp4;base64,{base64_video}"},
                    "fps":2
                },
                {"type": "text", "text": "この動画には何が描かれていますか?"},
            ],
        }
    ],
)
print(completion.choices[0].message.content)

Node.js

import OpenAI from "openai";
import { readFileSync } from 'fs';

const openai = new OpenAI(
    {
        // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
        // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を apiKey: "sk-xxx" に置き換えてください。
        apiKey: process.env.DASHSCOPE_API_KEY,
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

const encodeVideo = (videoPath) => {
    const videoFile = readFileSync(videoPath);
    return videoFile.toString('base64');
  };
// xxx/test.mp4 をローカル動画ファイルの絶対パスに置き換えます。
const base64Video = encodeVideo("xxx/test.mp4")
async function main() {
    const completion = await openai.chat.completions.create({
        model: "qwen3.5-plus", 
        messages: [
            {"role": "user",
             "content": [{
                 // Base64 エンコードされた動画データの場合、type は "video_url" を使用します。
                "type": "video_url", 
                "video_url": {"url": `data:video/mp4;base64,${base64Video}`},
                "fps":2},
                 {"type": "text", "text": "この動画には何が描かれていますか?"}]}]
    });
    console.log(completion.choices[0].message.content);
}

main();

curl

  • 詳細については、「サンプルコード」をご参照ください。

  • コード内の Base64 エンコードされた文字列 "data:video/mp4;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..." は、表示のために省略されています。実際のリクエストでは、完全な文字列を使用する必要があります。

# ======= 重要事項 =======
# API キーはリージョンごとに異なります。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# 構成はリージョンによって異なります。実際のリージョンに基づいて構成を変更してください。
# === 実行前にこのコメントを削除してください ===

curl --location 'https://dashscope.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": "video_url", "video_url": {"url": "data:video/mp4;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..."},"fps":2},
      {"type": "text", "text": "この画像に描かれているシーンは何ですか?"}
    ]
  }]
}'

DashScope

Python

import base64
import os
import dashscope

// エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

// ローカルファイルを Base64 エンコードされた文字列に変換します。
def encode_video(video_path):
    with open(video_path, "rb") as video_file:
        return base64.b64encode(video_file.read()).decode("utf-8")

// xxxx/test.mp4 をローカル動画ファイルの絶対パスに置き換えます。
base64_video = encode_video("xxxx/test.mp4")

messages = [{'role':'user',
                // fps パラメーターは 1 秒あたりに抽出するフレーム数を指定します。
             'content': [{'video': f"data:video/mp4;base64,{base64_video}","fps":2},
                            {'text': 'この動画には何が描かれていますか?'}]}]
response = dashscope.MultiModalConversation.call(
    // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3.5-plus',
    messages=messages)

print(response.output.choices[0].message.content[0]["text"])

Java

import java.io.IOException;
import java.util.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.alibaba.dashscope.aigc.multimodalconversation.*;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    
    private static String encodeVideoToBase64(String videoPath) throws IOException {
        Path path = Paths.get(videoPath);
        byte[] videoBytes = Files.readAllBytes(path);
        return Base64.getEncoder().encodeToString(videoBytes);
    }

    public static void callWithLocalFile(String localPath)
            throws ApiException, NoApiKeyException, UploadFileException, IOException {

        String base64Video = encodeVideoToBase64(localPath); // Base64 エンコード済み

        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(new HashMap<String, Object>()
                                       {{
                                           put("video", "data:video/mp4;base64," + base64Video); // fps パラメーターは 1 秒あたりに抽出するフレーム数を指定します。
                                           put("fps", 2);
                                       }},
                        new HashMap<String, Object>(){{put("text", "この動画には何が描かれていますか?");}})).build();

        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
                // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を .apiKey("sk-xxx") に置き換えてください。
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")
                .messages(Arrays.asList(userMessage))
                .build();

        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }

    public static void main(String[] args) {
        try {
            // xxx/test.mp4 をローカル動画ファイルの絶対パスに置き換えます。
            callWithLocalFile("xxx/test.mp4");
        } catch (ApiException | NoApiKeyException | UploadFileException | IOException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

  • サンプルコード」では、ファイルを Base64 エンコードされた文字列に変換する方法を示しています。

  • コード内の Base64 エンコードされた文字列 "f"data:video/mp4;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..." は、表示のために省略されています。実際のリクエストでは、完全な文字列を使用する必要があります。

# ======= 重要 =======
# 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-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' \
-d '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {
             "role": "user",
             "content": [
               {"video": "data:video/mp4;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..."},
               {"text": "この動画には何が描かれていますか?"}
                ]
            }
        ]
    }
}'

画像リスト

この例では、以下のローカルファイルを使用します:football1.jpgfootball2.jpgfootball3.jpg、および football4.jpg

ファイルパス

Python

import os
import dashscope

// エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

local_path1 = "football1.jpg"
local_path2 = "football2.jpg"
local_path3 = "football3.jpg"
local_path4 = "football4.jpg"

image_path1 = f"file://{local_path1}"
image_path2 = f"file://{local_path2}"
image_path3 = f"file://{local_path3}"
image_path4 = f"file://{local_path4}"

messages = [{'role':'user',
              // 画像リストを提供する場合、fps パラメーターは Qwen3.5、Qwen3-VL、および Qwen2.5-VL シリーズのモデルで利用可能です。
             'content': [{'video': [image_path1,image_path2,image_path3,image_path4],"fps":2},
                         {'text': 'この動画に示されているプロセスを説明してください。'}]}]
response = MultiModalConversation.call(
    // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen3.5-plus',  // この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルについては、モデル一覧をご参照ください:https://www.alibabacloud.com/help/en/model-studio/getting-started/models
    messages=messages)

print(response.output.choices[0].message.content[0]["text"])

Java

// DashScope SDK バージョン 2.21.10 以降が必要です。
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    
    private static final String MODEL_NAME = "qwen3.5-plus";  // この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルについては、モデル一覧をご参照ください:https://www.alibabacloud.com/help/en/model-studio/getting-started/models
    public static void videoImageListSample(String localPath1, String localPath2, String localPath3, String localPath4)
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        String filePath1 = "file://" + localPath1;
        String filePath2 = "file://" + localPath2;
        String filePath3 = "file://" + localPath3;
        String filePath4 = "file://" + localPath4;
        Map<String, Object> params = new HashMap<>();
        params.put("video", Arrays.asList(filePath1,filePath2,filePath3,filePath4));
        // 画像リストを提供する場合、fps パラメーターは Qwen3.5、Qwen3-VL、および Qwen2.5-VL シリーズのモデルで利用可能です。
        params.put("fps", 2);
        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(params,
                        Collections.singletonMap("text", "この動画に示されているプロセスを説明してください。")))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
                // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を .apiKey("sk-xxx") に置き換えてください。
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model(MODEL_NAME)
                .messages(Arrays.asList(userMessage)).build();
        MultiModalConversationResult result = conv.call(param);
        System.out.print(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            videoImageListSample(
                    "xxx/football1.jpg",
                    "xxx/football2.jpg",
                    "xxx/football3.jpg",
                    "xxx/football4.jpg");
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

Base64 エンコーディング

OpenAI 互換

Python

import os
from openai import OpenAI
import base64

// ローカルファイルを Base64 エンコードされた文字列に変換します。
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

base64_image1 = encode_image("football1.jpg")
base64_image2 = encode_image("football2.jpg")
base64_image3 = encode_image("football3.jpg")
base64_image4 = encode_image("football4.jpg")
client = OpenAI(
    // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
    // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を api_key="sk-xxx" に置き換えてください。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen3.5-plus",  // この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルについては、モデル一覧をご参照ください:https://www.alibabacloud.com/help/en/model-studio/getting-started/models
    messages=[  
    {"role": "user","content": [
        {"type": "video","video": [
            f"data:image/jpeg;base64,{base64_image1}",
            f"data:image/jpeg;base64,{base64_image2}",
            f"data:image/jpeg;base64,{base64_image3}",
            f"data:image/jpeg;base64,{base64_image4}",]},
        {"type": "text","text": "この動画に示されているプロセスを説明してください。"},
    ]}]
)
print(completion.choices[0].message.content)

Node.js

import OpenAI from "openai";
import { readFileSync } from 'fs';

const openai = new OpenAI(
    {
        // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
        // 環境変数を設定していない場合、Model Studio API キーを直接渡すために、次の行を apiKey: "sk-xxx" に置き換えてください。
        apiKey: process.env.DASHSCOPE_API_KEY,
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

const encodeImage = (imagePath) => {
    const imageFile = readFileSync(imagePath);
    return imageFile.toString('base64');
  };
  
const base64Image1 = encodeImage("football1.jpg")
const base64Image2 = encodeImage("football2.jpg")
const base64Image3 = encodeImage("football3.jpg")
const base64Image4 = encodeImage("football4.jpg")
async function main() {
    const completion = await openai.chat.completions.create({
        model: "qwen3.5-plus",  // この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換えることができます。利用可能なモデルについては、モデル一覧をご参照ください:https://www.alibabacloud.com/help/en/model-studio/getting-started/models
        messages: [
            {"role": "user",
             "content": [{"type": "video",
                        "video": [
                            `data:image/jpeg;base64,${base64Image1}`,
                            `data:image/jpeg;base64,${base64Image2}`,
                            `data:image/jpeg;base64,${base64Image3}`,
                            `data:image/jpeg;base64,${base64Image4}`]},
                        {"type": "text", "text": "この動画に描かれているシーンを説明してください。"}]}]
    });
    console.log(completion.choices[0].message.content);
}

main();

curl

  • ファイルを Base64 エンコードされた文字列に変換する例については、「サンプルコード」をご参照ください。

  • Base64 エンコードされた文字列 "data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..." は、表示のために省略されています。実際のリクエストでは、完全な文字列を渡す必要があります。

# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen3.5-plus",
    "messages": [{"role": "user",
                "content": [{"type": "video",
                "video": [
                          "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA...",
                          "data:image/jpeg;base64,nEpp6jpnP57MoWSyOWwrkXMJhHRCWYeFYb...",
                          "data:image/jpeg;base64,JHWQnJPc40GwQ7zERAtRMK6iIhnWw4080s...",
                          "data:image/jpeg;base64,adB6QOU5HP7dAYBBOg/Fb7KIptlbyEOu58..."
                          ]},
                {"type": "text",
                "text": "この動画に示されているプロセスを説明してください。"}]}]
}'

DashScope

Python

import base64
import os
import dashscope

# エンドポイントはリージョンによって異なります。お使いのリージョンに応じてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

# ローカルファイルを Base64 エンコードされた文字列に変換します。
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

base64_image1 = encode_image("football1.jpg")
base64_image2 = encode_image("football2.jpg")
base64_image3 = encode_image("football3.jpg")
base64_image4 = encode_image("football4.jpg")


messages = [{'role':'user',
            'content': [
                    {'video':
                         [f"data:image/jpeg;base64,{base64_image1}",
                          f"data:image/jpeg;base64,{base64_image2}",
                          f"data:image/jpeg;base64,{base64_image3}",
                          f"data:image/jpeg;base64,{base64_image4}"
                         ]
                    },
                    {'text': 'この動画で示されているプロセスを説明してください。'}]}]
response = dashscope.MultiModalConversation.call(
    # 各リージョンでは API キーが必要です。API キーの取得方法については、以下をご参照ください: https://www.alibabacloud.com/help/en/model-studio/get-api-key
    # 環境変数を設定していない場合は、以下の行を Model Studio API キーで置き換えてください: api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model='qwen3.5-plus',  # この例では qwen3.5-plus モデルを使用しています。必要に応じて置き換え可能です。利用可能なモデルの一覧については、モデル一覧をご参照ください: https://www.alibabacloud.com/help/en/model-studio/getting-started/models
    messages=messages)

print(response.output.choices[0].message.content[0]["text"])

Java

import java.io.IOException;
import java.util.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.alibaba.dashscope.aigc.multimodalconversation.*;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        // エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }

    private static String encodeImageToBase64(String imagePath) throws IOException {
        Path path = Paths.get(imagePath);
        byte[] imageBytes = Files.readAllBytes(path);
        return Base64.getEncoder().encodeToString(imageBytes);
    }

    public static void videoImageListSample(String localPath1,String localPath2,String localPath3,String localPath4)
            throws ApiException, NoApiKeyException, UploadFileException, IOException {

        String base64Image1 = encodeImageToBase64(localPath1); // Base64 エンコード済み
        String base64Image2 = encodeImageToBase64(localPath2);
        String base64Image3 = encodeImageToBase64(localPath3);
        String base64Image4 = encodeImageToBase64(localPath4);

        MultiModalConversation conv = new MultiModalConversation();
        Map<String, Object> params = new HashMap<>();
        params.put("video", Arrays.asList(
                        "data:image/jpeg;base64," + base64Image1,
                        "data:image/jpeg;base64," + base64Image2,
                        "data:image/jpeg;base64," + base64Image3,
                        "data:image/jpeg;base64," + base64Image4));
        // 画像リストを提供する場合、fps パラメーターは Qwen3.5、Qwen3-VL、および Qwen2.5-VL シリーズのモデルで利用可能です。
        params.put("fps", 2);
        MultiModalMessage userMessage = MultiModalMessage.builder()
                .role(Role.USER.getValue())
                .content(Arrays.asList(params,
                        Collections.singletonMap("text", "この動画に示されている特定のプロセスを説明してください。")))
                .build();

        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-api-key
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")
                .messages(Arrays.asList(userMessage))
                .build();

        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }

    public static void main(String[] args) {
        try {
            // "xxx/football1.jpg" などのプレースホルダーを、ローカル画像ファイルの絶対パスに置き換えてください。
            videoImageListSample(
                    "xxx/football1.jpg",
                    "xxx/football2.jpg",
                    "xxx/football3.jpg",
                    "xxx/football4.jpg"
            );
        } catch (ApiException | NoApiKeyException | UploadFileException | IOException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

  • ファイルを Base64 エンコードされた文字列に変換する例については、「サンプルコード」をご参照ください。

  • Base64 エンコードされた文字列 "data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA..." は、表示のために省略されています。実際のリクエストでは、完全な文字列を渡す必要があります。

# ======= 重要 =======
# エンドポイントはリージョンによって異なります。ご利用のリージョンに合わせてエンドポイントを変更してください。
# 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/en/model-studio/get-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' \
-d '{
  "model": "qwen3.5-plus",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "video": [
                      "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAA...",
                      "data:image/jpeg;base64,nEpp6jpnP57MoWSyOWwrkXMJhHRCWYeFYb...",
                      "data:image/jpeg;base64,JHWQnJPc40GwQ7zERAtRMK6iIhnWw4080s...",
                      "data:image/jpeg;base64,adB6QOU5HP7dAYBBOg/Fb7KIptlbyEOu58..."
            ],
            "fps":2     
          },
          {
            "text": "この動画に示されているプロセスを説明してください。"
          }
        ]
      }
    ]
  }
}'

高解像度画像の処理

視覚理解モデル API は、エンコードされた画像ごとのビジュアルトークン数に上限があります。デフォルトでは、高解像度画像は圧縮されるため、ディテールが失われ、理解精度が低下する可能性があります。vl_high_resolution_images を有効にするか、max_pixels を調整することで、ビジュアルトークン数を増やすことができます。これにより、より多くの画像ディテールが保持され、理解が向上します。

各モデルの 1 トークンあたりのピクセル数、トークン上限、ピクセル上限を確認

入力画像のピクセル数がモデルのピクセル上限を超える場合、画像はその上限内に収まるようにスケーリングダウンされます。

モデル

1 トークンあたりのピクセル数

vl_high_resolution_images

max_pixels

トークン上限

ピクセル上限

Qwen3.5 および Qwen3-VL シリーズのモデル

32*32

true

max_pixels は無視されます。

16384 トークン

16777216(これは 16384×32×32 に相当)

false(デフォルト)

値はカスタマイズ可能で、デフォルト値は 2621440、最大値は 16777216 です。

max_pixels によって決定され、計算式は max_pixels/32/32 です。

max_pixels

qwen-vl-maxqwen-vl-max-latestqwen-vl-max-2025-08-13qwen-vl-plusqwen-vl-plus-latestqwen-vl-plus-2025-08-15 モデル

32*32

true

max_pixels は無視されます。

16384 トークン

16777216(これは 16384×32×32 に相当)

false(デフォルト)

値はカスタマイズ可能で、デフォルト値は 1310720、最大値は 16777216 です。

max_pixels によって決定され、計算式は max_pixels/32/32 です。

max_pixels

その他の qwen-vl-max および qwen-vl-plus モデル、Qwen2.5-VL オープンソースシリーズ、および QVQ シリーズのモデル

28 × 28

true

max_pixels は無視されます。

16384 トークン

12845056(これは 16384×28×28 に相当)

false(デフォルト)

値はカスタマイズ可能で、デフォルト値は 1003520、最大値は 12845056 です。

max_pixels によって決定され、計算式は max_pixels/28/28 です。

max_pixels

  • vl_high_resolution_images=true の場合、API は固定解像度ポリシーを使用し、max_pixels 設定を無視します。画像内の細かいテキスト、小さなオブジェクト、豊かなディテールの認識が必要なタスクに使用してください。

  • vl_high_resolution_images=false の場合、max_pixels パラメーターが最終的なピクセル上限を決定します。

    • 処理速度が重要であったり、コストに敏感なアプリケーションでは、max_pixels のデフォルト値を使用するか、より小さい値に設定してください。

    • 一部のディテールを保持したいが、処理速度の低下を受け入れられる場合は、max_pixels の値を大きくしてください。

OpenAI 互換

vl_high_resolution_images パラメーターは、標準の OpenAI パラメーターではありません。SDK ごとに渡す方法が異なります。

  • Python SDK: extra_body 辞書内でパラメーターを渡します。

  • Node.js SDK: パラメーターをトップレベルのパラメーターとして直接渡します。

Python

import os
import time
from openai import OpenAI

client = OpenAI(
    // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    // ご利用のリージョンに合わせてエンドポイントを変更してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen3.5-plus",
    messages=[
        {"role": "user","content": [
            {"type": "image_url","image_url": {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250212/earbrt/vcg_VCG211286867973_RF.jpg"},
            // max_pixels:入力画像の最大ピクセル数を設定します。vl_high_resolution_images=True の場合は無視されます。最大値はモデルによって異なります。
            // "max_pixels": 16384 * 32 * 32
            },
           {"type": "text", "text": "この画像にはどの祝日が描かれていますか?"},
            ],
        }
    ],
    extra_body={"vl_high_resolution_images":True}

)
print(f"モデルの出力:{completion.choices[0].message.content}")
print(f"合計入力トークン数:{completion.usage.prompt_tokens}")

Node.js

import OpenAI from "openai";

const openai = new OpenAI(
    {
        // 環境変数を使用しない場合は、ここに Model Studio API キーを設定します:apiKey: "sk-xxx"
        // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        apiKey: process.env.DASHSCOPE_API_KEY,
        // ご利用のリージョンに合わせてエンドポイントを変更してください。
        baseURL: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
    }
);

const response = await openai.chat.completions.create({
        model: "qwen3.5-plus",
        messages: [
        {role: "user",content: [
            {type: "image_url",
            image_url: {"url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250212/earbrt/vcg_VCG211286867973_RF.jpg"},
            // max_pixels:入力画像の最大ピクセル数を設定します。vl_high_resolution_images=True の場合は無視されます。最大値はモデルによって異なります。
            // "max_pixels": 2560 * 32 * 32
            },
            {type: "text", text: "この画像にはどの祝日が描かれていますか?" },
        ]}],
        vl_high_resolution_images:true
    })


console.log("モデルの出力:",response.choices[0].message.content);
console.log("合計入力トークン数:",response.usage.prompt_tokens);

curl

# ======= 重要 =======
# 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
# ご利用のリージョンに合わせてエンドポイントを変更してください。
# === 実行前にこのコメントを削除してください ===

curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
  "model": "qwen3.5-plus",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250212/earbrt/vcg_VCG211286867973_RF.jpg"
          }
        },
        {
          "type": "text",
          "text": "この画像にはどの祝日が描かれていますか?"
        }
      ]
    }
  ],
  "vl_high_resolution_images":true
}'

DashScope

Python

import os
import time

import dashscope

// ご利用のリージョンに合わせてエンドポイントを変更してください。
dashscope.base_http_api_url = 'https://dashscope-intl.aliyuncs.com/api/v1'

messages = [
    {
        "role": "user",
        "content": [
            {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250212/earbrt/vcg_VCG211286867973_RF.jpg",
            // max_pixels:入力画像の最大ピクセル数を設定します。vl_high_resolution_images=True の場合は無視されます。最大値はモデルによって異なります。
            // "max_pixels": 16384 * 32 * 32
            },
            {"text": "この画像にはどの祝日が描かれていますか?"}
        ]
    }
]

response = dashscope.MultiModalConversation.call(
        // 環境変数を使用しない場合は、ここに Model Studio API キーを設定します:api_key="sk-xxx"
        // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
        api_key=os.getenv('DASHSCOPE_API_KEY'),
        model='qwen3.5-plus',
        messages=messages,
        vl_high_resolution_images=True
    )
    
print("モデルの出力:",response.output.choices[0].message.content[0]["text"])
print("合計入力トークン数:",response.usage.input_tokens)

Java

import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.HashMap;
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.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        // ご利用のリージョンに合わせてエンドポイントを変更してください。
        Constants.baseHttpApiUrl="https://dashscope-intl.aliyuncs.com/api/v1";
    }
    
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        Map<String, Object> map = new HashMap<>();
        map.put("image", "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250212/earbrt/vcg_VCG211286867973_RF.jpg");
        // max_pixels:入力画像の最大ピクセル数を設定します。vl_high_resolution_images=True の場合は無視されます。最大値はモデルによって異なります。
        // map.put("max_pixels", 2621440); 
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map,
                        Collections.singletonMap("text", "この画像にはどの祝日が描かれていますか?"))).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                // 環境変数を使用しない場合は、ここに Model Studio API キーを設定します:.apiKey("sk-xxx")
                // 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-api-key
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen3.5-plus")
                .message(userMessage)
                .vlHighResolutionImages(true)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
        System.out.println(result.getUsage().getInputTokens());
    }

    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

curl

# ======= 重要 =======
# 各リージョンには API キーが必要です。API キーの取得方法については、こちらをご参照ください:https://www.alibabacloud.com/help/zh/model-studio/get-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' \
-d '{
    "model": "qwen3.5-plus",
    "input":{
        "messages":[
            {
             "role": "user",
             "content": [
               {"image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20250212/earbrt/vcg_VCG211286867973_RF.jpg"},
               {"text": "この画像にはどの祝日が描かれていますか?"}
                ]
            }
        ]
    },
    "parameters": {
        "vl_high_resolution_images": true
    }
}'

その他の使用方法

制限事項

入力ファイルの制限事項

画像の制限事項

  • 解決方法:

    • 最小寸法:画像の幅と高さはいずれも 10 ピクセルより大きい必要があります。

    • 縦横比:画像の長い辺と短い辺の比率は 200:1 を超えてはなりません。

    • ピクセル上限:

      • 画像解像度は 8K (7680x4320) 以内にすることを推奨します。この解像度を超える画像は、ファイルサイズが大きかったりネットワーク伝送時間が長かったりするために、API 呼び出しでタイムアウトが発生する可能性があります。

      • 自動スケーリング:モデルは、max_pixels および min_pixels パラメーターを使用して画像サイズを調整します。超高解像度の画像を提供しても認識精度は向上せず、呼び出し失敗のリスクが高まります。クライアント側で事前に画像を適切なサイズにスケーリングしてください。

  • 対応画像フォーマット

    • 4K (3840x2160) 未満の解像度の場合、対応画像フォーマットは以下のとおりです。

      画像フォーマット

      一般的な拡張子

      MIME Type

      BMP

      .bmp

      image/bmp

      JPEG

      .jpe, .jpeg, .jpg

      image/jpeg

      PNG

      .png

      image/png

      TIFF

      .tif, .tiff

      image/tiff

      WEBP

      .webp

      image/webp

      HEIC

      .heic

      image/heic

    • 4K (3840x2160) 以上 8K (7680x4320) 未満の解像度の場合、JPEG、JPG、PNG のみがサポートされています。

  • サイズ:

    • 公開 URL として渡す場合:単一の画像は、Qwen3.5 シリーズでは 20 MB、その他のモデルでは 10 MB を超えてはなりません。

    • ローカルファイルパスとして渡す場合(DashScope SDK のみ):単一の画像は 10 MB を超えてはなりません。

    • Base64 エンコードされた文字列として渡す場合:エンコードされた文字列は 10 MB を超えてはなりません。

    ファイルを圧縮する方法については、「画像または動画を必要なサイズに圧縮する方法」をご参照ください。
  • 枚数: 許容される画像の最大枚数は、入力方法によって異なります。

    • 公開 URL またはローカルファイルパスとして渡す場合:最大 256 枚の画像。

    • Base64 エンコードされた文字列として渡す場合:最大 250 枚の画像。

      すべての画像およびテキストの合計トークン数は、モデルの最大入力を下回る必要があります。

動画の制限事項

  • イメージがリストとして渡される場合、イメージの数は以下の制限の対象となります:

    • qwen3.5 シリーズ:最小 4 枚、最大 8000 枚の画像。

    • qwen3-vl-plus シリーズ、qwen3-vl-flash シリーズ、qwen3-vl-235b-a22b-thinking、および qwen3-vl-235b-a22b-instruct:最小 4 枚、最大 2000 枚の画像。

    • その他の Qwen3-VL オープンソース、Qwen2.5-VL(商用およびオープンソース版を含む)、および QVQ シリーズのモデル:最小 4 枚、最大 512 枚の画像。

    • その他のモデル:最小 4 枚、最大 80 枚の画像。

  • 動画を単一ファイルとして送信する場合:

    • サイズ:

      • 公開 URL として渡す場合:

        • qwen3.5 シリーズ、Qwen3-VL シリーズ、および qwen-vl-maxqwen-vl-max-latestqwen-vl-max-2025-04-08、およびそれ以降のすべてのバージョンを含む):2 GB を超えてはなりません。

        • qwen-vl-plus シリーズ、その他の qwen-vl-max モデル、Qwen2.5-VL オープンソースシリーズ、および QVQ シリーズのモデル:1 GB を超えてはなりません。

        • その他のモデル:150 MB を超えてはなりません。

      • Base64 エンコードされた文字列として渡す場合:エンコードされた文字列は 10 MB 未満である必要があります。

      • ローカルファイルパスとして渡す場合(DashScope SDK のみ):動画ファイル自体は 100 MB を超えてはなりません。

      ファイルを圧縮する方法については、「画像または動画を必要なサイズに圧縮する方法」をご参照ください。
    • 再生時間:

      • qwen3.5 シリーズ:2 秒から 2 時間。

      • qwen3-vl-plus シリーズ、qwen3-vl-flash シリーズ、qwen3-vl-235b-a22b-thinking、および qwen3-vl-235b-a22b-instruct:2 秒から 1 時間。

      • その他の Qwen3-VL オープンソースシリーズおよび qwen-vl-maxqwen-vl-max-latestqwen-vl-max-2025-04-08、およびそれ以降のすべてのバージョンを含む):2 秒から 20 分。

      • qwen-vl-plus シリーズ、その他の qwen-vl-max モデル、Qwen2.5-VL オープンソースシリーズ、および QVQ シリーズのモデル:2 秒から 10 分。

      • その他のモデル:2 秒から 40 秒。

    • フォーマット: MP4、AVI、MKV、MOV、FLV、WMV がサポートされています。

    • 寸法: 特定の制限はありません。モデルは、max_pixels および min_pixels パラメーターを使用して動画の寸法を自動的に調整します。より大きな動画の寸法を使用しても、理解度は向上しません。

    • 動画の枚数制限: 最大 64 本の動画を送信できます。

    • 音声の理解: モデルは動画ファイルから音声を処理しません。

ファイル入力方法

  • 公開 URL: HTTP または HTTPS プロトコルを使用した、公開アクセス可能な URL を提供します。 安定性とパフォーマンスを最適化するために、ファイルを OSS ことを推奨します。

    重要

    モデルがファイルを正常にダウンロードできるようにするため、公開 URL のレスポンスヘッダーには 必ず Content-Length(ファイルサイズ)および Content-Type(メディアタイプ、例:image/jpeg)を含める必要があります。いずれかのフィールドが欠落または不正確な場合、モデルはファイルをダウンロードできません。

  • Base64 エンコーディング: ファイルを Base64 エンコードされた文字列に変換し、その結果の文字列を渡します。

  • ローカルファイルパスを渡す(DashScope SDK のみ): ローカルファイルへのパスを指定します。

ファイル入力方法に関する推奨事項については、「ファイルアップロード方法の選択方法?

本番環境での使用

  • 画像/動画の前処理: 視覚理解モデルには入力ファイルのサイズ制限があります。圧縮方法については、「画像または動画の圧縮方法」をご参照ください。

  • テキストファイルの処理: 視覚理解モデルは画像フォーマットのみをサポートしており、テキストファイルを直接処理することはできません。以下の代替方法をご利用ください。

    • テキストファイルを画像フォーマットに変換します。画像処理ライブラリ(例:Pythonpdf2image ライブラリ)を使用して、ファイルをページごとに複数の高品質画像に変換し、複数画像入力」方法を使用して、結果の画像をモデルに渡します。

    • Qwen-Long はテキストファイルの処理とその内容の解析をサポートしています。

  • フォールトトレランスと安定性

    • タイムアウト処理:非ストリーミング呼び出しの場合、モデルが 180 秒以内に出力の生成を完了できないと、通常はタイムアウトエラーが発生します。ユーザーエクスペリエンスを向上させるために、レスポンス本文にはタイムアウト前に生成されたコンテンツが含まれます。レスポンスヘッダーに x-dashscope-partialresponse:true が含まれている場合、タイムアウトが発生したことを示します。「部分補完モード」機能(一部のモデルで利用可能)を使用して、生成されたコンテンツを messages 配列に追加し、リクエストを再送信することで、モデルが中断したところからコンテンツの生成を継続できます。「不完全な出力に基づく書き込みの継続」をご参照ください。

    • リトライメカニズム:ネットワークの変動や一時的なサービスの停止を処理するために、指数バックオフなどの合理的な API 呼び出しリトライメカニズムを実装します。

課金とレート制限

  • 課金: 総コストは、入力トークンと出力トークンの合計数に基づいて算出されます。入力および出力の価格設定については、「モデル一覧」をご参照ください。

    • トークンの構成: 入力トークンはテキストトークンと画像または動画から変換されたトークンで構成されます。出力トークンはモデルが生成したテキストです。思考モードでは、モデルの推論プロセスも出力トークンとしてカウントされます。推論プロセスが出力されない思考モードの場合、ノンシンキングモードの価格が適用されます。

    • 画像および動画のトークン数の計算: 以下のコードを使用して、画像または動画のトークン消費量を推定できます。この推定値は参考用です。実際の課金は API レスポンスに基づきます。

      画像および動画のトークン数の計算

      画像

      計算式:画像トークン数 = h_bar * w_bar / token_pixels + 2

      • h_bar, w_bar:スケーリング後の画像の高さと幅。画像を処理する前に、モデルはそれを特定のピクセル上限にスケーリングします。この上限は、max_pixels および vl_high_resolution_images パラメーターに依存します。「高解像度画像の処理」をご参照ください。

      • token_pixels:各ビジュアル トークン に対応するピクセル数。この値はモデルによって異なります。

        • Qwen3.5Qwen3-VLqwen-vl-maxqwen-vl-max-latestqwen-vl-max-2025-08-13qwen-vl-plusqwen-vl-plus-latestqwen-vl-plus-2025-08-15トークン32x32 ピクセルに対応します。

        • QVQ およびその他の Qwen2.5-VL モデル 各トークンは 28x28 ピクセルに対応します。

      以下のコードは、モデルの画像スケーリングロジックの概要を示しています。画像のトークン数を推定するために使用してください。実際の課金は API レスポンスに基づきます。

      import math
      // 以下のコマンドを使用して Pillow ライブラリをインストールします:pip install Pillow
      from PIL import Image
      
      def token_calculate(image_path, max_pixels, vl_high_resolution_images):
          // 指定された画像ファイルを開きます。
          image = Image.open(image_path)
      
          // 画像の元の寸法を取得します。
          height = image.height
          width = image.width
      
          // モデルに応じて、高さと幅を 32 または 28 の倍数に調整します。
          h_bar = round(height / 32) * 32
          w_bar = round(width / 32) * 32
      
          // 画像の最小ピクセル数。
          min_pixels = 4 * 32 * 32
          // vl_high_resolution_images が True に設定されている場合、入力画像トークンの上限は 16,386 トークンで、対応する最大ピクセル値は 16384 * 32 * 32 または 16384 * 28 * 28 です。それ以外の場合は、max_pixels パラメーターの値が使用されます。
          if vl_high_resolution_images:
              max_pixels = 16384 * 32 * 32
          else:
              max_pixels = max_pixels
      
          // 画像の合計ピクセル数が [min_pixels, max_pixels] の範囲内になるようにスケーリングします。
          if h_bar * w_bar > max_pixels:
              // スケーリング後の画像の合計ピクセル数が max_pixels を超えないようにするためのスケーリング係数 beta を計算します。
              beta = math.sqrt((height * width) / max_pixels)
              // 調整後の高さと幅を再計算します。
              h_bar = math.floor(height / beta / 32) * 32
              w_bar = math.floor(width / beta / 32) * 32
          elif h_bar * w_bar < min_pixels:
              // スケーリング後の画像の合計ピクセル数が min_pixels 未満にならないようにするためのスケーリング係数 beta を計算します。
              beta = math.sqrt(min_pixels / (height * width))
              // 調整後の高さと幅を再計算します。
              h_bar = math.ceil(height * beta / 32) * 32
              w_bar = math.ceil(width * beta / 32) * 32
          return h_bar, w_bar
      
      if __name__ == "__main__":
          // test.png をローカル画像のパスに置き換えます。
          h_bar, w_bar =  token_calculate("xxx/test.jpg", max_pixels=16384*32*32, vl_high_resolution_images=False)
          print(f"スケーリング後の画像寸法:高さ {h_bar}、幅 {w_bar}")
          // システムは自動的に視覚マーカー <|vision_bos|> および <|vision_eos|>(各 1 トークン)を追加します。
          token = int((h_bar * w_bar) / (32 * 32))+2
          print(f"画像のトークン数:{token}")

      動画

      • 動画ファイル:

        動画ファイルを処理する場合、モデルはまずフレームを抽出し、その後すべてのフレームのトークン総数を計算します。この計算は複雑です。以下のコードを使用して、動画の合計トークン消費量をパスを指定して推定できます。

        // 使用前にインストール:pip install opencv-python
        import math
        import os
        import logging
        import cv2
        
        logger = logging.getLogger(__name__)
        
        FRAME_FACTOR = 2
        
        // Qwen3-VL、qwen-vl-max-0813、qwen-vl-plus-0815、qwen-vl-plus-0710 モデルの場合、画像のスケーリング係数は 32 です。
        IMAGE_FACTOR = 32
        
        // その他のモデルの場合、画像のスケーリング係数は 28 です。
        // IMAGE_FACTOR = 28
        
        // 動画フレームの最大アスペクト比。
        MAX_RATIO = 200
        // 動画フレームの最小ピクセル数。
        VIDEO_MIN_PIXELS = 4 * 32 * 32
        // 動画フレームの最大ピクセル数。Qwen3-VL-Plus モデルの場合、VIDEO_MAX_PIXELS は 640 * 32 * 32 です。その他のモデルの場合、値は 768 * 32 * 32 です。
        VIDEO_MAX_PIXELS = 640 * 32 * 32
        
        // FPS パラメーターが提供されていない場合、デフォルト値を使用します。
        FPS = 2.0
        // 抽出されるフレームの最小数。
        FPS_MIN_FRAMES = 4
        // 抽出されるフレームの最大数。Qwen3-VL-Plus モデルの場合、FPS_MAX_FRAMES は 2000、Qwen3-VL-Flash および Qwen2.5-VL モデルの場合 512、その他は 80 に設定します。
        FPS_MAX_FRAMES = 2000
        
        // 動画入力の合計最大ピクセル数。この値は、Qwen3-VL-Plus モデルの場合 131072 * 32 * 32、その他のモデルの場合 65536 * 32 * 32 です。
        VIDEO_TOTAL_PIXELS = int(float(os.environ.get('VIDEO_MAX_PIXELS', 131072 * 32 * 32)))
        
        def round_by_factor(number: int, factor: int) -> int:
            """'number' に最も近い 'factor' の倍数の整数を返します。"""
            return round(number / factor) * factor
        
        def ceil_by_factor(number: int, factor: int) -> int:
            """'number' 以上で 'factor' の倍数となる最小の整数を返します。"""
            return math.ceil(number / factor) * factor
        
        def floor_by_factor(number: int, factor: int) -> int:
            """'number' 以下で 'factor' の倍数となる最大の整数を返します。"""
            return math.floor(number / factor) * factor
        
        def extract_vision_info(conversations):
            vision_infos = []
            if isinstance(conversations[0], dict):
                conversations = [conversations]
            for conversation in conversations:
                for message in conversation:
                    if isinstance(message["content"], list):
                        for ele in message["content"]:
                            if (
                                "image" in ele
                                or "image_url" in ele
                                or "video" in ele
                                or ele.get("type","") in ("image", "image_url", "video")
                            ):
                                vision_infos.append(ele)
            return vision_infos
        
        def smart_nframes(ele,total_frames,video_fps):
            """抽出する動画フレーム数を計算します。
        
            Args:
                ele (dict): 動画設定を含む辞書。
                    - fps: モデル入力用に抽出するフレーム数を制御します。
                total_frames (int): 動画の元の総フレーム数。
                video_fps (int | float): 動画の元のフレームレート。
        
            Raises:
                nframes should be in the interval [FRAME_FACTOR, total_frames], otherwise an error occurs.
        
            Returns:
                モデル入力に使用する動画フレーム数。
            """
            assert not ("fps" in ele and "nframes" in ele), "Only accept either `fps` or `nframes`"
            fps = ele.get("fps", FPS)
            min_frames = ceil_by_factor(ele.get("min_frames", FPS_MIN_FRAMES), FRAME_FACTOR)
            max_frames = floor_by_factor(ele.get("max_frames", min(FPS_MAX_FRAMES, total_frames)), FRAME_FACTOR)
            duration = total_frames / video_fps if video_fps != 0 else 0
            if duration-int(duration)>(1/fps):
                total_frames = math.ceil(duration * video_fps)
            else:
                total_frames = math.ceil(int(duration)*video_fps)
            nframes = total_frames / video_fps * fps
            if nframes > total_frames:
                logger.warning(f"smart_nframes: nframes[{nframes}] > total_frames[{total_frames}]")
            nframes = int(min(min(max(nframes, min_frames), max_frames), total_frames))
            if not (FRAME_FACTOR <= nframes and nframes <= total_frames):
                raise ValueError(f"nframes should in interval [{FRAME_FACTOR}, {total_frames}], but got {nframes}.")
        
            return nframes
        
        def get_video(video_path):
            // 動画情報を取得します。
            cap = cv2.VideoCapture(video_path)
        
            frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            // 動画の高さを取得します。
            frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        
            video_fps = cap.get(cv2.CAP_PROP_FPS)
            return frame_height, frame_width, total_frames, video_fps
        
        def smart_resize(ele, path, factor=IMAGE_FACTOR):
            // 動画の元の幅と高さを取得します。
            height, width, total_frames, video_fps = get_video(path)
            // 動画フレームの最小ピクセル数。
            min_pixels = VIDEO_MIN_PIXELS
            total_pixels = VIDEO_TOTAL_PIXELS
            // 抽出された動画フレーム数。
            nframes = smart_nframes(ele, total_frames, video_fps)
            max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR),int(min_pixels * 1.05))
        
            // 動画のアスペクト比は 200:1 または 1:200 を超えてはなりません。
            if max(height, width) / min(height, width) > MAX_RATIO:
                raise ValueError(
                    f"absolute aspect ratio must be smaller than {MAX_RATIO}, got {max(height, width) / min(height, width)}"
                )
        
            h_bar = max(factor, round_by_factor(height, factor))
            w_bar = max(factor, round_by_factor(width, factor))
            if h_bar * w_bar > max_pixels:
                beta = math.sqrt((height * width) / max_pixels)
                h_bar = floor_by_factor(height / beta, factor)
                w_bar = floor_by_factor(width / beta, factor)
            elif h_bar * w_bar < min_pixels:
                beta = math.sqrt(min_pixels / (height * width))
                h_bar = ceil_by_factor(height * beta, factor)
                w_bar = ceil_by_factor(width * beta, factor)
            return h_bar, w_bar
        
        
        def token_calculate(video_path, fps):
            // 動画パスとフレーム抽出の fps パラメーターを渡します。
            messages = [{"content": [{"video": video_path, "fps": fps}]}]
            vision_infos = extract_vision_info(messages)[0]
        
            resized_height, resized_width = smart_resize(vision_infos, video_path)
        
            height, width, total_frames, video_fps = get_video(video_path)
            num_frames = smart_nframes(vision_infos, total_frames, video_fps)
            print(f"元の動画寸法:{height}*{width}、モデル入力寸法:{resized_height}*{resized_width}、動画の総フレーム数:{total_frames}、fps が {fps} の場合に抽出される総フレーム数:{num_frames}", end=", ")
            video_token = int(math.ceil(num_frames / 2) * resized_height / 32 * resized_width / 32)
            video_token += 2   // システムは自動的に視覚マーカー <|vision_bos|> および <|vision_eos|>(各 1 トークン)を追加します。
            return video_token
        
        
        video_token = token_calculate("xxx/test.mp4", 1)
        print("動画トークン数:", video_token)
      • 画像リスト:

        動画を画像リストとして提供する場合、フレーム抽出はすでに完了しています。代表的なフレームのパスとフレーム総数を指定して、画像リストのトークン消費量を計算するコードを以下に示します。

        // 使用前にインストール:pip install Pillow
        import math
        import os
        import logging
        from typing import Tuple
        from PIL import Image
        
        logger = logging.getLogger(__name__)
        
        // ==================== 定数定義 ====================
        FRAME_FACTOR = 2
        // Qwen3.5、Qwen3-VL、qwen-vl-max-0813、qwen-vl-plus-0815、qwen-vl-plus-0710 などのモデルの場合、スケーリング係数は 32 です。
        IMAGE_FACTOR = 32
        
        // その他のモデルの場合、スケーリング係数は 28 です。
        // IMAGE_FACTOR = 28
        
        // トークン計算のための定数。
        TOKEN_DIVISOR = 32  // トークン計算のための除数。
        VISION_SPECIAL_TOKENS = 2  // <|vision_bos|> および <|vision_eos|> マーカー。
        
        // 動画フレームの最大アスペクト比。
        MAX_RATIO = 200
        // 動画フレームの最小ピクセル数。
        VIDEO_MIN_PIXELS = 4 * 32 * 32
        // 動画フレームの最大ピクセル数。Qwen3-VL-Plus モデルの場合、値は 640 * 32 * 32、その他のモデルの場合 768 * 32 * 32 です。
        VIDEO_MAX_PIXELS = 640 * 32 * 32
        
        // 動画入力の合計最大ピクセル数。この値は、Qwen3-VL-Plus モデルの場合 131072 * 32 * 32、その他のモデルの場合 65536 * 32 * 32 です。
        VIDEO_TOTAL_PIXELS = int(float(os.environ.get('VIDEO_MAX_PIXELS', 131072 * 32 * 32)))
        
        def round_by_factor(number: int, factor: int) -> int:
            """'number' に最も近い 'factor' の倍数の整数を返します。"""
            return round(number / factor) * factor
        
        def ceil_by_factor(number: int, factor: int) -> int:
            """'number' 以上で 'factor' の倍数となる最小の整数を返します。"""
            return math.ceil(number / factor) * factor
        
        def floor_by_factor(number: int, factor: int) -> int:
            """'number' 以下で 'factor' の倍数となる最大の整数を返します。"""
            return math.floor(number / factor) * factor
        
        
        def get_image_size(image_path: str) -> Tuple[int, int]:
            if not os.path.exists(image_path):
                raise FileNotFoundError(f"Image file not found: {image_path}")
        
            try:
                image = Image.open(image_path)
                height = image.height
                width = image.width
                image.close() // ファイルを速やかに閉じます。
                return height, width
            except Exception as e:
                raise ValueError(f"Cannot read the image file {image_path}: {str(e)}")
        
        def smart_resize(height: int, width: int, nframes: int, factor: int = IMAGE_FACTOR) -> Tuple[int, int]:
            """
            スケーリング後の画像寸法を計算します。
        
            Args:
                height: 元の画像の高さ。
                width: 元の画像の幅。
                nframes: 動画フレーム数。
                factor: スケーリング係数。デフォルトは IMAGE_FACTOR。
        
            Returns:
                (resized_height, resized_width): スケーリング後の高さと幅。
        
            Raises:
                ValueError: アスペクト比が制限を超えている場合。
            """
            // 動画フレームの最小ピクセル数。
            min_pixels = VIDEO_MIN_PIXELS
            total_pixels = VIDEO_TOTAL_PIXELS
            // 抽出された動画フレーム数。
            max_pixels = max(min(VIDEO_MAX_PIXELS, total_pixels / nframes * FRAME_FACTOR), int(min_pixels * 1.05))
        
            // 画像のアスペクト比は 200:1 または 1:200 を超えてはなりません。
            aspect_ratio = max(height, width) / min(height, width)
            if aspect_ratio > MAX_RATIO:
                raise ValueError(
                    f"The aspect ratio of the image must be less than {MAX_RATIO}:1. The current ratio is {aspect_ratio:.2f}:1."
                )
        
            h_bar = max(factor, round_by_factor(height, factor))
            w_bar = max(factor, round_by_factor(width, factor))
            if h_bar * w_bar > max_pixels:
                beta = math.sqrt((height * width) / max_pixels)
                h_bar = floor_by_factor(height / beta, factor)
                w_bar = floor_by_factor(width / beta, factor)
            elif h_bar * w_bar < min_pixels:
                beta = math.sqrt(min_pixels / (height * width))
                h_bar = ceil_by_factor(height * beta, factor)
                w_bar = ceil_by_factor(width * beta, factor)
            return h_bar, w_bar
        
        
        def calculate_video_tokens(image_path: str, nframes: int = 1, factor: int = IMAGE_FACTOR, verbose: bool = True) -> int:
            """
        
            Args:
                image_path: 代表的な動画フレームファイルへのパス。
                nframes: 動画フレーム数。
                factor: スケーリング係数。デフォルトは IMAGE_FACTOR。
                verbose: 詳細情報を出力するかどうかを指定します。
        
            Returns:
                消費されるトークンの総数。
        
            Raises:
                FileNotFoundError: ファイルが存在しない場合。
                ValueError: ファイル形式が無効またはアスペクト比が制限を超えている場合。
            """
            // 元の画像寸法を取得します(一度だけ読み込みます)。
            height, width = get_image_size(image_path)
        
            // スケーリング後の寸法を計算します。
            resized_height, resized_width = smart_resize(height, width, nframes, factor)
        
            // トークン数を計算します。
            video_token = int(
                math.ceil(nframes / 2) *
                (resized_height / TOKEN_DIVISOR) *
                (resized_width / TOKEN_DIVISOR)
            )
            // 視覚マーカートークン(<|vision_bos|> および <|vision_eos|>)を追加します。
            video_token += VISION_SPECIAL_TOKENS
        
            if verbose:
                print(f"元の動画フレーム寸法:{height}×{width}、モデル入力寸法:{resized_height}×{resized_width}、 ", end="")
        
            return video_token
        
        if __name__ == "__main__":
            try:
                video_token = calculate_video_tokens("xxx/test.jpg", nframes=30)
                print(f"動画トークン数:{video_token}\n")
            except Exception as e:
                print(f"エラー:{str(e)}\n")
  • 請求書の確認: Alibaba Cloud コンソールの 課金管理 ページで、請求書の確認やアカウントへのチャージができます。

  • レート制限: 視覚理解モデルのレート制限については、「レート制限」をご参照ください。

  • 無料クォータ(シンガポールのみ):視覚理解モデルには、Model Studio のアクティベート日またはモデルリクエストの承認日から 90 日間有効な 100 万トークンの無料クォータが提供されます。

API リファレンス

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

よくある質問

ファイルアップロード方法

SDK の種類、ファイルサイズ、ネットワークの安定性に応じて、最適なアップロード方法を選択してください。

種類

ファイル仕様

DashScope SDK (Python, Java)

OpenAI 互換 / DashScope HTTP

画像

7 MB ~ 10 MB

ローカルパスを提供

公開 URL のみ。 Object Storage Service (OSS) の使用を推奨します。

7 MB 未満

ローカルパスを提供

Base64 エンコーディング

動画

100 MB 超

公開 URL のみサポートされています。Object Storage Service (OSS) の使用を推奨します。

公開 URL のみ。Object Storage Service (OSS) の使用を推奨します。

7 MB ~ 100 MB

ローカルパスを提供

公開 URL のみ。Object Storage Service (OSS) の使用を推奨します。

7 MB 未満

ローカルパスを提供

Base64 エンコーディング

Base64 エンコーディングはファイルサイズを増加させるため、元のファイルは 7 MB 未満である必要があります。
サーバー側のダウンロードタイムアウトを防ぎ、安定性を向上させるために、Base64 エンコーディングまたはローカルパスを使用してください。

画像または動画を必要なサイズに圧縮する方法は?

視覚理解モデルの入力ファイルにはサイズ制限があります。以下の方法で圧縮してください。

画像圧縮方法

  • オンラインツール:CompressJPEG などのサービスを使用します。

  • ローカルソフトウェア:Photoshop などのツールを使用してエクスポート品質を調整します。

  • コード実装:

    # pip install pillow
    
    from PIL import Image
    def compress_image(input_path, output_path, quality=85):
        with Image.open(input_path) as img:
            img.save(output_path, "JPEG", optimize=True, quality=quality)
    
    # ローカル画像を渡します。
    compress_image("/xxx/before-large.jpeg","/xxx/after-min.jpeg")

動画圧縮方法

  • オンラインツール:FreeConvert などのサービスを使用します。

  • ローカルソフトウェア:HandBrake などのツールを使用します。

  • コード実装:FFmpeg ツールを使用します。FFmpeg 公式ウェブサイトをご参照ください。

    # 基本的な変換コマンド
    # -i: 入力ファイルパスを指定します。例:input.mp4
    # -vcodec: 動画エンコーダーを指定します。一般的な値には libx264(一般用途に推奨)および libx265(より高い圧縮率)があります。
    # -crf: 動画品質を制御します。有効値は [18-28] です。値が低いほど高品質でファイルサイズが大きくなります。
    # --preset: エンコード速度と圧縮効率のバランスを制御します。一般的な値には slow、fast、faster があります。
    # -y: 既存のファイルを上書きします(値は不要)。
    # output.mp4: 出力ファイルパスを指定します。
    
    ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset slow output.mp4

モデルがオブジェクトのローカライズ結果を出力した後、検出フレームを元の画像に描画するにはどうすればよいですか?

視覚理解モデルがオブジェクトのローカライズ結果を生成した後、以下のコードを使用して、バウンディングボックスとそのラベルを元の画像に描画できます。

  • Qwen2.5-VL:スケーリングされた画像の左上隅を基準とした絶対ピクセル座標を返します。バウンディングボックスを描画するには、「qwen2_5_vl_2d.py」のコードをご参照ください。

  • Qwen3-VL:[0, 999] の範囲に正規化された相対座標を返します。バウンディングボックスを描画するには、「qwen3_vl_2d.py」(2D ローカライズ用)または「qwen3_vl_3d.zip」(3D ローカライズ用)のコードをご参照ください。

エラーコード

モデルの呼び出しに失敗し、エラーメッセージが返された場合は、「エラーメッセージ」で解決策をご確認ください。