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

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

最終更新日:Sep 09, 2026

Alibaba Cloud Model Studio は、OpenAI 互換のバッチファイル API を提供します。ファイルを通じてリクエストを一括で送信すると、システムが非同期で処理し、すべてのリクエストが完了するか、最大待機時間に達した時点で結果を返します。コストはリアルタイム呼び出しのわずか 50% です。データ分析、モデル評価など、レイテンシーが重要でない大規模ワークロードに最適です。

コンソールを使用するには、「コンソールガイド」をご参照ください。

ワークフロー

前提条件

バッチファイル API は、OpenAI SDK (Python、Node.js) または HTTP API を通じて呼び出すことができます。

サポート範囲

シンガポール

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

中国 (北京)

サポート対象モデル:

  • テキスト生成モデル
    • Qwen-Max:qwen3.8-max、qwen3.7-max、qwen3-max、qwen-max、qwen-max-latest
    • Qwen-Plus:qwen3.7-plus、qwen3.6-plus、qwen3.5-plus、qwen-plus、qwen-plus-latest
    • Qwen-Flash:qwen3.8-flash、qwen3.7-flash、qwen3.6-flash、qwen3.5-flash、qwen-flash
    • 推奨モデル:qwen-long-latest
    • 推奨モデル:qwq-plus
    • サードパーティモデル:deepseek-r1、deepseek-v3.2、deepseek-v3
  • マルチモーダルモデル
    • 画像・動画理解:qwen3.8-max、qwen3.8-flash、qwen3.7-plus、qwen3.6-plus、qwen3.7-flash、qwen3.6-flash、qwen3.5-plus、qwen3.5-flash、qwen3-vl-plus、qwen3-vl-flash、qwen-vl-max、qwen-vl-max-latest、qwen-vl-plus、qwen-vl-plus-latest
    • テキスト抽出:qwen-vl-ocr
    • オムニモーダル:qwen3.5-omni-plus
  • テキスト埋め込みモデル:text-embedding-v4

重要

  • バッチ処理シナリオでは、qwen3.8-max、qwen3.8-flash、qwen3.7-max、qwen3.7-plus、qwen3.6-plus、qwen3.7-flash、qwen3.6-flash、qwen3.5-plus、qwen3.5-flash、および qwen3.5-omni-plus のリクエストあたりの最大コンテキストトークンは 256 K です。qwen3.5-omni-plus は音声出力をサポートしていません。
  • 一部のモデルは思考モードをサポートしています。このモードを有効にすると、思考 tokens が生成され、コストが増加します。
  • qwen3.8、qwen3.7、qwen3.6、および qwen3.5 シリーズのモデルでは、思考モードがデフォルトで有効になっています。ハイブリッド思考モデルを使用する場合、enable_thinking パラメーターを明示的に設定する必要があります。このパラメーターを true に設定するとモードが有効になり、false に設定すると無効になります。
  • JSONL リクエストボディにおいて、enable_thinking は body のトップレベルパラメーターであり、model と同じレベルに配置する必要があります。extra_body 内には配置しないでください。

はじめに

正式なタスクを処理する前に、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:コードの実行

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

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

注記既存のファイル ID の再利用:ファイルをアップロードした後に返される ID (例:file-batch-xxx) は再利用できます。入力内容が同じ場合は、再アップロードをスキップし、既存の ID で直接タスクを作成します。

batch = client.batches.create(
    input_file_id="file-batch-xxx",  # 既存のファイル ID を再利用し、再アップロードは不要
    endpoint="/v1/chat/completions",
    completion_window="24h"
)

client.files.list(purpose="batch") API を通じて過去のファイル ID を取得し、アップロード済みのバッチファイル ID をクエリできます。

