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

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

最終更新日:Jun 26, 2026

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

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

ワークフロー

前提条件

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

重要

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

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

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

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

範囲

シンガポール

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

中国 (北京)

サポート対象モデル

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

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

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

サポート対象モデル名の一覧

  • テキスト生成モデル

    • Qwen-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.5-flash、qwen-flash

    • 推奨モデル:qwen-long-latest

    • 推奨モデル:qwq-plus

    • サードパーティモデル:deepseek-r1、deepseek-v3.2、deepseek-v3

  • マルチモーダルモデル

    • 画像・動画理解:qwen3.7-plus、qwen3.6-plus、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

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

重要
  • バッチ処理シナリオでは、qwen3.7-maxqwen3.7-plusqwen3.6-plusqwen3.5-plusqwen3.5-flash のリクエストあたりの最大コンテキストトークンは 256 K です。

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

  • qwen3.7qwen3.6qwen3.5 シリーズのモデルでは、思考モードがデフォルトで有効になっています。ハイブリッド思考モデルを使用する場合は、enable_thinking パラメーターを明示的に設定する必要があります。このパラメーターを true に設定するとモードが有効になり、false に設定すると無効になります。

  • JSONL リクエストボディでは、enable_thinkingbody のトップレベルパラメーターであり、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 を取得できます。

サンプルコード

OpenAI Python SDK

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

# クライアントの初期化
client = OpenAI(
    # 環境変数が設定されていない場合は、以下の行を api_key="sk-xxx" に置き換えてください。ただし、漏洩リスクを減らすため、本番環境ではハードコーディングしないでください。
    # API キーはシンガポールリージョンと北京リージョンで異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合:https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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()

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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';
// 北京の場合:const BASE_URL = 'https://{WorkspaceId}.cn-beijing.maas.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();

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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
 */
public class BatchAPITest {

    // シンガポールリージョンのベース URL
    private static final String BASE_URL = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
    // 北京の場合:private static final String BASE_URL = "https://{WorkspaceId}.cn-beijing.maas.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);
    }
}

curl (HTTP)

#!/bin/bash
# Model Studio バッチ API テスト - curl を使用
#
# 前提条件:
# 1. 環境変数 DASHSCOPE_API_KEY が設定されていることを確認してください
# 2. テストファイル test_model.jsonl を準備してください (カレントディレクトリに配置)
#
# リージョン設定:
# - 北京リージョン:https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
# - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1

API_KEY="${DASHSCOPE_API_KEY}"
BASE_URL="https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"

# 北京の場合:BASE_URL="https://{WorkspaceId}.cn-beijing.maas.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")
  2. Data URL フォーマットを構築します:data:[MIME_type];base64,{base64_image}

    1. MIME_type を実際のメディアタイプに置き換えます。これは MIME Type の値 (例:image/jpegimage/png) と一致する必要があります;

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

説明

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

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):各行は成功した1つのリクエストに対応し、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. ファイルのアップロード

ファイルアップロード 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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用し、API キーを更新してください。
    # 注:リージョンを切り替える際は、API キーも適宜更新してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を以下に置き換えてください:
// const BASE_URL = 'https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
 * 注:リージョンを切り替える際は、API キーも適宜更新してください。
 */
public class BatchAPIUploadFile {
    
    // シンガポールリージョンの設定
    private static final String BASE_URL = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
    // 北京の場合:private static final String BASE_URL = "https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/files に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用し、API キーを更新してください。
    # 注:リージョンを切り替える際は、API キーも適宜更新してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を以下に置き換えてください:
// const BASE_URL = 'https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
 * 注:リージョンを切り替える際は、API キーも適宜更新してください。
 */
public class BatchAPICreateBatch {
    
    // シンガポールリージョンの設定 (デフォルト)
    private static final String BASE_URL = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
    // 北京の場合:private static final String BASE_URL = "https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/batches に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl -X POST https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用し、API キーを更新してください。
    # 注:リージョンを切り替える際は、API キーも適宜更新してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を以下に置き換えてください:
// const BASE_URL = 'https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
 * 注:リージョンを切り替える際は、API キーも適宜更新してください。
 */
public class BatchAPIRetrieveBatch {
    
