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

Alibaba Cloud Model Studio:OpenAI 互換 - バッチ

最終更新日:Jan 31, 2026

Alibaba Cloud Model Studio は、OpenAI 互換のバッチ API を提供しており、バッチファイルを送信して非同期実行させることができます。このサービスは、オフピーク時間帯に大規模なデータをオフラインで処理し、タスクが完了するか最大待機時間に達した後に結果を返します。コストはリアルタイム呼び出しの 50% です。

コンソール操作については、「バッチ処理」をご参照ください。

ワークフロー

image

前提条件

OpenAI SDK (Python、Node.js) または HTTP API を使用します。

適用範囲

中国本土

中国本土デプロイメントモードでは、エンドポイントとデータストレージは北京リージョンに配置され、モデル推論の計算リソースは中国本土に限定されます。

サポート対象モデル

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

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

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

サポート対象モデル名リスト

国際

国際デプロイメントモードでは、エンドポイントとデータストレージはシンガポールリージョンに配置されます。モデル推論の計算リソースは、中国本土を除く世界中で動的にスケジューリングされます。

サポート対象モデル:qwen-max、qwen-plus、qwen-flash、qwen-turbo。

クイックスタート

正式なタスクを処理する前に、テストモデル 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?"}]}}

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

プログラミング言語に応じて、以下のコードサンプルのいずれかを選択します。入力ファイルと同じディレクトリに保存して実行してください。このコードは、ファイルのアップロード、タスクの作成、ステータスのポーリング、結果のダウンロードを含むワークフロー全体を完了します。

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

サンプルコード

OpenAI Python SDK

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

# クライアントを初期化します
client = OpenAI(
    # 環境変数を設定していない場合は、次の行を api_key="sk-xxx" に置き換えて、Model Studio API キーを使用してください。
    # 漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
    # API キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、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/model-studio/developer-reference/error-code")
            return
        # ステップ 4:結果のダウンロード:出力ファイル ID が空でない場合は、成功したリクエスト結果の最初の 1,000 文字を印刷し、完全な結果をローカルの出力ファイルにダウンロードします。
        # エラーファイル 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/model-studio/developer-reference/error-code")
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        print(f"詳細については、「エラーコード」をご参照ください:https://www.alibabacloud.com/help/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');

// シンガポールリージョンのベース URL
const BASE_URL = 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、次の URL を使用してください:
// 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/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 {

    // シンガポールリージョンのベース URL
    private static final String BASE_URL = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
    // 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換えてください:
    // 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/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 を次のように置き換えてください:
# 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/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。各行は独立した JSON オブジェクトでなければなりません。

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

  • 行制限:各 JSON オブジェクトは最大 6 MB で、モデルのコンテキストウィンドウ内に収まる必要があります。

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

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

ファイル内容の例:

{"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?"}]}}

JSONL バッチ生成ツール

このツールを使用して、JSONL ファイルを迅速に生成します。

JSONL バッチ生成ツール
モードを選択:

1. 入力ファイルの変更

  • test_model.jsonl を直接変更します。model パラメーターに使用する実際のモデルを設定し、url フィールドを構成します。

    タイプ

    url

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

    /v1/chat/completions

    テキスト埋め込み

    /v1/embeddings

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

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

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

  2. endpoint パラメーターの値を、入力ファイルの url フィールドと一致するように変更します。

