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

Alibaba Cloud Model Studio:OpenAI 互換 - バッチ(ファイル入力)

最終更新日:Mar 31, 2026

Alibaba Cloud Model Studio は、OpenAI 互換のバッチファイル API を提供します。ファイルを用いてタスクを一括で送信できます。システムは非同期で処理を行い、タスク完了時または最大待機時間に達した時点で結果を返します。コストはリアルタイム呼び出しの50 %のみです。遅延が厳密に要求されないデータ分析、モデル評価、その他の大規模ワークロードに最適です。

コンソールを使用する場合は、「バッチ推論」をご参照ください。

ワークフロー

前提条件

OpenAI SDK(Python、Node.js)または HTTP API を使用して、バッチファイル API を呼び出します。

  • API キーの取得: 「Model Studio API キーを環境変数として取得および設定」をご参照ください。

  • SDK のインストール(任意): 使用する予定がある場合は、「OpenAI SDK」をインストールしてください。

  • サービスエンドポイント

    • 中国本土: https://dashscope.aliyuncs.com/compatible-mode/v1

    • 国際: https://dashscope-intl.aliyuncs.com/compatible-mode/v1

可用性

国際

国際デプロイモード」では、エンドポイントおよびデータストレージの両方がシンガポールに配置されます。モデル推論の計算リソースは、中国本土を除くグローバルなリージョン間で動的にスケジュールされます。

サポートされるモデル: qwen-max、qwen-plus、qwen-flash、qwen-turbo。

中国本土

中国本土デプロイモード」では、エンドポイントおよびデータストレージの両方が中国(北京)に配置されます。モデル推論の計算リソースは、中国本土内でのみ利用可能です。

サポートされるモデル:

  • テキスト生成モデル: Qwen-Max、Plus、Flash、Long の安定版および一部の latest バージョン。QwQ シリーズ(qwq-plus)および一部のサードパーティモデル(deepseek-r1、deepseek-v3)もサポートされます。

  • マルチモーダルモデル: Qwen-VL-Max、Plus、Flash の安定版および一部の latest バージョン。Qwen-OCR モデルもサポートされます。

  • テキスト埋め込みモデル: text-embedding-v4。

サポートされるモデル名

重要
  • 一部のモデルは思考モードをサポートしています。有効化すると、このモードは思考 トークン を生成し、コストが増加します。

  • qwen3.5 シリーズ(例: qwen3.5-plus および qwen3.5-flash)では、思考モードがデフォルトで有効になっています。ハイブリッド思考モデルを使用する場合は、明示的に enable_thinking パラメーター(true または false)を設定してください。

クイックスタート

本番タスクを実行する前に、batch-test-model を使用してテストを行ってください。このテストモデルは推論をスキップし、固定の成功応答を返すことで、API 呼び出しチェーンおよびデータ形式の検証が可能です。

説明

batch-test-model の制限事項:

  • テストファイルは「入力ファイルの要件」を満たす必要があります。ファイルサイズは1 MB以下、行数は100 行以内である必要があります。

  • 同時実行数制限: 最大2並列タスクまで。

  • コスト: テストモデルはモデル推論料金は発生しません。

ステップ 1: 入力ファイルの準備

以下の内容で test_model.jsonl という名前のファイルを作成します:

{"custom_id":"1","method":"POST","url":"/v1/chat/ds-test","body":{"model":"batch-test-model","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"Hello! How can I help you?"}]}}
{"custom_id":"2","method":"POST","url":"/v1/chat/ds-test","body":{"model":"batch-test-model","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"What is 2+2?"}]}}

マルチモーダルモデル(例: qwen-vl-plus)では、ファイル URL および Base64 エンコードされた入力がサポートされます:

{"custom_id":"image-url","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"}},{"type":"text","text":"Describe this image."}]}]}}
{"custom_id":"image-base64","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEA8ADwAAD..."}},{"type":"text","text":"Describe this image."}]}]}}

ステップ 2: コードの実行

プログラミング言語に応じたサンプルコードスニペットを選択し、入力ファイルと同じディレクトリに保存して実行します。このコードは、アップロード、タスク作成、ステータスポーリング、結果ダウンロードの全ワークフローを処理します。

ファイルパスやその他のパラメーターを調整する場合は、必要に応じてコードを修正してください。

サンプルコード

OpenAI Python SDK

import os
from pathlib import Path
from openai import OpenAI
import time

# クライアントの初期化
client = OpenAI(
    # 環境変数が設定されていない場合は、下記の行を api_key="sk-xxx" に置き換えてください。ただし、本番環境ではハードコーディングしないでください(漏洩リスクを低減するため)。
    # API キーはシンガポールと北京のリージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合は: https://dashscope.aliyuncs.com/compatible-mode/v1
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"  # Model Studio サービスの base_url
)

def upload_file(file_path):
    print(f"リクエスト情報を含む JSONL ファイルをアップロード中...")
    file_object = client.files.create(file=Path(file_path), purpose="batch")
    print(f"ファイルのアップロードが正常に完了しました。ファイル ID: {file_object.id}\n")
    return file_object.id

def create_batch_job(input_file_id):
    print(f"ファイル ID を基にバッチタスクを作成中...")
    # 注: ここで指定する endpoint パラメーターの値は、入力ファイル内の url フィールドと一致している必要があります。
    # テストモデル (batch-test-model) の場合は /v1/chat/ds-test を使用します。
    # テキスト埋め込みモデルの場合は /v1/embeddings を使用します。
    # その他のモデルの場合は /v1/chat/completions を使用します。
    batch = client.batches.create(input_file_id=input_file_id, endpoint="/v1/chat/ds-test", completion_window="24h")
    print(f"バッチタスクが作成されました。バッチタスク ID: {batch.id}\n")
    return batch.id

def check_job_status(batch_id):
    print(f"バッチタスクのステータスを確認中...")
    batch = client.batches.retrieve(batch_id=batch_id)
    print(f"バッチタスクのステータス: {batch.status}\n")
    return batch.status

def get_output_id(batch_id):
    print(f"バッチタスク内の成功したリクエストの出力ファイル ID を取得中...")
    batch = client.batches.retrieve(batch_id=batch_id)
    print(f"出力ファイル ID: {batch.output_file_id}\n")
    return batch.output_file_id

def get_error_id(batch_id):
    print(f"バッチタスク内の失敗したリクエストの出力ファイル ID を取得中...")
    batch = client.batches.retrieve(batch_id=batch_id)
    print(f"エラー ファイル ID: {batch.error_file_id}\n")
    return batch.error_file_id

def download_results(output_file_id, output_file_path):
    print(f"バッチタスクから成功したリクエストの結果を表示およびダウンロード中...")
    content = client.files.content(output_file_id)
    # テスト用に一部のコンテンツを表示
    print(f"成功したリクエストの結果の先頭 1,000 文字を表示: {content.text[:1000]}...\n")
    # 結果ファイルをローカルに保存
    content.write_to_file(output_file_path)
    print(f"完全な出力結果がローカルの出力ファイル result.jsonl に保存されました\n")

def download_errors(error_file_id, error_file_path):
    print(f"バッチタスクからリクエストの失敗情報を表示およびダウンロード中...")
    content = client.files.content(error_file_id)
    # テスト用に一部のコンテンツを表示
    print(f"リクエスト失敗情報の先頭 1,000 文字を表示: {content.text[:1000]}...\n")
    # エラー情報ファイルをローカルに保存
    content.write_to_file(error_file_path)
    print(f"完全なリクエスト失敗情報がローカルのエラー ファイル error.jsonl に保存されました\n")

def main():
    # ファイルパス
    input_file_path = "test_model.jsonl"  # 必要に応じて入力ファイルパスに置き換え可能
    output_file_path = "result.jsonl"  # 必要に応じて出力ファイルパスに置き換え可能
    error_file_path = "error.jsonl"  # 必要に応じてエラー ファイルパスに置き換え可能
    try:
        # ステップ 1: リクエスト情報を含む JSONL ファイルをアップロードし、入力ファイル ID を取得します
        input_file_id = upload_file(input_file_path)
        # ステップ 2: 入力ファイル ID を基にバッチタスクを作成します
        batch_id = create_batch_job(input_file_id)
        # ステップ 3: タスクが完了するまでステータスを確認します
        status = ""
        while status not in ["completed", "failed", "expired", "cancelled"]:
            status = check_job_status(batch_id)
            print(f"タスク完了を待機中...")
            time.sleep(10)  # 10 秒待機してから再度ステータスを照会
        # タスクが失敗した場合は、エラーメッセージを表示して終了します
        if status == "failed":
            batch = client.batches.retrieve(batch_id)
            print(f"バッチタスクが失敗しました。エラーメッセージ: {batch.errors}\n")
            print(f"詳細については、「エラーコード」をご参照ください: https://www.alibabacloud.com/help/zh/model-studio/developer-reference/error-code")
            return
        # ステップ 4: 結果のダウンロード: output_file_id が空でない場合は、成功したリクエストの結果の先頭 1,000 文字を表示し、完全な結果をローカル出力ファイルにダウンロードします。
        # error_file_id が空でない場合は、リクエスト失敗情報の先頭 1,000 文字を表示し、完全な情報をローカルエラー ファイルにダウンロードします。
        output_file_id = get_output_id(batch_id)
        if output_file_id:
            download_results(output_file_id, output_file_path)
        error_file_id = get_error_id(batch_id)
        if error_file_id:
            download_errors(error_file_id, error_file_path)
            print(f"詳細については、「エラーコード」をご参照ください: https://www.alibabacloud.com/help/zh/model-studio/developer-reference/error-code")
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        print(f"詳細については、「エラーコード」をご参照ください: https://www.alibabacloud.com/help/zh/model-studio/developer-reference/error-code")

if __name__ == "__main__":
    main()

OpenAI Node.js SDK

/**
 * Model Studio バッチ API テスト - OpenAI Node.js SDK を使用
 *
 * 依存関係のインストール: npm install openai
 * 実行: node test-nodejs.js
 */

const OpenAI = require('openai');
const fs = require('fs');

// シンガポールリージョンの base_url
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京の場合は: const BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';