サンプルコード

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/ja/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/ja/model-studio/developer-reference/error-code
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        print(f"詳細については、「エラーコード」をご参照ください: https://www.alibabacloud.com/help/ja/model-studio/developer-reference/error-code

if __name__ == "__main__":
    main()
/**
 * 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';
// 北京リージョンの場合は、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/ja/model-studio/developer-reference/error-code
        } else {
            console.log(`\nタスクステータス: ${status}`);
        }

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

main();
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";
    // 北京リージョンの場合は、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/ja/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);
    }
}
#!/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/ja/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 オブジェクト)。
  • サイズ制限:ファイルあたり最大 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")
  1. Data URL フォーマットを構築します: data:[MIME_type];base64,{base64_image}

    1. MIME_type を実際のメディアタイプに置き換えます。これは MIME Type の値 (例:image/jpeg、image/png) と一致する必要があります。
    2. base64_image は、前のステップで生成された Base64 文字列です。

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

JSONL バッチ生成ツール

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

1. 入力ファイルの変更

  • test_model.jsonl ファイルで、model パラメーターをターゲットモデルに設定し、url フィールドを設定します。

    モデルタイプ

    url

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

    /v1/chat/completions

    テキスト埋め込みモデル

    /v1/embeddings

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

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

  1. 入力ファイルのパスを、ご利用のファイル名に変更します。
  2. endpoint パラメーターを、入力ファイルの 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 である必要があります。

注記既存のファイル ID の再利用: ファイルをアップロードした後に返される ID (例:file-batch-xxx) は再利用できます。入力コンテンツが同じままであれば、再アップロードをスキップし、既存の ID を使用して直接タスクを作成します:

batch = client.batches.create(
    input_file_id="file-batch-xxx",  # 既存のファイル ID を再利用し、再アップロードは不要
    endpoint="/v1/chat/completions",
    completion_window="24h"
)

client.files.list(purpose="batch") API を通じて過去のファイル ID を取得し、アップロード済みのバッチファイル ID をクエリできます。

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("File 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

はい

API アクセスパス。入力ファイル内の 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

API アクセスパス。

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

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

finalizing_at

Integer

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

completed_at

Integer

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

failed_at

Integer

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

expired_at

Integer

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

cancelling_at

Integer

タスクがキャンセル中状態になったときの UNIX タイムスタンプ (秒)。

cancelled_at

Integer

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

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"

レスポンス例

クエリが成功すると、詳細なバッチタスク情報が返されます。以下は、ステータスが 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"
  }
}

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

フィールド

タイプ

説明

id

String

バッチタスク ID。

status

String

タスクステータス。指定できる値:

  • validating

  • in_progress

  • finalizing

  • completed

  • failed

  • expired

  • 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 (以下同様) に置き換えてください。
# === 実行前にこのコメントを削除してください ===
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_id の batch_id を実際の値に置き換えます。limit には返すタスク数を設定します。ds_name にはタスク名の一部を指定します。input_file_ids には 1 つ以上のファイル ID を指定します。status には 1 つ以上のバッチタスクステータスを指定します。create_after と create_before には時間境界を指定します。

入力パラメーター

フィールド

タイプ

メソッド

必須

説明

after

String

Query

いいえ

ページネーション用のカーソル。 前のページの最後のタスク ID を設定します。

limit

Integer

Query

いいえ

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

ds_name

String

Query

いいえ

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

input_file_ids

String

Query

いいえ

カンマで区切った複数のファイル 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_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_id が file-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":"こんにちは!もちろんです。情報、学習資料、問題解決の方法、その他どんな助けが必要であっても、私はあなたをサポートするためにここにいます。何について助けが必要か教えてください。"}}]}},"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 - 結果ファイルのダウンロード
 *
 * 環境変数が設定されていない場合は、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": "こんにちは!もちろんです。情報、学習資料、問題解決の方法、その他どんな助けが必要であっても、私はあなたをサポートするためにここにいます。何について助けが必要か教えてください。"
                    }
                }
            ],
            "object": "chat.completion"
        }
    },
    "error": null
}

レスポンスパラメーター

フィールド

タイプ

説明

id

String

リクエスト ID。

custom_id

String

ユーザー定義のリクエスト識別子。

response

Object

リクエストの結果。

status_code

Integer

HTTP ステータスコード。200 は成功を示します。

request_id

String

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

completion_tokens

Integer

モデルが生成したレスポンスのトークン数。

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

「イベントを Message Queue for RocketMQ にルーティングする」をご参照ください。

本番環境への適用

  • ファイル管理
    • ストレージ制限 (10,000 ファイルまたは 100 GB) に達しないように、OpenAI File delete API を使用して不要なファイルを定期的に削除してください。
    • サイズの大きいファイルは直接アップロードするのではなく、OSS に保存してください。
  • タスクのモニタリング
    • Callback または 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.jsonl を result.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 Text など) を使用して CSV ファイルのエンコーディングを GBK に変換してから、Excel で開きます。
  • または、新しい Excel ファイルを作成し、データをインポートする際に UTF-8 エンコーディングを指定します。

レート制限

API

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

タスクの作成

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

タスクの照会

1,000 呼び出し/分

タスクリストの照会

100 呼び出し/分

タスクのキャンセル

1,000 呼び出し/分

課金

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

  • 課金範囲:
    • タスク内で正常に実行されたリクエストのみが課金対象となります。
    • ファイル解析エラー、タスク実行の失敗、または行レベルのエラーによって失敗したリクエストには、料金は発生しません。
    • キャンセルされたタスクの場合、キャンセル前に正常に完了したリクエストは通常どおり課金されます。

注記

  • バッチ推論は独立した課金項目です。これは AI 汎用節約プラン をサポートしますが、サブスクリプション (その他の節約プラン) や 新規ユーザー向けの無料クォータ などの割引は対象外です。また、コンテキストキャッシュ などの機能もサポートしていません。
  • qwen3.5-plus や qwen3.5-flash などの一部のモデルでは、思考モードがデフォルトで有効になっています。このモードでは追加の思考トークンが生成され、出力トークン価格で課金されるため、コストが増加します。コストをコントロールするには、タスクの複雑さに応じて enable_thinking パラメーターを設定してください。詳細については、「ディープシンキング」をご参照ください。

エラーコード

リクエストが失敗し、エラーメッセージが返された場合のソリューションは、エラーコードをご参照ください。

よくある質問

  1. Batch Chat と Batch File はどのように使い分ければよいですか?

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

  2. Batch File API の課金方法について教えてください。別途パッケージの購入は必要ですか?

    Batch は、成功したリクエストによって消費されたトークン数に基づく従量課金制です。別途リソースパッケージを購入する必要はありません。

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

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

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

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

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