    // シンガポールリージョンの設定
    private static final String BASE_URL = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
    // 北京の場合:private static final String BASE_URL = "https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/batches/batch_id に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl --request GET 'https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用し、API キーを更新してください。
    # 注:リージョンを切り替える際は、API キーも適宜更新してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を以下に置き換えてください:
// const BASE_URL = 'https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
 * 注:リージョンを切り替える際は、API キーも適宜更新してください。
 */
public class BatchAPIListBatches {
    
    // シンガポールリージョンの設定
    private static final String BASE_URL = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
    // 北京の場合:private static final String BASE_URL = "https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/batches?xxx (以下同様) に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl --request GET  'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/batches?after=batch_xxx&limit=2&ds_name=Batch&input_file_ids=file-batch-xxx,file-batch-xxx&status=completed,failed&create_after=20250303000000&create_before=20250320000000' \
 -H "Authorization: Bearer $DASHSCOPE_API_KEY"
after=batch_idbatch_id を実際の値に置き換えてください。limit には返すタスクの数を設定します。ds_name にはタスク名の一部を指定します。input_file_ids には1つ以上のファイル ID を指定します。status には1つ以上のバッチタスクステータスを指定します。create_aftercreate_before には時間境界を指定します。

入力パラメーター

フィールド

タイプ

メソッド

必須

説明

after

String

Query

いいえ

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

limit

Integer

Query

いいえ

ページあたりのタスク数。範囲:[1, 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_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合:https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用し、API キーを更新してください。
    # 注:リージョンを切り替える際は、API キーも適宜更新してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を以下に置き換えてください:
// const BASE_URL = 'https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
 * 注:リージョンを切り替える際は、API キーも適宜更新してください。
 */
public class BatchAPICancelBatch {
    
    // シンガポールリージョンの設定
    private static final String BASE_URL = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
    // 北京の場合:private static final String BASE_URL = "https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/batches/batch_id/cancel に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl --request POST 'https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1/batches/batch_id/cancel' \
 -H "Authorization: Bearer $DASHSCOPE_API_KEY"
batch_id を実際の値に置き換えてください。

レスポンス例

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

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

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

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

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

OpenAI Python SDK

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

リクエスト例

import os
from openai import OpenAI

client = OpenAI(
    # 環境変数が設定されていない場合は、api_key="sk-xxx" を使用してください (本番環境では漏洩のリスクがあるため非推奨)。
    # API キーはリージョンごとに異なります。
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # シンガポールリージョンの base_url。北京の場合:https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1 を使用し、API キーを更新してください。
    # 注:リージョンを切り替える際は、API キーも適宜更新してください。
    base_url="https://{WorkspaceId}.ap-southeast-1.maas.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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1';
// 北京リージョンを使用する場合は、上記の BASE_URL を以下に置き換えてください:
// const BASE_URL = 'https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
 * - シンガポールリージョン:https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
 * 注:リージョンを切り替える際は、API キーも適宜更新してください。
 */
public class BatchAPIDownloadFile {
    
    // シンガポールリージョンの設定
    private static final String BASE_URL = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1";
    // 北京の場合:private static final String BASE_URL = "https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1/files/file-batch_output-xxx/content に置き換えてください。
# === 実行前にこのコメントを削除してください ===
curl -X GET https://{WorkspaceId}.ap-southeast-1.maas.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 を指定します。タスクが完了すると、システムは指定された URL にタスクステータスを含む POST リクエストを送信します:

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://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1 を使用し、API キーを更新してください。
    base_url="https://{WorkspaceId}.cn-beijing.maas.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://{WorkspaceId}.cn-beijing.maas.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

リファレンス:「RocketMQ のメッセージキューへのイベントのルーティング」。

本番運用

  • ファイル管理

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

    • 大きなファイルは直接アップロードするのではなく、OSS に保存します。

  • タスクモニタリング

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

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

  • エラー処理

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

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

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

  • コスト最適化

    • 小さなタスクを単一のバッチに統合します。

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

ユーティリティツール

CSV から JSONL へ

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

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

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

JSONL 結果を CSV へ

このスクリプトを使用して、result.jsonlresult.csv に変換し、Excel で分析します。

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

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

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

Excel での文字化けの修正

  • テキストエディター (Sublime 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. バッチチャットとバッチファイルのどちらを選ぶべきですか?

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

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

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

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

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

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

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

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