const apiKey = process.env.DASHSCOPE_API_KEY;
if (!apiKey) {
    console.error('エラー: 環境変数 DASHSCOPE_API_KEY を設定してください');
    process.exit(1);
}

// クライアントの初期化
const client = new OpenAI({
    apiKey: apiKey,
    baseURL: BASE_URL
});

async function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function main() {
    try {
        console.log('=== バッチ API テストを開始 ===\n');

        // ステップ 1: ファイルのアップロード
        console.log('ステップ 1: リクエスト情報を含む JSONL ファイルをアップロード中...');
        const fileStream = fs.createReadStream('test_model.jsonl');
        const fileObject = await client.files.create({
            file: fileStream,
            purpose: 'batch'
        });
        const fileId = fileObject.id;
        console.log(`✓ ファイルのアップロードが正常に完了しました。ファイル ID: ${fileId}\n`);

        // ステップ 2: バッチタスクの作成
        console.log('ステップ 2: バッチタスクを作成中...');
        const batch = await client.batches.create({
            input_file_id: fileId,
            endpoint: '/v1/chat/ds-test',  // テストモデルの場合、/v1/chat/ds-test を使用
            completion_window: '24h'
        });
        const batchId = batch.id;
        console.log(`✓ バッチタスクが正常に作成されました。タスク ID: ${batchId}\n`);

        // ステップ 3: タスクステータスのポーリング
        console.log('ステップ 3: タスク完了を待機中...');
        let status = batch.status;
        let pollCount = 0;
        let latestBatch = batch;

        while (!['completed', 'failed', 'expired', 'cancelled'].includes(status)) {
            await sleep(10000); // 10 秒待機
            latestBatch = await client.batches.retrieve(batchId);
            status = latestBatch.status;
            pollCount++;
            console.log(`  [${pollCount}] タスクステータス: ${status}`);
        }

        console.log(`\n✓ タスクが完了しました。最終ステータス: ${status}\n`);

        // ステップ 4: 結果の処理
        if (status === 'completed') {
            console.log('ステップ 4: 結果ファイルをダウンロード中...');

            // 成功した結果のダウンロード
            const outputFileId = latestBatch.output_file_id;
            if (outputFileId) {
                console.log(`  出力ファイル ID: ${outputFileId}`);
                const content = await client.files.content(outputFileId);
                const text = await content.text();
                console.log('\n--- 成功した結果(先頭 500 文字) ---');
                console.log(text.substring(0, Math.min(500, text.length)));
                console.log('...\n');
            }

            // エラー ファイル(該当する場合)のダウンロード
            const errorFileId = latestBatch.error_file_id;
            if (errorFileId) {
                console.log(`  エラー ファイル ID: ${errorFileId}`);
                const errorContent = await client.files.content(errorFileId);
                const errorText = await errorContent.text();
                console.log('\n--- エラー情報 ---');
                console.log(errorText);
            }

            console.log('\n=== テストが正常に完了しました ===');
        } else if (status === 'failed') {
            console.error('\n✗ バッチタスクが失敗しました');
            if (latestBatch.errors) {
                console.error('エラーメッセージ:', latestBatch.errors);
            }
            console.error('\nエラーコードのドキュメントをご参照ください: https://www.alibabacloud.com/help/zh/model-studio/developer-reference/error-code');
        } else {
            console.log(`\nタスクステータス: ${status}`);
        }

    } catch (error) {
        console.error('エラーが発生しました:', error.message);
        console.error(error);
    }
}

main();

Java(HTTP)

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

/**
 * Model Studio バッチ API テスト - HTTP API を使用
 *
 * 前提条件:
 * 1. 環境変数 DASHSCOPE_API_KEY が設定されていること
 * 2. テストファイル test_model.jsonl(プロジェクトのルートディレクトリ内)が準備されていること
 *
 * リージョン構成:
 * - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
 */
public class BatchAPITest {

    // シンガポールリージョンの base_url
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京の場合は: private static final String BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1";

    private static String API_KEY;