3. コードを実行して結果を待つ

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

  • 成功した結果 (output_file_id):各行は成功した元のリクエストに対応し、custom_idresponse を含みます。

    {"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":"こんにちは!杭州西湖は中国の有名な景勝地で、浙江省杭州市の西部に位置していることから「西湖」と名付けられました。中国の十大景勝地の一つであり、世界文化遺産でもあります(2011年にユネスコに登録)。美しい自然景観と深い文化的遺産で世界的に有名です。\n\n### I. 自然景観\n西湖は三方を山に囲まれ、一方は市街地に接しており、面積は約6.39平方キロメートルで、波打つ青い水面を持つ如意の形をしています。湖は孤山、白堤、蘇堤、楊公堤によって自然または人工的に複数の水域に分けられ、「一山、二塔、三島、三堤」のレイアウトを形成しています。\n\n主な見どころは以下の通りです:\n- **蘇堤春暁**:北宋時代、偉大な文人である蘇東坡が杭州の知事を務めていた際、西湖の浚渫を指揮し、掘り出された土砂で堤を築きました。後に「蘇堤」と名付けられました。春には桃の花と柳が絵のように美しい景色を作り出します。\n- **断橋残雪**:白堤の東端に位置し、『白蛇伝』の再会の場面の舞台となった場所です。冬に雪が降った後、銀白色の姿で特に有名です。\n- **雷峰夕照**:雷峰塔は夕日に照らされて金色に輝き、かつて「西湖十景」の一つでした。\n- **三潭印月**:湖中の小瀛洲島には三つの石塔があります。中秋節には塔の中に灯籠を灯すことができ、月光、灯火、湖の反射が調和した美しい光景が生まれます。\n- **平湖秋月**:白堤の西端に位置し、湖上の月を眺めるのに最適な場所です。\n- **花港観魚**:花と魚を観賞することで知られ、庭園では牡丹と鯉が美しく引き立て合っています。\n\n### II. 文化歴史\n西湖は美しい景色だけでなく、豊かな歴史的・文化的意義も持っています:\n- 唐・宋時代以来、白居易、蘇東坡、林逋、楊万里など数多くの文人がここに詩を残しました。\n- 白居易は「白堤」の建設を監督し、西湖を浚渫して地元の人々に恩恵をもたらしました。\n- 西湖周辺には、岳王廟(民族英雄・岳飛を記念)、霊隠寺(千年の歴史を持つ仏教寺院)、六和塔、龍井村(中国十大名茶の一つである龍井茶の発祥地)など、多くの史跡があります。\n\n### III. 文化的象徴\n西湖は「地上の楽園」の代表と見なされ、中国の伝統的な風景美学のモデルです。自然の美しさと文化的な深さを統合することで、「天人合一」の哲学的概念を体現しています。多くの詩、絵画、オペラが西湖を題材にしており、中国文化の重要な象徴となっています。\n\n### IV. 旅行の推奨\n- 最適な訪問時期:春(3月~5月)は桃の花と柳、秋(9月~11月)は晴天で涼しい気候です。\n- 推奨される方法:散歩、サイクリング(湖畔の緑道沿い)、または湖上でのボート遊び。\n- 地元料理:西湖酢魚、龍井蝦仁、東坡肉、片児川麺。\n\n要約すると、杭州西湖は単なる自然の驚異ではなく、詳細に探求する価値のある生きた文化博物館でもあります。もし杭州を訪れる機会があれば、「薄化粧でも濃い化粧でも同様に魅力的」なこの地上の楽園をお見逃しなく。"}}],"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":"春風が緑の柳を撫で、\n夜雨が赤い花を潤す。\n鳥のさえずりが森に満ち、\n山と川は同じ美しさを分かち合う。"}}],"object":"chat.completion"}},"error":null}
  • 失敗の詳細 (error_file_id):失敗したリクエスト行の情報と対応するエラー理由が含まれています。トラブルシューティングについては、「エラーコード」をご参照ください。

詳細な手順

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

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

入力ファイル形式の要件を満たす JSONL ファイルをファイルアップロード API を使用してアップロードし、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 キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    # 注意:リージョンを切り替える際は、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 - ファイルのアップロード
 * 
 * 環境変数を設定していない場合は、コード内で API キーをハードコーディングできます:apiKey: 'sk-xxx'
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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 キーをハードコーディングできます:API_KEY = "sk-xxx"
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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";
    // 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換えてください:
    // 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 キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    # 注意:リージョンを切り替える際は、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 - バッチタスクの作成
 * 
 * 環境変数を設定していない場合は、コード内で API キーをハードコーディングできます:apiKey: 'sk-xxx'
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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 キーをハードコーディングできます:API_KEY = "sk-xxx"
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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";
    // 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換えてください:
    // 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-intl.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 キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    # 注意:リージョンを切り替える際は、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 - 単一タスクのクエリ
 * 
 * 環境変数を設定していない場合は、コード内で API キーをハードコーディングできます:apiKey: 'sk-xxx'
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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 キーをハードコーディングできます:API_KEY = "sk-xxx"
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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";
    // 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換えてください:
    // 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"

レスポンス例

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

{
  "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"
  }
}

返された JSON オブジェクトには、タスクステータス、結果ファイル ID、リクエスト統計など、バッチタスクに関する完全な情報が含まれています。詳細なフィールドの説明については、以下の表をご参照ください。

フィールド

タイプ

説明

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 キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    # 注意:リージョンを切り替える際は、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 - タスクリストのクエリ
 * 
 * 環境変数を設定していない場合は、コード内で API キーをハードコーディングできます:apiKey: 'sk-xxx'
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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 キーをハードコーディングできます:API_KEY = "sk-xxx"
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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";
    // 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換えてください:
    // 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 (以下同様) に置き換えてください。
# === 実行前にこのコメントを削除してください ===
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"
batch_idafter=batch_id の実際の値に置き換えてください。limit パラメーターを返すタスクの数に設定してください。ds_name にタスク名の一部を入力してください。input_file_ids に 1 つ以上のファイル ID を入力してください。status に 1 つ以上のバッチタスクステータスを入力してください。create_aftercreate_before の時点を入力してください。

入力パラメーター

フィールド

タイプ

場所

必須

説明

after

