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

Alibaba Cloud Model Studio:Qwen-OCR API リファレンス

最終更新日:Jun 26, 2026

Qwen-OCR モデルを使用して、画像からテキスト、構造化データ、およびキー情報を抽出します。Qwen-OCR は、OpenAI 互換 API と DashScope API の 2 つの API プロトコルをサポートしています。

ユースケースとクイックスタートガイダンスについては、「テキスト抽出 (Qwen-OCR)」をご参照ください。

OpenAI 互換 API

エンドポイント

リージョン

SDK base_url

HTTP エンドポイント

シンガポール

https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1

POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions

米国 (バージニア)

https://dashscope-us.aliyuncs.com/compatible-mode/v1

POST https://dashscope-us.aliyuncs.com/compatible-mode/v1/chat/completions

中国 (北京)

https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1

POST https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/chat/completions

重要

Model Studio は、中国 (北京) およびシンガポールリージョン向けにワークスペース固有のドメインをリリースしました。新しい専用ドメインは、推論リクエストに対して優れたパフォーマンスと高い安定性を提供します。新しいドメインへの移行を推奨します:

  • 中国 (北京):https://dashscope.aliyuncs.com から https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com

  • シンガポール:https://dashscope-intl.aliyuncs.com から https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com

{WorkspaceId} は、Model Studio コンソールの [ワークスペース詳細] ページで確認できるワークスペース ID です。既存のドメインも引き続き完全に機能します。

前提条件

API キーを取得し、環境変数として設定します。 OpenAI SDK を使用する場合は、SDK をインストールします

クイックスタート

OpenAI 互換のチャット補完エンドポイントを使用して、イメージ URL とテキストプロンプトを含む user メッセージを送信します。モデルはテキストを抽出し、choices[0].message.content でそれを返します。

非ストリーミング

Python

from openai import OpenAI
import os

PROMPT_TICKET_EXTRACTION = """
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx', 'departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'},
"""

try:
    client = OpenAI(
        # 環境変数が設定されていない場合は、api_key="sk-xxx" に置き換えます
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        # シンガポールリージョン。米国 (バージニア) の場合は https://dashscope-us.aliyuncs.com/compatible-mode/v1 を使用します
        # 中国 (北京) の場合は https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用します
        base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
    )
    completion = client.chat.completions.create(
        model="qwen-vl-ocr-2025-11-20",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "image_url",
                        "image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
                        # 最小ピクセル数。これより小さい画像はアップスケールされます。
                        "min_pixels": 32 * 32 * 3,
                        # 最大ピクセル数。これより大きい画像はダウンスケールされます。
                        "max_pixels": 32 * 32 * 8192
                    },
                    # カスタムプロンプト。これがない場合、モデルは「画像からテキストコンテンツのみを出力し、追加の説明やフォーマットは含めないでください」を使用します。
                    {"type": "text",
                     "text": PROMPT_TICKET_EXTRACTION}
                ]
            }
        ])
    print(completion.choices[0].message.content)
except Exception as e:
    print(f"Error message: {e}")

Node.js

import OpenAI from 'openai';

const PROMPT_TICKET_EXTRACTION = `
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx', 'departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'}
`;

const client = new OpenAI({
  // 環境変数が設定されていない場合は、apiKey: "sk-xxx" に置き換えます
  apiKey: process.env.DASHSCOPE_API_KEY,
  // 中国 (北京) の場合は https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用します
  baseURL: 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1',
});

async function main() {
  const response = await client.chat.completions.create({
    model: 'qwen-vl-ocr-2025-11-20',
    messages: [
      {
        role: 'user',
        content: [
          { type: 'text', text: PROMPT_TICKET_EXTRACTION},
          {
            type: 'image_url',
            image_url: {
              url: 'https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg',
            },
              // 最小ピクセル数。これより小さい画像はアップスケールされます。
              "min_pixels": 32 * 32 * 3,
              // 最大ピクセル数。これより大きい画像はダウンスケールされます。
              "max_pixels": 32 * 32 * 8192
          }
        ]
      }
    ],
  });
  console.log(response.choices[0].message.content)
}

main();

curl

curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "model": "qwen-vl-ocr-2025-11-20",
  "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
                    "min_pixels": 3072,
                    "max_pixels": 8388608
                },
                {"type": "text", "text": "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'}"}
            ]
        }
    ]
}'

ストリーミング

streamtrue に設定すると、モデルが結果を生成するたびに増分的に結果を受け取ることができます。

Python

import os
from openai import OpenAI

PROMPT_TICKET_EXTRACTION = """
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx','departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'},
"""

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
    model="qwen-vl-ocr-2025-11-20",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
                    "min_pixels": 32 * 32 * 3,
                    "max_pixels": 32 * 32 * 8192
                },
                {"type": "text","text": PROMPT_TICKET_EXTRACTION}
            ]
        }
    ],
    stream=True,
    stream_options={"include_usage": True}
)

for chunk in completion:
    print(chunk.model_dump_json())

Node.js

import OpenAI from 'openai';

const PROMPT_TICKET_EXTRACTION = `
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx', 'departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'}
`;

const openai = new OpenAI({
  apiKey: process.env.DASHSCOPE_API_KEY,
  baseURL: 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1',
});