    public static void main(String[] args) throws Exception {
        // API キーを環境変数から取得
        API_KEY = System.getenv("DASHSCOPE_API_KEY");
        if (API_KEY == null || API_KEY.isEmpty()) {
            System.err.println("エラー: 環境変数 DASHSCOPE_API_KEY を設定してください");
            System.exit(1);
        }

        System.out.println("=== バッチ API テストを開始 ===\n");

        try {
            // ステップ 1: ファイルのアップロード
            System.out.println("ステップ 1: リクエスト情報を含む JSONL ファイルをアップロード中...");
            String fileId = uploadFile("test_model.jsonl");
            System.out.println("✓ ファイルのアップロードが正常に完了しました。ファイル ID: " + fileId + "\n");

            // ステップ 2: バッチタスクの作成
            System.out.println("ステップ 2: バッチタスクを作成中...");
            String batchId = createBatch(fileId);
            System.out.println("✓ バッチタスクが正常に作成されました。タスク ID: " + batchId + "\n");

            // ステップ 3: タスクステータスのポーリング
            System.out.println("ステップ 3: タスク完了を待機中...");
            String status = "";
            int pollCount = 0;

            while (!isTerminalStatus(status)) {
                Thread.sleep(10000); // 10 秒待機
                String batchInfo = getBatch(batchId);
                status = parseStatus(batchInfo);
                pollCount++;
                System.out.println("  [" + pollCount + "] タスクステータス: " + status);

                // ステップ 4: 完了した場合、結果をダウンロード
                if ("completed".equals(status)) {
                    System.out.println("\n✓ タスクが完了しました!\n");
                    System.out.println("ステップ 4: 結果ファイルをダウンロード中...");

                    String outputFileId = parseOutputFileId(batchInfo);
                    if (outputFileId != null && !outputFileId.isEmpty()) {
                        System.out.println("  出力ファイル ID: " + outputFileId);
                        String content = getFileContent(outputFileId);
                        System.out.println("\n--- 成功した結果(先頭 500 文字) ---");
                        System.out.println(content.substring(0, Math.min(500, content.length())));
                        System.out.println("...\n");
                    }

                    String errorFileId = parseErrorFileId(batchInfo);
                    if (errorFileId != null && !errorFileId.isEmpty() && !"null".equals(errorFileId)) {
                        System.out.println("  エラー ファイル ID: " + errorFileId);
                        String errorContent = getFileContent(errorFileId);
                        System.out.println("\n--- エラー情報 ---");
                        System.out.println(errorContent);
                    }

                    System.out.println("\n=== テストが正常に完了しました ===");
                    break;
                } else if ("failed".equals(status)) {
                    System.err.println("\n✗ バッチタスクが失敗しました");
                    System.err.println("タスク情報: " + batchInfo);
                    System.err.println("\nエラーコードのドキュメントをご参照ください: https://www.alibabacloud.com/help/zh/model-studio/developer-reference/error-code");
                    break;
                } else if ("expired".equals(status) || "cancelled".equals(status)) {
                    System.out.println("\nタスクステータス: " + status);
                    break;
                }
            }

        } catch (Exception e) {
            System.err.println("エラーが発生しました: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * ファイルのアップロード
     */
    private static String uploadFile(String filePath) throws Exception {
        String boundary = "----WebKitFormBoundary" + System.currentTimeMillis();
        URL url = new URL(BASE_URL + "/files");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

        try (DataOutputStream out = new DataOutputStream(conn.getOutputStream())) {
            // purpose フィールドの追加
            out.writeBytes("--" + boundary + "\r\n");
            out.writeBytes("Content-Disposition: form-data; name=\"purpose\"\r\n\r\n");
            out.writeBytes("batch\r\n");

            // ファイルの追加
            out.writeBytes("--" + boundary + "\r\n");
            out.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + filePath + "\"\r\n");
            out.writeBytes("Content-Type: application/octet-stream\r\n\r\n");

            byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
            out.write(fileBytes);
            out.writeBytes("\r\n");
            out.writeBytes("--" + boundary + "--\r\n");
        }

        String response = readResponse(conn);
        return parseField(response, "\"id\":\\s*\"([^\"]+)\"");
    }

    /**
     * バッチタスクの作成
     */
    private static String createBatch(String fileId) throws Exception {
        String jsonBody = String.format(
            "{\"input_file_id\":\"%s\",\"endpoint\":\"/v1/chat/ds-test\",\"completion_window\":\"24h\"}",
            fileId
        );

        String response = sendRequest("POST", "/batches", jsonBody);
        return parseField(response, "\"id\":\\s*\"([^\"]+)\"");
    }

    /**
     * バッチタスク情報の取得
     */
    private static String getBatch(String batchId) throws Exception {
        return sendRequest("GET", "/batches/" + batchId, null);
    }

    /**
     * ファイルコンテンツの取得
     */
    private static String getFileContent(String fileId) throws Exception {
        return sendRequest("GET", "/files/" + fileId + "/content", null);
    }

    /**
     * HTTP リクエストの送信
     */
    private static String sendRequest(String method, String path, String jsonBody) throws Exception {
        URL url = new URL(BASE_URL + path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);

        if (jsonBody != null) {
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "application/json");
            try (OutputStream os = conn.getOutputStream()) {
                os.write(jsonBody.getBytes("UTF-8"));
            }
        }

        return readResponse(conn);
    }

    /**
     * レスポンスの読み取り
     */
    private static String readResponse(HttpURLConnection conn) throws Exception {
        int responseCode = conn.getResponseCode();
        InputStream is = (responseCode < 400) ? conn.getInputStream() : conn.getErrorStream();

        try (Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }

    /**
     * JSON フィールドの解析(簡易実装)
     */
    private static String parseField(String json, String regex) {
        java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(regex);
        java.util.regex.Matcher matcher = pattern.matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }

    private static String parseStatus(String json) {
        return parseField(json, "\"status\":\\s*\"([^\"]+)\"");
    }

    private static String parseOutputFileId(String json) {
        return parseField(json, "\"output_file_id\":\\s*\"([^\"]+)\"");
    }

    private static String parseErrorFileId(String json) {
        return parseField(json, "\"error_file_id\":\\s*\"([^\"]+)\"");
    }

    /**
     * ステータスが終了状態かどうかを確認
     */
    private static boolean isTerminalStatus(String status) {
        return "completed".equals(status)
            || "failed".equals(status)
            || "expired".equals(status)
            || "cancelled".equals(status);
    }
}

curl(HTTP)

#!/bin/bash
# Model Studio バッチ API テスト - curl を使用
#
# 前提条件:
# 1. 環境変数 DASHSCOPE_API_KEY が設定されていること
# 2. テストファイル test_model.jsonl(現在のディレクトリ内)が準備されていること
#
# リージョン構成:
# - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
# - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1

API_KEY="${DASHSCOPE_API_KEY}"
BASE_URL="https://dashscope-intl.aliyuncs.com/compatible-mode/v1"

# 北京の場合は: BASE_URL="https://dashscope.aliyuncs.com/compatible-mode/v1"

# API キーの確認
if [ -z "$API_KEY" ]; then
    echo "エラー: 環境変数 DASHSCOPE_API_KEY を設定してください"
    exit 1
fi

echo "=== バッチ API テストを開始 ==="
echo ""

# ステップ 1: ファイルのアップロード
echo "ステップ 1: リクエスト情報を含む JSONL ファイルをアップロード中..."
UPLOAD_RESPONSE=$(curl -s -X POST "${BASE_URL}/files" \
  -H "Authorization: Bearer ${API_KEY}" \
  -F 'file=@test_model.jsonl' \
  -F 'purpose=batch')

FILE_ID=$(echo $UPLOAD_RESPONSE | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
echo "✓ ファイルのアップロードが正常に完了しました。ファイル ID: ${FILE_ID}"
echo ""

# ステップ 2: バッチタスクの作成
echo "ステップ 2: バッチタスクを作成中..."
BATCH_RESPONSE=$(curl -s -X POST "${BASE_URL}/batches" \
  -H "Authorization: Bearer ${API_KEY}" \
  -H "Content-Type: application/json" \
  -d "{\"input_file_id\":\"${FILE_ID}\",\"endpoint\":\"/v1/chat/ds-test\",\"completion_window\":\"24h\"}")

BATCH_ID=$(echo $BATCH_RESPONSE | grep -o '"id":"[^"]*"' | head -1 | cut -d'"' -f4)
echo "✓ バッチタスクが正常に作成されました。タスク ID: ${BATCH_ID}"
echo ""

# ステップ 3: タスクステータスのポーリング
echo "ステップ 3: タスク完了を待機中..."
STATUS=""
POLL_COUNT=0

while [[ "$STATUS" != "completed" && "$STATUS" != "failed" && "$STATUS" != "expired" && "$STATUS" != "cancelled" ]]; do
    sleep 10
    BATCH_INFO=$(curl -s -X GET "${BASE_URL}/batches/${BATCH_ID}" \
      -H "Authorization: Bearer ${API_KEY}")
    STATUS=$(echo $BATCH_INFO | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
    POLL_COUNT=$((POLL_COUNT + 1))
    echo "  [${POLL_COUNT}] タスクステータス: ${STATUS}"
done

echo ""
echo "✓ タスクが完了しました。最終ステータス: ${STATUS}"
echo ""

# ステップ 4: 結果のダウンロード
if [[ "$STATUS" == "completed" ]]; then
    echo "ステップ 4: 結果ファイルをダウンロード中..."

    OUTPUT_FILE_ID=$(echo $BATCH_INFO | grep -o '"output_file_id":"[^"]*"' | cut -d'"' -f4)
    if [[ -n "$OUTPUT_FILE_ID" && "$OUTPUT_FILE_ID" != "null" ]]; then
        echo "  出力ファイル ID: ${OUTPUT_FILE_ID}"

        RESULT_CONTENT=$(curl -s -X GET "${BASE_URL}/files/${OUTPUT_FILE_ID}/content" \
          -H "Authorization: Bearer ${API_KEY}")

        echo ""
        echo "--- 成功した結果(先頭 500 文字) ---"
        echo "${RESULT_CONTENT:0:500}"
        echo "..."
        echo ""
    fi

    ERROR_FILE_ID=$(echo $BATCH_INFO | grep -o '"error_file_id":"[^"]*"' | cut -d'"' -f4)
    if [[ -n "$ERROR_FILE_ID" && "$ERROR_FILE_ID" != "null" ]]; then
        echo "  エラー ファイル ID: ${ERROR_FILE_ID}"

        ERROR_CONTENT=$(curl -s -X GET "${BASE_URL}/files/${ERROR_FILE_ID}/content" \
          -H "Authorization: Bearer ${API_KEY}")

        echo ""
        echo "--- エラー情報 ---"
        echo "${ERROR_CONTENT}"
    fi

    echo ""
    echo "=== テストが正常に完了しました ==="
elif [[ "$STATUS" == "failed" ]]; then
    echo ""
    echo "✗ バッチタスクが失敗しました"
    echo "タスク情報: ${BATCH_INFO}"
    echo ""
    echo "エラーコードのドキュメントをご参照ください: https://www.alibabacloud.com/help/zh/model-studio/developer-reference/error-code"
else
    echo ""
    echo "タスクステータス: ${STATUS}"
fi

ステップ 3: テスト結果の確認

タスクが成功した後、結果ファイル result.jsonl には固定の応答 {"content":"This is a test result."} が含まれます:

{"id":"a2b1ae25-21f4-4d9a-8634-99a29926486c","custom_id":"1","response":{"status_code":200,"request_id":"a2b1ae25-21f4-4d9a-8634-99a29926486c","body":{"created":1743562621,"usage":{"completion_tokens":6,"prompt_tokens":20,"total_tokens":26},"model":"batch-test-model","id":"chatcmpl-bca7295b-67c3-4b1f-8239-d78323bb669f","choices":[{"finish_reason":"stop","index":0,"message":{"content":"This is a test result."}}],"object":"chat.completion"}},"error":null}
{"id":"39b74f09-a902-434f-b9ea-2aaaeebc59e0","custom_id":"2","response":{"status_code":200,"request_id":"39b74f09-a902-434f-b9ea-2aaaeebc59e0","body":{"created":1743562621,"usage":{"completion_tokens":6,"prompt_tokens":20,"total_tokens":26},"model":"batch-test-model","id":"chatcmpl-1e32a8ba-2b69-4dc4-be42-e2897eac9e84","choices":[{"finish_reason":"stop","index":0,"message":{"content":"This is a test result."}}],"object":"chat.completion"}},"error":null}

本番タスクの実行

入力ファイルの要件

  • フォーマット: UTF-8 エンコードの JSONL(1 行につき 1 つの独立した JSON オブジェクト)。

  • サイズ制限: 1 ファイルあたり最大 50,000 リクエスト、ファイルサイズは最大 500 MB。

  • 行数制限: 各 JSON オブジェクトは最大 6 MB かつモデルのコンテキストウィンドウ内であること。

  • 一貫性: 同じファイル内のすべてのリクエストは、同じモデルおよび思考モード(該当する場合)を使用する必要があります。

  • 一意の識別子: 各リクエストには、ファイル内で一意の custom_id フィールドを含める必要があります。これは結果とのマッチングに使用されます。

シナリオ 1: テキストチャット

サンプルファイルの内容:

{"custom_id":"1","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-plus","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"Hello!"}]}}
{"custom_id":"2","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-plus","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"What is 2+2?"}]}}

シナリオ 2: 画像および動画理解

マルチモーダルモデル(例: qwen-vl-plus)では、ファイル URL および Base64 エンコードされた入力がサポートされます。

{"custom_id":"image-url","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"https://dashscope.oss-cn-beijing.aliyuncs.com/images/dog_and_girl.jpeg"}},{"type":"text","text":"Describe this image."}]}]}}
{"custom_id":"image-base64","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEA8ADwAAD..."}},{"type":"text","text":"Describe this image."}]}]}}
{"custom_id":"video-url","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"video","video":"https://example.com/video.mp4"},{"type":"text","text":"Describe this video."}]}]}}
{"custom_id":"video-base64","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"video","video":["data:image/jpeg;base64,{frame1}","data:image/jpeg;base64,{frame2}","data:image/jpeg;base64,{frame3}"]},{"type":"text","text":"Describe this video."}]}]}}
{"custom_id":"multi-image-url","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"https://example.com/image1.jpg"}},{"type":"image_url","image_url":{"url":"https://example.com/image2.jpg"}},{"type":"text","text":"Compare these two images."}]}]}}
{"custom_id":"multi-image-base64","method":"POST","url":"/v1/chat/completions","body":{"model":"qwen-vl-plus","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,{image1_base64}"}},{"type":"image_url","image_url":{"url":"data:image/jpeg;base64,{image2_base64}"}},{"type":"text","text":"Compare these two images."}]}]}}
上記の例の Base64 文字列は省略されています。以下の Python コードを使用して、完全なエンコーディングを生成してください。

Base64 エンコード文字列の渡し方(画像を例に説明)

  1. ローカルファイルを 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/jpegimage/png)と一致させます;

    2. base64_image は、前のステップで生成された Base64 文字列です。

説明

詳細(ファイル制限、MIME タイプ、エンコーディング方法を含む)については、「ローカルファイルの渡し方(Base64 エンコーディングまたはファイルパス)」をご参照ください。

JSONL バッチ生成ツール

このツールを使用して、JSONL ファイルをすばやく生成できます。

JSONL バッチ生成ツール
モードを選択してください:

1. 入力ファイルの変更

  • test_model.jsonl ファイルで、`model` パラメーターを使用するモデルに設定し、`url` フィールドを設定します:

    モデルタイプ

    url

    テキスト生成/マルチモーダルモデル

    /v1/chat/completions

    テキスト埋め込みモデル

    /v1/embeddings

  • または、上記の「JSONL バッチ生成ツール」を使用して、正式なタスク用の新しいファイルを生成してください。model フィールドと url フィールドが正しいことを確認してください。

2. クイックスタートコードの変更

  1. 入力ファイルパスをファイル名に変更します。

  2. エンドポイントパラメーターを、入力ファイル内の url フィールドと一致するように設定します。

3. コードの実行と結果の待機