String

Query

いいえ

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

limit

Integer

Query

いいえ

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

ds_name

String

Query

いいえ

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

input_file_ids

String

Query

いいえ

ファイル ID でフィルタリングします。複数の ID はカンマで区切り、最大 20 個まで。

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

タイプ、固定値 list。

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 キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    # 注意:リージョンを切り替える際は、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 - タスクのキャンセル
 * 
 * 環境変数を設定していない場合は、コード内で API キーをハードコーディングできます:apiKey: 'sk-xxx'
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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 キーをハードコーディングできます:API_KEY = "sk-xxx"
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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";
    // 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換えてください:
    // 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-intl.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 キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 以下はシンガポールリージョンの base_url です。北京リージョンのモデルを使用する場合は、base_url を https://dashscope.aliyuncs.com/compatible-mode/v1 に置き換えてください。
    # 注意:リージョンを切り替える際は、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":"こんにちは!もちろんです。情報、学習資料、問題解決方法、その他どんな助けが必要であっても、私はあなたをサポートするためにここにいます。何について助けが必要か教えてください。"}}]}},"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は4です。"}}]}},"error":null}

OpenAI Node.js SDK

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

リクエスト例

/**
 * Model Studio バッチ API - 結果ファイルのダウンロード
 * 
 * 環境変数を設定していない場合は、コード内で API キーをハードコーディングできます:apiKey: 'sk-xxx'
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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 キーをハードコーディングできます:API_KEY = "sk-xxx"
 * ただし、漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
 * 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";
    // 北京リージョンを使用する場合は、上記の BASE_URL を次のように置き換えてください:
    // 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 メソッドを使用し、URL で 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": "こんにちは!もちろんです。情報、学習資料、問題解決方法、その他どんな助けが必要であっても、私はあなたをサポートするためにここにいます。何について助けが必要か教えてください。"
                    }
                }
            ],
            "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

エラー情報オブジェクト。API 呼び出しが成功した場合、この値は null です。エラーが発生した場合、これにはエラーコードと詳細なエラー情報が含まれます。

error.code

String

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

error.message

String

エラーメッセージ。

高度な機能

完了通知の設定

長時間実行されるタスクの場合、ポーリングは不要なリソースを消費します。タスクが完了したときにシステムが能動的に通知する非同期通知メカニズムを使用します。

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

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

方法 1:コールバック

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

OpenAI Python SDK

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数を設定していない場合は、次の行を api_key="sk-xxx" に置き換えてください。
    # 漏洩のリスクを減らすため、本番コードに API キーをハードコーディングしないでください。
    # API キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"), 
    # 以下は北京リージョンの base_url です。シンガポールリージョンのモデルを使用する場合は、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 サービスとの統合が必要な複雑なシナリオに適しています。

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

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

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

リファレンス:「ApsaraMQ for RocketMQ へのイベントのルーティング」をご参照ください。

本番稼働

  • ファイル管理

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

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

  • タスク監視

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

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

  • エラー処理

    • ネットワークエラー、API エラー、その他の潜在的な問題をカバーする完全な例外処理メカニズムを実装します。

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

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

  • コスト最適化

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

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

ユーティリティツール

CSV から JSONL へ

元のデータが CSV ファイル (最初の列が 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.jsonl を Excel で分析しやすい result.csv に解析します。

ファイルパスやその他のパラメーターを調整するには、必要に応じてコードを修正してください。
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% です。「モデルリスト」をご参照ください。

  • 適用範囲:

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

    • ファイル解析の失敗、タスク実行の失敗、または行レベルのエラーリクエストは料金が発生しません

    • キャンセルされたタスクの場合、キャンセル前に正常に完了したリクエストは課金されます。

重要

バッチ推論は別の課金項目であり、サブスクリプション (節約プラン)、新規ユーザー無料クォータ、またはコンテキストキャッシュなどの機能はサポートしていません。

エラーコード

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

よくある質問

  1. バッチ呼び出しはどのように課金されますか?別途購入する必要がありますか?

    タスク内の成功したリクエストで使用されたトークンに対して課金されます。別途パッケージを購入する必要はありません。

  2. 送信されたバッチタスクは順番に実行されますか?

    いいえ、されません。バックエンドは、全体の計算リソースの負荷に基づいてタスクの実行をスケジュールする動的スケジューリングメカニズムを使用します。したがって、実行は送信順に保証されるわけではありません。リソースが限られている場合、タスクの起動と実行が遅れることがあります。

  3. 送信されたバッチタスクが完了するまでどのくらいかかりますか?

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

    シナリオの推奨事項:リアルタイムのモデル推論が必要なシナリオでは、リアルタイム呼び出しを使用することをお勧めします。時間に敏感でない大規模なデータ処理シナリオでは、バッチ呼び出しを使用することをお勧めします。