async function main() {
  const response = await openai.chat.completions.create({
    model: 'qwen-vl-ocr-2025-11-20',
    messages: [
      {
        role: 'user',
        content: [
          { type: 'text', text: PROMPT_TICKET_EXTRACTION},
          {
            type: 'image_url',
            image_url: {
              url: 'https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg',
            },
              "min_pixels": 32 * 32 * 3,
              "max_pixels": 32 * 32 * 8192
          }
        ]
      }
    ],
    stream: true,
    stream_options:{"include_usage": true}
  });
  let fullContent = ""
  console.log("Streaming output content:")
  for await (const chunk of response) {
    if (chunk.choices[0] && chunk.choices[0].delta.content != null) {
      fullContent += chunk.choices[0].delta.content;
      console.log(chunk.choices[0].delta.content);
    }
  }
  console.log(`Full output content: ${fullContent}`)
}

main();

curl

curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
  "model": "qwen-vl-ocr-2025-11-20",
  "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {"url":"https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg"},
                    "min_pixels": 3072,
                    "max_pixels": 8388608
                },
                {"type": "text", "text": "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'}"}
            ]
        }
    ],
    "stream": true,
    "stream_options": {"include_usage": true}
}'

リクエストパラメーター

パラメーター

必須

説明

model

string

はい

モデル名。サポートされているモデルについては、「推奨モデル」をご参照ください。

messages

array

はい

モデルにコンテキストを提供するメッセージオブジェクトの配列。

メッセージオブジェクト

各メッセージには、role (必須で user) と、以下の要素タイプを持つ content 配列が必要です:

パラメーター

必須

説明

type

string

はい

テキスト入力の場合は text、画像入力の場合は image_url

text

string

いいえ

テキストプロンプト。デフォルト:"画像からテキストコンテンツのみを出力し、追加の説明やフォーマットは含めないでください"

image_url.url

string

はい (typeimage_url の場合)

画像の URL または Base64 エンコードされたデータ URL。ローカルファイルについては、「テキスト抽出」をご参照ください。

min_pixels

integer

いいえ

最小ピクセルしきい値。この値を下回る画像はアップスケールされます。「画像解像度のコントロール」をご参照ください。

max_pixels

integer

いいえ

最大ピクセルしきい値。この値を超える画像はダウンスケールされます。「画像解像度のコントロール」をご参照ください。

生成パラメーター

パラメーター

デフォルト

説明

stream

boolean

false

true に設定すると、モデルが出力を生成するたびに増分応答を受け取ります。

stream_options.include_usage

boolean

false

streamtrue の場合、これを true に設定すると、最後のチャンクにトークン使用量が含まれます。

max_tokens

integer

可変

出力の最大トークン数。これを超えると応答が切り捨てられます。「出力トークンの制限」をご参照ください。

temperature

float

0.01

出力の多様性をコントロールします。値が高いほど、より多様なテキストが生成されます。範囲:[0, 2)。

top_p

float

0.001

ニュークリアスサンプリングのしきい値。値が高いほど多様性が増します。範囲:(0, 1.0]。temperature または top_p のいずれかを設定し、両方を設定しないでください。

top_k

integer

1

サンプリング中に候補となるトークンセットを制限します。値が None または 100 より大きい場合、top_k ポリシーは有効にならず、top_p ポリシーのみが有効になります。>= 0 である必要があります。標準の OpenAI パラメーターではありません。Python SDK では extra_body を介して渡します:extra_body={"top_k": xxx}。Node.js SDK または HTTP では、トップレベルで渡します。

repetition_penalty

float

1.0

繰り返しシーケンスに対するペナルティ。1.0 より大きい値は繰り返しを減らします。標準の OpenAI パラメーターではありません。Python SDK では extra_body を介して渡します。

presence_penalty

float

0.0

コンテンツの繰り返しをコントロールします。範囲:[-2.0, 2.0]。正の値は繰り返しを減らします。

seed

integer

--

同じ値が同一のパラメーターで使用された場合に、再現性のある結果を保証します。範囲:[0, 2^31 - 1]。

logprobs

boolean

false

true に設定すると、出力トークンの対数確率を返します。

top_logprobs

integer

0

ステップごとに返す最も可能性の高いトークンの数。範囲:[0, 5]。logprobstrue の場合にのみ有効です。

stop

string または array

--

ストップワードまたはトークン ID。指定された文字列または token_id が出現すると生成が停止します。同じ配列内で文字列と token_id を混在させないでください。

応答

非ストリーミング応答 (chat.completion)