タスクが完了すると、成功したリクエストの結果はローカルの result.jsonl ファイルに保存されます。失敗したリクエストがある場合は、エラーの詳細が error.jsonl ファイルに保存されます。

  • 成功した結果(output_file_id): 各行は元のリクエスト 1 件に対応し、custom_id および response を含みます。

    {"id":"3a5c39d5-3981-4e4c-97f2-e0e821893f03","custom_id":"req-001","response":{"status_code":200,"request_id":"3a5c39d5-3981-4e4c-97f2-e0e821893f03","body":{"created":1768306034,"usage":{"completion_tokens":654,"prompt_tokens":14,"total_tokens":668},"model":"qwen-plus","id":"chatcmpl-3a5c39d5-3981-4e4c-97f2-e0e821893f03","choices":[{"finish_reason":"stop","index":0,"message":{"role":"assistant","content":"Hello! Hangzhou West Lake is a famous scenic spot in China, located in the western part of Hangzhou City, Zhejiang Province, hence the name \"West Lake\". It is one of China's top ten scenic spots and a World Cultural Heritage site (listed by UNESCO in 2011). It is renowned worldwide for its beautiful natural scenery and profound cultural heritage.\n\n### I. Natural Landscape\nWest Lake is surrounded by mountains on three sides and borders the city on one side, covering an area of approximately 6.39 square kilometers, shaped like a ruyi scepter with rippling blue waters. The lake is naturally or artificially divided into multiple water areas by Solitary Hill, Bai Causeway, Su Causeway, and Yanggong Causeway, forming a layout of \"one mountain, two pagodas, three islands, and three causeways\".\n\nMain attractions include the following:\n- **Spring Dawn at Su Causeway**: During the Northern Song Dynasty, the great literary figure Su Dongpo, while serving as the prefect of Hangzhou, led the dredging of West Lake and used the excavated silt to build a causeway, later named \"Su Causeway\". In spring, peach blossoms and willows create a picturesque scene.\n- **Lingering Snow on Broken Bridge**: Located at the eastern end of Bai Causeway, this is where the reunion scene from the Legend of the White Snake took place. After snowfall in winter, it is particularly famous for its silver-white appearance.\n- **Leifeng Pagoda at Sunset**: Leifeng Pagoda glows golden under the setting sun and was once one of the \"Ten Scenes of West Lake\".\n- **Three Pools Mirroring the Moon**: On Xiaoyingzhou Island in the lake, there are three stone pagodas. During the Mid-Autumn Festival, lanterns can be lit inside the pagodas, creating a harmonious interplay of moonlight, lamplight, and lake reflections.\n- **Autumn Moon over Calm Lake**: Located at the western end of Bai Causeway, it is an excellent spot for viewing the moon over the lake.\n- **Viewing Fish at Flower Harbor**: Known for viewing flowers and fish, with peonies and koi complementing each other beautifully in the garden.\n\n### II. Cultural History\nWest Lake not only boasts beautiful scenery but also carries rich historical and cultural significance:\n- Since the Tang and Song dynasties, numerous literati such as Bai Juyi, Su Dongpo, Lin Bu, and Yang Wanli have left poems here.\n- Bai Juyi oversaw the construction of \"Bai Causeway\" and dredged West Lake, benefiting the local people.\n- Around West Lake are many historical sites, including Yuewang Temple (commemorating national hero Yue Fei), Lingyin Temple (a millennium-old Buddhist temple), Liuhe Pagoda, and Longjing Village (the origin of Longjing tea, one of China's top ten famous teas).\n\n### III. Cultural Symbolism\nWest Lake is regarded as a representative of \"paradise on earth\" and a model of traditional Chinese landscape aesthetics. It embodies the philosophical concept of \"harmony between heaven and humanity\" by integrating natural beauty with cultural depth. Many poems, paintings, and operas feature West Lake, making it an important symbol of Chinese culture.\n\n### IV. Travel Recommendations\n- Best visiting seasons: Spring (March-May) for peach blossoms and willows, Autumn (September-November) for clear skies and cool weather.\n- Recommended ways: Walking, cycling (along the lakeside greenway), or boating on the lake.\n- Local cuisine: West Lake vinegar fish, Longjing shrimp, Dongpo pork, pian'erchuan noodles.\n\nIn summary, Hangzhou West Lake is not just a natural wonder but also a living cultural museum worth exploring in detail. If you ever visit Hangzhou, don't miss this earthly paradise that is \"equally charming in light or heavy makeup\"."}}],"object":"chat.completion"}},"error":null}
    {"id":"628312ba-172c-457d-ba7f-3e5462cc6899","custom_id":"req-002","response":{"status_code":200,"request_id":"628312ba-172c-457d-ba7f-3e5462cc6899","body":{"created":1768306035,"usage":{"completion_tokens":25,"prompt_tokens":18,"total_tokens":43},"model":"qwen-plus","id":"chatcmpl-628312ba-172c-457d-ba7f-3e5462cc6899","choices":[{"finish_reason":"stop","index":0,"message":{"role":"assistant","content":"The spring breeze brushes green willows,\nNight rain nourishes red flowers.\nBird songs fill the forest,\nMountains and rivers share the same beauty."}}],"object":"chat.completion"}},"error":null}
  • 失敗の詳細(error_file_id): 失敗したリクエスト行およびエラー理由に関する情報を含みます。トラブルシューティングについては、「エラーコード」をご参照ください。

詳細な手順

バッチ API のワークフローは、ファイルのアップロード、タスクの作成、タスクステータスの照会、結果のダウンロードの 4 ステップで構成されます。

1. ファイルのアップロード

ファイルアップロード API を使用して JSONL ファイルをアップロードし、file_id を取得します。

ファイルをアップロードする際、purpose パラメーターは必ず batch に設定してください。

OpenAI Python SDK

リクエスト例

import os
from pathlib import Path
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
    # API キーはリージョンによって異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合は: https://dashscope.aliyuncs.com/compatible-mode/v1 および API キーの更新。
    # 注: リージョンを切り替える場合、API キーも同様に更新してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

# test.jsonl はローカルのサンプルファイルです。purpose は batch である必要があります。
file_object = client.files.create(file=Path("test.jsonl"), purpose="batch")

print(file_object.model_dump_json())

OpenAI Node.js SDK

リクエスト例

/**
 * Model Studio バッチ API - ファイルのアップロード
 * 
 * 環境変数が設定されていない場合は、apiKey: 'sk-xxx' を使用します(本番環境では使用しないでください。漏洩のリスクがあります)。
 * API キーはリージョンによって異なります。
 * 
 * 依存関係のインストール: npm install openai
 */
const OpenAI = require('openai');
const fs = require('fs');

// シンガポールリージョンの構成(デフォルト)
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を以下で置き換えます:
// const BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
// 注: リージョンを切り替える場合は、API キーもそれに応じて更新してください。

const apiKey = process.env.DASHSCOPE_API_KEY;
if (!apiKey) {
    console.error('エラー: 環境変数 DASHSCOPE_API_KEY を設定してください');
    console.error('または、コード内で次のように設定します: const apiKey = "sk-xxx";');
    process.exit(1);
}

const client = new OpenAI({
    apiKey: apiKey,
    baseURL: BASE_URL
});

const fileStream = fs.createReadStream('test.jsonl');
const fileObject = await client.files.create({
    file: fileStream,
    purpose: 'batch'
});
console.log(fileObject.id);

Java(HTTP)

リクエスト例

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Model Studio バッチ API - ファイルのアップロード
 * 
 * 環境変数が設定されていない場合は、API_KEY = "sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * リージョン構成:
 * - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
 * 注: リージョンを切り替える場合、API キーも同様に更新してください。
 */
public class BatchAPIUploadFile {
    
    // シンガポールリージョンの構成
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京の場合は: private static final String BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"; および API キーの更新。
    
    private static String API_KEY;
    
    public static void main(String[] args) throws Exception {
        API_KEY = System.getenv("DASHSCOPE_API_KEY");
        if (API_KEY == null || API_KEY.isEmpty()) {
            System.err.println("エラー: 環境変数 DASHSCOPE_API_KEY を設定してください");
            System.err.println("またはコード内で API_KEY = \"sk-xxx\"; と設定");
            System.exit(1);
        }
        
String fileId = uploadFile("test.jsonl");
        System.out.println("ファイル ID: " + fileId);
    }
    
    // === ユーティリティメソッド ===
    
    private static String uploadFile(String filePath) throws Exception {
        String boundary = "----WebKitFormBoundary" + System.currentTimeMillis();
        URL url = new URL(BASE_URL + "/files");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

        try (DataOutputStream out = new DataOutputStream(conn.getOutputStream())) {
            // purpose フィールドの追加
            out.writeBytes("--" + boundary + "\r\n");
            out.writeBytes("Content-Disposition: form-data; name=\"purpose\"\r\n\r\n");
            out.writeBytes("batch\r\n");

            // ファイルの追加
            out.writeBytes("--" + boundary + "\r\n");
            out.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + filePath + "\"\r\n");
            out.writeBytes("Content-Type: application/octet-stream\r\n\r\n");

            byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
            out.write(fileBytes);
            out.writeBytes("\r\n");
            out.writeBytes("--" + boundary + "--\r\n");
        }

        String response = readResponse(conn);
        return parseField(response, "\"id\":\\s*\"([^\"]+)\"");
    }
    
    private static String readResponse(HttpURLConnection conn) throws Exception {
        int responseCode = conn.getResponseCode();
        InputStream is = (responseCode < 400) ? conn.getInputStream() : conn.getErrorStream();
        try (Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
    
    private static String parseField(String json, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }
}

curl(HTTP)

リクエスト例

# ======= 重要 =======
# API キーはシンガポールと北京のリージョンで異なります。
# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/files に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/files \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
--form 'file=@"test.jsonl"' \
--form 'purpose="batch"'

レスポンス例

{
    "id": "file-batch-xxx",
    "bytes": 437,
    "created_at": 1742304153,
    "filename": "test.jsonl",
    "object": "file",
    "purpose": "batch",
    "status": "processed",
    "status_details": null
}

2. バッチタスクの作成

ファイルアップロードステップから返されたファイル IDを使用してバッチタスクを作成します。

OpenAI Python SDK

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
    # API キーはリージョンによって異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合は: https://dashscope.aliyuncs.com/compatible-mode/v1 および API キーの更新。
    # 注: リージョンを切り替える場合、API キーも同様に更新してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)

batch = client.batches.create(
    input_file_id="file-batch-xxx",  # ファイルアップロード後に返される ID
    endpoint="/v1/chat/completions",  # テストモデル batch-test-model の場合は /v1/chat/ds-test。テキスト埋め込みモデルの場合は /v1/embeddings。テキスト生成/マルチモーダルモデルの場合は /v1/chat/completions。
    completion_window="24h",
    metadata={'ds_name':"タスク名",'ds_description':'タスクの説明'} # タスク名と説明を作成するためのオプションのメタデータフィールド
)
print(batch)

OpenAI Node.js SDK

リクエスト例

/**
 * Model Studio バッチ API - バッチタスクの作成
 * 
 * 環境変数が設定されていない場合は、apiKey: 'sk-xxx' を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * 依存関係のインストール: npm install openai
 */
const OpenAI = require('openai');

// シンガポールリージョンの構成(デフォルト)
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換え:
// const BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
// 注: リージョンを切り替える場合、API キーも同様に更新してください。

const apiKey = process.env.DASHSCOPE_API_KEY;
if (!apiKey) {
    console.error('エラー: 環境変数 DASHSCOPE_API_KEY を設定してください');
    console.error('またはコード内で const apiKey = "sk-xxx"; と設定');
    process.exit(1);
}

const client = new OpenAI({
    apiKey: apiKey,
    baseURL: BASE_URL
});

const batch = await client.batches.create({
    input_file_id: 'file-batch-xxx',
    endpoint: '/v1/chat/completions',
    completion_window: '24h',
    metadata: {'ds_name': 'タスク名', 'ds_description': 'タスクの説明'}
});
console.log(batch.id);

Java(HTTP)

リクエスト例

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Model Studio バッチ API - バッチタスクの作成
 * 
 * 環境変数が設定されていない場合は、API_KEY = "sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * リージョン構成:
 * - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
 * 注: リージョンを切り替える場合、API キーも同様に更新してください。
 */
public class BatchAPICreateBatch {
    
    // シンガポールリージョンの構成(デフォルト)
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京の場合は: private static final String BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"; および API キーの更新。
    
    private static String API_KEY;
    
    public static void main(String[] args) throws Exception {
        API_KEY = System.getenv("DASHSCOPE_API_KEY");
        if (API_KEY == null || API_KEY.isEmpty()) {
            System.err.println("エラー: 環境変数 DASHSCOPE_API_KEY を設定してください");
            System.err.println("またはコード内で API_KEY = \"sk-xxx\"; と設定");
            System.exit(1);
        }
        
        String jsonBody = "{\"input_file_id\":\"file-batch-xxx\",\"endpoint\":\"/v1/chat/completions\",\"completion_window\":\"24h\",\"metadata\":{\"ds_name\":\"タスク名\",\"ds_description\":\"タスクの説明\"}}";
String response = sendRequest("POST", "/batches", jsonBody);
        String batchId = parseField(response, "\"id\":\\s*\"([^\"]+)\"");
        System.out.println("バッチタスク ID: " + batchId);
    }
    
    // === ユーティリティメソッド ===
    
    private static String sendRequest(String method, String path, String jsonBody) throws Exception {
        URL url = new URL(BASE_URL + path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
        
        if (jsonBody != null) {
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "application/json");
            try (OutputStream os = conn.getOutputStream()) {
                os.write(jsonBody.getBytes("UTF-8"));
            }
        }
        
        return readResponse(conn);
    }
    
    private static String readResponse(HttpURLConnection conn) throws Exception {
        int responseCode = conn.getResponseCode();
        InputStream is = (responseCode < 400) ? conn.getInputStream() : conn.getErrorStream();
        try (Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
    
    private static String parseField(String json, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }
}

curl(HTTP)

リクエスト例

# ======= 重要 =======
# API キーはシンガポールと北京のリージョンで異なります。
# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/batches に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl -X POST https://dashscope-intl.aliyuncs.com/compatible-mode/v1/batches \
  -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_file_id": "file-batch-xxx",
    "endpoint": "/v1/chat/completions",
    "completion_window": "24h",
    "metadata":{"ds_name":"タスク名","ds_description":"タスクの説明"}
  }'

入力パラメーター

フィールド

タイプ

パラメーター渡し

メソッド

必須

説明

input_file_id

String

Body

はい

入力ファイル ID。

ファイルの準備とアップロード API によって返されるファイル ID(例: file-batch-xxx)を使用します。

endpoint

String

Body

はい

アクセスパス。入力ファイル内の url フィールドと一致する必要があります。

  • テストモデル batch-test-model の場合は、/v1/chat/ds-test を入力します

  • その他のモデルの場合は、/v1/chat/completions を入力します

completion_window

String

Body

はい

最大待機時間。範囲: 24h–336h、整数のみ。

単位: "h" または "d"(例: "24h" または "14d")。

metadata

Map

Body

いいえ

タスクの拡張メタデータ。キーと値のペアとしてアタッチされます。

metadata.ds_name

String

Body

いいえ

タスク名。

例: "ds_name": "バッチタスク"

制限: 長さは 100 文字を超えることはできません。

このフィールドが複数回定義された場合、最後に渡された値が使用されます。

metadata.ds_description

String

Body

いいえ

タスクの説明。

例: "ds_description": "バッチ推論タスクテスト"

制限: 長さは 200 文字を超えることはできません。

このフィールドが複数回定義された場合、最後に渡された値が使用されます。

レスポンス例

{
    "id": "batch_xxx",
    "object": "batch",
    "endpoint": "/v1/chat/completions",
    "errors": null,
    "input_file_id": "file-batch-xxx",
    "completion_window": "24h",
    "status": "validating",
    "output_file_id": null,
    "error_file_id": null,
    "created_at": 1742367779,
    "in_progress_at": null,
    "expires_at": null,
    "finalizing_at": null,
    "completed_at": null,
    "failed_at": null,
    "expired_at": null,
    "cancelling_at": null,
    "cancelled_at": null,
    "request_counts": {
        "total": 0,
        "completed": 0,
        "failed": 0
    },
    "metadata": {
        "ds_name": "タスク名",
        "ds_description": "タスクの説明"
    }
}

レスポンスパラメーター

フィールド

タイプ

説明

id

String

バッチタスク ID。

object

String

固定値: batch

endpoint

String

アクセスパス。

errors

Map

エラーメッセージ。

input_file_id

String

ファイル ID。

completion_window

String

最大待機時間。範囲: 24h–336h、整数のみ。

単位: "h" または "d"(例: "24h" または "14d")。

status

String

タスクステータス: validating、failed、in_progress、finalizing、completed、expired、cancelling、cancelled。

output_file_id

String

成功したリクエストの出力ファイル ID。

error_file_id

String

失敗したリクエストの出力ファイル ID。

created_at

Integer

タスクが作成されたときの UNIX タイムスタンプ(秒)。

in_progress_at

Integer

タスクが実行を開始したときの UNIX タイムスタンプ(秒)。

expires_at

Integer

タスクがタイムアウトを開始するタイムスタンプ(秒)。

finalizing_at

Integer

タスクが最後に開始されたタイムスタンプ(秒)。

completed_at

Integer

タスクが完了したタイムスタンプ(秒)。

failed_at

Integer

タスクが失敗したタイムスタンプ(秒)。

expired_at

Integer

タスクが期限切れになったタイムスタンプ(秒)。

cancelling_at

Integer

タスクがキャンセル中に設定されたタイムスタンプ(秒)。

cancelled_at

Integer

タスクがキャンセルされたタイムスタンプ(秒)。

request_counts

Map

異なる状態のリクエスト数。

metadata

Map

追加情報、キーと値のペア。

metadata.ds_name

String

タスク名。

metadata.ds_description

String

タスクの説明。

3. バッチタスクの照会と管理

タスクを作成した後、以下の API を使用してステータスを照会したり、履歴タスクを一覧表示したり、進行中のタスクをキャンセルしたりできます。

特定のタスクステータスの照会

ID でバッチタスクを照会します。過去 30 日以内に作成されたタスクのみ照会できます。

OpenAI Python SDK

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
    # API キーはリージョンによって異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合は: https://dashscope.aliyuncs.com/compatible-mode/v1 および API キーの更新。
    # 注: リージョンを切り替える場合、API キーも同様に更新してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
batch = client.batches.retrieve("batch_id")  # batch_id をバッチタスク ID に置き換える
print(batch)

OpenAI Node.js SDK

リクエスト例

/**
 * Model Studio バッチ API - 単一タスクの照会
 * 
 * 環境変数が設定されていない場合は、apiKey: 'sk-xxx' を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * 依存関係のインストール: npm install openai
 */
const OpenAI = require('openai');

// シンガポールリージョンの構成(デフォルト)
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換え:
// const BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
// 注: リージョンを切り替える場合、API キーも同様に更新してください。

const apiKey = process.env.DASHSCOPE_API_KEY;
if (!apiKey) {
    console.error('エラー: 環境変数 DASHSCOPE_API_KEY を設定してください');
    console.error('またはコード内で const apiKey = "sk-xxx"; と設定');
    process.exit(1);
}

const client = new OpenAI({
    apiKey: apiKey,
    baseURL: BASE_URL
});

const batch = await client.batches.retrieve('batch_id');
console.log(batch.status);

Java(HTTP)

リクエスト例

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Model Studio バッチ API - 単一タスクの照会
 * 
 * 環境変数が設定されていない場合は、API_KEY = "sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * リージョン構成:
 * - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
 * 注: リージョンを切り替える場合、API キーも同様に更新してください。
 */
public class BatchAPIRetrieveBatch {
    
    // シンガポールリージョンの構成
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京の場合は: private static final String BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"; および API キーの更新。
    
    private static String API_KEY;
    
    public static void main(String[] args) throws Exception {
        API_KEY = System.getenv("DASHSCOPE_API_KEY");
        if (API_KEY == null || API_KEY.isEmpty()) {
            System.err.println("エラー: 環境変数 DASHSCOPE_API_KEY を設定してください");
            System.err.println("またはコード内で API_KEY = \"sk-xxx\"; と設定");
            System.exit(1);
        }
        
        String batchInfo = sendRequest("GET", "/batches/batch_id", null);
        String status = parseField(batchInfo, "\"status\":\\s*\"([^\"]+)\"");
        System.out.println("タスクステータス: " + status);
    }
    
    // === ユーティリティメソッド ===
    
    private static String sendRequest(String method, String path, String jsonBody) throws Exception {
        URL url = new URL(BASE_URL + path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
        
        if (jsonBody != null) {
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "application/json");
            try (OutputStream os = conn.getOutputStream()) {
                os.write(jsonBody.getBytes("UTF-8"));
            }
        }
        
        return readResponse(conn);
    }
    
    private static String readResponse(HttpURLConnection conn) throws Exception {
        int responseCode = conn.getResponseCode();
        InputStream is = (responseCode < 400) ? conn.getInputStream() : conn.getErrorStream();
        try (Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
    
    private static String parseField(String json, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }
}

curl(HTTP)

リクエスト例

# ======= 重要 =======
# API キーはシンガポールと北京のリージョンで異なります。
# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/batches/batch_id に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl --request GET 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/batches/batch_id' \
 -H "Authorization: Bearer $DASHSCOPE_API_KEY"

レスポンス例

成功したクエリは、バッチタスクの詳細情報を返します。以下は、ステータスが完了したタスクのレスポンス例です:

{
  "id": "batch_abc123",
  "object": "batch",
  "endpoint": "/v1/chat/completions",
  "errors": null,
  "input_file_id": "file-abc123",
  "completion_window": "24h",
  "status": "completed",
  "output_file_id": "file-batch_output-xyz789",
  "error_file_id": "file-batch_error-xyz789",
  "created_at": 1711402400,
  "in_progress_at": 1711402450,
  "expires_at": 1711488800,
  "finalizing_at": 1711405000,
  "completed_at": 1711406000,
  "failed_at": null,
  "expired_at": null,
  "cancelling_at": null,
  "cancelled_at": null,
  "request_counts": {
    "total": 100,
    "completed": 95,
    "failed": 5
  },
  "metadata": {
    "customer_id": "user_123456789",
    "batch_description": "Nightly eval job"
  }
}

フィールドの説明については、以下の表をご参照ください。

フィールド

タイプ

説明

id

String

バッチタスク ID。

status

String

タスクステータス。可能な値は以下の通りです:

  • validating: 入力ファイルを検証中。

  • in_progress: タスクを処理中。

  • finalizing: タスク処理が完了し、出力ファイルを生成中。

  • completed: タスクが正常に完了しました。

  • failed: 重大なエラーによりタスクが失敗しました。

  • expired: completion_window 内に完了できなかったため、タスクが期限切れになりました。

  • cancelling: タスクをキャンセル中。

  • cancelled: タスクはキャンセルされました。

output_file_id

String

成功結果ファイルの ID。タスク完了後に生成されます。

error_file_id

String

失敗結果ファイルの ID。失敗したリクエストがある場合にタスク完了後に生成されます。

request_counts

Object

合計、完了、失敗のカウントを含む統計オブジェクト。

タスクリストの照会

batches.list() メソッドを使用して、バッチタスクのリストを照会します。ページネーションを使用して、完全なタスクリストを取得します。

OpenAI Python SDK

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
    # API キーはリージョンによって異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合は: https://dashscope.aliyuncs.com/compatible-mode/v1 および API キーの更新。
    # 注: リージョンを切り替える場合、API キーも同様に更新してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
batches = client.batches.list(after="batch_xxx", limit=2,extra_query={'ds_name':'タスク名','input_file_ids':'file-batch-xxx,file-batch-xxx','status':'completed,expired','create_after':'20250304000000','create_before':'20250306123000'})
print(batches)

OpenAI Node.js SDK

リクエスト例

/**
 * Model Studio バッチ API - タスクリストの照会
 * 
 * 環境変数が設定されていない場合は、apiKey: 'sk-xxx' を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * 依存関係のインストール: npm install openai
 */
const OpenAI = require('openai');

// シンガポールリージョンの構成(デフォルト)
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換え:
// const BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
// 注: リージョンを切り替える場合、API キーも同様に更新してください。

const apiKey = process.env.DASHSCOPE_API_KEY;
if (!apiKey) {
    console.error('エラー: 環境変数 DASHSCOPE_API_KEY を設定してください');
    console.error('またはコード内で const apiKey = "sk-xxx"; と設定');
    process.exit(1);
}

const client = new OpenAI({
    apiKey: apiKey,
    baseURL: BASE_URL
});

const batches = await client.batches.list({
    after: 'batch_xxx',
    limit: 2,
    extra_query: {
        'ds_name': 'タスク名',
        'input_file_ids': 'file-batch-xxx,file-batch-xxx',
        'status': 'completed,expired',
        'create_after': '20250304000000',
        'create_before': '20250306123000'
    }
});

for (const batch of batches.data) {
    console.log(batch.id, batch.status);
}

Java(HTTP)

リクエスト例

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Model Studio バッチ API - タスクリストの照会
 * 
 * 環境変数が設定されていない場合は、API_KEY = "sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * リージョン構成:
 * - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
 * 注: リージョンを切り替える場合、API キーも同様に更新してください。
 */
public class BatchAPIListBatches {
    
    // シンガポールリージョンの構成
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京の場合は: private static final String BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"; および API キーの更新。
    
    private static String API_KEY;
    
    public static void main(String[] args) throws Exception {
        API_KEY = System.getenv("DASHSCOPE_API_KEY");
        if (API_KEY == null || API_KEY.isEmpty()) {
            System.err.println("エラー: 環境変数 DASHSCOPE_API_KEY を設定してください");
            System.err.println("またはコード内で API_KEY = \"sk-xxx\"; と設定");
            System.exit(1);
        }
        
        String response = sendRequest("GET", "/batches?after=batch_xxx&limit=2&ds_name=Batch&input_file_ids=file-batch-xxx,file-batch-xxx&status=completed,failed&create_after=20250303000000&create_before=20250320000000", null);
// JSON を解析してタスクリストを取得
        System.out.println(response);
    }
    
    // === ユーティリティメソッド ===
    
    private static String sendRequest(String method, String path, String jsonBody) throws Exception {
        URL url = new URL(BASE_URL + path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
        
        if (jsonBody != null) {
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "application/json");
            try (OutputStream os = conn.getOutputStream()) {
                os.write(jsonBody.getBytes("UTF-8"));
            }
        }
        
        return readResponse(conn);
    }
    
    private static String readResponse(HttpURLConnection conn) throws Exception {
        int responseCode = conn.getResponseCode();
        InputStream is = (responseCode < 400) ? conn.getInputStream() : conn.getErrorStream();
        try (Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
    
    private static String parseField(String json, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }
}

curl(HTTP)

リクエスト例

# ======= 重要 =======
# API キーはシンガポールと北京のリージョンで異なります。
# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/batches?xxx same as below xxx に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl --request GET  'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/batches?after=batch_xxx&limit=2&ds_name=Batch&input_file_ids=file-batch-xxx,file-batch-xxx&status=completed,failed&create_after=20250303000000&create_before=20250320000000' \
 -H "Authorization: Bearer $DASHSCOPE_API_KEY"
after=batch_idbatch_id を実際の値に置き換えてください。limit パラメーターには返すタスク数を設定します。ds_name にはタスク名の一部を入力します。input_file_ids には 1 つ以上のファイル ID を入力します。status には 1 つ以上のバッチタスクステータスを入力します。create_aftercreate_before には時点を入力します。

入力パラメーター

フィールド

タイプ

パラメーター渡し方法

必須

説明

after

String

Query

いいえ

ページネーション用カーソル。値は、前のページの最後のタスク ID です。

limit

Integer

Query

いいえ

1 ページあたりに返すタスク数。範囲 [1, 100]、デフォルト 20。

ds_name

String

Query

いいえ

タスク名によるあいまい一致。

input_file_ids

String

Query

いいえ

ファイル ID でフィルターします。カンマ区切りで最大 20 個の ID。

status

String

Query

いいえ

タスクステータスでフィルタリング。複数のステータスはカンマで区切ります。

create_after

String

Query

いいえ

この時刻以降に作成されたタスクをフィルターします。フォーマット: yyyyMMddHHmmss

create_before

String

Query

いいえ

この時刻より前に作成されたタスクをフィルターします。フォーマット: yyyyMMddHHmmss

レスポンス例

{
  "object": "list",
  "data": [
    {
      "id": "batch_xxx",
      "object": "batch",
      "endpoint": "/v1/chat/completions",
      "errors": null,
      "input_file_id": "file-batch-xxx",
      "completion_window": "24h",
      "status": "completed",
      "output_file_id": "file-batch_output-xxx",
      "error_file_id": null,
      "created_at": 1722234109,
      "in_progress_at": 1722234109,
      "expires_at": null,
      "finalizing_at": 1722234165,
      "completed_at": 1722234165,
      "failed_at": null,
      "expired_at": null,
      "cancelling_at": null,
      "cancelled_at": null,
      "request_counts": {
        "total": 100,
        "completed": 95,
        "failed": 5
      },
      "metadata": {}
    },
    { ... }
  ],
  "first_id": "batch_xxx",
  "last_id": "batch_xxx",
  "has_more": true
}

レスポンスパラメーター

フィールド

タイプ

説明

object

String

タイプ、固定値リスト。

data

Array

バッチタスクオブジェクト。バッチタスク作成時のレスポンスパラメーターをご参照ください。

first_id

String

現在のページの最初のバッチタスク ID。

last_id

String

現在のページの最後のバッチタスク ID。

has_more

Boolean

次のページがあるかどうかを示します。

バッチタスクのキャンセル

進行中またはキューに入っているタスクをキャンセルします。呼び出しが成功すると、タスクステータスは cancelling に変わり、その後 cancelled になります。完全なキャンセル前に完了したタスクの部分については、引き続き請求されます。

OpenAI Python SDK

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
    # API キーはリージョンによって異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合は: https://dashscope.aliyuncs.com/compatible-mode/v1 および API キーの更新。
    # 注: リージョンを切り替える場合、API キーも同様に更新してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
batch = client.batches.cancel("batch_id")  # batch_id をバッチタスク ID に置き換える
print(batch)

OpenAI Node.js SDK

リクエスト例

/**
 * Model Studio バッチ API - タスクのキャンセル
 * 
 * 環境変数が設定されていない場合は、apiKey: 'sk-xxx' を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * 依存関係のインストール: npm install openai
 */
const OpenAI = require('openai');

// シンガポールリージョンの構成(デフォルト)
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換え:
// const BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
// 注: リージョンを切り替える場合、API キーも同様に更新してください。

const apiKey = process.env.DASHSCOPE_API_KEY;
if (!apiKey) {
    console.error('エラー: 環境変数 DASHSCOPE_API_KEY を設定してください');
    console.error('またはコード内で const apiKey = "sk-xxx"; と設定');
    process.exit(1);
}

const client = new OpenAI({
    apiKey: apiKey,
    baseURL: BASE_URL
});

const batch = await client.batches.cancel('batch_id');
console.log(batch.status); // cancelled

Java(HTTP)

リクエスト例

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Model Studio バッチ API - タスクのキャンセル
 * 
 * 環境変数が設定されていない場合は、API_KEY = "sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * リージョン構成:
 * - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
 * 注: リージョンを切り替える場合、API キーも同様に更新してください。
 */
public class BatchAPICancelBatch {
    
    // シンガポールリージョンの構成
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京の場合は: private static final String BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"; および API キーの更新。
    
    private static String API_KEY;
    
    public static void main(String[] args) throws Exception {
        API_KEY = System.getenv("DASHSCOPE_API_KEY");
        if (API_KEY == null || API_KEY.isEmpty()) {
            System.err.println("エラー: 環境変数 DASHSCOPE_API_KEY を設定してください");
            System.err.println("またはコード内で API_KEY = \"sk-xxx\"; と設定");
            System.exit(1);
        }
        
        String response = sendRequest("POST", "/batches/batch_id/cancel", null);
        System.out.println(response);
    }
    
    // === ユーティリティメソッド ===
    
    private static String sendRequest(String method, String path, String jsonBody) throws Exception {
        URL url = new URL(BASE_URL + path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
        
        if (jsonBody != null) {
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "application/json");
            try (OutputStream os = conn.getOutputStream()) {
                os.write(jsonBody.getBytes("UTF-8"));
            }
        }
        
        return readResponse(conn);
    }
    
    private static String readResponse(HttpURLConnection conn) throws Exception {
        int responseCode = conn.getResponseCode();
        InputStream is = (responseCode < 400) ? conn.getInputStream() : conn.getErrorStream();
        try (Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
    
    private static String parseField(String json, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }
}

curl(HTTP)

リクエスト例

# ======= 重要 =======
# API キーはシンガポールと北京のリージョンで異なります。
# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/batches/batch_id/cancel に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl --request POST 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1/batches/batch_id/cancel' \
 -H "Authorization: Bearer $DASHSCOPE_API_KEY"
batch_id を実際の値に置き換えてください。

レスポンス例

タスクを正常にキャンセルした後、API はバッチタスクの詳細情報を返します。以下は、ステータスが cancelling のタスクのレスポンス例です:

{
  "id": "batch_abc123",
  "object": "batch",
  "endpoint": "/v1/chat/completions",
  "errors": null,
  "input_file_id": "file-abc123",
  "completion_window": "24h",
  "status": "cancelling",
  "output_file_id": null,
  "error_file_id": null,
  "created_at": 1711402400,
  "in_progress_at": 1711402450,
  "expires_at": 1711488800,
  "finalizing_at": null,
  "completed_at": null,
  "failed_at": null,
  "expired_at": null,
  "cancelling_at": 1711403000,
  "cancelled_at": null,
  "request_counts": {
    "total": 100,
    "completed": 23,
    "failed": 1
  },
  "metadata": null
}
タスクをキャンセルすると、ステータスはまず cancelling に変わり、システムが現在実行中のリクエストの完了を待ちます。ステータスは最終的に cancelled に変わります。完了したリクエストの結果は、引き続き出力ファイルに保存されます。

4. バッチ結果ファイルのダウンロード

タスクが完了すると、結果ファイル(output_file_id)とエラーファイル(error_file_id)が生成される場合があります。両方のタイプのファイルは、同じファイルダウンロード API を使用して取得します。

file_idfile-batch_output で始まるファイルのみダウンロードできます。

OpenAI Python SDK

content メソッドを使用してバッチタスク結果ファイルの内容を取得し、write_to_file メソッドを使用して内容をローカルファイルに保存します。

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
    # API キーはリージョンによって異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合は: https://dashscope.aliyuncs.com/compatible-mode/v1 および API キーの更新。
    # 注: リージョンを切り替える場合、API キーも同様に更新してください。
    base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
)
content = client.files.content(file_id="file-batch_output-xxx")
# 結果ファイルの内容を表示
print(content.text)
# 結果ファイルをローカルに保存
content.write_to_file("result.jsonl")

レスポンス例

{"id":"c308ef7f-xxx","custom_id":"1","response":{"status_code":200,"request_id":"c308ef7f-0824-9c46-96eb-73566f062426","body":{"created":1742303743,"usage":{"completion_tokens":35,"prompt_tokens":26,"total_tokens":61},"model":"qwen-plus","id":"chatcmpl-c308ef7f-0824-9c46-96eb-73566f062426","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Hello! Of course. Whether you need information, learning materials, problem-solving methods, or any other help, I am here to support you. Please tell me what you need help with."}}],"object":"chat.completion"}},"error":null}
{"id":"73291560-xxx","custom_id":"2","response":{"status_code":200,"request_id":"73291560-7616-97bf-87f2-7d747bbe84fd","body":{"created":1742303743,"usage":{"completion_tokens":7,"prompt_tokens":26,"total_tokens":33},"model":"qwen-plus","id":"chatcmpl-73291560-7616-97bf-87f2-7d747bbe84fd","choices":[{"finish_reason":"stop","index":0,"message":{"content":"2+2 equals 4."}}],"object":"chat.completion"}},"error":null}

OpenAI Node.js SDK

content メソッドを使用して、バッチタスク結果ファイルの内容を取得します。

リクエスト例

/**
 * Model Studio バッチ API - 結果ファイルのダウンロード
 * 
 * 環境変数が設定されていない場合は、apiKey: 'sk-xxx' を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * 依存関係のインストール: npm install openai
 */
const OpenAI = require('openai');
const fs = require('fs');

// シンガポールリージョンの構成(デフォルト)
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換え:
// const BASE_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
// 注: リージョンを切り替える場合、API キーも同様に更新してください。

const apiKey = process.env.DASHSCOPE_API_KEY;
if (!apiKey) {
    console.error('エラー: 環境変数 DASHSCOPE_API_KEY を設定してください');
    console.error('またはコード内で const apiKey = "sk-xxx"; と設定');
    process.exit(1);
}

const client = new OpenAI({
    apiKey: apiKey,
    baseURL: BASE_URL
});

// 結果ファイルのダウンロード
const content = await client.files.content('file-batch_output-xxx');
const text = await content.text();
console.log(text);

// ローカルファイルに保存
fs.writeFileSync('result.jsonl', text);
console.log('結果が result.jsonl に保存されました');

Java(HTTP)

/files/{file_id}/content エンドポイントへの GET リクエストを使用して、ファイルの内容を取得します。

リクエスト例

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * Model Studio バッチ API - 結果ファイルのダウンロード
 * 
 * 環境変数が設定されていない場合は、API_KEY = "sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
 * API キーはリージョンによって異なります。
 * 
 * リージョン構成:
 * - 北京リージョン: https://dashscope.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン: https://dashscope-intl.aliyuncs.com/compatible-mode/v1
 * 注: リージョンを切り替える場合、API キーも同様に更新してください。
 */
public class BatchAPIDownloadFile {
    
    // シンガポールリージョンの構成
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京の場合は: private static final String BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"; および API キーの更新。
    
    private static String API_KEY;
    
    public static void main(String[] args) throws Exception {
        API_KEY = System.getenv("DASHSCOPE_API_KEY");
        if (API_KEY == null || API_KEY.isEmpty()) {
            System.err.println("エラー: 環境変数 DASHSCOPE_API_KEY を設定してください");
            System.err.println("またはコード内で API_KEY = \"sk-xxx\"; と設定");
            System.exit(1);
        }

// 結果ファイルのダウンロード
String content = sendRequest("GET", "/files/file-batch_output-xxx/content", null);
System.out.println(content);

// ローカルファイルに保存
        Files.write(Paths.get("result.jsonl"), content.getBytes());
        System.out.println("結果が result.jsonl に保存されました");
    }
    
    // === ユーティリティメソッド ===
    
    private static String sendRequest(String method, String path, String jsonBody) throws Exception {
        URL url = new URL(BASE_URL + path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod(method);
        conn.setRequestProperty("Authorization", "Bearer " + API_KEY);
        
        if (jsonBody != null) {
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-Type", "application/json");
            try (OutputStream os = conn.getOutputStream()) {
                os.write(jsonBody.getBytes("UTF-8"));
            }
        }
        
        return readResponse(conn);
    }
    
    private static String readResponse(HttpURLConnection conn) throws Exception {
        int responseCode = conn.getResponseCode();
        InputStream is = (responseCode < 400) ? conn.getInputStream() : conn.getErrorStream();
        try (Scanner scanner = new Scanner(is, "UTF-8").useDelimiter("\\A")) {
            return scanner.hasNext() ? scanner.next() : "";
        }
    }
    
    private static String parseField(String json, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(json);
        return matcher.find() ? matcher.group(1) : null;
    }
}

curl(HTTP)

GET リクエストで file_id を指定して結果ファイルをダウンロードします。

リクエスト例

# ======= 重要 =======
# API キーはシンガポールと北京のリージョンで異なります。
# 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1/files/file-batch_output-xxx/content に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl -X GET https://dashscope-intl.aliyuncs.com/compatible-mode/v1/files/file-batch_output-xxx/content \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" > result.jsonl

レスポンス例

単一のレスポンスの例:

{
    "id": "c308ef7f-xxx",
    "custom_id": "1",
    "response": {
        "status_code": 200,
        "request_id": "c308ef7f-0824-9c46-96eb-73566f062426",
        "body": {
            "created": 1742303743,
            "usage": {
                "completion_tokens": 35,
                "prompt_tokens": 26,
                "total_tokens": 61
            },
            "model": "qwen-plus",
            "id": "chatcmpl-c308ef7f-0824-9c46-96eb-73566f062426",
            "choices": [
                {
                    "finish_reason": "stop",
                    "index": 0,
                    "message": {
                        "content": "Hello! Of course. Whether you need information, learning materials, problem-solving methods, or any other help, I am here to support you. Please tell me what you need help with."
                    }
                }
            ],
            "object": "chat.completion"
        }
    },
    "error": null
}

レスポンスパラメーター

フィールド

タイプ

説明

id

String

リクエスト ID。

custom_id

String

ユーザー定義 ID。

response

Object

リクエスト結果。

status_code

Integer

ステータスコード。200 はリクエストが成功したことを示します。

request_id

String

このリクエストに対してサーバーによって生成された一意の ID。

completion_tokens

Integer

モデルが生成した返信(completion)によって消費されたトークン数。

prompt_tokens

Integer

モデルに送信された入力コンテンツ(prompt)によって消費されたトークン数。

total_tokens

Integer

この呼び出しで消費された合計トークン数。

model

String

この呼び出しで使用されたモデルの名前。

error

Object

エラーオブジェクト。成功時は null です。失敗時は、エラーコードと詳細メッセージが含まれます。

error.code

String

エラー行の情報と理由。トラブルシューティングについては、「エラーコード」をご参照ください。

error.message

String

エラーメッセージ。

高度な機能

完了通知の設定

長時間実行されるタスクには、リソースを節約するためにポーリングの代わりに非同期通知を使用します。

説明

完了通知は北京リージョンでのみサポートされています。

  • コールバック: タスク作成時に公開アクセス可能な URL を指定します。

  • EventBridge メッセージキュー: Alibaba Cloud エコシステムと深く統合されており、パブリック IP は不要です。

方法 1: コールバック

タスク作成時に、metadata を介して公開アクセス可能な URL を指定します。タスク完了後、システムはタスクステータスを含む POST リクエストを指定された URL に送信します:

OpenAI Python SDK

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用(本番環境では漏洩リスクを避けるため使用しないでください)。
    # API キーはリージョンによって異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"), 
    # 北京リージョンの base_url。シンガポールの場合は: https://dashscope-intl.aliyuncs.com/compatible-mode/v1 および API キーの更新。
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

batch = client.batches.create(
    input_file_id="file-batch-xxx",  # ファイルアップロード後に返される ID
    endpoint="/v1/chat/completions",  # テキスト埋め込みモデルの場合は "/v1/embeddings" を入力。テストモデル batch-test-model の場合は /v1/chat/ds-test を入力。その他のモデルの場合は /v1/chat/completions を入力。
    completion_window="24h", 
    metadata={
            "ds_batch_finish_callback": "https://xxx/xxx"
          }
)
print(batch)

curl(HTTP)

リクエスト例

curl -X POST --location "https://dashscope.aliyuncs.com/compatible-mode/v1/batches" \
    -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
          "input_file_id": "file-batch-xxxxx",
          "endpoint": "/v1/chat/completions",
          "completion_window": "24h",
          "metadata": {
            "ds_batch_finish_callback": "https://xxx/xxx"
          }
        }'

方法 2: EventBridge メッセージキュー

この方法はパブリック IP を必要とせず、Function Compute や RocketMQ などのサービスとの統合が必要な複雑なシナリオに適しています。

バッチタスクが完了すると、システムは Alibaba Cloud EventBridge にイベントを送信します。EventBridge ルールを設定してこのイベントをリッスンし、指定されたターゲットにルーティングします。

  • イベントソース(Source): acs.dashscope

  • イベントタイプ(Type): dashscope:System:BatchTaskFinish

リファレンス: 「ApsaraMQ for RocketMQ へのイベントのルーティング」。

本番稼働

  • ファイル管理

    • OpenAI ファイル削除 API を使用して不要なファイルを定期的に削除し、ストレージ制限(10,000 ファイルまたは 100 GB)に達しないようにします。

    • 大きなファイルは代わりに OSS に保存します。

  • タスクモニタリング

    • コールバックまたは EventBridge の非同期通知を使用します。

    • ポーリングが必要な場合は、間隔を 1 分以上に設定し、指数バックオフ戦略を使用します。

  • エラー処理

    • ネットワークエラー、API エラー、その他の例外を処理します。

    • error_file_id のエラー詳細をダウンロードして分析します。

    • 一般的なエラーコードについては、「エラーメッセージ」をご参照ください。

  • コスト最適化

    • 小さなタスクを 1 つのバッチにまとめます。

    • completion_window を適切に設定して、スケジューリングの柔軟性を高めます。

ユーティリティツール

CSV から JSONL へ

データが CSV ファイル(1 列目: ID、2 列目: コンテンツ)にある場合、このスクリプトを使用して JSONL バッチファイルを生成します。

ファイルパスやその他のパラメーターを調整する場合は、必要に応じてコードを修正してください。
import csv
import json
def messages_builder_example(content):
    messages = [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": content}]
    return messages

with open("input_demo.csv", "r") as fin:
    with open("input_demo.jsonl", 'w', encoding='utf-8') as fout:
        csvreader = csv.reader(fin)
        for row in csvreader:
            body = {"model": "qwen-turbo", "messages": messages_builder_example(row[1])}
            # テキスト埋め込みモデルを呼び出す場合、url の値を "/v1/embeddings" に設定します。その他のモデルの場合は、/v1/chat/completions に設定します。
            request = {"custom_id": row[0], "method": "POST", "url": "/v1/chat/completions", "body": body}
            fout.write(json.dumps(request, separators=(',', ':'), ensure_ascii=False) + "\n")

JSONL 結果を CSV に

このスクリプトを使用して result.jsonlresult.csv に解析します。これは Excel での分析が容易です。

ファイルパスやその他のパラメーターを調整する場合は、必要に応じてコードを修正してください。
import json
import csv
columns = ["custom_id",
           "model",
           "request_id",
           "status_code",
           "error_code",
           "error_message",
           "created",
           "content",
           "usage"]

def dict_get_string(dict_obj, path):
    obj = dict_obj
    try:
        for element in path:
            obj = obj[element]
        return obj
    except:
        return None

with open("result.jsonl", "r") as fin:
    with open("result.csv", 'w', encoding='utf-8') as fout:
        rows = [columns]
        for line in fin:
            request_result = json.loads(line)
            row = [dict_get_string(request_result, ["custom_id"]),
                   dict_get_string(request_result, ["response", "body", "model"]),
                   dict_get_string(request_result, ["response", "request_id"]),
                   dict_get_string(request_result, ["response", "status_code"]),
                   dict_get_string(request_result, ["error", "error_code"]),
                   dict_get_string(request_result, ["error", "error_message"]),
                   dict_get_string(request_result, ["response", "body", "created"]),
                   dict_get_string(request_result, ["response", "body", "choices", 0, "message", "content"]),
                   dict_get_string(request_result, ["response", "body", "usage"])]
            rows.append(row)
        writer = csv.writer(fout)
        writer.writerows(rows)

Excel での文字化けの解決

  • テキストエディター(Sublime など)を使用して、CSV ファイルのエンコーディングを GBK に変換してから Excel で開きます。

  • または、新しい Excel ファイルを作成し、データをインポートする際に正しいエンコーディング形式 UTF-8 を指定します。

レート制限

インターフェース

レート制限(Alibaba Cloud アカウントあたり)

タスクの作成

1,000 呼び出し/分、最大 1,000 同時タスク

タスクの照会

1,000 呼び出し/分

タスクリストの照会

100 呼び出し/分

タスクのキャンセル

1,000 呼び出し/分

課金

  • 単価: すべての成功したリクエストの入力および出力トークンは、対応するモデルのリアルタイム推論価格の50 %で課金されます。詳細については、「モデルリスト」をご参照ください。

  • 課金範囲:

    • タスク内で正常に実行されたリクエストのみが課金されます。

    • ファイル解析エラー、タスク実行失敗、または行レベルのエラーによる失敗リクエストは課金されません

    • キャンセルされたタスクについては、キャンセル前に正常に完了したリクエストは通常通り課金されます。

説明
  • バッチ推論は別の課金項目です。AI 汎用節約プランをサポートしますが、サブスクリプション(その他の節約プラン)や新規ユーザー向けの無料クォータなどの割引はサポートしません。また、コンテキストキャッシュなどの機能もサポートしません。

  • qwen3.5-plus や qwen3.5-flash などの一部のモデルでは、思考モードがデフォルトで有効になっています。このモードは追加の思考トークンを生成し、出力トークン価格で課金され、コストが増加します。コストを管理するには、タスクの複雑さに応じて `enable_thinking` パラメーターを設定してください。詳細については、「ディープシンキング」をご参照ください。

エラーコード

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

よくある質問

  1. バッチチャットとバッチファイルのどちらを選ぶべきですか?

    多数のリクエストを含む単一の大きなファイルを非同期で処理する必要がある場合は、バッチファイルを使用します。ビジネスロジックで多数の独立した会話リクエストを高い同時実行性で同期的に送信する必要がある場合は、バッチチャットを使用します。

  2. バッチファイル API はどのように課金されますか?別途パッケージを購入する必要がありますか?

    バッチは、成功したリクエストのトークンに基づいて従量課金されます。別途パッケージは不要です。

  3. 送信されたバッチファイルは順番に実行されますか?

    いいえ。システムは計算負荷に基づいて動的スケジューリングを使用し、順序を保証しません。リソースが制約されている場合、タスクが遅延することがあります。

  4. 送信されたバッチファイルが完了するまでどのくらいかかりますか?

    実行時間は、システムリソースとタスクの規模によって異なります。タスクが completion_window 内に完了しない場合、期限切れになります。期限切れのタスク内の未処理のリクエストは実行されず、課金も発生しません。

    シナリオの推奨事項: 厳密なリアルタイムのモデル推論が必要なシナリオではリアルタイム呼び出しを使用します。ある程度の遅延が許容される大規模なデータ処理シナリオではバッチ呼び出しを使用します。