{
  "id": "chatcmpl-ba21fa91-dcd6-4dad-90cc-6d49c3c39094",
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "logprobs": null,
      "message": {
        "content": "```json\n{\n    \"seller_name\": \"null\",\n    \"buyer_name\": \"Cai Yingshi\",\n    \"price_excluding_tax\": \"230769.23\",\n    \"organization_code\": \"null\",\n    \"invoice_code\": \"142011726001\"\n}\n```",
        "refusal": null,
        "role": "assistant",
        "annotations": null,
        "audio": null,
        "function_call": null,
        "tool_calls": null
      }
    }
  ],
  "created": 1763283287,
  "model": "qwen-vl-ocr-latest",
  "object": "chat.completion",
  "service_tier": null,
  "system_fingerprint": null,
  "usage": {
    "completion_tokens": 72,
    "prompt_tokens": 1185,
    "total_tokens": 1257,
    "completion_tokens_details": {
      "accepted_prediction_tokens": null,
      "audio_tokens": null,
      "reasoning_tokens": null,
      "rejected_prediction_tokens": null,
      "text_tokens": 72
    },
    "prompt_tokens_details": {
      "audio_tokens": null,
      "cached_tokens": null,
      "image_tokens": 1001,
      "text_tokens": 184
    }
  }
}

フィールド

説明

id

string

一意のリクエスト識別子。

choices

array

モデルが生成したコンテンツ。

choices[].finish_reason

string

生成が正常に完了した場合は stop、トークン制限により切り捨てられた場合は length

choices[].index

integer

choices 配列内の位置。

choices[].message.content

string

モデルから抽出されたテキストまたは構造化出力。

choices[].message.role

string

常に assistant

choices[].message.refusal

string

常に null

choices[].message.audio

object

常に null

choices[].message.function_call

object

常に null

choices[].message.tool_calls

array

常に null

created

integer

リクエストの UNIX タイムスタンプ。

model

string

使用されたモデル。

object

string

常に chat.completion

service_tier

string

常に null

system_fingerprint

string

常に null

usage.completion_tokens

integer

出力トークン数。

usage.prompt_tokens

integer

入力トークン数。

usage.total_tokens

integer

prompt_tokenscompletion_tokens の合計。

usage.completion_tokens_details.text_tokens

integer

テキスト出力トークン。completion_tokens_details 内の他のフィールドは常に null です。

usage.prompt_tokens_details.image_tokens

integer

画像入力トークン。

usage.prompt_tokens_details.text_tokens

integer

テキスト入力トークン。prompt_tokens_details 内の他のフィールドは常に null です。

ストリーミング応答 (chat.completion.chunk)

streamtrue の場合、応答は一連の Server-Sent Event (SSE) チャンクとして配信されます。各チャンクは非ストリーミング応答と同じ構造に従いますが、以下の違いがあります:

  • object は常に chat.completion.chunk です。

  • choices[].deltachoices[].message を置き換えます。delta オブジェクトは message と同じフィールドを持ちます。

  • choices[].delta.role は最初のチャンクでのみ返されます。

  • finish_reason は生成中は null、完了時は stop、切り捨てられた場合は length です。

  • include_usagetrue の場合、最後のチャンクは空の choices 配列を持ち、usage オブジェクトを含みます。

{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"","function_call":null,"refusal":null,"role":"assistant","tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"```","function_call":null,"refusal":null,"role":null,"tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"json","function_call":null,"refusal":null,"role":null,"tool_calls":null},"finish_reason":null,"index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
......
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[{"delta":{"content":"","function_call":null,"refusal":null,"role":null,"tool_calls":null},"finish_reason":"stop","index":0,"logprobs":null}],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":null}
{"id":"chatcmpl-f6fbdc0d-78d6-418f-856f-f099c2e4859b","choices":[],"created":1764139204,"model":"qwen-vl-ocr-latest","object":"chat.completion.chunk","service_tier":null,"system_fingerprint":null,"usage":{"completion_tokens":141,"prompt_tokens":513,"total_tokens":654,"completion_tokens_details":{"accepted_prediction_tokens":null,"audio_tokens":null,"reasoning_tokens":null,"rejected_prediction_tokens":null,"text_tokens":141},"prompt_tokens_details":{"audio_tokens":null,"cached_tokens":null,"image_tokens":332,"text_tokens":181}}}

画像解像度のコントロール

min_pixelsmax_pixels は、処理前の画像サイズ変更をコントロールします。トークンとピクセルの比率はモデルのバージョンによって異なります:

モデル

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

min_pixels デフォルト (最小値)

max_pixels デフォルト

max_pixels 最大値

qwen3.5-ocr, qwen-vl-ocr-latest, qwen-vl-ocr-2025-11-20

32 x 32 = 1,024

3,072 (3 トークン)

8,388,608 (8,192 トークン)

30,720,000 (30,000 トークン)

qwen-vl-ocr, qwen-vl-ocr-2025-08-28, およびそれ以前

28 x 28 = 784

3,136 (4 トークン)

6,422,528 (8,192 トークン)

23,520,000 (30,000 トークン)

サイズ変更の動作

  • 画像のピクセル数が min_pixels を下回る場合、画像は min_pixels を超えるまでアップスケールされます。

  • 画像のピクセル数が [min_pixels, max_pixels] の範囲内にある場合、元の画像がサイズ変更なしで使用されます。

  • 画像のピクセル数が max_pixels を超える場合、画像は max_pixels を下回るようにダウンスケールされます。

出力トークンの制限

モデル

デフォルトおよび最大 max_tokens

qwen3.5-ocr, qwen-vl-ocr-latest, qwen-vl-ocr-2025-11-20, qwen-vl-ocr-2024-10-28

モデルの最大出力長と同じです。「モデルの選択」をご参照ください。

qwen-vl-ocr, qwen-vl-ocr-2025-04-13, qwen-vl-ocr-2025-08-28

4,096

qwen-vl-ocr, qwen-vl-ocr-2025-04-13, and qwen-vl-ocr-2025-08-28 の場合、max_tokens のデフォルトは 4096 です。これを増やす (4097–8192) には、営業担当者に、Alibaba Cloud アカウント ID、画像タイプ (例:ドキュメント、e コマース、契約書)、モデル名、推定 QPS と 1 日あたりのリクエスト量、および 4096 出力トークンを超えるリクエストの割合を連絡してください。

DashScope API

エンドポイント

リージョン

HTTP エンドポイント

シンガポール

POST https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

米国 (バージニア)

POST https://dashscope-us.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

中国 (北京)

POST https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

SDK ベース URL の構成

Python:

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

Java (メソッド 1 -- コンストラクター):

import com.alibaba.dashscope.protocol.Protocol;
MultiModalConversation conv = new MultiModalConversation(Protocol.HTTP.getValue(), "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1");

Java (メソッド 2 -- 静的ブロック):

import com.alibaba.dashscope.utils.Constants;
Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1";
ドメインを米国 (バージニア) リージョンの場合は dashscope-us.aliyuncs.com に、中国 (北京) リージョンの場合は {WorkspaceId}.cn-beijing.maas.aliyuncs.com に置き換えてください。中国 (北京) リージョンの場合、SDK 呼び出しに base_url を設定する必要はありません。

API キーを取得して、環境変数として設定してください。DashScope SDK を使用する場合は、DashScope SDK をインストールする必要もあります。

組み込みタスク

DashScope API は、ocr_options パラメーターを介して組み込みの OCR タスクを提供します。各タスクは最適化されたデフォルトのプロンプトを使用するため、text メッセージは不要です。

タスク

ocr_options.task の値

出力フォーマット

一般的なテキスト認識

text_recognition

プレーンテキスト

高精度認識

advanced_recognition

バウンディングボックス付きのプレーンテキスト

情報抽出

key_information_extraction

構造化されたキーと値のペア

テーブル解析

table_parsing

テーブル構造

ドキュメント解析

document_parsing

ドキュメント構造

数式認識

formula_recognition

LaTeX 数式

多言語認識

multi_lan

多言語テキスト

高精度認識

認識された各行のテキストと位置データを返します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [{
            "role": "user",
            "content": [{
                "image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
                "min_pixels": 32 * 32 * 3,
                "max_pixels": 32 * 32 * 8192,
                "enable_rotate": False}]
            }]

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen-vl-ocr-2025-11-20',
    messages=messages,
    ocr_options={"task": "advanced_recognition"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])

Java

// dashscope SDK バージョン >= 2.21.8
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.aigc.multimodalconversation.OcrOptions;
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://{WorkspaceId}.ap-southeast-1.maas.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/20241108/ctdzex/biaozhun.jpg");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        map.put("enable_rotate", false);

        OcrOptions ocrOptions = OcrOptions.builder()
                .task(OcrOptions.Task.ADVANCED_RECOGNITION)
                .build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map
                        )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .ocrOptions(ocrOptions)
                .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

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
  "model": "qwen-vl-ocr-2025-11-20",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
            "min_pixels": 3072,
            "max_pixels": 8388608,
            "enable_rotate": false
          }
        ]
      }
    ]
  },
  "parameters": {
    "ocr_options": {
      "task": "advanced_recognition"
    }
  }
}
'

情報抽出

画像から構造化されたキーと値のデータを抽出します。task_config.result_schema で抽出するフィールドを指定します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [
      {
        "role":"user",
        "content":[
          {
              "image":"http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg",
              "min_pixels": 3072,
              "max_pixels": 8388608,
              "enable_rotate": False
          }
        ]
      }
    ]

params = {
  "ocr_options":{
    "task": "key_information_extraction",
    "task_config": {
      "result_schema": {
          "Ride Date": "画像内の乗車日時に対応し、YYYY-MM-DD 形式、例:2025-03-05",
          "Invoice Code": "画像から請求書コードを抽出します。通常は数字または文字の組み合わせです",
          "Invoice Number": "請求書から番号を抽出します。通常は数字のみで構成されます。"
      }
    }
  }
}

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen-vl-ocr-2025-11-20',
    messages=messages,
    **params)

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

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.aigc.multimodalconversation.OcrOptions;
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;
import com.google.gson.JsonObject;

public class Main {

    static {
        Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.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", "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        map.put("enable_rotate", false);

        JsonObject resultSchema = new JsonObject();
        resultSchema.addProperty("Ride Date", "画像内の乗車日時に対応し、YYYY-MM-DD 形式、例:2025-03-05");
        resultSchema.addProperty("Invoice Code", "画像から請求書コードを抽出します。通常は数字または文字の組み合わせです");
        resultSchema.addProperty("Invoice Number", "請求書から番号を抽出します。通常は数字のみで構成されます。");

        OcrOptions ocrOptions = OcrOptions.builder()
                .task(OcrOptions.Task.KEY_INFORMATION_EXTRACTION)
                .taskConfig(OcrOptions.TaskConfig.builder().resultSchema(resultSchema).build())
                .build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map
                        )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .ocrOptions(ocrOptions)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("ocr_result"));
    }

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

curl

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
  "model": "qwen-vl-ocr-2025-11-20",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "image": "http://duguang-labelling.oss-cn-shanghai.aliyuncs.com/demo_ocr/receipt_zh_demo.jpg",
            "min_pixels": 3072,
            "max_pixels": 8388608,
            "enable_rotate": false
          }
        ]
      }
    ]
  },
  "parameters": {
    "ocr_options": {
      "task": "key_information_extraction",
      "task_config": {
        "result_schema": {
          "Ride Date": "画像内の乗車日時に対応し、YYYY-MM-DD 形式、例:2025-03-05",
          "Invoice Code": "画像から請求書コードを抽出します。通常は数字または文字の組み合わせです",
          "Invoice Number": "請求書から番号を抽出します。通常は数字のみで構成されます。"
        }
      }
    }
  }
}
'

テーブル解析

画像からテーブル構造を抽出します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [{
            "role": "user",
            "content": [{
                "image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/doc_parsing/tables/photo/eng/17.jpg",
                "min_pixels": 32 * 32 * 3,
                "max_pixels": 32 * 32 * 8192,
                "enable_rotate": False}]
            }]

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen-vl-ocr-2025-11-20',
    messages=messages,
    ocr_options={"task": "table_parsing"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])

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.aigc.multimodalconversation.OcrOptions;
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://{WorkspaceId}.ap-southeast-1.maas.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://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/doc_parsing/tables/photo/eng/17.jpg");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        map.put("enable_rotate", false);

        OcrOptions ocrOptions = OcrOptions.builder()
                .task(OcrOptions.Task.TABLE_PARSING)
                .build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map
                        )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .ocrOptions(ocrOptions)
                .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

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
  "model": "qwen-vl-ocr-2025-11-20",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/doc_parsing/tables/photo/eng/17.jpg",
            "min_pixels": 3072,
            "max_pixels": 8388608,
            "enable_rotate": false
          }
        ]
      }
    ]
  },
  "parameters": {
    "ocr_options": {
      "task": "table_parsing"
    }
  }
}
'

ドキュメント解析

ドキュメントから構造レイアウトとテキストを抽出します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [{
            "role": "user",
            "content": [{
                "image": "https://img.alicdn.com/imgextra/i1/O1CN01ukECva1cisjyK6ZDK_!!6000000003635-0-tps-1500-1734.jpg",
                "min_pixels": 32 * 32 * 3,
                "max_pixels": 32 * 32 * 8192,
                "enable_rotate": False}]
            }]

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen-vl-ocr-2025-11-20',
    messages=messages,
    ocr_options={"task": "document_parsing"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])

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.aigc.multimodalconversation.OcrOptions;
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://{WorkspaceId}.ap-southeast-1.maas.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://img.alicdn.com/imgextra/i1/O1CN01ukECva1cisjyK6ZDK_!!6000000003635-0-tps-1500-1734.jpg");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        map.put("enable_rotate", false);

        OcrOptions ocrOptions = OcrOptions.builder()
                .task(OcrOptions.Task.DOCUMENT_PARSING)
                .build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map
                        )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .ocrOptions(ocrOptions)
                .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

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
  "model": "qwen-vl-ocr-2025-11-20",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "image": "https://img.alicdn.com/imgextra/i1/O1CN01ukECva1cisjyK6ZDK_!!6000000003635-0-tps-1500-1734.jpg",
            "min_pixels": 3072,
            "max_pixels": 8388608,
            "enable_rotate": false
          }
        ]
      }
    ]
  },
  "parameters": {
    "ocr_options": {
      "task": "document_parsing"
    }
  }
}
'

数式認識

画像から数式を抽出し、LaTeX 形式で返します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [{
            "role": "user",
            "content": [{
                "image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/formula_handwriting/test/inline_5_4.jpg",
                "min_pixels": 32 * 32 * 3,
                "max_pixels": 32 * 32 * 8192,
                "enable_rotate": False}]
            }]

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen-vl-ocr-2025-11-20',
    messages=messages,
    ocr_options={"task": "formula_recognition"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])

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.aigc.multimodalconversation.OcrOptions;
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://{WorkspaceId}.ap-southeast-1.maas.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", "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/formula_handwriting/test/inline_5_4.jpg");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        map.put("enable_rotate", false);

        OcrOptions ocrOptions = OcrOptions.builder()
                .task(OcrOptions.Task.FORMULA_RECOGNITION)
                .build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map
                        )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .ocrOptions(ocrOptions)
                .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

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
  "model": "qwen-vl-ocr",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "image": "http://duguang-llm.oss-cn-hangzhou.aliyuncs.com/llm_data_keeper/data/formula_handwriting/test/inline_5_4.jpg",
            "min_pixels": 3072,
            "max_pixels": 8388608,
            "enable_rotate": false
          }
        ]
      }
    ]
  },
  "parameters": {
    "ocr_options": {
      "task": "formula_recognition"
    }
  }
}
'

一般的なテキスト認識

構造的なフォーマットなしで画像からプレーンテキストを抽出します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [{
            "role": "user",
            "content": [{
                "image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
                "min_pixels": 32 * 32 * 3,
                "max_pixels": 32 * 32 * 8192,
                "enable_rotate": False}]
            }]

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen-vl-ocr-2025-11-20',
    messages=messages,
    ocr_options={"task": "text_recognition"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])

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.aigc.multimodalconversation.OcrOptions;
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://{WorkspaceId}.ap-southeast-1.maas.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/20241108/ctdzex/biaozhun.jpg");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        map.put("enable_rotate", false);

        OcrOptions ocrOptions = OcrOptions.builder()
                .task(OcrOptions.Task.TEXT_RECOGNITION)
                .build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map
                        )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .ocrOptions(ocrOptions)
                .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

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
  "model": "qwen-vl-ocr-2025-11-20",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "image": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20241108/ctdzex/biaozhun.jpg",
            "min_pixels": 3072,
            "max_pixels": 8388608,
            "enable_rotate": false
          }
        ]
      }
    ]
  },
  "parameters": {
    "ocr_options": {
      "task": "text_recognition"
    }
  }
}
'

多言語認識

画像から複数の言語のテキストを認識します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

messages = [{
            "role": "user",
            "content": [{
                "image": "https://img.alicdn.com/imgextra/i2/O1CN01VvUMNP1yq8YvkSDFY_!!6000000006629-2-tps-6000-3000.png",
                "min_pixels": 32 * 32 * 3,
                "max_pixels": 32 * 32 * 8192,
                "enable_rotate": False}]
            }]

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv('DASHSCOPE_API_KEY'),
    model='qwen-vl-ocr-2025-11-20',
    messages=messages,
    ocr_options={"task": "multi_lan"}
)
print(response["output"]["choices"][0]["message"].content[0]["text"])

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.aigc.multimodalconversation.OcrOptions;
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://{WorkspaceId}.ap-southeast-1.maas.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://img.alicdn.com/imgextra/i2/O1CN01VvUMNP1yq8YvkSDFY_!!6000000006629-2-tps-6000-3000.png");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        map.put("enable_rotate", false);

        OcrOptions ocrOptions = OcrOptions.builder()
                .task(OcrOptions.Task.MULTI_LAN)
                .build();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map
                        )).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .ocrOptions(ocrOptions)
                .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

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--data '
{
  "model": "qwen-vl-ocr-2025-11-20",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "image": "https://img.alicdn.com/imgextra/i2/O1CN01VvUMNP1yq8YvkSDFY_!!6000000006629-2-tps-6000-3000.png",
            "min_pixels": 3072,
            "max_pixels": 8388608,
            "enable_rotate": false
          }
        ]
      }
    ]
  },
  "parameters": {
    "ocr_options": {
      "task": "multi_lan"
    }
  }
}
'

ストリーミング (DashScope)

ストリーミング出力を有効にして、結果を増分的に受け取ります。メソッドは SDK によって異なります:

  • Python SDKstream=Trueincremental_output=True を設定します。

  • Java SDKstreamCall インターフェイスを使用します。

  • HTTPX-DashScope-SSE: enable ヘッダーを設定します。

Python

import os
import dashscope

dashscope.base_http_api_url = 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1'

PROMPT_TICKET_EXTRACTION = """
列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。
キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。
データを次の JSON 形式で返してください: {'invoice_number': 'xxx','departure_station': 'xxx', 'arrival_station': 'xxx', 'departure_date_and_time':'xxx', 'seat_number': 'xxx','ticket_price':'xxx', 'id_card_number': 'xxx', 'passenger_name': 'xxx'},
"""

messages = [
    {
        "role": "user",
        "content": [
            {
                "image": "https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg",
                "min_pixels": 32 * 32 * 3,
                "max_pixels": 32 * 32 * 8192},
            {
                "type": "text",
                "text": PROMPT_TICKET_EXTRACTION
            }
        ]
    }
]

response = dashscope.MultiModalConversation.call(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model="qwen-vl-ocr-2025-11-20",
    messages=messages,
    stream=True,
    incremental_output=True,
)
full_content = ""
print("Streaming output content:")
for response in response:
    try:
        print(response["output"]["choices"][0]["message"].content[0]["text"])
        full_content += response["output"]["choices"][0]["message"].content[0]["text"]
    except:
        pass
print(f"Full content: {full_content}")

Java

import java.util.*;

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 io.reactivex.Flowable;
import com.alibaba.dashscope.utils.Constants;

public class Main {

    static {
        Constants.baseHttpApiUrl="https://{WorkspaceId}.ap-southeast-1.maas.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://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg");
        map.put("max_pixels", 8388608);
        map.put("min_pixels", 3072);
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(
                        map,
                        Collections.singletonMap("text", "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'"))).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .apiKey(System.getenv("DASHSCOPE_API_KEY"))
                .model("qwen-vl-ocr-2025-11-20")
                .message(userMessage)
                .incrementalOutput(true)
                .build();
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(item -> {
            try {
                List<Map<String, Object>> contentList = item.getOutput().getChoices().get(0).getMessage().getContent();
                if (!contentList.isEmpty()){
                    System.out.println(contentList.get(0).get("text"));
                }//
            } catch (Exception e){
                System.exit(0);
            }
        });
    }

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

curl

curl --location 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header 'Content-Type: application/json' \
--header 'X-DashScope-SSE: enable' \
--data '
{
    "model": "qwen-vl-ocr-2025-11-20",
    "input": {
        "messages": [
            {
              "role": "user",
              "content": [
                  {
                      "image": "https://img.alicdn.com/imgextra/i2/O1CN01ktT8451iQutqReELT_!!6000000004408-0-tps-689-487.jpg",
                      "min_pixels": 3072,
                      "max_pixels": 8388608
                  },
                  {"type": "text", "text": "列車のチケット画像から、請求書番号、列車番号、出発駅、到着駅、出発日時、座席番号、座席クラス、チケット価格、ID カード番号、乗客名を抽出してください。キー情報を正確に抽出する必要があります。情報を省略したり、捏造したりしないでください。ぼやけている、または強い光で隠されている一文字は、英語の疑問符 (?) に置き換えてください。データを次の JSON 形式で返してください: {\'invoice_number\': \'xxx\', \'departure_station\': \'xxx\', \'arrival_station\': \'xxx\', \'departure_date_and_time\':\'xxx\', \'seat_number\': \'xxx\',\'ticket_price\':\'xxx\', \'id_card_number\': \'xxx\', \'passenger_name\': \'xxx\'}"}
              ]
            }
        ]
    },
    "parameters": {
        "incremental_output": true
    }
}'

リクエストパラメーター

パラメーター

必須

説明

model

string

はい

モデル名。サポートされているモデルについては、「推奨モデル」をご参照ください。

input.messages

array

はい

メッセージオブジェクトの配列。

メッセージオブジェクト

各メッセージには、role (必須で user) と content フィールド (文字列または配列) が必要です。テキストのみの入力には文字列を使用します。入力に画像データが含まれる場合は、以下のフィールドを持つ配列を使用します:

パラメーター

必須

説明

image

string

いいえ

画像の URL、Base64 データ URL、またはローカルパス。「ローカルファイルの受け渡し」をご参照ください。

text

string

いいえ

テキストプロンプト。デフォルト:"画像からテキストコンテンツのみを出力し、追加の説明やフォーマットは含めないでください"。組み込みタスクを使用する場合は不要です。

enable_rotate

boolean

いいえ

true に設定すると、傾いた画像が補正されます。デフォルト:false

min_pixels

integer

いいえ

最小ピクセルしきい値。「画像解像度のコントロール」をご参照ください。

max_pixels

integer

いいえ

最大ピクセルしきい値。「画像解像度のコントロール」をご参照ください。

生成パラメーター

HTTP 呼び出しの場合は、これらを parameters オブジェクトに設定します。

パラメーター

デフォルト

説明

max_tokens

integer

可変

出力の最大トークン数。「出力トークンの制限」をご参照ください。Java SDK では、maxTokens を使用します。

stream

boolean

false

ストリーミング出力を有効にします。Python SDK のみ。Java の場合は streamCall を使用します。HTTP の場合は X-DashScope-SSE: enable を設定します。

incremental_output

boolean

false

true (推奨) の場合、各チャンクには新しいコンテンツのみが含まれます。false の場合、各チャンクにはこれまでの完全なシーケンスが含まれます。Java SDK では、incrementalOutput を使用します。

temperature

float

0.01

出力の多様性をコントロールします。範囲:[0, 2)。

top_p

float

0.001

ニュークリアスサンプリングのしきい値。範囲:(0, 1.0]。temperature または top_p のいずれかを設定し、両方を設定しないでください。

top_k

integer

1

サンプリング中に候補となるトークンセットを制限します。値が None または 100 より大きい場合、top_k ポリシーは有効にならず、top_p ポリシーのみが有効になります。>= 0 である必要があります。

repetition_penalty

float

1.0

繰り返しシーケンスに対するペナルティ。1.0 より大きい値は繰り返しを減らします。

presence_penalty

float

0.0

コンテンツの繰り返しをコントロールします。範囲:[-2.0, 2.0]。

seed

integer

--

再現性のある結果を保証します。範囲:[0, 2^31 - 1]。

logprobs

boolean

false

true に設定すると、対数確率を返します。サポートされているモデル:qwen-vl-ocr-2025-04-13 以降。Java SDK では、同じ名前を使用します。HTTP の場合は、parameters に配置します。

top_logprobs

integer

0

ステップごとの最も可能性の高いトークンの数。範囲:[0, 5]。logprobstrue の場合にのみ有効です。Java SDK では、topLogprobs を使用します。HTTP の場合は、parameters に配置します。

stop

string または array

--

ストップワードまたはトークン ID。指定された文字列または token_id が出現すると生成が停止します。同じ配列内で文字列と token_id を混在させないでください。

組み込みタスクパラメーター (ocr_options)

組み込みタスクを使用する場合、ocr_optionsparameters (HTTP) で渡すか、キーワード引数 (Python SDK) として渡すか、OcrOptions ビルダー (Java SDK) を介して渡します。

パラメーター

必須

説明

ocr_options.task

string

はい

組み込みタスク名。有効な値:text_recognitionkey_information_extractiondocument_parsingtable_parsingformula_recognitionmulti_lanadvanced_recognition

ocr_options.task_config

object

いいえ

key_information_extraction の構成。

ocr_options.task_config.result_schema

object

いいえ

抽出するフィールドを指定する JSON オブジェクト。キーはフィールド名、値は精度向上のためのオプションの説明です。最大 3 階層のネストをサポートします。

result_schema の例

"result_schema": {
     "invoice_number": "請求書の一意の識別番号。通常は数字と文字の組み合わせです。",
     "issue_date": "請求書が発行された日付。YYYY-MM-DD 形式で抽出します。例:2023-10-26。",
     "seller_name": "請求書に表示されている販売者の完全な会社名。",
     "total_amount": "請求書の合計金額 (税込み)。数値を抽出し、小数点以下 2 桁を保持します。例:123.45。"
}
Java SDK では、このパラメーターは OcrOptions です。最小 DashScope Python SDK バージョンは 1.22.2 です。最小 Java SDK バージョンは 2.18.4 です。advanced_recognition の場合、Java SDK >= 2.21.8 が必要です。

応答

DashScope API は、ストリーミング出力と非ストリーミング出力で同一の応答フォーマットを使用します。

{
  "status_code": 200,
  "request_id": "8f8c0f6e-6805-4056-bb65-d26d66080a41",
  "code": "",
  "message": "",
  "output": {
    "text": null,
    "finish_reason": null,
    "choices": [
      {
        "finish_reason": "stop",
        "message": {
          "role": "assistant",
          "content": [
            {
              "ocr_result": {
                "kv_result": {
                  "price_excluding_tax": "230769.23",
                  "invoice_code": "142011726001",
                  "organization_code": "null",
                  "buyer_name": "Cai Yingshi",
                  "seller_name": "null"
                }
              },
              "text": "```json\n{\n    \"price_excluding_tax\": \"230769.23\",\n    \"invoice_code\": \"142011726001\",\n    \"organization_code\": \"null\",\n    \"buyer_name\": \"Cai Yingshi\",\n    \"seller_name\": \"null\"\n}\n```"
            }
          ]
        }
      }
    ],
    "audio": null
  },
  "usage": {
    "input_tokens": 926,
    "output_tokens": 72,
    "characters": 0,
    "image_tokens": 754,
    "input_tokens_details": {
      "image_tokens": 754,
      "text_tokens": 172
    },
    "output_tokens_details": {
      "text_tokens": 72
    },
    "total_tokens": 998
  }
}

フィールド

説明

status_code

string

200 は成功を示します。Java SDK はこのフィールドを返す代わりに例外をスローします。

request_id

string

一意のリクエスト識別子。Java SDK では、これは requestId です。

code

string

エラーコード。成功時は空です。Python SDK のみがこのフィールドを返します。

output.text

string

常に null

output.finish_reason

string

生成中は null、完了時は stop、切り捨てられた場合は length

output.choices[].finish_reason

string

output.finish_reason と同じ値。

output.choices[].message.role

string

常に assistant

output.choices[].message.content[].text

string

モデルから抽出されたテキストまたはフォーマットされた出力。

output.choices[].message.content[].ocr_result

object

組み込みタスク (key_information_extraction, advanced_recognition) に対して返されます。

output.choices[].message.content[].ocr_result.kv_result

object

キーと値の抽出結果 (key_information_extraction の場合)。

output.choices[].message.content[].ocr_result.words_info

array

位置データ付きのテキスト行の結果 (advanced_recognition の場合)。

output.choices[].message.content[].ocr_result.words_info[].rotate_rect

array

[center_x, center_y, width, height, angle] -- 回転したバウンディングボックス。

output.choices[].message.content[].ocr_result.words_info[].location

array

[x1, y1, x2, y2, x3, y3, x4, y4] -- 左上から時計回りの 4 つの頂点。

output.choices[].message.content[].ocr_result.words_info[].text

string

テキスト行のコンテンツ。

output.choices[].message.logprobs

object

logprobstrue の場合に返される対数確率情報。

usage.input_tokens

integer

入力トークン数。

usage.output_tokens

integer

出力トークン数。

usage.characters

integer

0 に固定。

usage.total_tokens

integer

input_tokensoutput_tokens の合計。

usage.image_tokens

integer

画像入力に対応するトークン。

usage.input_tokens_details.image_tokens

integer

画像入力トークン。

usage.input_tokens_details.text_tokens

integer

テキスト入力トークン。

usage.output_tokens_details.text_tokens

integer

テキスト出力トークン。

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

モデル

説明

qwen3.5-ocr

Qwen3.5 アーキテクチャに基づいています。より高速で、より正確です。情報抽出、テキストの位置特定、マルチターン対話のサポートが大幅に改善されました。コンテキスト長は 128K に拡張されました。

qwen-vl-ocr-latest

常に最新バージョンを指します。

qwen-vl-ocr-2025-11-20

最新の日付付きスナップショット。

qwen-vl-ocr-2025-08-28

以前のバージョン。

qwen-vl-ocr-2025-04-13

以前のバージョン。

qwen-vl-ocr-2024-10-28

以前のバージョン。

qwen-vl-ocr

ベースモデル。

エラーコード

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