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

Alibaba Cloud Model Studio:ナレッジベース API ガイド

最終更新日:Nov 05, 2025

Alibaba Cloud Model Studio は、ナレッジベース機能の API 操作を提供します。これにより、ナレッジベースを既存の業務システムに迅速に統合し、操作を自動化し、複雑な取得ニーズに対応できます。

前提条件

  1. RAM ユーザーは、Alibaba Cloud API を使用してナレッジベースを操作する前に、API 権限 (AliyunBailianDataFullAccess ポリシー) を取得し、ワークスペースに参加する必要があります。これは Alibaba Cloud アカウントには必要ありません。

    RAM ユーザーは、参加しているワークスペースでのみナレッジベースを管理できます。Alibaba Cloud アカウントは、すべてのワークスペースでナレッジベースを管理できます。
  2. 最新バージョンの GenAI Service SDK をインストールして、ナレッジベース関連の API を呼び出します。インストール手順の詳細については、SDK 開発リファレンスをご参照ください。

    SDK がニーズを満たさない場合は、署名メカニズムを使用して、関連するナレッジベース API に HTTP リクエストを送信できます。このメソッドは比較的複雑であることに注意してください。特定の統合メソッドの詳細については、「API 概要」をご参照ください。
  3. AccessKey と AccessKey シークレットを取得する、およびワークスペース ID を取得します。サンプルコードを実行するには、これらをシステム環境変数として設定します。次の例では、Linux オペレーティングシステムを使用します。

    IDE または他の開発者プラグインを使用する場合は、開発環境で ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および WORKSPACE_ID 変数を設定します。
    export ALIBABA_CLOUD_ACCESS_KEY_ID='お使いの Alibaba Cloud AccessKey ID'
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET='お使いの Alibaba Cloud AccessKey シークレット'
    export WORKSPACE_ID='お使いの Model Studio ワークスペース ID'
  4. ナレッジベースを作成するために、サンプルのナレッジドキュメント Bailian Phones Specifications.docx を準備します。

完全なサンプルコード

ナレッジベースの作成

重要
  • この例を呼び出す前に、すべての前提条件を完了してください。 RAM ユーザーには、AliyunBailianDataFullAccess ポリシーが付与されている必要があります。

  • IDE または他の開発プラグインを使用する場合は、ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET、および WORKSPACE_ID 環境変数を設定してください。

Python

# このサンプルコードは参照用です。本番環境では使用しないでください。
import hashlib
import os
import time

import requests
from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models


def check_environment_variables():
    """必要な環境変数をチェックし、設定を促します。"""
    required_vars = {
        'ALIBABA_CLOUD_ACCESS_KEY_ID': 'Alibaba Cloud AccessKey ID',
        'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'Alibaba Cloud AccessKey secret',
        'WORKSPACE_ID': 'Alibaba Cloud Model Studio ワークスペース ID'
    }
    missing_vars = []
    for var, description in required_vars.items():
        if not os.environ.get(var):
            missing_vars.append(var)
            print(f"エラー: 環境変数 {var} ({description}) を設定してください。")
    
    return len(missing_vars) == 0


def calculate_md5(file_path: str) -> str:
    """
    ファイルの MD5 ハッシュを計算します。

    パラメーター:
        file_path (str): ファイルのローカルパス。

    戻り値:
        str: ファイルの MD5 ハッシュ。
    """
    md5_hash = hashlib.md5()

    # ファイルをバイナリモードで読み取ります。
    with open(file_path, "rb") as f:
        # 大きなファイルで高いメモリ使用量を避けるために、ファイルをチャンクで読み取ります。
        for chunk in iter(lambda: f.read(4096), b""):
            md5_hash.update(chunk)

    return md5_hash.hexdigest()


def get_file_size(file_path: str) -> int:
    """
    ファイルサイズをバイト単位で取得します。
    パラメーター:
        file_path (str): ファイルのローカルパス。
    戻り値:
        int: ファイルサイズ (バイト単位)。
    """
    return os.path.getsize(file_path)


# クライアントを初期化します。
def create_client() -> bailian20231229Client:
    """
    クライアントを作成して設定します。

    戻り値:
        bailian20231229Client: 設定済みのクライアント。
    """
    config = open_api_models.Config(
        access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    )
    # 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
    config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
    return bailian20231229Client(config)


# ファイルアップロードリースをリクエストします。
def apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id):
    """
    Model Studio サービスからファイルアップロードリースをリクエストします。

    パラメーター:
        client (bailian20231229Client): クライアント。
        category_id (str): カテゴリ ID。
        file_name (str): ファイル名。
        file_md5 (str): ファイルの MD5 ハッシュ。
        file_size (int): ファイルサイズ (バイト単位)。
        workspace_id (str): ワークスペース ID。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    request = bailian_20231229_models.ApplyFileUploadLeaseRequest(
        file_name=file_name,
        md_5=file_md5,
        size_in_bytes=file_size,
    )
    runtime = util_models.RuntimeOptions()
    return client.apply_file_upload_lease_with_options(category_id, workspace_id, request, headers, runtime)


# ファイルを一時ストレージにアップロードします。
def upload_file(pre_signed_url, headers, file_path):
    """
    Model Studio サービスにファイルをアップロードします。
    パラメーター:
        pre_signed_url (str): アップロードリース内の URL。
        headers (dict): アップロードのリクエストヘッダー。
        file_path (str): ファイルのローカルパス。
    """
    with open(file_path, 'rb') as f:
        file_content = f.read()
    upload_headers = {
        "X-bailian-extra": headers["X-bailian-extra"],
        "Content-Type": headers["Content-Type"]
    }
    response = requests.put(pre_signed_url, data=file_content, headers=upload_headers)
    response.raise_for_status()


# ファイルをカテゴリに追加します。
def add_file(client: bailian20231229Client, lease_id: str, parser: str, category_id: str, workspace_id: str):
    """
    Model Studio サービスの指定されたカテゴリにファイルを追加します。

    パラメーター:
        client (bailian20231229Client): クライアント。
        lease_id (str): リース ID。
        parser (str): ファイルのパーサ。
        category_id (str): カテゴリ ID。
        workspace_id (str): ワークスペース ID。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    request = bailian_20231229_models.AddFileRequest(
        lease_id=lease_id,
        parser=parser,
        category_id=category_id,
    )
    runtime = util_models.RuntimeOptions()
    return client.add_file_with_options(workspace_id, request, headers, runtime)


# ファイルの解析ステータスをクエリします。
def describe_file(client, workspace_id, file_id):
    """
    ファイルの基本情報を取得します。

    パラメーター:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        file_id (str): ファイル ID。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    runtime = util_models.RuntimeOptions()
    return client.describe_file_with_options(workspace_id, file_id, headers, runtime)


# ナレッジベース (インデックス) を初期化します。
def create_index(client, workspace_id, file_id, name, structure_type, source_type, sink_type):
    """
    Model Studio サービスでナレッジベースを作成します (初期化)。

    パラメーター:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        file_id (str): ファイル ID。
        name (str): ナレッジベース名。
        structure_type (str): ナレッジベースのデータの型。
        source_type (str): アプリケーションデータのデータの型。カテゴリとファイルがサポートされています。
        sink_type (str): ナレッジベースのベクターストレージタイプ。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    request = bailian_20231229_models.CreateIndexRequest(
        structure_type=structure_type,
        name=name,
        source_type=source_type,
        sink_type=sink_type,
        document_ids=[file_id]
    )
    runtime = util_models.RuntimeOptions()
    return client.create_index_with_options(workspace_id, request, headers, runtime)


# インデックス作成タスクを送信します。
def submit_index(client, workspace_id, index_id):
    """
    Model Studio サービスにインデックス作成タスクを送信します。

    パラメーター:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    submit_index_job_request = bailian_20231229_models.SubmitIndexJobRequest(
        index_id=index_id
    )
    runtime = util_models.RuntimeOptions()
    return client.submit_index_job_with_options(workspace_id, submit_index_job_request, headers, runtime)


# インデックス作成タスクが完了するのを待ちます。
def get_index_job_status(client, workspace_id, job_id, index_id):
    """
    インデックス作成タスクのステータスをクエリします。

    パラメーター:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        job_id (str): タスク ID。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    get_index_job_status_request = bailian_20231229_models.GetIndexJobStatusRequest(
        index_id=index_id,
        job_id=job_id
    )
    runtime = util_models.RuntimeOptions()
    return client.get_index_job_status_with_options(workspace_id, get_index_job_status_request, headers, runtime)


def create_knowledge_base(
        file_path: str,
        workspace_id: str,
        name: str
):
    """
    Model Studio サービスを使用してナレッジベースを作成します。
    パラメーター:
        file_path (str): ファイルのローカルパス。
        workspace_id (str): ワークスペース ID。
        name (str): ナレッジベース名。
    戻り値:
        str または None: 呼び出しが成功した場合はナレッジベース ID。それ以外の場合は None が返されます。
    """
    # デフォルト値を設定します。
    category_id = 'default'
    parser = 'DASHSCOPE_DOCMIND'
    source_type = 'DATA_CENTER_FILE'
    structure_type = 'unstructured'
    sink_type = 'DEFAULT'
    try:
        # ステップ 1: クライアントを作成します。
        print("ステップ 1: クライアントを作成します。")
        client = create_client()
        # ステップ 2: ファイル情報を準備します。
        print("ステップ 2: ファイル情報を準備します。")
        file_name = os.path.basename(file_path)
        file_md5 = calculate_md5(file_path)
        file_size = get_file_size(file_path)
        # ステップ 3: アップロードリースをリクエストします。
        print("ステップ 3: Alibaba Cloud Model Studio からアップロードリースをリクエストします。")
        lease_response = apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id)
        lease_id = lease_response.body.data.file_upload_lease_id
        upload_url = lease_response.body.data.param.url
        upload_headers = lease_response.body.data.param.headers
        # ステップ 4: ファイルをアップロードします。
        print("ステップ 4: Alibaba Cloud Model Studio にファイルをアップロードします。")
        upload_file(upload_url, upload_headers, file_path)
        # ステップ 5: サーバーにファイルを追加します。
        print("ステップ 5: Alibaba Cloud Model Studio サーバーにファイルを追加します。")
        add_response = add_file(client, lease_id, parser, category_id, workspace_id)
        file_id = add_response.body.data.file_id
        # ステップ 6: ファイルのステータスを確認します。
        print("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。")
        while True:
            describe_response = describe_file(client, workspace_id, file_id)
            status = describe_response.body.data.status
            print(f"現在のファイルステータス: {status}")
            if status == 'INIT':
                print("ファイルは解析待ちです。しばらくお待ちください...")
            elif status == 'PARSING':
                print("ファイルは解析中です。しばらくお待ちください...")
            elif status == 'PARSE_SUCCESS':
                print("ファイルは解析されました。")
                break
            else:
                print(f"不明なファイルステータス: {status}。テクニカルサポートにお問い合わせください。")
                return None
            time.sleep(5)
        # ステップ 7: ナレッジベースを初期化します。
        print("ステップ 7: Alibaba Cloud Model Studio でナレッジベースを作成します。")
        index_response = create_index(client, workspace_id, file_id, name, structure_type, source_type, sink_type)
        index_id = index_response.body.data.id
        # ステップ 8: インデックス作成タスクを送信します。
        print("ステップ 8: Alibaba Cloud Model Studio にインデックス作成タスクを送信します。")
        submit_response = submit_index(client, workspace_id, index_id)
        job_id = submit_response.body.data.id
        # ステップ 9: インデックス作成タスクのステータスを取得します。
        print("ステップ 9: Alibaba Cloud Model Studio からインデックス作成タスクのステータスを取得します。")
        while True:
            get_index_job_status_response = get_index_job_status(client, workspace_id, job_id, index_id)
            status = get_index_job_status_response.body.data.status
            print(f"現在のインデックス作成タスクのステータス: {status}")
            if status == 'COMPLETED':
                break
            time.sleep(5)
        print("Alibaba Cloud Model Studio ナレッジベースが作成されました。")
        return index_id
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return None


def main():
    if not check_environment_variables():
        print("環境変数のチェックに失敗しました。")
        return
    file_path = input("アップロードするファイルのローカルパスを入力してください。Linux の例: /xxx/xxx/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx:")
    kb_name = input("ナレッジベースの名前を入力してください:")
    workspace_id = os.environ.get('WORKSPACE_ID')
    create_knowledge_base(file_path, workspace_id, kb_name)


if __name__ == '__main__':
    main()

Java

// このサンプルコードは参照用です。本番環境では使用しないでください。
import com.aliyun.bailian20231229.models.*;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.*;
import java.util.concurrent.TimeUnit;

public class KnowledgeBaseCreate {

    /**
     * 必要な環境変数をチェックし、設定を促します。
     *
     * @return 必要なすべての環境変数が設定されている場合は true、それ以外の場合は false。
     */
    public static boolean checkEnvironmentVariables() {
        Map<String, String> requiredVars = new HashMap<>();
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_ID", "Alibaba Cloud AccessKey ID");
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "Alibaba Cloud AccessKey secret");
        requiredVars.put("WORKSPACE_ID", "Alibaba Cloud Model Studio ワークスペース ID");

        List<String> missingVars = new ArrayList<>();
        for (Map.Entry<String, String> entry : requiredVars.entrySet()) {
            String value = System.getenv(entry.getKey());
            if (value == null || value.isEmpty()) {
                missingVars.add(entry.getKey());
                System.out.println("エラー: 環境変数 " + entry.getKey() + " (" + entry.getValue() + ") を設定してください");
            }
        }

        return missingVars.isEmpty();
    }

    /**
     * ファイルの MD5 ハッシュを計算します。
     *
     * @param filePath ファイルのローカルパス。
     * @return ファイルの MD5 ハッシュ。
     * @throws Exception 計算中にエラーが発生した場合。
     */
    public static String calculateMD5(String filePath) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        try (FileInputStream fis = new FileInputStream(filePath)) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                md.update(buffer, 0, bytesRead);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : md.digest()) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }

    /**
     * ファイルサイズをバイト単位で取得します。
     *
     * @param filePath ファイルのローカルパス。
     * @return ファイルサイズ (バイト単位)。
     */
    public static String getFileSize(String filePath) {
        File file = new File(filePath);
        long fileSize = file.length();
        return String.valueOf(fileSize);
    }

    /**
     * クライアントを初期化します。
     *
     * @return 設定済みのクライアントオブジェクト。
     */
    public static com.aliyun.bailian20231229.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        config.endpoint = "bailian.ap-southeast-1.aliyuncs.com";
        return new com.aliyun.bailian20231229.Client(config);
    }

    /**
     * ファイルアップロードリースをリクエストします。
     *
     * @param client クライアントオブジェクト。
     * @param categoryId カテゴリ ID。
     * @param fileName ファイル名。
     * @param fileMd5 ファイルの MD5 ハッシュ。
     * @param fileSize ファイルサイズ (バイト単位)。
     * @param workspaceId ワークスペース ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static ApplyFileUploadLeaseResponse applyLease(com.aliyun.bailian20231229.Client client, String categoryId, String fileName, String fileMd5, String fileSize, String workspaceId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest applyFileUploadLeaseRequest = new com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest();
        applyFileUploadLeaseRequest.setFileName(fileName);
        applyFileUploadLeaseRequest.setMd5(fileMd5);
        applyFileUploadLeaseRequest.setSizeInBytes(fileSize);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        ApplyFileUploadLeaseResponse applyFileUploadLeaseResponse = null;
        applyFileUploadLeaseResponse = client.applyFileUploadLeaseWithOptions(categoryId, workspaceId, applyFileUploadLeaseRequest, headers, runtime);
        return applyFileUploadLeaseResponse;
    }

    /**
     * ファイルを一時ストレージにアップロードします。
     *
     * @param preSignedUrl アップロードリース内の URL。
     * @param headers アップロードのリクエストヘッダー。
     * @param filePath ファイルのローカルパス。
     * @throws Exception アップロード中にエラーが発生した場合。
     */
    public static void uploadFile(String preSignedUrl, Map<String, String> headers, String filePath) throws Exception {
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            throw new IllegalArgumentException("ファイルが存在しないか、通常のファイルではありません: " + filePath);
        }

        try (FileInputStream fis = new FileInputStream(file)) {
            URL url = new URL(preSignedUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("PUT");
            conn.setDoOutput(true);

            // アップロードリクエストヘッダーを設定します。
            conn.setRequestProperty("X-bailian-extra", headers.get("X-bailian-extra"));
            conn.setRequestProperty("Content-Type", headers.get("Content-Type"));

            // ファイルをチャンクで読み取り、アップロードします。
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                conn.getOutputStream().write(buffer, 0, bytesRead);
            }

            int responseCode = conn.getResponseCode();
            if (responseCode != 200) {
                throw new RuntimeException("アップロードに失敗しました: " + responseCode);
            }
        }
    }

    /**
     * ファイルをカテゴリに追加します。
     *
     * @param client クライアントオブジェクト。
     * @param leaseId リース ID。
     * @param parser ファイルのパーサ。
     * @param categoryId カテゴリ ID。
     * @param workspaceId ワークスペース ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static AddFileResponse addFile(com.aliyun.bailian20231229.Client client, String leaseId, String parser, String categoryId, String workspaceId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.AddFileRequest addFileRequest = new com.aliyun.bailian20231229.models.AddFileRequest();
        addFileRequest.setLeaseId(leaseId);
        addFileRequest.setParser(parser);
        addFileRequest.setCategoryId(categoryId);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.addFileWithOptions(workspaceId, addFileRequest, headers, runtime);
    }

    /**
     * ファイルの基本情報をクエリします。
     *
     * @param client クライアントオブジェクト。
     * @param workspaceId ワークスペース ID。
     * @param fileId ファイル ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static DescribeFileResponse describeFile(com.aliyun.bailian20231229.Client client, String workspaceId, String fileId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.describeFileWithOptions(workspaceId, fileId, headers, runtime);
    }

    /**
     * Model Studio サービスでナレッジベースを作成します (初期化)。
     *
     * @param client クライアントオブジェクト。
     * @param workspaceId ワークスペース ID。
     * @param fileId ファイル ID。
     * @param name ナレッジベース名。
     * @param structureType ナレッジベースのデータの型。
     * @param sourceType アプリケーションデータのデータの型。カテゴリとファイルがサポートされています。
     * @param sinkType ナレッジベースのベクターストレージタイプ。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static CreateIndexResponse createIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String fileId, String name, String structureType, String sourceType, String sinkType) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.CreateIndexRequest createIndexRequest = new com.aliyun.bailian20231229.models.CreateIndexRequest();
        createIndexRequest.setStructureType(structureType);
        createIndexRequest.setName(name);
        createIndexRequest.setSourceType(sourceType);
        createIndexRequest.setSinkType(sinkType);
        createIndexRequest.setDocumentIds(Collections.singletonList(fileId));
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.createIndexWithOptions(workspaceId, createIndexRequest, headers, runtime);
    }

    /**
     * Model Studio サービスにインデックス作成タスクを送信します。
     *
     * @param client クライアントオブジェクト。
     * @param workspaceId ワークスペース ID。
     * @param indexId ナレッジベース ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static SubmitIndexJobResponse submitIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.SubmitIndexJobRequest submitIndexJobRequest = new com.aliyun.bailian20231229.models.SubmitIndexJobRequest();
        submitIndexJobRequest.setIndexId(indexId);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.submitIndexJobWithOptions(workspaceId, submitIndexJobRequest, headers, runtime);
    }

    /**
     * インデックス作成タスクのステータスをクエリします。
     *
     * @param client クライアントオブジェクト。
     * @param workspaceId ワークスペース ID。
     * @param jobId タスク ID。
     * @param indexId ナレッジベース ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static GetIndexJobStatusResponse getIndexJobStatus(com.aliyun.bailian20231229.Client client, String workspaceId, String jobId, String indexId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.GetIndexJobStatusRequest getIndexJobStatusRequest = new com.aliyun.bailian20231229.models.GetIndexJobStatusRequest();
        getIndexJobStatusRequest.setIndexId(indexId);
        getIndexJobStatusRequest.setJobId(jobId);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        GetIndexJobStatusResponse getIndexJobStatusResponse = null;
        getIndexJobStatusResponse = client.getIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
        return getIndexJobStatusResponse;
    }

    /**
     * Model Studio サービスを使用してナレッジベースを作成します。
     *
     * @param filePath ファイルのローカルパス。
     * @param workspaceId ワークスペース ID。
     * @param name ナレッジベース名。
     * @return 呼び出しが成功した場合はナレッジベース ID。それ以外の場合は null が返されます。
     */
    public static String createKnowledgeBase(String filePath, String workspaceId, String name) {
        // デフォルト値を設定します。
        String categoryId = "default";
        String parser = "DASHSCOPE_DOCMIND";
        String sourceType = "DATA_CENTER_FILE";
        String structureType = "unstructured";
        String sinkType = "DEFAULT";
        try {
            // ステップ 1: クライアントを初期化します。
            System.out.println("ステップ 1: クライアントを初期化します。");
            com.aliyun.bailian20231229.Client client = createClient();

            // ステップ 2: ファイル情報を準備します。
            System.out.println("ステップ 2: ファイル情報を準備します。");
            String fileName = new File(filePath).getName();
            String fileMd5 = calculateMD5(filePath);
            String fileSize = getFileSize(filePath);

            // ステップ 3: アップロードリースをリクエストします。
            System.out.println("ステップ 3: Alibaba Cloud Model Studio からアップロードリースをリクエストします。");
            ApplyFileUploadLeaseResponse leaseResponse = applyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId);
            String leaseId = leaseResponse.getBody().getData().getFileUploadLeaseId();
            String uploadUrl = leaseResponse.getBody().getData().getParam().getUrl();
            Object uploadHeaders = leaseResponse.getBody().getData().getParam().getHeaders();

            // ステップ 4: ファイルをアップロードします。
            System.out.println("ステップ 4: Alibaba Cloud Model Studio にファイルをアップロードします。");
            // jackson-databind をご自身でインストールしてください。
            // 前のステップの uploadHeaders をマップ (キーと値のペア) に変換します。
            ObjectMapper mapper = new ObjectMapper();
            Map<String, String> uploadHeadersMap = (Map<String, String>) mapper.readValue(mapper.writeValueAsString(uploadHeaders), Map.class);
            uploadFile(uploadUrl, uploadHeadersMap, filePath);

            // ステップ 5: サーバーにファイルを追加します。
            System.out.println("ステップ 5: Alibaba Cloud Model Studio サーバーにファイルを追加します。");
            AddFileResponse addResponse = addFile(client, leaseId, parser, categoryId, workspaceId);
            String fileId = addResponse.getBody().getData().getFileId();

            // ステップ 6: ファイルのステータスを確認します。
            System.out.println("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。");
            while (true) {
                DescribeFileResponse describeResponse = describeFile(client, workspaceId, fileId);
                String status = describeResponse.getBody().getData().getStatus();
                System.out.println("現在のファイルステータス: " + status);

                if (status.equals("INIT")) {
                    System.out.println("ファイルは解析待ちです。しばらくお待ちください...");
                } else if (status.equals("PARSING")) {
                    System.out.println("ファイルは解析中です。しばらくお待ちください...");
                } else if (status.equals("PARSE_SUCCESS")) {
                    System.out.println("ファイルは解析されました。");
                    break;
                } else {
                    System.out.println("不明なファイルステータス: " + status + "。テクニカルサポートにお問い合わせください。");
                    return null;
                }
                TimeUnit.SECONDS.sleep(5);
            }

            // ステップ 7: ナレッジベースを初期化します。
            System.out.println("ステップ 7: Alibaba Cloud Model Studio でナレッジベースを作成します。");
            CreateIndexResponse indexResponse = createIndex(client, workspaceId, fileId, name, structureType, sourceType, sinkType);
            String indexId = indexResponse.getBody().getData().getId();

            // ステップ 8: インデックス作成タスクを送信します。
            System.out.println("ステップ 8: Alibaba Cloud Model Studio にインデックス作成タスクを送信します。");
            SubmitIndexJobResponse submitResponse = submitIndex(client, workspaceId, indexId);
            String jobId = submitResponse.getBody().getData().getId();

            // ステップ 9: インデックス作成タスクのステータスを取得します。
            System.out.println("ステップ 9: Alibaba Cloud Model Studio からインデックス作成タスクのステータスを取得します。");
            while (true) {
                GetIndexJobStatusResponse getStatusResponse = getIndexJobStatus(client, workspaceId, jobId, indexId);
                String status = getStatusResponse.getBody().getData().getStatus();
                System.out.println("現在のインデックス作成タスクのステータス: " + status);

                if (status.equals("COMPLETED")) {
                    break;
                }
                TimeUnit.SECONDS.sleep(5);
            }

            System.out.println("Alibaba Cloud Model Studio ナレッジベースが作成されました。");
            return indexId;

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

    /**
     * メイン関数。
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        if (!checkEnvironmentVariables()) {
            return;
        }

        System.out.print("アップロードするファイルのローカルパスを入力してください。Linux の例: /xxx/xxx/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx:");
        String filePath = scanner.nextLine();

        System.out.print("ナレッジベースの名前を入力してください:");
        String kbName = scanner.nextLine();

        String workspaceId = System.getenv("WORKSPACE_ID");
        String result = createKnowledgeBase(filePath, workspaceId, kbName);
        if (result != null) {
            System.out.println("ナレッジベース ID: " + result);
        }
    }
}

PHP

<?php
// このサンプルコードは参照用です。本番環境では使用しないでください。
namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\Dara\Models\RuntimeOptions;
use AlibabaCloud\SDK\Bailian\V20231229\Bailian;
use AlibabaCloud\SDK\Bailian\V20231229\Models\AddFileRequest;
use \Exception;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Bailian\V20231229\Models\ApplyFileUploadLeaseRequest;
use AlibabaCloud\SDK\Bailian\V20231229\Models\CreateIndexRequest;
use AlibabaCloud\SDK\Bailian\V20231229\Models\SubmitIndexJobRequest;
use AlibabaCloud\SDK\Bailian\V20231229\Models\GetIndexJobStatusRequest;

class KnowledgeBaseCreate {

    /**
    * 必要な環境変数をチェックし、設定を促します。
    *
    * @return bool 必要なすべての環境変数が設定されている場合は true、それ以外の場合は false を返します。
    */
    public static function checkEnvironmentVariables() {
        $requiredVars = [
            'ALIBABA_CLOUD_ACCESS_KEY_ID' => 'Alibaba Cloud AccessKey ID',
            'ALIBABA_CLOUD_ACCESS_KEY_SECRET' => 'Alibaba Cloud AccessKey secret',
            'WORKSPACE_ID' => 'Alibaba Cloud Model Studio ワークスペース ID'
        ];
        $missingVars = [];
        foreach ($requiredVars as $var => $description) {
            if (!getenv($var)) {
                $missingVars[] = $var;
                echo "エラー: 環境変数 $var ($description) を設定してください\n";
            }
        }
        return count($missingVars) === 0;
    }

    /**
     * ファイルの MD5 ハッシュを計算します。
     *
     * @param string $filePath ファイルのローカルパス。
     * @return string ファイルの MD5 ハッシュ。
     */
    public static function calculateMd5($filePath) {
        $md5Hash = hash_init("md5");
        $handle = fopen($filePath, "rb");
        while (!feof($handle)) {
            $chunk = fread($handle, 4096);
            hash_update($md5Hash, $chunk);
        }
        fclose($handle);
        return hash_final($md5Hash);
    }

    /**
     * ファイルサイズをバイト単位で取得します。
     *
     * @param string $filePath ファイルのローカルパス。
     * @return int ファイルサイズ (バイト単位)。
     */
    public static function getFileSize($filePath) {
        return (string)filesize($filePath);
    }

    /**
     * クライアントを初期化します。
     *
     * @return Bailian 設定済みのクライアントオブジェクト。
     */
    public static function createClient(){
        $config = new Config([
            "accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), 
            "accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
        ]);
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        $config->endpoint = 'bailian.ap-southeast-1.aliyuncs.com';
        return new Bailian($config);
    }

    /**
     * ファイルアップロードリースをリクエストします。
     *
     * @param Bailian $client クライアント。
     * @param string $categoryId カテゴリ ID。
     * @param string $fileName ファイル名。
     * @param string $fileMd5 ファイルの MD5 ハッシュ。
     * @param int $fileSize ファイルサイズ (バイト単位)。
     * @param string $workspaceId ワークスペース ID。
     * @return ApplyFileUploadLeaseResponse Model Studio サービスからの応答。
     */
    public static function applyLease($client, $categoryId, $fileName, $fileMd5, $fileSize, $workspaceId) {
        $headers = [];
        $applyFileUploadLeaseRequest = new ApplyFileUploadLeaseRequest([
            "fileName" => $fileName,
            "md5" => $fileMd5,
            "sizeInBytes" => $fileSize
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->applyFileUploadLeaseWithOptions($categoryId, $workspaceId, $applyFileUploadLeaseRequest, $headers, $runtime);
    }

    /**
     * ファイルを一時ストレージにアップロードします。
    *
    * @param string $preSignedUrl アップロードリース内の URL。
    * @param array $headers アップロードのリクエストヘッダー。
    * @param string $filePath ファイルのローカルパス。
    */
    public static function uploadFile($preSignedUrl, $headers, $filePath) {
        $fileContent = file_get_contents($filePath);
        // アップロードリクエストヘッダーを設定します。
        $uploadHeaders = [
            "X-bailian-extra" => $headers["X-bailian-extra"],
            "Content-Type" => $headers["Content-Type"]
        ];
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $preSignedUrl);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContent);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array_map(function($key, $value) {
            return "$key: $value";
        }, array_keys($uploadHeaders), $uploadHeaders));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($httpCode != 200) {
            throw new Exception("アップロードに失敗しました: " . curl_error($ch));
        }
        curl_close($ch);
    }

    /**
     * ファイルをカテゴリに追加します。
     *
     * @param Bailian $client クライアント。
     * @param string $leaseId リース ID。
     * @param string $parser ファイルのパーサ。
     * @param string $categoryId カテゴリ ID。
     * @param string $workspaceId ワークスペース ID。
     * @return AddFileResponse Model Studio サービスからの応答。
     */
    public static function addFile($client, $leaseId, $parser, $categoryId, $workspaceId) {
        $headers = [];
        $addFileRequest = new AddFileRequest([
            "leaseId" => $leaseId,
            "parser" => $parser,
            "categoryId" => $categoryId
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->addFileWithOptions($workspaceId, $addFileRequest, $headers, $runtime);
    }

    /**
     * ファイルの基本情報をクエリします。
     *
     * @param Bailian $client クライアント。
     * @param string $workspaceId ワークスペース ID。
     * @param string $fileId ファイル ID。
     * @return DescribeFileResponse Model Studio サービスからの応答。
     */
    public static function describeFile($client, $workspaceId, $fileId) {
        $headers = [];
        $runtime = new RuntimeOptions([]);
        return $client->describeFileWithOptions($workspaceId, $fileId, $headers, $runtime);
    }

    /**
     * Model Studio サービスでナレッジベースを作成します (初期化)。
     *
     * @param Bailian $client クライアント。
     * @param string $workspaceId ワークスペース ID。
     * @param string $fileId ファイル ID。
     * @param string $name ナレッジベース名。
     * @param string $structureType ナレッジベースのデータの型。
     * @param string $sourceType アプリケーションデータのデータの型。カテゴリとファイルがサポートされています。
     * @param string $sinkType ナレッジベースのベクターストレージタイプ。
     * @return CreateIndexResponse Model Studio サービスからの応答。
     */
    public static function createIndex($client, $workspaceId, $fileId, $name, $structureType, $sourceType, $sinkType) {
        $headers = [];
        $createIndexRequest = new CreateIndexRequest([
            "structureType" => $structureType,
            "name" => $name,
            "sourceType" => $sourceType,
            "documentIds" => [
                $fileId
            ],
            "sinkType" => $sinkType
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->createIndexWithOptions($workspaceId, $createIndexRequest, $headers, $runtime);
    }

    /**
     * Model Studio サービスにインデックス作成タスクを送信します。
     *
     * @param Bailian $client クライアント。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId ナレッジベース ID。
     * @return SubmitIndexJobResponse Model Studio サービスからの応答。
     */
    public static function submitIndex($client, $workspaceId, $indexId) {
        $headers = [];
        $submitIndexJobRequest = new SubmitIndexJobRequest([
            'indexId' => $indexId
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->submitIndexJobWithOptions($workspaceId, $submitIndexJobRequest, $headers, $runtime);
    }

    /**
     * インデックス作成タスクのステータスをクエリします。
     *
     * @param Bailian $client クライアント。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId ナレッジベース ID。
     * @param string $jobId タスク ID。
     * @return GetIndexJobStatusResponse Model Studio サービスからの応答。
     */
    public static function getIndexJobStatus($client, $workspaceId, $jobId, $indexId) {
        $headers = [];
        $getIndexJobStatusRequest = new GetIndexJobStatusRequest([
            'indexId' => $indexId,
            'jobId' => $jobId
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->getIndexJobStatusWithOptions($workspaceId, $getIndexJobStatusRequest, $headers, $runtime);
    }

    /**
     * Model Studio サービスを使用してナレッジベースを作成します。
     *
     * @param string $filePath ファイルのローカルパス。
     * @param string $workspaceId ワークスペース ID。
     * @param string $name ナレッジベース名。
     * @return string|null 呼び出しが成功した場合はナレッジベース ID。それ以外の場合は null が返されます。
     */
    public static function createKnowledgeBase($filePath, $workspaceId, $name) {
        // デフォルト値を設定します。
        $categoryId = 'default';
        $parser = 'DASHSCOPE_DOCMIND';
        $sourceType = 'DATA_CENTER_FILE';
        $structureType = 'unstructured';
        $sinkType = 'DEFAULT';
        try {
            // ステップ 1: クライアントを初期化します。
            echo "ステップ 1: クライアントを初期化します。\n";
            $client = self::createClient();

            // ステップ 2: ファイル情報を準備します。
            echo "ステップ 2: ファイル情報を準備します。\n";
            $fileName = basename($filePath);
            echo("this is filename : $fileName");
            $fileMd5 = self::calculateMd5($filePath);
            $fileSize = self::getFileSize($filePath);

            // ステップ 3: アップロードリースをリクエストします。
            echo "ステップ 3: Alibaba Cloud Model Studio からアップロードリースをリクエストします。\n";
            $leaseResponse = self::applyLease($client, $categoryId, $fileName, $fileMd5, $fileSize, $workspaceId);
            $leaseId = $leaseResponse->body->data->fileUploadLeaseId;
            $uploadUrl = $leaseResponse->body->data->param->url;
            $uploadHeaders = $leaseResponse->body->data->param->headers;
            $uploadHeadersMap = json_decode(json_encode($uploadHeaders), true);

            // ステップ 4: ファイルをアップロードします。
            echo "ステップ 4: Alibaba Cloud Model Studio にファイルをアップロードします。\n";
            self::uploadFile($uploadUrl, $uploadHeadersMap, $filePath);

            // ステップ 5: サーバーにファイルを追加します。
            echo "ステップ 5: Alibaba Cloud Model Studio サーバーにファイルを追加します。\n";
            $addResponse = self::addFile($client, $leaseId, $parser, $categoryId, $workspaceId);
            $fileId = $addResponse->body->data->fileId;
            echo("fileid: $fileId\n");
            // ステップ 6: ファイルのステータスを確認します。
            echo "ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。\n";
            while (true) {
                $describeResponse = self::describeFile($client, $workspaceId, $fileId);
                $status = $describeResponse->body->data->status;
                echo "現在のファイルステータス: $status\n";
                if ($status == 'INIT') {
                    echo "ファイルは解析待ちです。しばらくお待ちください...\n";
                } elseif ($status == 'PARSING') {
                    echo "ファイルは解析中です。しばらくお待ちください...\n";
                } elseif ($status == 'PARSE_SUCCESS') {
                    echo "ファイルは解析されました。\n";
                    break;
                } else {
                    echo "不明なファイルステータス: $status。テクニカルサポートにお問い合わせください。\n";
                    return null;
                }
                sleep(5);
            }

            // ステップ 7: ナレッジベースを初期化します。
            echo "ステップ 7: Alibaba Cloud Model Studio でナレッジベースを初期化します。\n";
            $indexResponse = self::createIndex($client, $workspaceId, $fileId, $name, $structureType, $sourceType, $sinkType);
            $indexId = $indexResponse->body->data->id;

            // ステップ 8: インデックス作成タスクを送信します。
            echo "ステップ 8: Alibaba Cloud Model Studio にインデックス作成タスクを送信します。\n";
            $submitResponse = self::submitIndex($client, $workspaceId, $indexId);
            $jobId = $submitResponse->body->data->id;

            // ステップ 9: インデックス作成タスクのステータスを取得します。
            echo "ステップ 9: Alibaba Cloud Model Studio からインデックス作成タスクのステータスを取得します。\n";
            while (true) {
                $getIndexJobStatusResponse = self::getIndexJobStatus($client, $workspaceId, $jobId, $indexId);
                $status = $getIndexJobStatusResponse->body->data->status;
                echo "現在のインデックス作成タスクのステータス: $status\n";
                if ($status == 'COMPLETED') {
                    break;
                }
                sleep(5);
            }
            echo "Alibaba Cloud Model Studio ナレッジベースが作成されました。\n";
            return $indexId;
        } catch (Exception $e) {
            echo "エラーが発生しました: {$e->getMessage()}\n";
            return null;
        }
    }


    /**
     * メイン関数。
     */
    public static function main($args){
        if (!self::checkEnvironmentVariables()) {
            echo "環境変数のチェックに失敗しました。\n";
            return;
        }
        $filePath = readline("アップロードするファイルのローカルパスを入力してください。Linux の例: /xxx/xxx/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx:");
        $kbName = readline("ナレッジベースの名前を入力してください:");
        $workspaceId = getenv('WORKSPACE_ID');
        $result = self::createKnowledgeBase($filePath, $workspaceId, $kbName);
       if ($result) {
           echo "ナレッジベース ID: $result\n";
       } else {
           echo "ナレッジベースの作成に失敗しました。\n";
       }
    }
}
// autoload.php が現在のコードファイルの親ディレクトリにあると仮定します。プロジェクトの構造に基づいてパスを調整してください。
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}
KnowledgeBaseCreate::main(array_slice($argv, 1));

Node.js

// このサンプルコードは参照用です。本番環境では使用しないでください。
'use strict';

const fs = require('fs');
const path = require('path');
const axios = require('axios');
const crypto = require('crypto');

const bailian20231229 = require('@alicloud/bailian20231229');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');

class KbCreate {

  /**
   * 必要な環境変数をチェックし、設定を促します。
   * @returns {boolean} - 必要なすべての環境変数が設定されている場合は true を返します。それ以外の場合は false を返します。
   */
  static checkEnvironmentVariables() {
    const requiredVars = {
      'ALIBABA_CLOUD_ACCESS_KEY_ID': 'Alibaba Cloud AccessKey ID',
      'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'Alibaba Cloud AccessKey secret',
      'WORKSPACE_ID': 'Alibaba Cloud Model Studio ワークスペース ID'
    };

    const missing = [];
    for (const [varName, desc] of Object.entries(requiredVars)) {
      if (!process.env[varName]) {
        console.error(`エラー: 環境変数 ${varName} (${desc}) を設定してください`);
        missing.push(varName);
      }
    }
    return missing.length === 0;
  }

  /**
   * ファイルの MD5 ハッシュを計算します。
   * @param {string} filePath - ファイルのローカルパス。
   * @returns {Promise<string>} - ファイルの MD5 ハッシュ。
   */
  static async calculateMD5(filePath) {
    const hash = crypto.createHash('md5');
    const stream = fs.createReadStream(filePath);

    return new Promise((resolve, reject) => {
      stream.on('data', chunk => hash.update(chunk));
      stream.on('end', () => resolve(hash.digest('hex')));
      stream.on('error', reject);
    });
  }

  /**
   * ファイルサイズをバイト単位で取得し、文字列として返します。
   * @param {string} filePath - ファイルのローカルパス。
   * @returns {string} - ファイルサイズ (例: "123456")。
   */
  static getFileSize(filePath) {
    try {
      const stats = fs.statSync(filePath);
      return stats.size.toString();
    } catch (err) {
      console.error(`ファイルサイズの取得に失敗しました: ${err.message}`);
      throw err;
    }
  }

  /**
   * クライアントを作成して設定します。
   * @return Client
   * @throws Exception
   */
  static createClient() {
    const config = new OpenApi.Config({
      accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
      accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
    });
    // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
    config.endpoint = `bailian.ap-southeast-1.aliyuncs.com`;
    return new bailian20231229.default(config);
  }

  /**
   * ファイルアップロードリースをリクエストします。
   * @param {Bailian20231229Client} client - クライアント。
   * @param {string} categoryId - カテゴリ ID。
   * @param {string} fileName - ファイル名。
   * @param {string} fileMd5 - ファイルの MD5 ハッシュ。
   * @param {string} fileSize - ファイルサイズ (バイト単位)。
   * @param {string} workspaceId - ワークスペース ID。
   * @returns {Promise<bailian20231229.ApplyFileUploadLeaseResponse>} - Model Studio サービスからの応答。
   */
  static async applyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId) {
    const headers = {};
    const req = new bailian20231229.ApplyFileUploadLeaseRequest({
      md5: fileMd5,
      fileName,
      sizeInBytes: fileSize
    });
    const runtime = new Util.RuntimeOptions({});
    return await client.applyFileUploadLeaseWithOptions(
      categoryId,
      workspaceId,
      req,
      headers,
      runtime
    );
  }

  /**
   * ファイルを一時ストレージにアップロードします。
   * @param {string} preSignedUrl - アップロードリース内の URL。
   * @param {Object} headers - アップロードのリクエストヘッダー。
   * @param {string} filePath - ファイルのローカルパス。
   */
  static async uploadFile(preSignedUrl, headers, filePath) {
    const uploadHeaders = {
      "X-bailian-extra": headers["X-bailian-extra"],
      "Content-Type": headers["Content-Type"]
    };
    const stream = fs.createReadStream(filePath);
    try {
      await axios.put(preSignedUrl, stream, { headers: uploadHeaders });
    } catch (e) {
      throw new Error(`アップロードに失敗しました: ${e.message}`);
    }
  }

  /**
   * ファイルをカテゴリに追加します。
   * @param {Bailian20231229Client} client - クライアント。
   * @param {string} leaseId - リース ID。
   * @param {string} parser - ファイルのパーサ。
   * @param {string} categoryId - カテゴリ ID。
   * @param {string} workspaceId - ワークスペース ID。
   * @returns {Promise<bailian20231229.AddFileResponse>} - Model Studio サービスからの応答。
   */
  static async addFile(client, leaseId, parser, categoryId, workspaceId) {
    const headers = {};
    const req = new bailian20231229.AddFileRequest({
      leaseId,
      parser,
      categoryId
    });
    const runtime = new Util.RuntimeOptions({});
    return await client.addFileWithOptions(workspaceId, req, headers, runtime);
  }

  /**
   * ファイルの解析ステータスをクエリします。
   * @param {Bailian20231229Client} client - クライアント。
   * @param {string} workspaceId - ワークスペース ID。
   * @param {string} fileId - ファイル ID。
   * @returns {Promise<bailian20231229.DescribeFileResponse>} - Model Studio サービスからの応答。
   */
  static async describeFile(client, workspaceId, fileId) {
    const headers = {};
    const runtime = new Util.RuntimeOptions({});
    return await client.describeFileWithOptions(workspaceId, fileId, headers, runtime);
  }

  /**
   * ナレッジベース (インデックス) を初期化します。
   * @param {Bailian20231229Client} client - クライアント。
   * @param {string} workspaceId - ワークスペース ID。
   * @param {string} fileId - ファイル ID。
   * @param {string} name - ナレッジベース名。
   * @param {string} structureType - ナレッジベースのデータの型。
   * @param {string} sourceType - アプリケーションデータのデータの型。カテゴリとファイルがサポートされています。
   * @param {string} sinkType - ナレッジベースのベクターストレージタイプ。
   * @returns {Promise<bailian20231229.CreateIndexResponse>} - Model Studio サービスからの応答。
   */
  static async createIndex(client, workspaceId, fileId, name, structureType, sourceType, sinkType) {
    const headers = {};
    const req = new bailian20231229.CreateIndexRequest({
      name,
      structureType,
      documentIds: [fileId],
      sourceType,
      sinkType
    });
    const runtime = new Util.RuntimeOptions({});
    return await client.createIndexWithOptions(workspaceId, req, headers, runtime);
  }

  /**
   * インデックス作成タスクを送信します。
   * @param {Bailian20231229Client} client - クライアント。
   * @param {string} workspaceId - ワークスペース ID。
   * @param {string} indexId - ナレッジベース ID。
   * @returns {Promise<bailian20231229.SubmitIndexJobResponse>} - Model Studio サービスからの応答。
   */
  static async submitIndex(client, workspaceId, indexId) {
    const headers = {};
    const req = new bailian20231229.SubmitIndexJobRequest({ indexId });
    const runtime = new Util.RuntimeOptions({});
    return await client.submitIndexJobWithOptions(workspaceId, req, headers, runtime);
  }

  /**
   * インデックス作成タスクのステータスをクエリします。
   * @param {Bailian20231229Client} client - クライアント。
   * @param {string} workspaceId - ワークスペース ID。
   * @param {string} jobId - タスク ID。
   * @param {string} indexId - ナレッジベース ID。
   * @returns {Promise<bailian20231229.GetIndexJobStatusResponse>} - Model Studio サービスからの応答。
   */
  static async getIndexJobStatus(client, workspaceId, jobId, indexId) {
    const headers = {};
    const req = new bailian20231229.GetIndexJobStatusRequest({ jobId, indexId });
    const runtime = new Util.RuntimeOptions({});
    return await client.getIndexJobStatusWithOptions(workspaceId, req, headers, runtime);
  }

  /**
   * ナレッジベースを作成します。
   * @param {string} filePath - ファイルのローカルパス。
   * @param {string} workspaceId - ワークスペース ID。
   * @param {string} name - ナレッジベース名。
   * @returns {Promise<string | null>} - 呼び出しが成功した場合はナレッジベース ID。それ以外の場合は null が返されます。
   */
  static async createKnowledgeBase(filePath, workspaceId, name) {
    const categoryId = 'default';
    const parser = 'DASHSCOPE_DOCMIND';
    const sourceType = 'DATA_CENTER_FILE';
    const structureType = 'unstructured';
    const sinkType = 'DEFAULT';

    try {
      console.log("ステップ 1: クライアントを初期化します。");
      const client = this.createClient();

      console.log("ステップ 2: ファイル情報を準備します。");
      const fileName = path.basename(filePath);
      const fileMd5 = await this.calculateMD5(filePath);
      const fileSize = this.getFileSize(filePath);

      console.log("ステップ 3: Alibaba Cloud Model Studio からアップロードリースをリクエストします。")
      const leaseRes = await this.applyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId);
      const leaseId = leaseRes.body.data.fileUploadLeaseId;
      const uploadUrl = leaseRes.body.data.param.url;
      const uploadHeaders = leaseRes.body.data.param.headers;

      console.log("ステップ 4: Alibaba Cloud Model Studio にファイルをアップロードします。")
      await this.uploadFile(uploadUrl, uploadHeaders, filePath);

      console.log("ステップ 5: Alibaba Cloud Model Studio サーバーにファイルを追加します。")
      const addRes = await this.addFile(client, leaseId, parser, categoryId, workspaceId);
      const fileId = addRes.body.data.fileId;

      console.log("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。")
      while (true) {
        const descRes = await this.describeFile(client, workspaceId, fileId);
        const status = descRes.body.data.status;
        console.log(`現在のファイルステータス: ${status}`);

        if (status === 'INIT') console.log("ファイルは解析待ちです。しばらくお待ちください...");
        else if (status === 'PARSING') console.log("ファイルは解析中です。しばらくお待ちください...");
        else if (status === 'PARSE_SUCCESS') break;
        else {
          console.error(`不明なファイルステータス: ${status}。テクニカルサポートにお問い合わせください。`);
          return null;
        }
        await this.sleep(5);
      }

      console.log("ステップ 7: Alibaba Cloud Model Studio でナレッジベースを初期化します。")
      const indexRes = await this.createIndex(client, workspaceId, fileId, name, structureType, sourceType, sinkType);
      const indexId = indexRes.body.data.id;

      console.log("ステップ 8: Alibaba Cloud Model Studio にインデックス作成タスクを送信します。")
      const submitRes = await this.submitIndex(client, workspaceId, indexId);
      const jobId = submitRes.body.data.id;

      console.log("ステップ 9: Alibaba Cloud Model Studio からインデックス作成タスクのステータスを取得します。")
      while (true) {
        const jobRes = await this.getIndexJobStatus(client, workspaceId, jobId, indexId);
        const status = jobRes.body.data.status;
        console.log(`現在のインデックス作成タスクのステータス: ${status}`);
        if (status === 'COMPLETED') break;
        await this.sleep(5);
      }
      console.log("Alibaba Cloud Model Studio ナレッジベースが作成されました。");
      return indexId;
    } catch (e) {
      console.error(`エラーが発生しました: ${e.message}`);
      return null;
    }
  }

  /**
   * 指定された秒数待機します。
   * @param {number} seconds - 秒単位の待機時間。
   * @returns {Promise<void>}
   */
  static sleep(seconds) {
    return new Promise(resolve => setTimeout(resolve, seconds * 1000));
  }

  static async main(args) {
    if (!this.checkEnvironmentVariables()) {
      console.log("環境変数のチェックに失敗しました。");
      return;
    }

    const readline = require('readline').createInterface({
      input: process.stdin,
      output: process.stdout
    });

    try {
      const filePath = await new Promise((resolve, reject) => {
        readline.question("アップロードするファイルのローカルパスを入力してください。Linux の例: /xxx/xxx/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx:", (ans) => {
          ans.trim() ? resolve(ans) : reject(new Error("パスは空にできません。"));
        });
      });
      const kbName = await new Promise((resolve, reject) => {
        readline.question("ナレッジベースの名前を入力してください:", (ans) => {
          ans.trim() ? resolve(ans) : reject(new Error("ナレッジベース名は空にできません。"));
        });
      });
      const workspaceId = process.env.WORKSPACE_ID;

      const result = await KbCreate.createKnowledgeBase(filePath, workspaceId, kbName);
      if (result) console.log(`ナレッジベース ID: ${result}`);
      else console.log("ナレッジベースの作成に失敗しました。");
    } catch (err) {
      console.error(err.message);
    } finally {
      readline.close();
    }
  }
}

exports.KbCreate = KbCreate;
KbCreate.main(process.argv.slice(2));

C#

// このサンプルコードは参照用です。本番環境では使用しないでください。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

using Newtonsoft.Json;
using Tea;
using Tea.Utils;


namespace AlibabaCloud.SDK.KnowledgeBase
{
    public class KnowledgeBaseCreate
    {
        /// <summary>
        /// 必要な環境変数をチェックし、設定を促します。
        /// </summary>
        /// <returns>必要なすべての環境変数が設定されている場合は true を返します。それ以外の場合は false を返します。</returns>
        public static bool CheckEnvironmentVariables()
        {
            var requiredVars = new Dictionary<string, string>
            {
                { "ALIBABA_CLOUD_ACCESS_KEY_ID", "Alibaba Cloud AccessKey ID" },
                { "ALIBABA_CLOUD_ACCESS_KEY_SECRET", "Alibaba Cloud AccessKey secret" },
                { "WORKSPACE_ID", "Alibaba Cloud Model Studio ワークスペース ID" }
            };

            var missingVars = new List<string>();
            foreach (var entry in requiredVars)
            {
                string value = Environment.GetEnvironmentVariable(entry.Key);
                if (string.IsNullOrEmpty(value))
                {
                    missingVars.Add(entry.Key);
                    Console.WriteLine($"エラー: 環境変数 {entry.Key} ({entry.Value}) を設定してください");
                }
            }

            return missingVars.Count == 0;
        }

        /// <summary>
        /// ファイルの MD5 ハッシュを計算します。
        /// </summary>
        /// <param name="filePath">ファイルのローカルパス。</param>
        /// <returns>ファイルの MD5 ハッシュ。</returns>
        /// <exception cref="Exception">計算中にエラーが発生した場合にスローされます。</exception>
        public static string CalculateMD5(string filePath)
        {
            using (var md5 = MD5.Create())
            {
                using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    byte[] hashBytes = md5.ComputeHash(stream);
                    StringBuilder sb = new StringBuilder();
                    foreach (byte b in hashBytes)
                    {
                        sb.Append(b.ToString("x2"));
                    }
                    return sb.ToString();
                }
            }
        }

        /// <summary>
        /// ファイルサイズをバイト単位で取得します。
        /// </summary>
        /// <param name="filePath">ファイルのローカルパス。</param>
        /// <returns>ファイルサイズ (バイト単位)。</returns>
        public static string GetFileSize(string filePath)
        {
            var file = new FileInfo(filePath);
            return file.Length.ToString();
        }

        /// <summary>
        /// クライアントを初期化します。
        /// </summary>
        /// <returns>設定済みのクライアントオブジェクト。</returns>
        /// <exception cref="Exception">初期化中にエラーが発生した場合にスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Client CreateClient()
        {
            var config = new AlibabaCloud.OpenApiClient.Models.Config
            {
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
            };
            // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
            config.Endpoint = "bailian.ap-southeast-1.aliyuncs.com";
            return new AlibabaCloud.SDK.Bailian20231229.Client(config);
        }

        /// <summary>
        /// ファイルアップロードリースをリクエストします。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="categoryId">カテゴリ ID。</param>
        /// <param name="fileName">ファイル名。</param>
        /// <param name="fileMd5">ファイルの MD5 ハッシュ。</param>
        /// <param name="fileSize">ファイルサイズ (バイト単位)。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合にスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.ApplyFileUploadLeaseResponse ApplyLease(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string categoryId,
            string fileName,
            string fileMd5,
            string fileSize,
            string workspaceId)
        {
            var headers = new Dictionary<string, string>() { };
            var applyFileUploadLeaseRequest = new AlibabaCloud.SDK.Bailian20231229.Models.ApplyFileUploadLeaseRequest
            {
                FileName = fileName,
                Md5 = fileMd5,
                SizeInBytes = fileSize
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.ApplyFileUploadLeaseWithOptions(categoryId, workspaceId, applyFileUploadLeaseRequest, headers, runtime);
        }

        /// <summary>
        /// ファイルを一時ストレージにアップロードします。
        /// </summary>
        /// <param name="preSignedUrl">アップロードリース内の URL。</param>
        /// <param name="headers">アップロードのリクエストヘッダー。</param>
        /// <param name="filePath">ファイルのローカルパス。</param>
        /// <exception cref="Exception">アップロード中にエラーが発生した場合にスローされます。</exception>
        public static void UploadFile(string preSignedUrl, Dictionary<string, string> headers, string filePath)
        {
            var file = new FileInfo(filePath);
            if (!File.Exists(filePath))
            {
                throw new ArgumentException($"ファイルが存在しないか、通常のファイルではありません: {filePath}");
            }

            using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                var url = new Uri(preSignedUrl);
                var conn = (HttpWebRequest)WebRequest.Create(url);
                conn.Method = "PUT";
                conn.ContentType = headers["Content-Type"];
                conn.Headers.Add("X-bailian-extra", headers["X-bailian-extra"]);

                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    conn.GetRequestStream().Write(buffer, 0, bytesRead);
                }

                using (var response = (HttpWebResponse)conn.GetResponse())
                {
                    if (response.StatusCode != HttpStatusCode.OK)
                    {
                        throw new Exception($"アップロードに失敗しました: {response.StatusCode}");
                    }
                }
            }
        }

        /// <summary>
        /// ファイルをカテゴリに追加します。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="leaseId">リース ID。</param>
        /// <param name="parser">ファイルのパーサ。</param>
        /// <param name="categoryId">カテゴリ ID。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合にスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.AddFileResponse AddFile(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string leaseId,
            string parser,
            string categoryId,
            string workspaceId)
        {
            var headers = new Dictionary<string, string>() { };
            var addFileRequest = new AlibabaCloud.SDK.Bailian20231229.Models.AddFileRequest
            {
                LeaseId = leaseId,
                Parser = parser,
                CategoryId = categoryId
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.AddFileWithOptions(workspaceId, addFileRequest, headers, runtime);
        }

        /// <summary>
        /// ファイルの基本情報をクエリします。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="fileId">ファイル ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合にスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.DescribeFileResponse DescribeFile(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string fileId)
        {
            var headers = new Dictionary<string, string>() { };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.DescribeFileWithOptions(workspaceId, fileId, headers, runtime);
        }

        /// <summary>
        /// Model Studio サービスでナレッジベースを作成します (初期化)。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="fileId">ファイル ID。</param>
        /// <param name="name">ナレッジベース名。</param>
        /// <param name="structureType">ナレッジベースのデータの型。</param>
        /// <param name="sourceType">アプリケーションデータのデータの型。カテゴリとファイルがサポートされています。</param>
        /// <param name="sinkType">ナレッジベースのベクターストレージタイプ。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合にスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.CreateIndexResponse CreateIndex(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string fileId,
            string name,
            string structureType,
            string sourceType,
            string sinkType)
        {
            var headers = new Dictionary<string, string>() { };
            var createIndexRequest = new AlibabaCloud.SDK.Bailian20231229.Models.CreateIndexRequest
            {
                StructureType = structureType,
                Name = name,
                SourceType = sourceType,
                SinkType = sinkType,
                DocumentIds = new List<string> { fileId }
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.CreateIndexWithOptions(workspaceId, createIndexRequest, headers, runtime);
        }

        /// <summary>
        /// Model Studio サービスにインデックス作成タスクを送信します。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="indexId">ナレッジベース ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合にスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexJobResponse SubmitIndex(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string indexId)
        {
            var headers = new Dictionary<string, string>() { };
            var submitIndexJobRequest = new AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexJobRequest
            {
                IndexId = indexId
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.SubmitIndexJobWithOptions(workspaceId, submitIndexJobRequest, headers, runtime);
        }

        /// <summary>
        /// インデックス作成タスクのステータスをクエリします。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="jobId">タスク ID。</param>
        /// <param name="indexId">ナレッジベース ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合にスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusResponse GetIndexJobStatus(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string jobId,
            string indexId)
        {
            var headers = new Dictionary<string, string>() { };
            var getIndexJobStatusRequest = new AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusRequest
            {
                IndexId = indexId,
                JobId = jobId
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.GetIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
        }

        /// <summary>
        /// Model Studio サービスを使用してナレッジベースを作成します。
        /// </summary>
        /// <param name="filePath">ファイルのローカルパス。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="name">ナレッジベース名。</param>
        /// <returns>呼び出しが成功した場合はナレッジベース ID。それ以外の場合は null が返されます。</returns>
        public static string CreateKnowledgeBase(string filePath, string workspaceId, string name)
        {
            // デフォルト値を設定します。
            string categoryId = "default";
            string parser = "DASHSCOPE_DOCMIND";
            string sourceType = "DATA_CENTER_FILE";
            string structureType = "unstructured";
            string sinkType = "DEFAULT";

            try
            {
                Console.WriteLine("ステップ 1: クライアントを初期化します。");
                AlibabaCloud.SDK.Bailian20231229.Client client = CreateClient();

                Console.WriteLine("ステップ 2: ファイル情報を準備します。");
                var fileInfo = new FileInfo(filePath);
                string fileName = fileInfo.Name;
                string fileMd5 = CalculateMD5(filePath);
                string fileSize = GetFileSize(filePath);

                Console.WriteLine("ステップ 3: Alibaba Cloud Model Studio からアップロードリースをリクエストします。");
                Bailian20231229.Models.ApplyFileUploadLeaseResponse leaseResponse = ApplyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId);
                string leaseId = leaseResponse.Body.Data.FileUploadLeaseId;
                string uploadUrl = leaseResponse.Body.Data.Param.Url;
                var uploadHeaders = leaseResponse.Body.Data.Param.Headers;

                Console.WriteLine("ステップ 4: Alibaba Cloud Model Studio にファイルをアップロードします。");
                // Newtonsoft.Json をご自身でインストールしてください。
                var uploadHeadersMap = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(uploadHeaders));
                UploadFile(uploadUrl, uploadHeadersMap, filePath);

                Console.WriteLine("ステップ 5: Alibaba Cloud Model Studio サーバーにファイルを追加します。");
                Bailian20231229.Models.AddFileResponse addResponse = AddFile(client, leaseId, parser, categoryId, workspaceId);
                string fileId = addResponse.Body.Data.FileId;

                Console.WriteLine("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。");
                while (true)
                {
                    Bailian20231229.Models.DescribeFileResponse describeResponse = DescribeFile(client, workspaceId, fileId);
                    string status = describeResponse.Body.Data.Status;
                    Console.WriteLine($"現在のファイルステータス: {status}");

                    if (status == "INIT")
                    {
                        Console.WriteLine("ファイルは解析待ちです。しばらくお待ちください...");
                    }
                    else if (status == "PARSING")
                    {
                        Console.WriteLine("ファイルは解析中です。しばらくお待ちください...");
                    }
                    else if (status == "PARSE_SUCCESS")
                    {
                        Console.WriteLine("ファイルは解析されました。");
                        break;
                    }
                    else
                    {
                        Console.WriteLine($"不明なファイルステータス: {status}。テクニカルサポートにお問い合わせください。");
                        return null;
                    }
                    Thread.Sleep(5000);
                }

                Console.WriteLine("ステップ 7: Alibaba Cloud Model Studio でナレッジベースを作成します。");
                Bailian20231229.Models.CreateIndexResponse indexResponse = CreateIndex(client, workspaceId, fileId, name, structureType, sourceType, sinkType);
                string indexId = indexResponse.Body.Data.Id;

                Console.WriteLine("ステップ 8: Alibaba Cloud Model Studio にインデックス作成タスクを送信します。");
                Bailian20231229.Models.SubmitIndexJobResponse submitResponse = SubmitIndex(client, workspaceId, indexId);
                string jobId = submitResponse.Body.Data.Id;

                Console.WriteLine("ステップ 9: Alibaba Cloud Model Studio からインデックス作成タスクのステータスを取得します。");
                while (true)
                {
                    Bailian20231229.Models.GetIndexJobStatusResponse getStatusResponse = GetIndexJobStatus(client, workspaceId, jobId, indexId);
                    string status = getStatusResponse.Body.Data.Status;
                    Console.WriteLine($"現在のインデックス作成タスクのステータス: {status}");

                    if (status == "COMPLETED")
                    {
                        break;
                    }
                    Thread.Sleep(5000);
                }

                Console.WriteLine("Alibaba Cloud Model Studio ナレッジベースが作成されました。");
                return indexId;

            }
            catch (Exception ex)
            {
                Console.WriteLine($"エラーが発生しました: {ex.Message}");
                Console.WriteLine("エラー詳細: " + ex.StackTrace);
                return null;
            }
        }

        /// <summary>
        /// メイン関数。
        /// </summary>
        public static void Main(string[] args)
        {
            if (!CheckEnvironmentVariables())
            {
                return;
            }

            Console.Write("アップロードするファイルのローカルパスを入力してください。Linux の例: /xxx/xxx/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx:");
            string filePath = Console.ReadLine();

            Console.Write("ナレッジベースの名前を入力してください:");
            string kbName = Console.ReadLine();

            string workspaceId = Environment.GetEnvironmentVariable("WORKSPACE_ID");
            string result = CreateKnowledgeBase(filePath, workspaceId, kbName);
            if (result != null)
            {
                Console.WriteLine($"ナレッジベース ID: {result}");
            }
        }
    }
}

Go

// このサンプルコードは参照用です。本番環境では使用しないでください。
package main

import (
	"bufio"
	"crypto/md5"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"path/filepath"
	"strings"
	"time"

	bailian20231229 "github.com/alibabacloud-go/bailian-20231229/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/go-resty/resty/v2"
)

// CheckEnvironmentVariables は、必要な環境変数をチェックし、設定を促します。
func CheckEnvironmentVariables() bool {
	// 必要な環境変数とその説明。
	requiredVars := map[string]string{
		"ALIBABA_CLOUD_ACCESS_KEY_ID":     "Alibaba Cloud AccessKey ID",
		"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "Alibaba Cloud AccessKey secret",
		"WORKSPACE_ID":                    "Alibaba Cloud Model Studio ワークスペース ID",
	}

	var missingVars []string
	for varName, desc := range requiredVars {
		if os.Getenv(varName) == "" {
			fmt.Printf("エラー: 環境変数 %s (%s) を設定してください\n", varName, desc)
			missingVars = append(missingVars, varName)
		}
	}

	return len(missingVars) == 0
}

// CalculateMD5 は、ファイルの MD5 ハッシュを計算します。
//
// パラメーター:
//   - filePath (string): ファイルのローカルパス。
//
// 戻り値:
//   - string: ファイルの MD5 ハッシュ。
//   - error: エラーメッセージ。
func CalculateMD5(filePath string) (_result string, _err error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", err
	}
	defer file.Close()

	md5Hash := md5.New()
	_, err = io.Copy(md5Hash, file)
	if err != nil {
		return "", err
	}

	return fmt.Sprintf("%x", md5Hash.Sum(nil)), nil
}

// GetFileSize は、ファイルサイズをバイト単位で取得します。
//
// パラメーター:
//   - filePath (string): ファイルのローカルパス。
//
// 戻り値:
//   - string: ファイルサイズ (バイト単位)。
//   - error: エラーメッセージ。
func GetFileSize(filePath string) (_result string, _err error) {
	info, err := os.Stat(filePath)
	if err != nil {
		return "", err
	}
	return fmt.Sprintf("%d", info.Size()), nil
}

// CreateClient は、クライアントを作成して設定します。
//
// 戻り値:
//   - *client.Bailian20231229Client: 設定済みのクライアント。
//   - error: エラーメッセージ。
func CreateClient() (_result *bailian20231229.Client, _err error) {
	config := &openapi.Config{
		AccessKeyId:     tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
		AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
	}
	// 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
	config.Endpoint = tea.String("bailian.ap-southeast-1.aliyuncs.com")
	_result = &bailian20231229.Client{}
	_result, _err = bailian20231229.NewClient(config)
	return _result, _err
}

// ApplyLease は、Model Studio サービスからファイルアップロードリースをリクエストします。
//
// パラメーター:
//   - client (bailian20231229.Client): クライアント。
//   - categoryId (string): カテゴリ ID。
//   - fileName (string): ファイル名。
//   - fileMD5 (string): ファイルの MD5 ハッシュ。
//   - fileSize (string): ファイルサイズ (バイト単位)。
//   - workspaceId (string): ワークスペース ID。
//
// 戻り値:
//   - *bailian20231229.ApplyFileUploadLeaseResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func ApplyLease(client *bailian20231229.Client, categoryId, fileName, fileMD5 string, fileSize string, workspaceId string) (_result *bailian20231229.ApplyFileUploadLeaseResponse, _err error) {
	headers := make(map[string]*string)
	applyFileUploadLeaseRequest := &bailian20231229.ApplyFileUploadLeaseRequest{
		FileName:    tea.String(fileName),
		Md5:         tea.String(fileMD5),
		SizeInBytes: tea.String(fileSize),
	}
	runtime := &util.RuntimeOptions{}
	return client.ApplyFileUploadLeaseWithOptions(tea.String(categoryId), tea.String(workspaceId), applyFileUploadLeaseRequest, headers, runtime)
}

// UploadFile は、Model Studio サービスにファイルをアップロードします。
//
// パラメーター:
//   - preSignedUrl (string): アップロードリース内の URL。
//   - headers (map[string]string): アップロードのリクエストヘッダー。
//   - filePath (string): ファイルのローカルパス。
func UploadFile(preSignedUrl string, headers map[string]string, filePath string) error {
	file, err := os.Open(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	body, err := io.ReadAll(file)
	if err != nil {
		return err
	}

	client := resty.New()
	uploadHeaders := map[string]string{
		"X-bailian-extra": headers["X-bailian-extra"],
		"Content-Type":    headers["Content-Type"],
	}

	resp, err := client.R().
		SetHeaders(uploadHeaders).
		SetBody(body).
		Put(preSignedUrl)

	if err != nil {
		return err
	}

	if resp.IsError() {
		return fmt.Errorf("HTTP エラー: %d", resp.StatusCode())
	}

	return nil
}

// AddFile は、Model Studio サービスの指定されたカテゴリにファイルを追加します。
//
// パラメーター:
//   - client (bailian20231229.Client): クライアント。
//   - leaseId (string): リース ID。
//   - parser (string): ファイルのパーサ。
//   - categoryId (string): カテゴリ ID。
//   - workspaceId (string): ワークスペース ID。
//
// 戻り値:
//   - *bailian20231229.AddFileResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func AddFile(client *bailian20231229.Client, leaseId, parser, categoryId, workspaceId string) (_result *bailian20231229.AddFileResponse, _err error) {
	headers := make(map[string]*string)
	addFileRequest := &bailian20231229.AddFileRequest{
		LeaseId:    tea.String(leaseId),
		Parser:     tea.String(parser),
		CategoryId: tea.String(categoryId),
	}
	runtime := &util.RuntimeOptions{}
	return client.AddFileWithOptions(tea.String(workspaceId), addFileRequest, headers, runtime)
}

// DescribeFile は、ファイルの基本情報を取得します。
//
// パラメーター:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - fileId (string): ファイル ID。
//
// 戻り値:
//   - any: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func DescribeFile(client *bailian20231229.Client, workspaceId, fileId string) (_result *bailian20231229.DescribeFileResponse, _err error) {
	headers := make(map[string]*string)
	runtime := &util.RuntimeOptions{}
	return client.DescribeFileWithOptions(tea.String(workspaceId), tea.String(fileId), headers, runtime)
}

// CreateIndex は、Model Studio サービスでナレッジベースを作成します (初期化)。
//
// パラメーター:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - fileId (string): ファイル ID。
//   - name (string): ナレッジベース名。
//   - structureType (string): ナレッジベースのデータの型。
//   - sourceType (string): アプリケーションデータのデータの型。カテゴリとファイルがサポートされています。
//   - sinkType (string): ナレッジベースのベクターストレージタイプ。
//
// 戻り値:
//   - *bailian20231229.CreateIndexResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func CreateIndex(client *bailian20231229.Client, workspaceId, fileId, name, structureType, sourceType, sinkType string) (_result *bailian20231229.CreateIndexResponse, _err error) {
	headers := make(map[string]*string)
	createIndexRequest := &bailian20231229.CreateIndexRequest{
		StructureType: tea.String(structureType),
		Name:          tea.String(name),
		SourceType:    tea.String(sourceType),
		SinkType:      tea.String(sinkType),
		DocumentIds:   []*string{tea.String(fileId)},
	}
	runtime := &util.RuntimeOptions{}
	return client.CreateIndexWithOptions(tea.String(workspaceId), createIndexRequest, headers, runtime)
}

// SubmitIndex は、インデックス作成タスクを送信します。
//
// パラメーター:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): ナレッジベース ID。
//
// 戻り値:
//   - *bailian20231229.SubmitIndexJobResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func SubmitIndex(client *bailian20231229.Client, workspaceId, indexId string) (_result *bailian20231229.SubmitIndexJobResponse, _err error) {
	headers := make(map[string]*string)
	submitIndexJobRequest := &bailian20231229.SubmitIndexJobRequest{
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.SubmitIndexJobWithOptions(tea.String(workspaceId), submitIndexJobRequest, headers, runtime)
}

// GetIndexJobStatus は、インデックス作成タスクのステータスをクエリします。
//
// パラメーター:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - jobId (string): タスク ID。
//   - indexId (string): ナレッジベース ID。
//
// 戻り値:
//   - *bailian20231229.GetIndexJobStatusResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func GetIndexJobStatus(client *bailian20231229.Client, workspaceId, jobId, indexId string) (_result *bailian20231229.GetIndexJobStatusResponse, _err error) {
	headers := make(map[string]*string)
	getIndexJobStatusRequest := &bailian20231229.GetIndexJobStatusRequest{
		JobId:   tea.String(jobId),
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.GetIndexJobStatusWithOptions(tea.String(workspaceId), getIndexJobStatusRequest, headers, runtime)
}

// CreateKnowledgeBase は、Model Studio サービスを使用してナレッジベースを作成します。
//
// パラメーター:
//   - filePath (string): ファイルのローカルパス。
//   - workspaceId (string): ワークスペース ID。
//   - name (string): ナレッジベース名。
//
// 戻り値:
//   - string または nil: 呼び出しが成功した場合はナレッジベース ID。それ以外の場合は nil が返されます。
//   - error: エラーメッセージ。
func CreateKnowledgeBase(filePath, workspaceId, name string) (_result string, _err error) {
	categoryId := "default"
	parser := "DASHSCOPE_DOCMIND"
	sourceType := "DATA_CENTER_FILE"
	structureType := "unstructured"
	sinkType := "DEFAULT"

	fmt.Println("ステップ 1: クライアントを初期化します。")
	client, err := CreateClient()
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 2: ファイル情報を準備します。")
	fileName := filepath.Base(filePath)
	fileMD5, err := CalculateMD5(filePath)
	if err != nil {
		return "", err
	}
	fileSizeStr, err := GetFileSize(filePath)
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 3: Alibaba Cloud Model Studio からアップロードリースをリクエストします。")
	leaseResponse, err := ApplyLease(client, categoryId, fileName, fileMD5, fileSizeStr, workspaceId)
	if err != nil {
		return "", err
	}

	leaseId := tea.StringValue(leaseResponse.Body.Data.FileUploadLeaseId)
	uploadURL := tea.StringValue(leaseResponse.Body.Data.Param.Url)
	uploadHeaders := leaseResponse.Body.Data.Param.Headers

	jsonData, err := json.Marshal(uploadHeaders)
	if err != nil {
		return "", err
	}

	var uploadHeadersMap map[string]string
	err = json.Unmarshal(jsonData, &uploadHeadersMap)
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 4: Alibaba Cloud Model Studio にファイルをアップロードします。")
	err = UploadFile(uploadURL, uploadHeadersMap, filePath)
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 5: Alibaba Cloud Model Studio サーバーにファイルを追加します。")
	addResponse, err := AddFile(client, leaseId, parser, categoryId, workspaceId)
	if err != nil {
		return "", err
	}
	fileID := tea.StringValue(addResponse.Body.Data.FileId)

	fmt.Println("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。")
	for {
		describeResponse, err := DescribeFile(client, workspaceId, fileID)
		if err != nil {
			return "", err
		}

		status := tea.StringValue(describeResponse.Body.Data.Status)
		fmt.Printf("現在のファイルステータス: %s\n", status)

		if status == "INIT" {
			fmt.Println("ファイルは解析待ちです。しばらくお待ちください...")
		} else if status == "PARSING" {
			fmt.Println("ファイルは解析中です。しばらくお待ちください...")
		} else if status == "PARSE_SUCCESS" {
			fmt.Println("ファイルは解析されました。")
			break
		} else {
			fmt.Printf("不明なファイルステータス: %s。テクニカルサポートにお問い合わせください。\n", status)
			return "", fmt.Errorf("不明なドキュメントステータス: %s", status)
		}
		time.Sleep(5 * time.Second)
	}

	fmt.Println("ステップ 7: Alibaba Cloud Model Studio でナレッジベースを初期化します。")
	indexResponse, err := CreateIndex(client, workspaceId, fileID, name, structureType, sourceType, sinkType)
	if err != nil {
		return "", err
	}
	indexID := tea.StringValue(indexResponse.Body.Data.Id)

	fmt.Println("ステップ 8: Alibaba Cloud Model Studio にインデックス作成タスクを送信します。")
	submitResponse, err := SubmitIndex(client, workspaceId, indexID)
	if err != nil {
		return "", err
	}
	jobID := tea.StringValue(submitResponse.Body.Data.Id)

	fmt.Println("ステップ 9: Alibaba Cloud Model Studio からインデックス作成タスクのステータスを取得します。")
	for {
		getIndexJobStatusResponse, err := GetIndexJobStatus(client, workspaceId, jobID, indexID)
		if err != nil {
			return "", err
		}

		status := tea.StringValue(getIndexJobStatusResponse.Body.Data.Status)
		fmt.Printf("現在のインデックス作成タスクのステータス: %s\n", status)

		if status == "COMPLETED" {
			break
		}
		time.Sleep(5 * time.Second)
	}

	fmt.Println("Alibaba Cloud Model Studio ナレッジベースが作成されました。")
	return indexID, nil
}

// メイン関数。
func main() {
	if !CheckEnvironmentVariables() {
		fmt.Println("環境変数のチェックに失敗しました。")
		return
	}
	// 入力を読み取るためのスキャナーを作成します。
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("アップロードするファイルのローカルパスを入力してください。Linux の例: /xxx/xxx/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx:")
	filePath, _ := reader.ReadString('\n')
	filePath = strings.TrimSpace(filePath)
	fmt.Print("ナレッジベースの名前を入力してください:")
	kbName, _ := reader.ReadString('\n')
	kbName = strings.TrimSpace(kbName)
	workspaceID := os.Getenv("WORKSPACE_ID")
	indexID, err := CreateKnowledgeBase(filePath, workspaceID, kbName)
	if err != nil {
		fmt.Printf("エラーが発生しました: %v\n", err)
		return
	}
	fmt.Printf("ナレッジベースが作成されました。ID: %s\n", indexID)
}

ナレッジベースからの取得

重要
  • この例を呼び出す前に、先行するすべての前提条件を完了する必要があります。RAM ユーザーがこの例を呼び出すには、AliyunBailianDataFullAccess ポリシーを取得する必要があります。

  • IDE またはその他の開発支援プラグインを使用する場合、対応する開発環境で ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET、および WORKSPACE_ID 変数を設定する必要があります。

Python

# このサンプルコードは参照用です。本番環境では直接使用しないでください。
import os

from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


def check_environment_variables():
    """必要な環境変数をチェックし、設定を促します。"""
    required_vars = {
        'ALIBABA_CLOUD_ACCESS_KEY_ID': 'お使いの Alibaba Cloud AccessKey ID',
        'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'お使いの Alibaba Cloud AccessKey シークレット',
        'WORKSPACE_ID': 'お使いの Alibaba Cloud Model Studio ワークスペース ID'
    }
    missing_vars = []
    for var, description in required_vars.items():
        if not os.environ.get(var):
            missing_vars.append(var)
            print(f"エラー: 環境変数 {var} ({description}) を設定してください。")
    
    return len(missing_vars) == 0


# クライアントを作成します。
def create_client() -> bailian20231229Client:
    """
    クライアントを作成して設定します。

    戻り値:
        bailian20231229Client: 設定済みのクライアント。
    """
    config = open_api_models.Config(
        access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    )
        # 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
    config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
    return bailian20231229Client(config)


# ナレッジベースを取得します。
def retrieve_index(client, workspace_id, index_id, query):
    """
    指定されたナレッジベースから情報を取得します。

    引数:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        query (str): 検索クエリ。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    retrieve_request = bailian_20231229_models.RetrieveRequest(
        index_id=index_id,
        query=query
    )
    runtime = util_models.RuntimeOptions()
    return client.retrieve_with_options(workspace_id, retrieve_request, headers, runtime)


def main():
    """
    Model Studio サービスを使用してナレッジベースを取得します。

    戻り値:
        str または None: 操作が成功した場合、取得されたテキストセグメント。それ以外の場合は None が返されます。
    """
    if not check_environment_variables():
        print("環境変数のチェックに失敗しました。")
        return
    try:
        print("ステップ 1: クライアントを作成します。")
        client = create_client()
        print("ステップ 2: ナレッジベースを取得します。")
        index_id = input("ナレッジベース ID を入力してください: ")  # これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
        query = input("検索クエリを入力してください: ")
        workspace_id = os.environ.get('WORKSPACE_ID')
        resp = retrieve_index(client, workspace_id, index_id, query)
        result = UtilClient.to_jsonstring(resp.body)
        print(result)
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return None


if __name__ == '__main__':
    main()

Java

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
import com.aliyun.bailian20231229.models.RetrieveRequest;
import com.aliyun.bailian20231229.models.RetrieveResponse;
import com.aliyun.teautil.models.RuntimeOptions;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.*;

public class KnowledgeBaseRetrieve {

    /**
     * 必要な環境変数をチェックし、設定を促します。
     *
     * @return 必要な環境変数がすべて設定されている場合は true、それ以外の場合は false。
     */
    public static boolean checkEnvironmentVariables() {
        Map<String, String> requiredVars = new HashMap<>();
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_ID", "お使いの Alibaba Cloud AccessKey ID");
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "お使いの Alibaba Cloud AccessKey シークレット");
        requiredVars.put("WORKSPACE_ID", "お使いの Alibaba Cloud Model Studio ワークスペース ID");

        List<String> missingVars = new ArrayList<>();
        for (Map.Entry<String, String> entry : requiredVars.entrySet()) {
            String value = System.getenv(entry.getKey());
            if (value == null || value.isEmpty()) {
                missingVars.add(entry.getKey());
                System.out.println("エラー: 環境変数 " + entry.getKey() + " (" + entry.getValue() + ") を設定してください");
            }
        }

        return missingVars.isEmpty();
    }

    /**
     * クライアントを初期化します。
     *
     * @return 設定済みのクライアントオブジェクト。
     */
    public static com.aliyun.bailian20231229.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        config.endpoint = "bailian.ap-southeast-1.aliyuncs.com";
        return new com.aliyun.bailian20231229.Client(config);
    }

    /**
     * 指定されたナレッジベースから情報を取得します。
     *
     * @param client         クライアントオブジェクト (bailian20231229Client)。
     * @param workspaceId    ワークスペース ID。
     * @param indexId        ナレッジベース ID。
     * @param query          検索文。
     * @return               Model Studio サービスからの応答。
     */
    public static RetrieveResponse retrieveIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String query) throws Exception {
        RetrieveRequest retrieveRequest = new RetrieveRequest();
        retrieveRequest.setIndexId(indexId);
        retrieveRequest.setQuery(query);
        RuntimeOptions runtime = new RuntimeOptions();
        return client.retrieveWithOptions(workspaceId, retrieveRequest, null, runtime);
    }

    /**
     * Model Studio サービスを使用してナレッジベースを取得します。
     */
    public static void main(String[] args) {
        if (!checkEnvironmentVariables()) {
            System.out.println("環境変数のチェックに失敗しました。");
            return;
        }

        try {
            // ステップ 1: クライアントを初期化します。
            System.out.println("ステップ 1: クライアントを作成します。");
            com.aliyun.bailian20231229.Client client = createClient();

            // ステップ 2: ナレッジベースを取得します。
            System.out.println("ステップ 2: ナレッジベースを取得します。");
            Scanner scanner = new Scanner(System.in);
            System.out.print("ナレッジベース ID を入力してください: "); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
            String indexId = scanner.nextLine();
            System.out.print("検索クエリを入力してください: ");
            String query = scanner.nextLine();
            String workspaceId = System.getenv("WORKSPACE_ID");
            RetrieveResponse resp = retrieveIndex(client, workspaceId, indexId, query);

            // jackson-databind をインストールして、応答本文を JSON 文字列に変換します。
            ObjectMapper mapper = new ObjectMapper();
            String result = mapper.writeValueAsString(resp.getBody());
            System.out.println(result);
        } catch (Exception e) {
            System.out.println("エラーが発生しました: " + e.getMessage());
        }
    }
}

PHP

<?php
// このサンプルコードは参照用です。本番環境では直接使用しないでください。
namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\Dara\Models\RuntimeOptions;
use AlibabaCloud\SDK\Bailian\V20231229\Bailian;
use \Exception;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Bailian\V20231229\Models\RetrieveRequest;

class KnowledgeBaseRetrieve {

    /**
    * 必要な環境変数をチェックし、設定を促します。
    *
    * @return bool 必要な環境変数がすべて設定されている場合は true、それ以外の場合は false を返します。
    */
    public static function checkEnvironmentVariables() {
        $requiredVars = [
            'ALIBABA_CLOUD_ACCESS_KEY_ID' => 'お使いの Alibaba Cloud AccessKey ID',
            'ALIBABA_CLOUD_ACCESS_KEY_SECRET' => 'お使いの Alibaba Cloud AccessKey シークレット',
            'WORKSPACE_ID' => 'お使いの Alibaba Cloud Model Studio ワークスペース ID'
        ];
        $missingVars = [];
        foreach ($requiredVars as $var => $description) {
            if (!getenv($var)) {
                $missingVars[] = $var;
                echo "エラー: 環境変数 $var ($description) を設定してください\n";
            }
        }
        return count($missingVars) === 0;
    }

    /**
     * クライアントを初期化します。
     *
     * @return Bailian 設定済みのクライアントオブジェクト。
     */
    public static function createClient(){
        $config = new Config([
            "accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), 
            "accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
        ]);
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        $config->endpoint = 'bailian.ap-southeast-1.aliyuncs.com';
        return new Bailian($config);
    }

     /**
     * 指定されたナレッジベースから情報を取得します。
     *
     * @param Bailian $client クライアントオブジェクト。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId ナレッジベース ID。
     * @param string $query 検索文。
     * @return RetrieveResponse Model Studio サービスからの応答。
     * @throws Exception
     */
    public static function retrieveIndex($client, $workspaceId, $indexId, $query) {
        $headers = [];
        $retrieveRequest = new RetrieveRequest([
            "query" => $query,
            "indexId" => $indexId
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->retrieveWithOptions($workspaceId, $retrieveRequest, $headers, $runtime);
    }

    /**
     * Model Studio サービスを使用してナレッジベースを取得します。
     */
    public static function main($args){
        if (!self::checkEnvironmentVariables()) {
            echo "環境変数のチェックに失敗しました。\n";
            return;
        }

        try {
            // ステップ 1: クライアントを作成します。
            echo "ステップ 1: クライアントを作成します。\n";
            $client = self::createClient();

            // ステップ 2: ナレッジベースを取得します。
            echo "ステップ 2: ナレッジベースを取得します。\n";
            $indexId = readline("ナレッジベース ID を入力してください: "); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
            $query = readline("検索クエリを入力してください: "); 
            $workspaceId = getenv("WORKSPACE_ID");
            // 取得メソッドを呼び出します。
            $resp = self::retrieveIndex($client, $workspaceId, $indexId, $query);
            // 応答本文を JSON 文字列に変換します。
            $result = json_encode($resp->body, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
            echo $result . "\n";
        } catch (Exception $e) {
            echo "エラーが発生しました: " . $e->getMessage() . "\n";
        }
    }
}
// autoload.php が現在のコードファイルの親フォルダにあると仮定します。プロジェクトの構造に基づいてパスを調整してください。
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}
KnowledgeBaseRetrieve::main(array_slice($argv, 1));

Node.js

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
'use strict';

const bailian20231229 = require('@alicloud/bailian20231229');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');

class KbRetrieve {

    /**
     * 必要な環境変数をチェックし、設定を促します。
     * @returns {boolean} - 必要な環境変数がすべて設定されている場合は true、それ以外の場合は false を返します。
     */
    static checkEnvironmentVariables() {
        const requiredVars = {
            'ALIBABA_CLOUD_ACCESS_KEY_ID': 'お使いの Alibaba Cloud AccessKey ID',
            'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'お使いの Alibaba Cloud AccessKey シークレット',
            'WORKSPACE_ID': 'お使いの Alibaba Cloud Model Studio ワークスペース ID'
        };

        const missing = [];
        for (const [varName, desc] of Object.entries(requiredVars)) {
            if (!process.env[varName]) {
                console.error(`エラー: 環境変数 ${varName} (${desc}) を設定してください`);
                missing.push(varName);
            }
        }
        return missing.length === 0;
    }

    /**
     * クライアントを作成して設定します。
     * @return Client
     * @throws Exception
     */
    static createClient() {
        const config = new OpenApi.Config({
            accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
            accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
        });
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com';
        return new bailian20231229.default(config);
    }

    /**
     * 指定されたナレッジベースから情報を取得します。
     * @param {bailian20231229.Client} client クライアント。
     * @param {string} workspaceId ワークスペース ID。
     * @param {string} indexId ナレッジベース ID。
     * @param {string} query 検索クエリ。
     * @returns {Promise<bailian20231229.RetrieveResponse>} Model Studio サービスからの応答。
     */
    static async retrieveIndex(client, workspaceId, indexId, query) {
        const headers = {};
        const req = new bailian20231229.RetrieveRequest({
            indexId,
            query
        });
        const runtime = new Util.RuntimeOptions({});
        return await client.retrieveWithOptions(workspaceId, req, headers, runtime);
    }

    /**
     * Model Studio サービスを使用してナレッジベースを取得します。
     */
    static async main(args) {
        if (!this.checkEnvironmentVariables()) {
            console.log("環境変数のチェックに失敗しました。");
            return;
        }

        const readline = require('readline').createInterface({
            input: process.stdin,
            output: process.stdout
        });

        try {
            console.log("ステップ 1: クライアントを作成します。")
            const client = this.createClient();
            
            console.log("ステップ 2: ナレッジベースを取得します。")
            const indexId = await new Promise((resolve, reject) => {
                // ナレッジベース ID は CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
                readline.question("ナレッジベース ID を入力してください: ", (ans) => {
                    ans.trim() ? resolve(ans) : reject(new Error("ナレッジベース ID は空にできません。"));
                });
            });
            const query = await new Promise((resolve, reject) => {
                readline.question("検索クエリを入力してください: ", (ans) => {
                    ans.trim() ? resolve(ans) : reject(new Error("検索クエリは空にできません。"));
                });
            });
            const workspaceId = process.env.WORKSPACE_ID;
            const resp = await this.retrieveIndex(client, workspaceId, indexId, query);
            const result = JSON.stringify(resp.body);
            console.log(result);
        } catch (err) {
            console.error(`エラーが発生しました: ${err.message}`);
            return;
        } finally {
            readline.close();
        }
    }
}

exports.KbRetrieve = KbRetrieve;
KbRetrieve.main(process.argv.slice(2));

C#

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;

using Newtonsoft.Json;
using Tea;
using Tea.Utils;


namespace AlibabaCloud.SDK.KnowledgeBase
{
    public class KnowledgeBaseRetrieve
    {
        /// <summary>
        /// 必要な環境変数をチェックし、設定を促します。
        /// </summary>
        /// <returns>必要な環境変数がすべて設定されている場合は true、それ以外の場合は false を返します。</returns>
        public static bool CheckEnvironmentVariables()
        {
            var requiredVars = new Dictionary<string, string>
            {
                { "ALIBABA_CLOUD_ACCESS_KEY_ID", "お使いの Alibaba Cloud AccessKey ID" },
                { "ALIBABA_CLOUD_ACCESS_KEY_SECRET", "お使いの Alibaba Cloud AccessKey シークレット" },
                { "WORKSPACE_ID", "お使いの Alibaba Cloud Model Studio ワークスペース ID" }
            };

            var missingVars = new List<string>();
            foreach (var entry in requiredVars)
            {
                string value = Environment.GetEnvironmentVariable(entry.Key);
                if (string.IsNullOrEmpty(value))
                {
                    missingVars.Add(entry.Key);
                    Console.WriteLine($"エラー: 環境変数 {entry.Key} ({entry.Value}) を設定してください");
                }
            }

            return missingVars.Count == 0;
        }

        /// <summary>
        /// クライアントを初期化します。
        /// </summary>
        /// <returns>設定済みのクライアントオブジェクト。</returns>
        /// <exception cref="Exception">初期化中にエラーが発生した場合に例外がスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Client CreateClient()
        {
            var config = new AlibabaCloud.OpenApiClient.Models.Config
            {
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
            };
            // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
            config.Endpoint = "bailian.ap-southeast-1.aliyuncs.com";
            return new AlibabaCloud.SDK.Bailian20231229.Client(config);
        }

        /// <summary>
        /// 指定されたナレッジベースから情報を取得します。
        /// </summary>
        /// <param name="client">クライアントオブジェクト (bailian20231229Client)。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="indexId">ナレッジベース ID。</param>
        /// <param name="query">検索文。</param>
        /// <returns>Model Studio サービスからの応答。</returns>
        /// <exception cref="Exception">呼び出しが失敗した場合に例外がスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.RetrieveResponse RetrieveIndex(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string indexId,
            string query)
        {
            var headers = new Dictionary<string, string>() { };
            var retrieveRequest = new AlibabaCloud.SDK.Bailian20231229.Models.RetrieveRequest
            {
                IndexId = indexId,
                Query = query
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.RetrieveWithOptions(workspaceId, retrieveRequest, headers, runtime);
        }

        /// <summary>
        /// Model Studio サービスを使用してナレッジベースを取得します。
        /// </summary>
        public static void Main(string[] args)
        {
            if (!CheckEnvironmentVariables())
            {
                Console.WriteLine("環境変数のチェックに失敗しました。");
                return;
            }

            try
            {
                // ステップ 1: クライアントを初期化します。
                Console.WriteLine("ステップ 1: クライアントを作成します。");
                Bailian20231229.Client client = CreateClient();

                // ステップ 2: ナレッジベースを取得します。
                Console.WriteLine("ステップ 2: ナレッジベースを取得します。");
                Console.Write("ナレッジベース ID を入力してください: "); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
                string indexId = Console.ReadLine();
                Console.Write("検索クエリを入力してください: ");
                string query = Console.ReadLine();
                string workspaceId = Environment.GetEnvironmentVariable("WORKSPACE_ID");
                Bailian20231229.Models.RetrieveResponse resp = RetrieveIndex(client, workspaceId, indexId, query);

                // Newtonsoft.Json をインストールして、応答本文を JSON 文字列に変換します。
                var mapper = new JsonSerializerSettings { Formatting = Formatting.Indented };
                string result = JsonConvert.SerializeObject(resp.Body, mapper);
                Console.WriteLine(result);
            }
            catch (Exception e)
            {
                Console.WriteLine("エラーが発生しました: " + e.Message);
            }
        }
    }
}

Go

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"

	bailian20231229 "github.com/alibabacloud-go/bailian-20231229/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
)

// checkEnvironmentVariables は、必要な環境変数をチェックし、設定を促します。
func checkEnvironmentVariables() bool {
	// 必要な環境変数とその説明。
	requiredVars := map[string]string{
		"ALIBABA_CLOUD_ACCESS_KEY_ID":     "お使いの Alibaba Cloud AccessKey ID",
		"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "お使いの Alibaba Cloud AccessKey シークレット",
		"WORKSPACE_ID":                    "お使いの Alibaba Cloud Model Studio ワークスペース ID",
	}

	var missingVars []string
	for varName, desc := range requiredVars {
		if os.Getenv(varName) == "" {
			fmt.Printf("エラー: 環境変数 %s (%s) を設定してください\n", varName, desc)
			missingVars = append(missingVars, varName)
		}
	}

	return len(missingVars) == 0
}

// createClient はクライアントを作成して設定します。
//
// 戻り値:
//   - *bailian20231229.Client: 設定済みのクライアント。
//   - error: エラーメッセージ。
func createClient() (_result *bailian20231229.Client, _err error) {
	config := &openapi.Config{
		AccessKeyId:     tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
		AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
	}
	// 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
	config.Endpoint = tea.String("bailian.ap-southeast-1.aliyuncs.com")
	_result = &bailian20231229.Client{}
	_result, _err = bailian20231229.NewClient(config)
	return _result, _err
}

// retrieveIndex は、指定されたナレッジベースから情報を取得します。
//
// パラメーター:
//   client: クライアント。
//   workspaceId: ワークスペース ID。
//   indexId: ナレッジベース ID。
//   query: 検索文。
//
// 戻り値:
//   Model Studio サービスからの応答。
//   エラー。
func retrieveIndex(client *bailian20231229.Client, workspaceId, indexId, query string) (*bailian20231229.RetrieveResponse, error) {
	headers := make(map[string]*string)
	request := &bailian20231229.RetrieveRequest{
		IndexId: tea.String(indexId),
		Query:   tea.String(query),
	}
	runtime := &util.RuntimeOptions{}
	return client.RetrieveWithOptions(tea.String(workspaceId), request, headers, runtime)
}

// main 関数。
func main() {
	if !checkEnvironmentVariables() {
		fmt.Println("環境変数のチェックに失敗しました。")
		return
	}

	// ステップ 1: クライアントを初期化します。
	fmt.Println("ステップ 1: クライアントを作成します。")
	client, err := createClient()
	if err != nil {
		fmt.Println("クライアントの作成に失敗しました:", err)
		return
	}

	// ステップ 2: ナレッジベースを取得します。
	fmt.Println("ステップ 2: ナレッジベースを取得します。")
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("ナレッジベース ID を入力してください: ") // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
	indexId, _ := reader.ReadString('\n')
	indexId = strings.TrimSpace(indexId)
	fmt.Print("検索クエリを入力してください: ")
	query, _ := reader.ReadString('\n')
	query = strings.TrimSpace(query)
	workspaceId := os.Getenv("WORKSPACE_ID")
	resp, err := retrieveIndex(client, workspaceId, indexId, query)
	if err != nil {
		fmt.Printf("取得に失敗しました: %v\n", err)
		return
	}
        fmt.Println(resp.Body)
}

ナレッジベースを更新する

重要
  • この例を呼び出す前に、すべての前提条件を完了してください。RAM ユーザーを使用してこの例を呼び出す場合は、RAM ユーザーにAliyunBailianDataFullAccess ポリシーを付与してください。

  • IDE または他の開発プラグインを使用する場合は、開発環境で ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET、および WORKSPACE_ID 環境変数を設定してください。

Python

# このサンプルコードは参考用です。本番環境では使用しないでください。
import hashlib
import os
import time

import requests
from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models


def check_environment_variables():
    """必要な環境変数をチェックし、設定を促します。"""
    required_vars = {
        'ALIBABA_CLOUD_ACCESS_KEY_ID': 'Alibaba Cloud AccessKey ID',
        'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'Alibaba Cloud AccessKey シークレット',
        'WORKSPACE_ID': 'Model Studio ワークスペース ID'
    }
    missing_vars = []
    for var, description in required_vars.items():
        if not os.environ.get(var):
            missing_vars.append(var)
            print(f"エラー: 環境変数 {var} ({description}) を設定してください。")
    
    return len(missing_vars) == 0


# クライアントを作成します。
def create_client() -> bailian20231229Client:
    """
    クライアントを作成して設定します。

    Returns:
        bailian20231229Client: 設定済みのクライアント。
    """
    config = open_api_models.Config(
        access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    )
    # 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
    config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
    return bailian20231229Client(config)


def calculate_md5(file_path: str) -> str:
    """
    ファイルの MD5 ハッシュを計算します。

    Args:
        file_path (str): ファイルのローカルパス。

    Returns:
        str: ファイルの MD5 ハッシュ。
    """
    md5_hash = hashlib.md5()

    # ファイルをバイナリモードで読み取ります。
    with open(file_path, "rb") as f:
        # 大きなファイルのメモリ使用量を抑えるために、ファイルをチャンクで読み取ります。
        for chunk in iter(lambda: f.read(4096), b""):
            md5_hash.update(chunk)

    return md5_hash.hexdigest()


def get_file_size(file_path: str) -> int:
    """
    ファイルのサイズをバイト単位で取得します。
    Args:
        file_path (str): ファイルのローカルパス。
    Returns:
        int: ファイルサイズ (バイト単位)。
    """
    return os.path.getsize(file_path)


# ファイルアップロードリースをリクエストします。
def apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id):
    """
    Model Studio サービスにファイルアップロードリースをリクエストします。

    Args:
        client (bailian20231229Client): クライアント。
        category_id (str): カテゴリ ID。
        file_name (str): ファイル名。
        file_md5 (str): ファイルの MD5 ハッシュ。
        file_size (int): ファイルサイズ (バイト単位)。
        workspace_id (str): ワークスペース ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    request = bailian_20231229_models.ApplyFileUploadLeaseRequest(
        file_name=file_name,
        md_5=file_md5,
        size_in_bytes=file_size,
    )
    runtime = util_models.RuntimeOptions()
    return client.apply_file_upload_lease_with_options(category_id, workspace_id, request, headers, runtime)


# ファイルを一時ストレージにアップロードします。
def upload_file(pre_signed_url, headers, file_path):
    """
    ファイルを Model Studio サービスにアップロードします。
    Args:
        lease_id (str): リース ID。
        pre_signed_url (str): アップロードリース内の URL。
        headers (dict): アップロードのリクエストヘッダー。
        file_path (str): ファイルのローカルパス。
    """
    with open(file_path, 'rb') as f:
        file_content = f.read()
    upload_headers = {
        "X-bailian-extra": headers["X-bailian-extra"],
        "Content-Type": headers["Content-Type"]
    }
    response = requests.put(pre_signed_url, data=file_content, headers=upload_headers)
    response.raise_for_status()


# ファイルをカテゴリに追加します。
def add_file(client: bailian20231229Client, lease_id: str, parser: str, category_id: str, workspace_id: str):
    """
    Model Studio サービスの指定されたカテゴリにファイルを追加します。

    Args:
        client (bailian20231229Client): クライアント。
        lease_id (str): リース ID。
        parser (str): ファイルのパーサ。
        category_id (str): カテゴリ ID。
        workspace_id (str): ワークスペース ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    request = bailian_20231229_models.AddFileRequest(
        lease_id=lease_id,
        parser=parser,
        category_id=category_id,
    )
    runtime = util_models.RuntimeOptions()
    return client.add_file_with_options(workspace_id, request, headers, runtime)


# ファイルの解析ステータスをクエリします。
def describe_file(client, workspace_id, file_id):
    """
    ファイルの基本情報を取得します。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        file_id (str): ファイル ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    runtime = util_models.RuntimeOptions()
    return client.describe_file_with_options(workspace_id, file_id, headers, runtime)


# ファイルを追加するタスクを送信します。
def submit_index_add_documents_job(client, workspace_id, index_id, file_id, source_type):
    """
    解析済みのファイルをドキュメント検索ナレッジベースに追加します。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        file_id (str): ファイル ID。
        source_type(str): データの型。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    submit_index_add_documents_job_request = bailian_20231229_models.SubmitIndexAddDocumentsJobRequest(
        index_id=index_id,
        document_ids=[file_id],
        source_type=source_type
    )
    runtime = util_models.RuntimeOptions()
    return client.submit_index_add_documents_job_with_options(workspace_id, submit_index_add_documents_job_request,
                                                              headers, runtime)


# 追加タスクが完了するのを待ちます。
def get_index_job_status(client, workspace_id, job_id, index_id):
    """
    インデックスジョブのステータスをクエリします。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        job_id (str): ジョブ ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    get_index_job_status_request = bailian_20231229_models.GetIndexJobStatusRequest(
        index_id=index_id,
        job_id=job_id
    )
    runtime = util_models.RuntimeOptions()
    return client.get_index_job_status_with_options(workspace_id, get_index_job_status_request, headers, runtime)


# 古いファイルを削除します。
def delete_index_document(client, workspace_id, index_id, file_id):
    """
    指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを永久に削除します。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        file_id (str): ファイル ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    delete_index_document_request = bailian_20231229_models.DeleteIndexDocumentRequest(
        index_id=index_id,
        document_ids=[file_id]
    )
    runtime = util_models.RuntimeOptions()
    return client.delete_index_document_with_options(workspace_id, delete_index_document_request, headers, runtime)


def update_knowledge_base(
        file_path: str,
        workspace_id: str,
        index_id: str,
        old_file_id: str
):
    """
    Model Studio サービスを使用してナレッジベースを更新します。
    Args:
        file_path (str): 更新されたファイルのローカルパス。
        workspace_id (str): ワークスペース ID。
        index_id (str): 更新するナレッジベースの ID。
        old_file_id (str): 更新するファイルのファイル ID。
    Returns:
        str or None: 更新が成功した場合はナレッジベースの ID。それ以外の場合は None。
    """
    # デフォルト値を設定します。
    category_id = 'default'
    parser = 'DASHSCOPE_DOCMIND'
    source_type = 'DATA_CENTER_FILE'
    try:
        # ステップ 1: クライアントを作成します。
        print("ステップ 1: クライアントを作成します。")
        client = create_client()
        # ステップ 2: ファイル情報を準備します。
        print("ステップ 2: ファイル情報を準備します。")
        file_name = os.path.basename(file_path)
        file_md5 = calculate_md5(file_path)
        file_size = get_file_size(file_path)
        # ステップ 3: アップロードリースをリクエストします。
        print("ステップ 3: Alibaba Cloud Model Studio にアップロードリースをリクエストします。")
        lease_response = apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id)
        lease_id = lease_response.body.data.file_upload_lease_id
        upload_url = lease_response.body.data.param.url
        upload_headers = lease_response.body.data.param.headers
        # ステップ 4: ファイルを一時ストレージにアップロードします。
        print("ステップ 4: ファイルを一時ストレージにアップロードします。")
        upload_file(upload_url, upload_headers, file_path)
        # ステップ 5: ファイルをカテゴリに追加します。
        print("ステップ 5: ファイルをカテゴリに追加します。")
        add_response = add_file(client, lease_id, parser, category_id, workspace_id)
        file_id = add_response.body.data.file_id
        # ステップ 6: ファイルのステータスを確認します。
        print("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。")
        while True:
            describe_response = describe_file(client, workspace_id, file_id)
            status = describe_response.body.data.status
            print(f"現在のファイルステータス: {status}")
            if status == 'INIT':
                print("ファイルは解析待ちです。しばらくお待ちください...")
            elif status == 'PARSING':
                print("ファイルは解析中です。しばらくお待ちください...")
            elif status == 'PARSE_SUCCESS':
                print("ファイルは解析されました。")
                break
            else:
                print(f"不明なファイルステータス: {status}。テクニカルサポートにお問い合わせください。")
                return None
            time.sleep(5)
        # ステップ 7: ファイルを追加するタスクを送信します。
        print("ステップ 7: ファイルを追加するタスクを送信します。")
        index_add_response = submit_index_add_documents_job(client, workspace_id, index_id, file_id, source_type)
        job_id = index_add_response.body.data.id
        # ステップ 8: インデックスジョブのステータスをクエリします。
        print("ステップ 8: 追加タスクが完了するのを待ちます。")
        while True:
            get_index_job_status_response = get_index_job_status(client, workspace_id, job_id, index_id)
            status = get_index_job_status_response.body.data.status
            print(f"現在のインデックスジョブのステータス: {status}")
            if status == 'COMPLETED':
                break
            time.sleep(5)
        print("ステップ 9: 古いファイルを削除します。")
        delete_index_document(client, workspace_id, index_id, old_file_id)
        print("Alibaba Cloud Model Studio のナレッジベースが更新されました。")
        return index_id
    except Exception as e:
        print(f"エラーが発生しました: {e}")
        return None


def main():
    if not check_environment_variables():
        print("環境変数のチェックに失敗しました。")
        return
    file_path = input("アップロードする更新済みファイルのローカルパスを入力してください (例: Linux システム上の /home/user/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx):")
    index_id = input("更新するナレッジベースの ID を入力してください:")  # これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページで ID を取得することもできます。
    old_file_id = input("更新するファイルのファイル ID を入力してください:")  # これは AddFile 操作によって返される FileId です。Model Studio コンソールのアプリケーションデータページでファイル名の横にある ID アイコンをクリックしてファイル ID を取得することもできます。
    workspace_id = os.environ.get('WORKSPACE_ID')
    update_knowledge_base(file_path, workspace_id, index_id, old_file_id)


if __name__ == '__main__':
    main()

Java

// このサンプルコードは参考用です。本番環境では使用しないでください。
import com.aliyun.bailian20231229.models.*;
import com.aliyun.teautil.models.RuntimeOptions;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.util.*;

public class KnowledgeBaseUpdate {

    /**
     * 必要な環境変数をチェックし、設定を促します。
     *
     * @return 必要なすべての環境変数が設定されている場合は true、それ以外の場合は false。
     */
    public static boolean checkEnvironmentVariables() {
        Map<String, String> requiredVars = new HashMap<>();
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_ID", "Alibaba Cloud AccessKey ID");
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "Alibaba Cloud AccessKey シークレット");
        requiredVars.put("WORKSPACE_ID", "Alibaba Cloud Model Studio ワークスペース ID");

        List<String> missingVars = new ArrayList<>();
        for (Map.Entry<String, String> entry : requiredVars.entrySet()) {
            String value = System.getenv(entry.getKey());
            if (value == null || value.isEmpty()) {
                missingVars.add(entry.getKey());
                System.out.println("エラー: 環境変数 " + entry.getKey() + " (" + entry.getValue() + ") を設定してください");
            }
        }

        return missingVars.isEmpty();
    }

    /**
     * クライアントを作成して設定します。
     *
     * @return 設定済みのクライアント。
     */
    public static com.aliyun.bailian20231229.Client createClient() throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        config.endpoint = "bailian.ap-southeast-1.aliyuncs.com";
        return new com.aliyun.bailian20231229.Client(config);
    }

    /**
     * ファイルの MD5 ハッシュを計算します。
     *
     * @param filePath ファイルのローカルパス。
     * @return ファイルの MD5 ハッシュ。
     */
    public static String calculateMD5(String filePath) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        try (FileInputStream fis = new FileInputStream(filePath)) {
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                md.update(buffer, 0, bytesRead);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (byte b : md.digest()) {
            sb.append(String.format("%02x", b & 0xff));
        }
        return sb.toString();
    }

    /**
     * ファイルのサイズをバイト単位で取得します。
     *
     * @param filePath ファイルのローカルパス。
     * @return ファイルサイズ (バイト単位)。
     */
    public static String getFileSize(String filePath) {
        File file = new File(filePath);
        long fileSize = file.length();
        return String.valueOf(fileSize);
    }

    /**
     * ファイルアップロードリースをリクエストします。
     *
     * @param client クライアントオブジェクト。
     * @param categoryId カテゴリ ID。
     * @param fileName ファイル名。
     * @param fileMd5 ファイルの MD5 ハッシュ。
     * @param fileSize ファイルサイズ (バイト単位)。
     * @param workspaceId ワークスペース ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static ApplyFileUploadLeaseResponse applyLease(com.aliyun.bailian20231229.Client client, String categoryId, String fileName, String fileMd5, String fileSize, String workspaceId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest applyFileUploadLeaseRequest = new com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest();
        applyFileUploadLeaseRequest.setFileName(fileName);
        applyFileUploadLeaseRequest.setMd5(fileMd5);
        applyFileUploadLeaseRequest.setSizeInBytes(fileSize);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        ApplyFileUploadLeaseResponse applyFileUploadLeaseResponse = null;
        applyFileUploadLeaseResponse = client.applyFileUploadLeaseWithOptions(categoryId, workspaceId, applyFileUploadLeaseRequest, headers, runtime);
        return applyFileUploadLeaseResponse;
    }

    /**
     * ファイルを一時ストレージにアップロードします。
     *
     * @param preSignedUrl アップロードリース内の URL。
     * @param headers アップロードのリクエストヘッダー。
     * @param filePath ファイルのローカルパス。
     * @throws Exception アップロード中にエラーが発生した場合。
     */
    public static void uploadFile(String preSignedUrl, Map<String, String> headers, String filePath) throws Exception {
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            throw new IllegalArgumentException("ファイルが存在しないか、通常のファイルではありません: " + filePath);
        }

        try (FileInputStream fis = new FileInputStream(file)) {
            URL url = new URL(preSignedUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("PUT");
            conn.setDoOutput(true);

            // アップロードリクエストヘッダーを設定します。
            conn.setRequestProperty("X-bailian-extra", headers.get("X-bailian-extra"));
            conn.setRequestProperty("Content-Type", headers.get("Content-Type"));

            // ファイルをチャンクで読み込んでアップロードします。
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fis.read(buffer)) != -1) {
                conn.getOutputStream().write(buffer, 0, bytesRead);
            }

            int responseCode = conn.getResponseCode();
            if (responseCode != 200) {
                throw new RuntimeException("アップロードに失敗しました: " + responseCode);
            }
        }
    }

    /**
     * ファイルをカテゴリに追加します。
     *
     * @param client クライアントオブジェクト。
     * @param leaseId リース ID。
     * @param parser ファイルのパーサ。
     * @param categoryId カテゴリ ID。
     * @param workspaceId ワークスペース ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static AddFileResponse addFile(com.aliyun.bailian20231229.Client client, String leaseId, String parser, String categoryId, String workspaceId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.AddFileRequest addFileRequest = new com.aliyun.bailian20231229.models.AddFileRequest();
        addFileRequest.setLeaseId(leaseId);
        addFileRequest.setParser(parser);
        addFileRequest.setCategoryId(categoryId);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.addFileWithOptions(workspaceId, addFileRequest, headers, runtime);
    }

    /**
     * ファイルの基本情報をクエリします。
     *
     * @param client クライアントオブジェクト。
     * @param workspaceId ワークスペース ID。
     * @param fileId ファイル ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static DescribeFileResponse describeFile(com.aliyun.bailian20231229.Client client, String workspaceId, String fileId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.describeFileWithOptions(workspaceId, fileId, headers, runtime);
    }

    /**
     * 解析済みのファイルをドキュメント検索ナレッジベースに追加します。
     *
     * @param client クライアント。
     * @param workspaceId ワークスペース ID。
     * @param indexId ナレッジベース ID。
     * @param fileId ファイル ID。
     * @param sourceType データの型。
     * @return Model Studio サービスからの応答。
     */
    public static SubmitIndexAddDocumentsJobResponse submitIndexAddDocumentsJob(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String fileId, String sourceType) throws Exception {
        Map<String, String> headers = new HashMap<>();
        SubmitIndexAddDocumentsJobRequest submitIndexAddDocumentsJobRequest = new SubmitIndexAddDocumentsJobRequest();
        submitIndexAddDocumentsJobRequest.setIndexId(indexId);
        submitIndexAddDocumentsJobRequest.setDocumentIds(Collections.singletonList(fileId));
        submitIndexAddDocumentsJobRequest.setSourceType(sourceType);
        RuntimeOptions runtime = new RuntimeOptions();
        return client.submitIndexAddDocumentsJobWithOptions(workspaceId, submitIndexAddDocumentsJobRequest, headers, runtime);
    }

    /**
     * インデックスジョブのステータスをクエリします。
     *
     * @param client クライアントオブジェクト。
     * @param workspaceId ワークスペース ID。
     * @param jobId ジョブ ID。
     * @param indexId ナレッジベース ID。
     * @return Model Studio サービスからの応答オブジェクト。
     */
    public static GetIndexJobStatusResponse getIndexJobStatus(com.aliyun.bailian20231229.Client client, String workspaceId, String jobId, String indexId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.GetIndexJobStatusRequest getIndexJobStatusRequest = new com.aliyun.bailian20231229.models.GetIndexJobStatusRequest();
        getIndexJobStatusRequest.setIndexId(indexId);
        getIndexJobStatusRequest.setJobId(jobId);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        GetIndexJobStatusResponse getIndexJobStatusResponse = null;
        getIndexJobStatusResponse = client.getIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
        return getIndexJobStatusResponse;
    }

    /**
     * 指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを永久に削除します。
     *
     * @param client クライアント。
     * @param workspaceId ワークスペース ID。
     * @param indexId ナレッジベース ID。
     * @param fileId ファイル ID。
     * @return Model Studio サービスからの応答。
     */
    public static DeleteIndexDocumentResponse deleteIndexDocument(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String fileId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        DeleteIndexDocumentRequest deleteIndexDocumentRequest = new DeleteIndexDocumentRequest();
        deleteIndexDocumentRequest.setIndexId(indexId);
        deleteIndexDocumentRequest.setDocumentIds(Collections.singletonList(fileId));
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.deleteIndexDocumentWithOptions(workspaceId, deleteIndexDocumentRequest, headers, runtime);
    }

    /**
     * Model Studio サービスを使用してナレッジベースを更新します。
     *
     * @param filePath 更新されたファイルのローカルパス。
     * @param workspaceId ワークスペース ID。
     * @param indexId 更新するナレッジベースの ID。
     * @param oldFileId 更新するファイルのファイル ID。
     * @return 更新が成功した場合はナレッジベースの ID。それ以外の場合は null。
     */
    public static String updateKnowledgeBase(String filePath, String workspaceId, String indexId, String oldFileId) {
        // デフォルト値を設定します。
        String categoryId = "default";
        String parser = "DASHSCOPE_DOCMIND";
        String sourceType = "DATA_CENTER_FILE";
        try {
            // ステップ 1: クライアントを初期化します。
            System.out.println("ステップ 1: クライアントを作成します。");
            com.aliyun.bailian20231229.Client client = createClient();

            // ステップ 2: 更新されたファイルのファイル情報を準備します。
            System.out.println("ステップ 2: ファイル情報を準備します。");
            String fileName = Paths.get(filePath).getFileName().toString();
            String fileMd5 = calculateMD5(filePath);
            String fileSize = getFileSize(filePath);

            // ステップ 3: アップロードリースをリクエストします。
            System.out.println("ステップ 3: Alibaba Cloud Model Studio にアップロードリースをリクエストします。");
            ApplyFileUploadLeaseResponse leaseResponse = applyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId);
            String leaseId = leaseResponse.getBody().getData().getFileUploadLeaseId();
            String uploadUrl = leaseResponse.getBody().getData().getParam().getUrl();
            Object uploadHeaders = leaseResponse.getBody().getData().getParam().getHeaders();

            // ステップ 4: ファイルを一時ストレージにアップロードします。
            // jackson-databind をインストールします。
            System.out.println("ステップ 4: ファイルを一時ストレージにアップロードします。");
            // 前のステップの uploadHeaders をキーと値のペアのマップに変換します。
            ObjectMapper mapper = new ObjectMapper();
            Map<String, String> uploadHeadersMap = (Map<String, String>) mapper.readValue(mapper.writeValueAsString(uploadHeaders), Map.class);
            uploadFile(uploadUrl, uploadHeadersMap, filePath);

            // ステップ 5: ファイルをカテゴリに追加します。
            System.out.println("ステップ 5: ファイルをカテゴリに追加します。");
            AddFileResponse addResponse = addFile(client, leaseId, parser, categoryId, workspaceId);
            String fileId = addResponse.getBody().getData().getFileId();

            // ステップ 6: 更新されたファイルのステータスを確認します。
            System.out.println("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。");
            while (true) {
                DescribeFileResponse describeResponse = describeFile(client, workspaceId, fileId);
                String status = describeResponse.getBody().getData().getStatus();
                System.out.println("現在のファイルステータス: " + status);
                if ("INIT".equals(status)) {
                    System.out.println("ファイルは解析待ちです。しばらくお待ちください...");
                } else if ("PARSING".equals(status)) {
                    System.out.println("ファイルは解析中です。しばらくお待ちください...");
                } else if ("PARSE_SUCCESS".equals(status)) {
                    System.out.println("ファイルは解析されました。");
                    break;
                } else {
                    System.out.println("不明なファイルステータス: " + status + "。テクニカルサポートにお問い合わせください。");
                    return null;
                }
                Thread.sleep(5000);
            }

            // ステップ 7: ファイルを追加するタスクを送信します。
            System.out.println("ステップ 7: ファイルを追加するタスクを送信します。");
            SubmitIndexAddDocumentsJobResponse indexAddResponse = submitIndexAddDocumentsJob(client, workspaceId, indexId, fileId, sourceType);
            String jobId = indexAddResponse.getBody().getData().getId();

            // ステップ 8: 追加タスクが完了するのを待ちます。
            System.out.println("ステップ 8: 追加タスクが完了するのを待ちます。");
            while (true) {
                GetIndexJobStatusResponse jobStatusResponse = getIndexJobStatus(client, workspaceId, jobId, indexId);
                String status = jobStatusResponse.getBody().getData().getStatus();
                System.out.println("現在のインデックスジョブのステータス: " + status);
                if ("COMPLETED".equals(status)) {
                    break;
                }
                Thread.sleep(5000);
            }

            // ステップ 9: 古いファイルを削除します。
            System.out.println("ステップ 9: 古いファイルを削除します。");
            deleteIndexDocument(client, workspaceId, indexId, oldFileId);

            System.out.println("Alibaba Cloud Model Studio のナレッジベースが更新されました。");
            return indexId;
        } catch (Exception e) {
            System.out.println("エラーが発生しました: " + e.getMessage());
            return null;
        }
    }

    /**
     * main 関数。
     */
    public static void main(String[] args) {
        if (!checkEnvironmentVariables()) {
            System.out.println("環境変数のチェックに失敗しました。");
            return;
        }

        Scanner scanner = new Scanner(System.in);
        System.out.print("アップロードする更新済みファイルのローカルパスを入力してください (例: Linux システム上の /home/user/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx):");
        String filePath = scanner.nextLine();

        System.out.print("更新するナレッジベースの ID を入力してください:"); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページで ID を取得することもできます。
        String indexId = scanner.nextLine();

        System.out.print("更新するファイルのファイル ID を入力してください:"); // これは AddFile 操作によって返される FileId です。Model Studio コンソールのアプリケーションデータページでファイル名の横にある ID アイコンをクリックしてファイル ID を取得することもできます。
        String oldFileId = scanner.nextLine();

        String workspaceId = System.getenv("WORKSPACE_ID");
        String result = updateKnowledgeBase(filePath, workspaceId, indexId, oldFileId);
        if (result != null) {
            System.out.println("ナレッジベースが更新されました。ナレッジベースの ID は次のとおりです: " + result);
        } else {
            System.out.println("ナレッジベースの更新に失敗しました。");
        }
    }
}

PHP

<?php
// このサンプルコードは参考用です。本番環境では使用しないでください。
namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\Dara\Models\RuntimeOptions;
use AlibabaCloud\SDK\Bailian\V20231229\Bailian;
use AlibabaCloud\SDK\Bailian\V20231229\Models\AddFileRequest;
use \Exception;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Bailian\V20231229\Models\ApplyFileUploadLeaseRequest;
use AlibabaCloud\SDK\Bailian\V20231229\Models\DeleteIndexDocumentRequest;
use AlibabaCloud\SDK\Bailian\V20231229\Models\GetIndexJobStatusRequest;
use AlibabaCloud\SDK\Bailian\V20231229\Models\SubmitIndexAddDocumentsJobRequest;

class KnowledgeBaseUpdate {

    /**
    * 必要な環境変数をチェックし、設定を促します。
    *
    * @return bool 必要なすべての環境変数が設定されている場合は true、それ以外の場合は false を返します。
    */
    public static function checkEnvironmentVariables() {
        $requiredVars = [
            'ALIBABA_CLOUD_ACCESS_KEY_ID' => 'Alibaba Cloud AccessKey ID',
            'ALIBABA_CLOUD_ACCESS_KEY_SECRET' => 'Alibaba Cloud AccessKey シークレット',
            'WORKSPACE_ID' => 'Alibaba Cloud Model Studio ワークスペース ID'
        ];
        $missingVars = [];
        foreach ($requiredVars as $var => $description) {
            if (!getenv($var)) {
                $missingVars[] = $var;
                echo "エラー: 環境変数 $var ($description) を設定してください\n";
            }
        }
        return count($missingVars) === 0;
    }

    /**
     * ファイルの MD5 ハッシュを計算します。
     *
     * @param string $filePath ファイルのローカルパス。
     * @return string ファイルの MD5 ハッシュ。
     */
    public static function calculateMd5($filePath) {
        $md5Hash = hash_init("md5");
        $handle = fopen($filePath, "rb");
        while (!feof($handle)) {
            $chunk = fread($handle, 4096);
            hash_update($md5Hash, $chunk);
        }
        fclose($handle);
        return hash_final($md5Hash);
    }

    /**
     * ファイルのサイズをバイト単位で取得します。
     *
     * @param string $filePath ファイルのローカルパス。
     * @return int ファイルサイズ (バイト単位)。
     */
    public static function getFileSize($filePath) {
        return (string)filesize($filePath);
    }

    /**
     * クライアントを初期化します。
     *
     * @return Bailian 設定済みのクライアントオブジェクト。
     */
    public static function createClient(){
        $config = new Config([
            "accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), 
            "accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
        ]);
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        $config->endpoint = 'bailian.ap-southeast-1.aliyuncs.com';
        return new Bailian($config);
    }

    /**
     * ファイルアップロードリースをリクエストします。
     *
     * @param Bailian $client クライアント。
     * @param string $categoryId カテゴリ ID。
     * @param string $fileName ファイル名。
     * @param string $fileMd5 ファイルの MD5 ハッシュ。
     * @param int $fileSize ファイルサイズ (バイト単位)。
     * @param string $workspaceId ワークスペース ID。
     * @return ApplyFileUploadLeaseResponse Model Studio サービスからの応答。
     */
    public static function applyLease($client, $categoryId, $fileName, $fileMd5, $fileSize, $workspaceId) {
        $headers = [];
        $applyFileUploadLeaseRequest = new ApplyFileUploadLeaseRequest([
            "fileName" => $fileName,
            "md5" => $fileMd5,
            "sizeInBytes" => $fileSize
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->applyFileUploadLeaseWithOptions($categoryId, $workspaceId, $applyFileUploadLeaseRequest, $headers, $runtime);
    }

    /**
     * ファイルを一時ストレージにアップロードします。
    *
    * @param string $preSignedUrl アップロードリース内の URL。
    * @param array $headers アップロードのリクエストヘッダー。
    * @param string $filePath ファイルのローカルパス。
    */
    public static function uploadFile($preSignedUrl, $headers, $filePath) {
        $fileContent = file_get_contents($filePath);
        // アップロードリクエストヘッダーを設定します。
        $uploadHeaders = [
            "X-bailian-extra" => $headers["X-bailian-extra"],
            "Content-Type" => $headers["Content-Type"]
        ];
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $preSignedUrl);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContent);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array_map(function($key, $value) {
            return "$key: $value";
        }, array_keys($uploadHeaders), $uploadHeaders));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($httpCode != 200) {
            throw new Exception("アップロードに失敗しました: " . curl_error($ch));
        }
        curl_close($ch);
    }

    /**
     * ファイルをカテゴリに追加します。
     *
     * @param Bailian $client クライアント。
     * @param string $leaseId リース ID。
     * @param string $parser ファイルのパーサ。
     * @param string $categoryId カテゴリ ID。
     * @param string $workspaceId ワークスペース ID。
     * @return AddFileResponse Model Studio サービスからの応答。
     */
    public static function addFile($client, $leaseId, $parser, $categoryId, $workspaceId) {
        $headers = [];
        $addFileRequest = new AddFileRequest([
            "leaseId" => $leaseId,
            "parser" => $parser,
            "categoryId" => $categoryId
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->addFileWithOptions($workspaceId, $addFileRequest, $headers, $runtime);
    }

    /**
     * ファイルの基本情報をクエリします。
     *
     * @param Bailian $client クライアント。
     * @param string $workspaceId ワークスペース ID。
     * @param string $fileId ファイル ID。
     * @return DescribeFileResponse Model Studio サービスからの応答。
     */
    public static function describeFile($client, $workspaceId, $fileId) {
        $headers = [];
        $runtime = new RuntimeOptions([]);
        return $client->describeFileWithOptions($workspaceId, $fileId, $headers, $runtime);
    }

    /**
     * 解析済みのファイルをドキュメント検索ナレッジベースに追加します。
     *
     * @param Bailian $client クライアントオブジェクト。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId ナレッジベース ID。
     * @param string $fileId ファイル ID。
     * @param string $sourceType データの型。
     * @return SubmitIndexAddDocumentsJobResponse Model Studio サービスからの応答。
     * @throws Exception
     */
    public static function submitIndexAddDocumentsJob($client, $workspaceId, $indexId, $fileId, $sourceType) {
        $headers = [];
        $submitIndexAddDocumentsJobRequest = new SubmitIndexAddDocumentsJobRequest([
            "indexId" =>$indexId,
            "sourceType" => $sourceType,
            "documentIds" => [
                $fileId
            ]
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->submitIndexAddDocumentsJobWithOptions($workspaceId, $submitIndexAddDocumentsJobRequest, $headers, $runtime);
    }

    /**
     * インデックスジョブのステータスをクエリします。
     *
     * @param Bailian $client クライアント。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId ナレッジベース ID。
     * @param string $jobId ジョブ ID。
     * @return GetIndexJobStatusResponse Model Studio サービスからの応答。
     */
    public static function getIndexJobStatus$client, $workspaceId, $jobId, $indexId) {
        $headers = [];
        $getIndexJobStatusRequest = new GetIndexJobStatusRequest([
            'indexId' => $indexId,
            'jobId' => $jobId
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->getIndexJobStatusWithOptions($workspaceId, $getIndexJobStatusRequest, $headers, $runtime);
    }

    /**
     * 指定されたドキュメント検索ナレッジベースからファイルを永久に削除します。
     *
     * @param Bailian $client クライアントオブジェクト。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId ナレッジベース ID。
     * @param string $fileId ファイル ID。
     * @return mixed Model Studio サービスからの応答。
     * @throws Exception
     */
    public static function deleteIndexDocument($client, $workspaceId, $indexId, $fileId) {
        $headers = [];
        $deleteIndexDocumentRequest = new DeleteIndexDocumentRequest([
            "indexId" => $indexId,
            "documentIds" => [
                $fileId
            ]
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->deleteIndexDocumentWithOptions($workspaceId, $deleteIndexDocumentRequest, $headers, $runtime);
    }

    /**
     * Model Studio サービスを使用してナレッジベースを更新します。
     *
     * @param string $filePath 更新されたファイルのローカルパス。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId 更新するナレッジベースの ID。
     * @param string $oldFileId 更新するファイルのファイル ID。
     * @return string| null 更新が成功した場合はナレッジベースの ID。それ以外の場合は null。
     */
    public static function updateKnowledgeBase($filePath, $workspaceId, $indexId, $oldFileId) {
        $categoryId = "default";
        $parser = "DASHSCOPE_DOCMIND";
        $sourceType = "DATA_CENTER_FILE";

        try {
            // ステップ 1: クライアントを作成します。
            echo "ステップ 1: クライアントを作成します。\n";
            $client = self::createClient();

            // ステップ 2: ファイル情報を準備します。
            echo "ステップ 2: ファイル情報を準備します。\n";
            $fileName = basename($filePath);
            $fileMd5 = self::calculateMD5($filePath);
            $fileSize = self::getFileSize($filePath);

            // ステップ 3: アップロードリースをリクエストします。
            echo "ステップ 3: Alibaba Cloud Model Studio にアップロードリースをリクエストします。\n";
            $leaseResponse = self::applyLease($client, $categoryId, $fileName, $fileMd5, $fileSize, $workspaceId);
            $leaseId = $leaseResponse->body->data->fileUploadLeaseId;
            $uploadUrl = $leaseResponse->body->data->param->url;
            $uploadHeaders = $leaseResponse->body->data->param->headers;
            $uploadHeadersMap = json_decode(json_encode($uploadHeaders), true);

            // ステップ 4: ファイルを一時ストレージにアップロードします。
            echo "ステップ 4: ファイルを一時ストレージにアップロードします。\n";
            self::uploadFile($uploadUrl, $uploadHeadersMap, $filePath);

            // ステップ 5: ファイルをカテゴリに追加します。
            echo "ステップ 5: ファイルをカテゴリに追加します。\n";
            $addResponse = self::addFile($client, $leaseId, $parser, $categoryId, $workspaceId);
            $fileId = $addResponse->body->data->fileId;

            // ステップ 6: ファイルのステータスを確認します。
            echo "ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。\n";
            while (true) {
                $describeResponse = self::describeFile($client, $workspaceId, $fileId);
                $status = $describeResponse->body->data->status;
                echo "現在のファイルステータス: " . $status . "\n";

                if ($status === "INIT") {
                    echo "ファイルは解析待ちです。しばらくお待ちください...\n";
                } elseif ($status === "PARSING") {
                    echo "ファイルは解析中です。しばらくお待ちください...\n";
                } elseif ($status === "PARSE_SUCCESS") {
                    echo "ファイルは解析されました。\n";
                    break;
                } else {
                    echo "不明なファイルステータス: " . $status . "。テクニカルサポートにお問い合わせください。\n";
                    return null;
                }
                sleep(5);
            }

            // ステップ 7: ファイルを追加するタスクを送信します。
            echo "ステップ 7: ファイルを追加するタスクを送信します。\n";
            $indexAddResponse = self::submitIndexAddDocumentsJob($client, $workspaceId, $indexId, $fileId, $sourceType);
            $jobId = $indexAddResponse->body->data->id;

            // ステップ 8: タスクが完了するのを待ちます。
            echo "ステップ 8: 追加タスクが完了するのを待ちます。\n";
            while (true) {
                $jobStatusResponse = self::getIndexJobStatus($client, $workspaceId, $jobId, $indexId);
                $status = $jobStatusResponse->body->data->status;
                echo "現在のインデックスジョブのステータス: " . $status . "\n";

                if ($status === "COMPLETED") {
                    break;
                }
                sleep(5);
            }

            // ステップ 9: 古いファイルを削除します。
            echo "ステップ 9: 古いファイルを削除します。\n";
            self::deleteIndexDocument($client, $workspaceId, $indexId, $oldFileId);

            echo "Alibaba Cloud Model Studio のナレッジベースが更新されました。\n";
            return $indexId;

        } catch (Exception $e) {
            echo "エラーが発生しました: " . $e->getMessage() . "\n";
            return null;
        }
    }


    /**
     * main 関数。
     */
    public static function main($args){
        if (!self::checkEnvironmentVariables()) {
            echo "環境変数のチェックに失敗しました。\n";
            return;
        }
        $filePath = readline("アップロードする更新済みファイルのローカルパスを入力してください (例: Linux システム上の /home/user/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx):");
        $indexId = readline("更新するナレッジベースの ID を入力してください:"); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページで ID を取得することもできます。
        $oldFileId = readline("更新するファイルのファイル ID を入力してください:"); // これは AddFile 操作によって返される FileId です。Model Studio コンソールのアプリケーションデータページでファイル名の横にある ID アイコンをクリックしてファイル ID を取得することもできます。
        $workspaceId = getenv('WORKSPACE_ID');
        $result = self::updateKnowledgeBase($filePath, $workspaceId, $indexId, $oldFileId);

        if ($result !== null) {
            echo "ナレッジベースが更新されました。ナレッジベースの ID は次のとおりです: " . $result . "\n";
        } else {
            echo "ナレッジベースの更新に失敗しました。\n";
        }
    }
}
// autoload.php が現在のコードファイルの親ディレクトリにあると仮定します。プロジェクトの構造に基づいてパスを調整してください。
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}
KnowledgeBaseUpdate::main(array_slice($argv, 1));

Node.js

// このサンプルコードは参考用です。本番環境では使用しないでください。
'use strict';

const fs = require('fs');
const path = require('path');
const axios = require('axios');
const crypto = require('crypto');

const bailian20231229 = require('@alicloud/bailian20231229');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');

class KbUpdate {

    /**
     * 必要な環境変数をチェックし、設定を促します。
     * @returns {boolean} - 必要なすべての環境変数が設定されている場合は true、それ以外の場合は false を返します。
     */
    static checkEnvironmentVariables() {
        const requiredVars = {
            'ALIBABA_CLOUD_ACCESS_KEY_ID': 'Alibaba Cloud AccessKey ID',
            'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'Alibaba Cloud AccessKey シークレット',
            'WORKSPACE_ID': 'Alibaba Cloud Model Studio ワークスペース ID'
        };

        const missing = [];
        for (const [varName, desc] of Object.entries(requiredVars)) {
            if (!process.env[varName]) {
                console.error(`エラー: 環境変数 ${varName} (${desc}) を設定してください`);
                missing.push(varName);
            }
        }
        return missing.length === 0;
    }

    /**
     * ファイルの MD5 ハッシュを計算します。
     * @param {string} filePath - ファイルのローカルパス。
     * @returns {Promise<string>} - ファイルの MD5 ハッシュ。
     */
    static async calculateMD5(filePath) {
        const hash = crypto.createHash('md5');
        const stream = fs.createReadStream(filePath);

        return new Promise((resolve, reject) => {
            stream.on('data', chunk => hash.update(chunk));
            stream.on('end', () => resolve(hash.digest('hex')));
            stream.on('error', reject);
        });
    }

    /**
     * ファイルのサイズをバイト単位で取得し、文字列として返します。
     * @param {string} filePath - ファイルのローカルパス。
     * @returns {string} - ファイルサイズ (例: "123456")。
     */
    static getFileSize(filePath) {
        try {
            const stats = fs.statSync(filePath);
            return stats.size.toString();
        } catch (err) {
            console.error(`ファイルサイズの取得に失敗しました: ${err.message}`);
            throw err;
        }
    }

    /**
     * クライアントを作成して設定します。
     * @return Client
     * @throws Exception
     */
    static createClient() {
        const config = new OpenApi.Config({
            accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
            accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
        });
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        config.endpoint = `bailian.ap-southeast-1.aliyuncs.com`;
        return new bailian20231229.default(config);
    }

    /**
     * ファイルアップロードリースをリクエストします。
     * @param {Bailian20231229Client} client - クライアント。
     * @param {string} categoryId - カテゴリ ID。
     * @param {string} fileName - ファイル名。
     * @param {string} fileMd5 - ファイルの MD5 ハッシュ。
     * @param {string} fileSize - ファイルサイズ (バイト単位)。
     * @param {string} workspaceId - ワークスペース ID。
     * @returns {Promise<bailian20231229.ApplyFileUploadLeaseResponse>} - Model Studio サービスからの応答。
     */
    static async applyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId) {
        const headers = {};
        const req = new bailian20231229.ApplyFileUploadLeaseRequest({
            md5: fileMd5,
            fileName,
            sizeInBytes: fileSize
        });
        const runtime = new Util.RuntimeOptions({});
        return await client.applyFileUploadLeaseWithOptions(
            categoryId,
            workspaceId,
            req,
            headers,
            runtime
        );
    }

    /**
     * ファイルを一時ストレージにアップロードします。
     * @param {string} preSignedUrl - アップロードリース内の URL。
     * @param {Object} headers - アップロードのリクエストヘッダー。
     * @param {string} filePath - ファイルのローカルパス。
     */
    static async uploadFile(preSignedUrl, headers, filePath) {
        const uploadHeaders = {
            "X-bailian-extra": headers["X-bailian-extra"],
            "Content-Type": headers["Content-Type"]
        };
        const stream = fs.createReadStream(filePath);
        try {
            await axios.put(preSignedUrl, stream, { headers: uploadHeaders });
        } catch (e) {
            throw new Error(`アップロードに失敗しました: ${e.message}`);
        }
    }

    /**
     * ファイルをカテゴリに追加します。
     * @param {Bailian20231229Client} client - クライアント。
     * @param {string} leaseId - リース ID。
     * @param {string} parser - ファイルのパーサ。
     * @param {string} categoryId - カテゴリ ID。
     * @param {string} workspaceId - ワークスペース ID。
     * @returns {Promise<bailian20231229.AddFileResponse>} - Model Studio サービスからの応答。
     */
    static async addFile(client, leaseId, parser, categoryId, workspaceId) {
        const headers = {};
        const req = new bailian20231229.AddFileRequest({
            leaseId,
            parser,
            categoryId
        });
        const runtime = new Util.RuntimeOptions({});
        return await client.addFileWithOptions(workspaceId, req, headers, runtime);
    }

    /**
     * ファイルの解析ステータスをクエリします。
     * @param {Bailian20231229Client} client - クライアント。
     * @param {string} workspaceId - ワークスペース ID。
     * @param {string} fileId - ファイル ID。
     * @returns {Promise<bailian20231229.DescribeFileResponse>} - Model Studio サービスからの応答。
     */
    static async describeFile(client, workspaceId, fileId) {
        const headers = {};
        const runtime = new Util.RuntimeOptions({});
        return await client.describeFileWithOptions(workspaceId, fileId, headers, runtime);
    }

    /**
     * ファイルを追加するタスクを送信します。
     * @param {Bailian20231229Client} client - クライアント。
     * @param {string} workspaceId - ワークスペース ID。
     * @param {string} indexId - ナレッジベース ID。
     * @param {string} fileId - ファイル ID。
     * @param {string} sourceType - データの型。
     * @returns {Promise<bailian20231229.SubmitIndexAddDocumentsJobResponse>} - Model Studio サービスからの応答。
     */
    static async submitIndexAddDocumentsJob(client, workspaceId, indexId, fileId, sourceType) {
        const headers = {};
        const req = new bailian20231229.SubmitIndexAddDocumentsJobRequest({
            indexId,
            documentIds: [fileId],
            sourceType,
        });
        const runtime = new Util.RuntimeOptions({});
        return await client.submitIndexAddDocumentsJobWithOptions(workspaceId, req, headers, runtime);
    }

    /**
     * インデックスジョブのステータスをクエリします。
     * @param {Bailian20231229Client} client - クライアント。
     * @param {string} workspaceId - ワークスペース ID。
     * @param {string} jobId - ジョブ ID。
     * @param {string} indexId - ナレッジベース ID。
     * @returns {Promise<bailian20231229.GetIndexJobStatusResponse>} - Model Studio サービスからの応答。
     */
    static async getIndexJobStatus(client, workspaceId, jobId, indexId) {
        const headers = {};
        const req = new bailian20231229.GetIndexJobStatusRequest({ jobId, indexId });
        const runtime = new Util.RuntimeOptions({});
        return await client.getIndexJobStatusWithOptions(workspaceId, req, headers, runtime);
    }

    /**
     * 古いファイルを削除します。
     * @param {Bailian20231229Client} client - クライアント。
     * @param {string} workspaceId - ワークスペース ID。
     * @param {string} indexId - ナレッジベース ID。
     * @param {string} fileId - ファイル ID。
     * @returns {Promise<bailian20231229.DeleteIndexDocumentResponse>} - Model Studio サービスからの応答。
     */
    static async deleteIndexDocument(client, workspaceId, indexId, fileId) {
        const headers = {};
        const req = new bailian20231229.DeleteIndexDocumentRequest({
            indexId,
            documentIds: [fileId],
        });
        const runtime = new Util.RuntimeOptions({});
        return await client.deleteIndexDocumentWithOptions(workspaceId, req, headers, runtime);
    }

    /**
     * Model Studio サービスを使用してナレッジベースを更新します。
     * @param {string} filePath - 更新されたファイルのローカルパス。
     * @param {string} workspaceId - ワークスペース ID。
     * @param {string} indexId - 更新するナレッジベースの ID。
     * @param {string} oldFileId - 更新するファイルのファイル ID。
     * @returns {Promise<string | null>} - 更新が成功した場合はナレッジベースの ID。それ以外の場合は null。
     */
    static async updateKnowledgeBase(filePath, workspaceId, indexId, oldFileId) {
        const categoryId = 'default';
        const parser = 'DASHSCOPE_DOCMIND';
        const sourceType = 'DATA_CENTER_FILE';

        try {
            console.log("ステップ 1: クライアントを作成します。");
            const client = this.createClient();

            console.log("ステップ 2: ファイル情報を準備します。");
            const fileName = path.basename(filePath);
            const fileMd5 = await this.calculateMD5(filePath);
            const fileSize = this.getFileSize(filePath);

            console.log("ステップ 3: Alibaba Cloud Model Studio にアップロードリースをリクエストします。");
            const leaseRes = await this.applyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId);
            const leaseId = leaseRes.body.data.fileUploadLeaseId;
            const uploadUrl = leaseRes.body.data.param.url;
            const uploadHeaders = leaseRes.body.data.param.headers;

            console.log("ステップ 4: ファイルを一時ストレージにアップロードします。");
            await this.uploadFile(uploadUrl, uploadHeaders, filePath);

            console.log("ステップ 5: ファイルをカテゴリに追加します。");
            const addRes = await this.addFile(client, leaseId, parser, categoryId, workspaceId);
            const fileId = addRes.body.data.fileId;

            console.log("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。");
            while (true) {
                const descRes = await this.describeFile(client, workspaceId, fileId);
                const status = descRes.body.data.status;
                console.log(`現在のファイルステータス: ${status}`);

                if (status === 'INIT') {
                    console.log("ファイルは解析待ちです。しばらくお待ちください...");
                } else if (status === 'PARSING') {
                    console.log("ファイルは解析中です。しばらくお待ちください...");
                } else if (status === 'PARSE_SUCCESS') {
                    console.log("ファイルは解析されました。");
                    break;
                } else {
                    console.error(`不明なファイルステータス: ${status}。テクニカルサポートにお問い合わせください。`);
                    return null;
                }
                await this.sleep(5);
            }

            console.log("ステップ 7: ファイルを追加するタスクを送信します。");
            const indexAddResponse = await this.submitIndexAddDocumentsJob(client, workspaceId, indexId, fileId, sourceType);
            const jobId = indexAddResponse.body.data.id;

            console.log("ステップ 8: 追加タスクが完了するのを待ちます。");
            while (true) {
                const getJobStatusResponse = await this.getIndexJobStatus(client, workspaceId, jobId, indexId);
                const status = getJobStatusResponse.body.data.status;
                console.log(`現在のインデックスジョブのステータス: ${status}`);
                if (status === 'COMPLETED') {
                    break;
                }
                await this.sleep(5);
            }

            console.log("ステップ 9: 古いファイルを削除します。");
            await this.deleteIndexDocument(client, workspaceId, indexId, oldFileId);

            console.log("Alibaba Cloud Model Studio のナレッジベースが更新されました。");
            return indexId;
        } catch (e) {
            console.error(`エラーが発生しました: ${e.message}`);
            return null;
        }
    }

    /**
     * 指定された秒数待機します。
     * @param {number} seconds - 待機時間 (秒)。
     * @returns {Promise<void>}
     */
    static sleep(seconds) {
        return new Promise(resolve => setTimeout(resolve, seconds * 1000));
    }

    static async main(args) {
        if (!this.checkEnvironmentVariables()) {
            console.log("環境変数のチェックに失敗しました。");
            return;
        }

        const readline = require('readline').createInterface({
            input: process.stdin,
            output: process.stdout
        });

        try {
            const filePath = await new Promise((resolve, reject) => {
                readline.question("アップロードする更新済みファイルのローカルパスを入力してください (例: Linux システム上の /home/user/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx):", (ans) => {
                    ans.trim() ? resolve(ans) : reject(new Error("パスは空にできません。"));
                });
            });
            const indexId = await new Promise((resolve, reject) => {
                // ナレッジベース ID は CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページで ID を取得することもできます。
                readline.question("更新するナレッジベースの ID を入力してください:", (ans) => {
                    ans.trim() ? resolve(ans) : reject(new Error("ナレッジベース ID は空にできません。"));
                });
            });
            const oldFileId = await new Promise((resolve, reject) => {
                // ファイル ID は AddFile 操作によって返される FileId です。Model Studio コンソールのアプリケーションデータページでファイル名の横にある ID アイコンをクリックしてファイル ID を取得することもできます。
                readline.question("更新するファイルのファイル ID を入力してください:", (ans) => {
                    ans.trim() ? resolve(ans) : reject(new Error("ファイル ID は空にできません。"));
                });
            });
            const workspaceId = process.env.WORKSPACE_ID;

            const result = await this.updateKnowledgeBase(filePath, workspaceId, indexId, oldFileId);
            if (result) console.log(`ナレッジベース ID: ${result}`);
            else console.log("ナレッジベースの更新に失敗しました。");
        } catch (err) {
            console.error(err.message);
        } finally {
            readline.close();
        }
    }
}

exports.KbUpdate = KbUpdate;
KbUpdate.main(process.argv.slice(2));

C#

// このサンプルコードは参考用です。本番環境では使用しないでください。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

using Tea;
using Tea.Utils;

namespace AlibabaCloud.SDK.KnowledgeBase
{
    public class KnowledgeBaseUpdate
    {
        /// <summary>
        /// 必要な環境変数をチェックし、設定を促します。
        /// </summary>
        /// <returns>必要なすべての環境変数が設定されている場合は true、それ以外の場合は false を返します。</returns>
        public static bool CheckEnvironmentVariables()
        {
            var requiredVars = new Dictionary<string, string>
            {
                { "ALIBABA_CLOUD_ACCESS_KEY_ID", "Alibaba Cloud AccessKey ID" },
                { "ALIBABA_CLOUD_ACCESS_KEY_SECRET", "Alibaba Cloud AccessKey シークレット" },
                { "WORKSPACE_ID", "Alibaba Cloud Model Studio ワークスペース ID" }
            };

            var missingVars = new List<string>();
            foreach (var entry in requiredVars)
            {
                string value = Environment.GetEnvironmentVariable(entry.Key);
                if (string.IsNullOrEmpty(value))
                {
                    missingVars.Add(entry.Key);
                    Console.WriteLine($"エラー: 環境変数 {entry.Key} ({entry.Value}) を設定してください");
                }
            }

            return missingVars.Count == 0;
        }

        /// <summary>
        /// ファイルの MD5 ハッシュを計算します。
        /// </summary>
        /// <param name="filePath">ファイルのローカルパス。</param>
        /// <returns>ファイルの MD5 ハッシュ。</returns>
        /// <exception cref="Exception">計算中にエラーが発生した場合、例外がスローされます。</exception>
        public static string CalculateMD5(string filePath)
        {
            using (var md5 = MD5.Create())
            {
                using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                {
                    byte[] hashBytes = md5.ComputeHash(stream);
                    StringBuilder sb = new StringBuilder();
                    foreach (byte b in hashBytes)
                    {
                        sb.Append(b.ToString("x2"));
                    }
                    return sb.ToString();
                }
            }
        }

        /// <summary>
        /// ファイルのサイズをバイト単位で取得します。
        /// </summary>
        /// <param name="filePath">ファイルのローカルパス。</param>
        /// <returns>ファイルサイズ (バイト単位)。</returns>
        public static string GetFileSize(string filePath)
        {
            var file = new FileInfo(filePath);
            return file.Length.ToString();
        }

        /// <summary>
        /// クライアントを初期化します。
        /// </summary>
        /// <returns>設定済みのクライアントオブジェクト。</returns>
        /// <exception cref="Exception">初期化中にエラーが発生した場合、例外がスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Client CreateClient()
        {
            var config = new AlibabaCloud.OpenApiClient.Models.Config
            {
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
            };
            // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
            config.Endpoint = "bailian.ap-southeast-1.aliyuncs.com";
            return new AlibabaCloud.SDK.Bailian20231229.Client(config);
        }

        /// <summary>
        /// ファイルアップロードリースをリクエストします。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="categoryId">カテゴリ ID。</param>
        /// <param name="fileName">ファイル名。</param>
        /// <param name="fileMd5">ファイルの MD5 ハッシュ。</param>
        /// <param name="fileSize">ファイルサイズ (バイト単位)。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.ApplyFileUploadLeaseResponse ApplyLease(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string categoryId,
            string fileName,
            string fileMd5,
            string fileSize,
            string workspaceId)
        {
            var headers = new Dictionary<string, string>() { };
            var applyFileUploadLeaseRequest = new AlibabaCloud.SDK.Bailian20231229.Models.ApplyFileUploadLeaseRequest
            {
                FileName = fileName,
                Md5 = fileMd5,
                SizeInBytes = fileSize
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.ApplyFileUploadLeaseWithOptions(categoryId, workspaceId, applyFileUploadLeaseRequest, headers, runtime);
        }

        /// <summary>
        /// ファイルを一時ストレージにアップロードします。
        /// </summary>
        /// <param name="preSignedUrl">アップロードリース内の URL。</param>
        /// <param name="headers">アップロードのリクエストヘッダー。</param>
        /// <param name="filePath">ファイルのローカルパス。</param>
        /// <exception cref="Exception">アップロード中にエラーが発生した場合、例外がスローされます。</exception>
        public static void UploadFile(string preSignedUrl, Dictionary<string, string> headers, string filePath)
        {
            var file = new FileInfo(filePath);
            if (!File.Exists(filePath))
            {
                throw new ArgumentException($"ファイルが存在しないか、通常のファイルではありません: {filePath}");
            }

            using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                var url = new Uri(preSignedUrl);
                var conn = (HttpWebRequest)WebRequest.Create(url);
                conn.Method = "PUT";
                conn.ContentType = headers["Content-Type"];
                conn.Headers.Add("X-bailian-extra", headers["X-bailian-extra"]);

                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    conn.GetRequestStream().Write(buffer, 0, bytesRead);
                }

                using (var response = (HttpWebResponse)conn.GetResponse())
                {
                    if (response.StatusCode != HttpStatusCode.OK)
                    {
                        throw new Exception($"アップロードに失敗しました: {response.StatusCode}");
                    }
                }
            }
        }

        /// <summary>
        /// ファイルをカテゴリに追加します。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="leaseId">リース ID。</param>
        /// <param name="parser">ファイルのパーサ。</param>
        /// <param name="categoryId">カテゴリ ID。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.AddFileResponse AddFile(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string leaseId,
            string parser,
            string categoryId,
            string workspaceId)
        {
            var headers = new Dictionary<string, string>() { };
            var addFileRequest = new AlibabaCloud.SDK.Bailian20231229.Models.AddFileRequest
            {
                LeaseId = leaseId,
                Parser = parser,
                CategoryId = categoryId
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.AddFileWithOptions(workspaceId, addFileRequest, headers, runtime);
        }

        /// <summary>
        /// ファイルの基本情報をクエリします。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="fileId">ファイル ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.DescribeFileResponse DescribeFile(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string fileId)
        {
            var headers = new Dictionary<string, string>() { };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.DescribeFileWithOptions(workspaceId, fileId, headers, runtime);
        }

        /// <summary>
        /// 解析済みのファイルをドキュメント検索ナレッジベースに追加します。
        /// </summary>
        /// <param name="client">クライアント。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="indexId">ナレッジベース ID。</param>
        /// <param name="fileId">ファイル ID。</param>
        /// <param name="sourceType">データの型。</param>
        /// <returns>Model Studio サービスからの応答。</returns>
        public static AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexAddDocumentsJobResponse SubmitIndexAddDocumentsJob(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string indexId,
            string fileId,
            string sourceType)
        {
            var headers = new Dictionary<string, string>() { };
            var submitIndexAddDocumentsJobRequest = new AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexAddDocumentsJobRequest
            {
                IndexId = indexId,
                DocumentIds = new List<string> { fileId },
                SourceType = sourceType
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.SubmitIndexAddDocumentsJobWithOptions(workspaceId, submitIndexAddDocumentsJobRequest, headers, runtime);
        }

        /// <summary>
        /// インデックスジョブのステータスをクエリします。
        /// </summary>
        /// <param name="client">クライアントオブジェクト。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="jobId">ジョブ ID。</param>
        /// <param name="indexId">ナレッジベース ID。</param>
        /// <returns>Model Studio サービスからの応答オブジェクト。</returns>
        /// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusResponse GetIndexJobStatus(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string jobId,
            string indexId)
        {
            var headers = new Dictionary<string, string>() { };
            var getIndexJobStatusRequest = new AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusRequest
            {
                IndexId = indexId,
                JobId = jobId
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.GetIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
        }

        /// <summary>
        /// 指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを永久に削除します。
        /// </summary>
        /// <param name="client">クライアント。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="indexId">ナレッジベース ID。</param>
        /// <param name="fileId">ファイル ID。</param>
        /// <returns>Model Studio サービスからの応答。</returns>
        public static AlibabaCloud.SDK.Bailian20231229.Models.DeleteIndexDocumentResponse DeleteIndexDocument(
            AlibabaCloud.SDK.Bailian20231229.Client client,
            string workspaceId,
            string indexId,
            string fileId)
        {
            var headers = new Dictionary<string, string>() { };
            var deleteIndexDocumentRequest = new AlibabaCloud.SDK.Bailian20231229.Models.DeleteIndexDocumentRequest
            {
                IndexId = indexId,
                DocumentIds = new List<string> { fileId }
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.DeleteIndexDocumentWithOptions(workspaceId, deleteIndexDocumentRequest, headers, runtime);
        }

        /// <summary>
        /// Model Studio サービスを使用してナレッジベースを更新します。
        /// </summary>
        /// <param name="filePath">更新されたファイルのローカルパス。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="indexId">更新するナレッジベースの ID。</param>
        /// <param name="oldFileId">更新するファイルのファイル ID。</param>
        /// <returns>更新が成功した場合はナレッジベースの ID。それ以外の場合は null。</returns>
        public static string UpdateKnowledgeBase(string filePath, string workspaceId, string indexId, string oldFileId)
        {
            // デフォルト値を設定します。
            string categoryId = "default";
            string parser = "DASHSCOPE_DOCMIND";
            string sourceType = "DATA_CENTER_FILE";

            try
            {
                Console.WriteLine("ステップ 1: クライアントを作成します。");
                var client = CreateClient();

                Console.WriteLine("ステップ 2: ファイル情報を準備します。");
                string fileName = Path.GetFileName(filePath);
                string fileMd5 = CalculateMD5(filePath);
                string fileSize = GetFileSize(filePath);

                Console.WriteLine("ステップ 3: Alibaba Cloud Model Studio にアップロードリースをリクエストします。");
                Bailian20231229.Models.ApplyFileUploadLeaseResponse leaseResponse = ApplyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId);
                string leaseId = leaseResponse.Body.Data.FileUploadLeaseId;
                string uploadUrl = leaseResponse.Body.Data.Param.Url;
                var uploadHeaders = leaseResponse.Body.Data.Param.Headers;

                Console.WriteLine("ステップ 4: ファイルを一時ストレージにアップロードします。");
                // Newtonsoft.Json をインストールします。
                var uploadHeadersMap = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(uploadHeaders));
                UploadFile(uploadUrl, uploadHeadersMap, filePath);

                Console.WriteLine("ステップ 5: ファイルをカテゴリに追加します。");
                Bailian20231229.Models.AddFileResponse addResponse = AddFile(client, leaseId, parser, categoryId, workspaceId);
                string fileId = addResponse.Body.Data.FileId;

                Console.WriteLine("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。");
                while (true)
                {
                    Bailian20231229.Models.DescribeFileResponse describeResponse = DescribeFile(client, workspaceId, fileId);
                    string status = describeResponse.Body.Data.Status;
                    Console.WriteLine("現在のファイルステータス: " + status);
                    if ("INIT".Equals(status))
                    {
                        Console.WriteLine("ファイルは解析待ちです。しばらくお待ちください...");
                    }
                    else if ("PARSING".Equals(status))
                    {
                        Console.WriteLine("ファイルは解析中です。しばらくお待ちください...");
                    }
                    else if ("PARSE_SUCCESS".Equals(status))
                    {
                        Console.WriteLine("ファイルは解析されました。");
                        break;
                    }
                    else
                    {
                        Console.WriteLine("不明なファイルステータス: " + status + "。テクニカルサポートにお問い合わせください。");
                        return null;
                    }
                    Thread.Sleep(5000);
                }

                Console.WriteLine("ステップ 7: ファイルを追加するタスクを送信します。");
                Bailian20231229.Models.SubmitIndexAddDocumentsJobResponse indexAddResponse = SubmitIndexAddDocumentsJob(client, workspaceId, indexId, fileId, sourceType);
                string jobId = indexAddResponse.Body.Data.Id;

                Console.WriteLine("ステップ 8: 追加タスクが完了するのを待ちます。");
                while (true)
                {
                    Bailian20231229.Models.GetIndexJobStatusResponse jobStatusResponse = GetIndexJobStatus(client, workspaceId, jobId, indexId);
                    string status = jobStatusResponse.Body.Data.Status;
                    Console.WriteLine("現在のインデックスジョブのステータス: " + status);
                    if ("COMPLETED".Equals(status))
                    {
                        break;
                    }
                    Thread.Sleep(5000);
                }

                Console.WriteLine("ステップ 9: 古いファイルを削除します。");
                DeleteIndexDocument(client, workspaceId, indexId, oldFileId);

                Console.WriteLine("Alibaba Cloud Model Studio のナレッジベースが更新されました。");
                return indexId;
            }
            catch (Exception e)
            {
                Console.WriteLine("エラーが発生しました: " + e.Message);
                return null;
            }
        }

        /// <summary>
        /// main 関数。
        /// </summary>
        public static void Main(string[] args)
        {
            if (!CheckEnvironmentVariables())
            {
                Console.WriteLine("環境変数のチェックに失敗しました。");
                return;
            }

            Console.Write("アップロードする更新済みファイルのローカルパスを入力してください (例: Linux システム上の /home/user/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx):");
            string filePath = Console.ReadLine();

            Console.Write("更新するナレッジベースの ID を入力してください:"); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページで ID を取得することもできます。
            string indexId = Console.ReadLine();

            Console.Write("更新するファイルのファイル ID を入力してください:"); // これは AddFile 操作によって返される FileId です。Model Studio コンソールのアプリケーションデータページでファイル名の横にある ID アイコンをクリックしてファイル ID を取得することもできます。
            string oldFileId = Console.ReadLine();

            string workspaceId = Environment.GetEnvironmentVariable("WORKSPACE_ID");
            string result = UpdateKnowledgeBase(filePath, workspaceId, indexId, oldFileId);
            if (result != null)
            {
                Console.WriteLine("ナレッジベースが更新されました。ナレッジベースの ID は次のとおりです: " + result);
            }
            else
            {
                Console.WriteLine("ナレッジベースの更新に失敗しました。");
            }
        }
    }
}

Go

// このサンプルコードは参考用です。本番環境では使用しないでください。
package main

import (
	"bufio"
	"crypto/md5"
	"encoding/json"
	"fmt"
	"io"
	"os"
	"path/filepath"
	"strings"
	"time"

	bailian20231229 "github.com/alibabacloud-go/bailian-20231229/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/go-resty/resty/v2"
)

// CheckEnvironmentVariables は、必要な環境変数をチェックし、設定を促します。
func CheckEnvironmentVariables() bool {
	// 必要な環境変数とその説明。
	requiredVars := map[string]string{
		"ALIBABA_CLOUD_ACCESS_KEY_ID":     "Alibaba Cloud AccessKey ID",
		"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "Alibaba Cloud AccessKey シークレット",
		"WORKSPACE_ID":                    "Alibaba Cloud Model Studio ワークスペース ID",
	}

	var missingVars []string
	for varName, desc := range requiredVars {
		if os.Getenv(varName) == "" {
			fmt.Printf("エラー: 環境変数 %s (%s) を設定してください\n", varName, desc)
			missingVars = append(missingVars, varName)
		}
	}

	return len(missingVars) == 0
}

// CalculateMD5 はファイルの MD5 ハッシュを計算します。
//
// Args:
//   - filePath (string): ファイルのローカルパス。
//
// Returns:
//   - string: ファイルの MD5 ハッシュ。
//   - error: エラーメッセージ。
func CalculateMD5(filePath string) (_result string, _err error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", err
	}
	defer file.Close()

	md5Hash := md5.New()
	_, err = io.Copy(md5Hash, file)
	if err != nil {
		return "", err
	}

	return fmt.Sprintf("%x", md5Hash.Sum(nil)), nil
}

// GetFileSize はファイルのサイズをバイト単位で取得します。
//
// Args:
//   - filePath (string): ファイルのローカルパス。
//
// Returns:
//   - string: ファイルサイズ (バイト単位)。
//   - error: エラーメッセージ。
func GetFileSize(filePath string) (_result string, _err error) {
	info, err := os.Stat(filePath)
	if err != nil {
		return "", err
	}
	return fmt.Sprintf("%d", info.Size()), nil
}

// CreateClient はクライアントを作成して設定します。
//
// Returns:
//   - *client.Bailian20231229Client: 設定済みのクライアント。
//   - error: エラーメッセージ。
func CreateClient() (_result *bailian20231229.Client, _err error) {
	config := &openapi.Config{
		AccessKeyId:     tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
		AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
	}
	// 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
	config.Endpoint = tea.String("bailian.ap-southeast-1.aliyuncs.com")
	_result = &bailian20231229.Client{}
	_result, _err = bailian20231229.NewClient(config)
	return _result, _err
}

// ApplyLease は Model Studio サービスにファイルアップロードリースをリクエストします。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - categoryId (string): カテゴリ ID。
//   - fileName (string): ファイル名。
//   - fileMD5 (string): ファイルの MD5 ハッシュ。
//   - fileSize (string): ファイルサイズ (バイト単位)。
//   - workspaceId (string): ワークスペース ID。
//
// Returns:
//   - *bailian20231229.ApplyFileUploadLeaseResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func ApplyLease(client *bailian20231229.Client, categoryId, fileName, fileMD5 string, fileSize string, workspaceId string) (_result *bailian20231229.ApplyFileUploadLeaseResponse, _err error) {
	headers := make(map[string]*string)
	applyFileUploadLeaseRequest := &bailian20231229.ApplyFileUploadLeaseRequest{
		FileName:    tea.String(fileName),
		Md5:         tea.String(fileMD5),
		SizeInBytes: tea.String(fileSize),
	}
	runtime := &util.RuntimeOptions{}
	return client.ApplyFileUploadLeaseWithOptions(tea.String(categoryId), tea.String(workspaceId), applyFileUploadLeaseRequest, headers, runtime)
}

// UploadFile はファイルを Model Studio サービスにアップロードします。
//
// Args:
//   - preSignedUrl (string): アップロードリース内の URL。
//   - headers (map[string]string): アップロードのリクエストヘッダー。
//   - filePath (string): ファイルのローカルパス。
func UploadFile(preSignedUrl string, headers map[string]string, filePath string) error {
	file, err := os.Open(filePath)
	if err != nil {
		return err
	}
	defer file.Close()

	body, err := io.ReadAll(file)
	if err != nil {
		return err
	}

	client := resty.New()
	uploadHeaders := map[string]string{
		"X-bailian-extra": headers["X-bailian-extra"],
		"Content-Type":    headers["Content-Type"],
	}

	resp, err := client.R().
		SetHeaders(uploadHeaders).
		SetBody(body).
		Put(preSignedUrl)

	if err != nil {
		return err
	}

	if resp.IsError() {
		return fmt.Errorf("HTTP エラー: %d", resp.StatusCode())
	}

	return nil
}

// AddFile は Model Studio サービスの指定されたカテゴリにファイルを追加します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - leaseId (string): リース ID。
//   - parser (string): ファイルのパーサ。
//   - categoryId (string): カテゴリ ID。
//   - workspaceId (string): ワークスペース ID。
//
// Returns:
//   - *bailian20231229.AddFileResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func AddFile(client *bailian20231229.Client, leaseId, parser, categoryId, workspaceId string) (_result *bailian20231229.AddFileResponse, _err error) {
	headers := make(map[string]*string)
	addFileRequest := &bailian20231229.AddFileRequest{
		LeaseId:    tea.String(leaseId),
		Parser:     tea.String(parser),
		CategoryId: tea.String(categoryId),
	}
	runtime := &util.RuntimeOptions{}
	return client.AddFileWithOptions(tea.String(workspaceId), addFileRequest, headers, runtime)
}

// DescribeFile はファイルの基本情報を取得します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - fileId (string): ファイル ID。
//
// Returns:
//   - *bailian20231229.DescribeFileResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func DescribeFile(client *bailian20231229.Client, workspaceId, fileId string) (_result *bailian20231229.DescribeFileResponse, _err error) {
	headers := make(map[string]*string)
	runtime := &util.RuntimeOptions{}
	return client.DescribeFileWithOptions(tea.String(workspaceId), tea.String(fileId), headers, runtime)
}

// SubmitIndexAddDocumentsJob は解析済みのファイルをドキュメント検索ナレッジベースに追加します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): ナレッジベース ID。
//   - fileId(string): ファイル ID。
//   - sourceType(string): データの型。
//
// Returns:
//   - *bailian20231229.SubmitIndexAddDocumentsJobResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func SubmitIndexAddDocumentsJob(client *bailian20231229.Client, workspaceId, indexId, fileId, sourceType string) (_result *bailian20231229.SubmitIndexAddDocumentsJobResponse, _err error) {
	headers := make(map[string]*string)
	submitIndexAddDocumentsJobRequest := &bailian20231229.SubmitIndexAddDocumentsJobRequest{
		IndexId:     tea.String(indexId),
		SourceType:  tea.String(sourceType),
		DocumentIds: []*string{tea.String(fileId)},
	}
	runtime := &util.RuntimeOptions{}
	return client.SubmitIndexAddDocumentsJobWithOptions(tea.String(workspaceId), submitIndexAddDocumentsJobRequest, headers, runtime)
}

// GetIndexJobStatus はインデックスジョブのステータスをクエリします。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - jobId (string): ジョブ ID。
//   - indexId (string): ナレッジベース ID。
//
// Returns:
//   - *bailian20231229.GetIndexJobStatusResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func GetIndexJobStatus(client *bailian20231229.Client, workspaceId, jobId, indexId string) (_result *bailian20231229.GetIndexJobStatusResponse, _err error) {
	headers := make(map[string]*string)
	getIndexJobStatusRequest := &bailian20231229.GetIndexJobStatusRequest{
		JobId:   tea.String(jobId),
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.GetIndexJobStatusWithOptions(tea.String(workspaceId), getIndexJobStatusRequest, headers, runtime)
}

// DeleteIndexDocument は指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを永久に削除します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): ナレッジベース ID。
//   - fileId (string): ファイル ID。
//
// Returns:
//   - *bailian20231229.DeleteIndexDocumentResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func DeleteIndexDocument(client *bailian20231229.Client, workspaceId, indexId, fileId string) (*bailian20231229.DeleteIndexDocumentResponse, error) {
	headers := make(map[string]*string)
	deleteIndexDocumentRequest := &bailian20231229.DeleteIndexDocumentRequest{
		IndexId:     tea.String(indexId),
		DocumentIds: []*string{tea.String(fileId)},
	}
	runtime := &util.RuntimeOptions{}
	return client.DeleteIndexDocumentWithOptions(tea.String(workspaceId), deleteIndexDocumentRequest, headers, runtime)
}

// UpdateKnowledgeBase は Model Studio サービスを使用してナレッジベースを更新します。
//
// Args:
//   - filePath (string): 更新されたファイルのローカルパス。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): 更新するナレッジベースの ID。
//   - oldFileId (string): 更新するファイルのファイル ID。
//
// Returns:
//   - string: 更新が成功した場合はナレッジベースの ID。それ以外の場合は空の文字列。
//   - error: エラーメッセージ。
func UpdateKnowledgeBase(filePath, workspaceId, indexId, oldFileId string) (_result string, _err error) {
	// デフォルト値を設定します。
	categoryId := "default"
	parser := "DASHSCOPE_DOCMIND"
	sourceType := "DATA_CENTER_FILE"

	fmt.Println("ステップ 1: クライアントを作成します。")
	client, err := CreateClient()
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 2: ファイル情報を準備します。")
	fileName := filepath.Base(filePath)
	fileMD5, err := CalculateMD5(filePath)
	if err != nil {
		return "", err
	}
	fileSizeStr, err := GetFileSize(filePath)
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 3: Alibaba Cloud Model Studio にアップロードリースをリクエストします。")
	leaseResponse, err := ApplyLease(client, categoryId, fileName, fileMD5, fileSizeStr, workspaceId)
	if err != nil {
		return "", err
	}

	leaseId := tea.StringValue(leaseResponse.Body.Data.FileUploadLeaseId)
	uploadURL := tea.StringValue(leaseResponse.Body.Data.Param.Url)
	uploadHeaders := leaseResponse.Body.Data.Param.Headers

	jsonData, err := json.Marshal(uploadHeaders)
	if err != nil {
		return "", err
	}

	var uploadHeadersMap map[string]string
	err = json.Unmarshal(jsonData, &uploadHeadersMap)
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 4: ファイルを一時ストレージにアップロードします。")
	err = UploadFile(uploadURL, uploadHeadersMap, filePath)
	if err != nil {
		return "", err
	}

	fmt.Println("ステップ 5: ファイルをカテゴリに追加します。")
	addResponse, err := AddFile(client, leaseId, parser, categoryId, workspaceId)
	if err != nil {
		return "", err
	}
	fileId := tea.StringValue(addResponse.Body.Data.FileId)

	fmt.Println("ステップ 6: Alibaba Cloud Model Studio でファイルのステータスを確認します。")
	for {
		describeResponse, err := DescribeFile(client, workspaceId, fileId)
		if err != nil {
			return "", err
		}

		status := tea.StringValue(describeResponse.Body.Data.Status)
		fmt.Printf("現在のファイルステータス: %s\n", status)

		if status == "INIT" {
			fmt.Println("ファイルは解析待ちです。しばらくお待ちください...")
		} else if status == "PARSING" {
			fmt.Println("ファイルは解析中です。しばらくお待ちください...")
		} else if status == "PARSE_SUCCESS" {
			fmt.Println("ファイルは解析されました。")
			break
		} else {
			fmt.Printf("不明なファイルステータス: %s。テクニカルサポートにお問い合わせください。\n", status)
			return "", fmt.Errorf("不明なドキュメントステータス: %s", status)
		}
		time.Sleep(5 * time.Second)
	}

	// ファイルを追加するタスクを送信します。
	fmt.Println("ステップ 7: ファイルを追加するタスクを送信します。")
	indexAddResponse, err := SubmitIndexAddDocumentsJob(client, workspaceId, indexId, fileId, sourceType)
	if err != nil {
		return "", err
	}
	jobId := tea.StringValue(indexAddResponse.Body.Data.Id)

	// タスクが完了するのを待ちます。
	fmt.Println("ステップ 8: 追加タスクが完了するのを待ちます。")
	for {
		getIndexJobStatusResponse, err := GetIndexJobStatus(client, workspaceId, jobId, indexId)
		if err != nil {
			return "", err
		}

		status := tea.StringValue(getIndexJobStatusResponse.Body.Data.Status)
		fmt.Printf("現在のインデックスジョブのステータス: %s\n", status)

		if status == "COMPLETED" {
			break
		}
		time.Sleep(5 * time.Second)
	}

	// 古いファイルを削除します。
	fmt.Println("ステップ 9: 古いファイルを削除します。")
	_, err = DeleteIndexDocument(client, workspaceId, indexId, oldFileId)
	if err != nil {
		return "", err
	}

	fmt.Println("Alibaba Cloud Model Studio のナレッジベースが更新されました。")
	return indexId, nil
}

// main 関数。
func main() {
	if !CheckEnvironmentVariables() {
		fmt.Println("環境変数のチェックに失敗しました。")
		return
	}
	// 入力を読み取るためのスキャナーを作成します。
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("アップロードする更新済みファイルのローカルパスを入力してください (例: Linux システム上の /home/user/Alibaba_Cloud_Model_Studio_Phone_Series_Introduction.docx):")
	filePath, _ := reader.ReadString('\n')
	filePath = strings.TrimSpace(filePath)

	fmt.Print("更新するナレッジベースの ID を入力してください:") // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページで ID を取得することもできます。
	indexId, _ := reader.ReadString('\n')
	indexId = strings.TrimSpace(indexId)

	fmt.Print("更新するファイルのファイル ID を入力してください:") // これは AddFile 操作によって返される FileId です。Model Studio コンソールのアプリケーションデータページでファイル名の横にある ID アイコンをクリックしてファイル ID を取得することもできます。
	oldFileId, _ := reader.ReadString('\n')
	oldFileId = strings.TrimSpace(oldFileId)

	workspaceId := os.Getenv("WORKSPACE_ID")
	result, err := UpdateKnowledgeBase(filePath, workspaceId, indexId, oldFileId)
	if err != nil {
		fmt.Printf("エラーが発生しました: %v\n", err)
		return
	}

	if result != "" {
		fmt.Printf("ナレッジベースが更新されました。ナレッジベースの ID は次のとおりです: %s\n", result)
	} else {
		fmt.Println("ナレッジベースの更新に失敗しました。")
	}
}

ナレッジベースの管理

重要
  • この例を呼び出す前に、先行するすべての前提条件を完了する必要があります。RAM ユーザーは、AliyunBailianDataFullAccess ポリシーを取得する必要もあります。

  • IDE またはその他の補助開発プラグインを使用する場合、開発環境で ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET、および WORKSPACE_ID 変数を設定する必要があります。

Python

# このサンプルコードは参照用です。本番環境では直接使用しないでください。
import os

from alibabacloud_bailian20231229 import models as bailian_20231229_models
from alibabacloud_bailian20231229.client import Client as bailian20231229Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


def check_environment_variables():
    """必要な環境変数が設定されているか確認し、設定を促します。"""
    required_vars = {
        'ALIBABA_CLOUD_ACCESS_KEY_ID': 'Alibaba Cloud AccessKey ID',
        'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'Alibaba Cloud AccessKey secret',
        'WORKSPACE_ID': 'Alibaba Cloud Model Studio workspace ID'
    }
    missing_vars = []
    for var, description in required_vars.items():
        if not os.environ.get(var):
            missing_vars.append(var)
            print(f"Error: Set the {var} environment variable ({description})")

    return len(missing_vars) == 0


# クライアントを作成します。
def create_client() -> bailian20231229Client:
    """
    クライアントを作成して設定します。

    Returns:
        bailian20231229Client: 設定済みのクライアント。
    """
    config = open_api_models.Config(
        access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    )
    # 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
    config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
    return bailian20231229Client(config)


# ナレッジベースを一覧表示します。
def list_indices(client, workspace_id):
    """
    指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。

    Parameters:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    list_indices_request = bailian_20231229_models.ListIndicesRequest()
    runtime = util_models.RuntimeOptions()
    return client.list_indices_with_options(workspace_id, list_indices_request, headers, runtime)


# ナレッジベースを削除します。
def delete_index(client, workspace_id, index_id):
    """
    指定されたナレッジベースを完全に削除します。

    Parameters:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    delete_index_request = bailian_20231229_models.DeleteIndexRequest(
        index_id=index_id
    )
    runtime = util_models.RuntimeOptions()
    return client.delete_index_with_options(workspace_id, delete_index_request, headers, runtime)


def main():
    if not check_environment_variables():
        print("Environment variable verification failed.")
        return
    try:
        start_option = input(
            "Select an operation to perform:\n1. List knowledge bases\n2. Delete a knowledge base\nEnter an option (1 or 2):")
        if start_option == '1':
            # ナレッジベースを一覧表示します。
            print("\nList knowledge bases")
            workspace_id = os.environ.get('WORKSPACE_ID')
            client = create_client()
            list_indices_response = list_indices(client, workspace_id)
            print(UtilClient.to_jsonstring(list_indices_response.body.data))
        elif start_option == '2':
            print("\nDelete a knowledge base")
            workspace_id = os.environ.get('WORKSPACE_ID')
            index_id = input("Enter the knowledge base ID:")  # これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
            # 削除前に確認します。
            while True:
                confirm = input(f"Are you sure you want to permanently delete the knowledge base {index_id}? (y/n): ").strip().lower()
                if confirm == 'y':
                    break
                elif confirm == 'n':
                    print("The deletion is canceled.")
                    return
                else:
                    print("Invalid input. Enter y or n.")
            client = create_client()
            resp = delete_index(client, workspace_id, index_id)
            if resp.body.status == 200:
                print(f"Knowledge base {index_id} is deleted.")
            else:
                err_info = UtilClient.to_jsonstring(resp.body)
                print(f"An error occurred: {err_info}")
        else:
            print("Invalid option. The program exits.")
            return
    except Exception as e:
        print(f"An error occurred: {e}")
        return


if __name__ == '__main__':
    main()

Java

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
import com.aliyun.bailian20231229.models.DeleteIndexResponse;
import com.aliyun.bailian20231229.models.ListIndicesResponse;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.*;

public class KnowledgeBaseManage {

    /**
     * 必要な環境変数が設定されているか確認し、設定を促します。
     *
     * @return 必要な環境変数がすべて設定されている場合は true を返します。それ以外の場合は false を返します。
     */
    public static boolean checkEnvironmentVariables() {
        Map<String, String> requiredVars = new HashMap<>();
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_ID", "Alibaba Cloud AccessKey ID");
        requiredVars.put("ALIBABA_CLOUD_ACCESS_KEY_SECRET", "Alibaba Cloud AccessKey secret");
        requiredVars.put("WORKSPACE_ID", "Alibaba Cloud Model Studio workspace ID");

        List<String> missingVars = new ArrayList<>();
        for (Map.Entry<String, String> entry : requiredVars.entrySet()) {
            String value = System.getenv(entry.getKey());
            if (value == null || value.isEmpty()) {
                missingVars.add(entry.getKey());
                System.out.println("Error: Set the " + entry.getKey() + " environment variable (" + entry.getValue() + ")");
            }
        }

        return missingVars.isEmpty();
    }

    /**
     * クライアントを作成して設定します。
     *
     * @return 設定済みのクライアント。
     */
    public static com.aliyun.bailian20231229.Client createClient() throws Exception {
        com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client();
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setCredential(credential);
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        config.endpoint = "bailian.ap-southeast-1.aliyuncs.com";
        return new com.aliyun.bailian20231229.Client(config);
    }

    /**
     * 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
     *
     * @param client      クライアント。
     * @param workspaceId ワークスペース ID。
     * @return Model Studio サービスからの応答。
     */
    public static ListIndicesResponse listIndices(com.aliyun.bailian20231229.Client client, String workspaceId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.ListIndicesRequest listIndicesRequest = new com.aliyun.bailian20231229.models.ListIndicesRequest();
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.listIndicesWithOptions(workspaceId, listIndicesRequest, headers, runtime);
    }

    /**
     * 指定されたナレッジベースを完全に削除します。
     *
     * @param client      クライアント。
     * @param workspaceId ワークスペース ID。
     * @param indexId     ナレッジベース ID。
     * @return Model Studio サービスからの応答。
     */
    public static DeleteIndexResponse deleteIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId) throws Exception {
        Map<String, String> headers = new HashMap<>();
        com.aliyun.bailian20231229.models.DeleteIndexRequest deleteIndexRequest = new com.aliyun.bailian20231229.models.DeleteIndexRequest();
        deleteIndexRequest.setIndexId(indexId);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        return client.deleteIndexWithOptions(workspaceId, deleteIndexRequest, headers, runtime);
    }

    /**
     * main 関数。
     */
    public static void main(String[] args) {
        if (!checkEnvironmentVariables()) {
            System.out.println("Environment variable verification failed.");
            return;
        }

        try {
            Scanner scanner = new Scanner(System.in);
            System.out.print("Select an operation to perform:\n1. List knowledge bases\n2. Delete a knowledge base\nEnter an option (1 or 2):");
            String startOption = scanner.nextLine();
            com.aliyun.bailian20231229.Client client = createClient();
            if (startOption.equals("1")) {
                // ナレッジベースを一覧表示します。
                System.out.println("\nList knowledge bases");
                String workspaceId = System.getenv("WORKSPACE_ID");
                ListIndicesResponse response = listIndices(client, workspaceId);
                // jackson-databind をインストールして、応答を JSON 文字列に変換します。
                ObjectMapper mapper = new ObjectMapper();
                String result = mapper.writeValueAsString(response.getBody().getData());
                System.out.println(result);
            } else if (startOption.equals("2")) {
                System.out.println("\nDelete a knowledge base");
                String workspaceId = System.getenv("WORKSPACE_ID");
                System.out.print("Enter the knowledge base ID:"); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
                String indexId = scanner.nextLine();
                // 削除前に確認します。
                boolean confirm = false;
                while (!confirm) {
                    System.out.print("Are you sure you want to permanently delete the knowledge base " + indexId + "? (y/n): ");
                    String input = scanner.nextLine().trim().toLowerCase();
                    if (input.equals("y")) {
                        confirm = true;
                    } else if (input.equals("n")) {
                        System.out.println("The deletion is canceled.");
                        return;
                    } else {
                        System.out.println("Invalid input. Enter y or n.");
                    }
                }
                DeleteIndexResponse resp = deleteIndex(client, workspaceId, indexId);
                if (resp.getBody().getStatus().equals("200")) {
                    System.out.println("Knowledge base " + indexId + " is deleted.");
                } else {
                    ObjectMapper mapper = new ObjectMapper();
                    System.out.println("An error occurred: " + mapper.writeValueAsString(resp.getBody()));
                }
            } else {
                System.out.println("Invalid option. The program exits.");
            }
        } catch (Exception e) {
            System.out.println("An error occurred: " + e.getMessage());
        }
    }
}

PHP

<?php
// このサンプルコードは参照用です。本番環境では直接使用しないでください。
namespace AlibabaCloud\SDK\KnowledgeBase;

use AlibabaCloud\Dara\Models\RuntimeOptions;
use AlibabaCloud\SDK\Bailian\V20231229\Bailian;
use AlibabaCloud\SDK\Bailian\V20231229\Models\DeleteIndexRequest;
use AlibabaCloud\SDK\Bailian\V20231229\Models\ListIndexDocumentsRequest;
use \Exception;

use Darabonba\OpenApi\Models\Config;

class KnowledgeBaseManage {

    /**
    * 必要な環境変数が設定されているか確認し、設定を促します。
    *
    * @return bool 必要な環境変数がすべて設定されている場合は true を返します。それ以外の場合は false を返します。
    */
    public static function checkEnvironmentVariables() {
        $requiredVars = [
            'ALIBABA_CLOUD_ACCESS_KEY_ID' => 'Alibaba Cloud AccessKey ID',
            'ALIBABA_CLOUD_ACCESS_KEY_SECRET' => 'Alibaba Cloud AccessKey secret',
            'WORKSPACE_ID' => 'Alibaba Cloud Model Studio workspace ID'
        ];
        $missingVars = [];
        foreach ($requiredVars as $var => $description) {
            if (!getenv($var)) {
                $missingVars[] = $var;
                echo "Error: Set the $var environment variable ($description)\n";
            }
        }
        return count($missingVars) === 0;
    }

    /**
     * クライアントを初期化します。
     *
     * @return Bailian 設定済みのクライアントオブジェクト。
     */
    public static function createClient(){
        $config = new Config([
            "accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), 
            "accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
        ]);
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        $config->endpoint = 'bailian.ap-southeast-1.aliyuncs.com';
        return new Bailian($config);
    }

     /**
     * 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
     *
     * @param Bailian $client クライアントオブジェクト。
     * @param string $workspaceId ワークスペース ID。
     * @return ListIndicesResponse Model Studio サービスからの応答。
     * @throws Exception
     */
    public static function listIndices($client, $workspaceId) {
        $headers = [];
        $listIndexDocumentsRequest = new ListIndexDocumentsRequest([]);
        $runtime = new RuntimeOptions([]);
        // クライアントメソッドを呼び出します。
        return $client->listIndicesWithOptions($workspaceId, $listIndexDocumentsRequest, $headers, $runtime);
    }

    /**
     * 指定されたナレッジベースを完全に削除します。
     *
     * @param Bailian $client クライアントオブジェクト。
     * @param string $workspaceId ワークスペース ID。
     * @param string $indexId ナレッジベース ID。
     * @return mixed Model Studio サービスからの応答。
     * @throws Exception
     */
    public static function deleteIndex($client, $workspaceId, $indexId) {
        $headers = [];
        $deleteIndexRequest = new DeleteIndexRequest([
            "indexId" => $indexId
        ]);
        $runtime = new RuntimeOptions([]);
        return $client->deleteIndexWithOptions($workspaceId, $deleteIndexRequest, $headers, $runtime);
    }

    /**
     * main 関数。
     */
    public static function main($args) {
        if (!self::checkEnvironmentVariables()) {
            echo "Environment variable verification failed.\n";
            return;
        }

        try {
            echo "Select an operation to perform:\n1. List knowledge bases\n2. Delete a knowledge base\nEnter an option (1 or 2):";
            $startOption = trim(fgets(STDIN));
            $client = self::createClient();
            if ($startOption === "1") {
                // ナレッジベースを一覧表示します。
                echo "\nList knowledge bases\n";
                $workspaceId = getenv("WORKSPACE_ID");
                $response = self::listIndices($client, $workspaceId);
                // 応答を JSON 文字列に変換します。
                $result = json_encode($response->body->data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
                echo $result . "\n";
            } elseif ($startOption === "2") {
                echo "\nDelete a knowledge base\n";
                $workspaceId = getenv("WORKSPACE_ID");
                $indexId = readline("Enter the knowledge base ID:"); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
                // 削除前に確認します。
                while (true) {
                    $confirm = strtolower(trim(readline("Are you sure you want to permanently delete the knowledge base $indexId? (y/n): ")));
                    if ($confirm === 'y') {
                        break;
                    } elseif ($confirm === 'n') {
                        echo "The deletion is canceled.\n";
                        return;
                    } else {
                        echo "Invalid input. Enter y or n.\n";
                    }
                }
                $response = self::deleteIndex($client, $workspaceId, $indexId);
                if ($response->body->status == "200")
                    echo "Knowledge base " . $indexId . " is deleted.\n";
                else 
                    echo "An error occurred: " . json_encode($response->body) . "\n";
            } else {
                echo "Invalid option. The program exits.\n";
            }
        } catch (Exception $e) {
            echo "An error occurred: " . $e->getMessage() . "\n";
        }
    }
}
// これは、autoload.php が現在のコードファイルの親ディレクトリにあることを前提としています。プロジェクトの構造に基づいてパスを調整してください。
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}
KnowledgeBaseManage::main(array_slice($argv, 1));

Node.js

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
'use strict';

const bailian20231229 = require('@alicloud/bailian20231229');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');

class KbManage {

    /**
     * 必要な環境変数が設定されているか確認し、設定を促します。
     * @returns {boolean} - 必要な環境変数がすべて設定されている場合は true を返します。それ以外の場合は false を返します。
     */
    static checkEnvironmentVariables() {
        const requiredVars = {
            'ALIBABA_CLOUD_ACCESS_KEY_ID': 'Alibaba Cloud AccessKey ID',
            'ALIBABA_CLOUD_ACCESS_KEY_SECRET': 'Alibaba Cloud AccessKey secret',
            'WORKSPACE_ID': 'Alibaba Cloud Model Studio workspace ID'
        };

        const missing = [];
        for (const [varName, desc] of Object.entries(requiredVars)) {
            if (!process.env[varName]) {
                console.error(`Error: Set the ${varName} environment variable (${desc})`);
                missing.push(varName);
            }
        }

        return missing.length === 0;
    }

    /**
     * クライアントを作成して設定します。
     * @return Client
     * @throws Exception
     */
    static createClient() {
        const config = new OpenApi.Config({
            accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
            accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
        });
        // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
        config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com';
        return new bailian20231229.default(config);
    }

    /**
     * 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
     * @param {bailian20231229.Client} client クライアント。
     * @param {string} workspaceId ワークスペース ID。
     * @returns {Promise<bailian20231229.ListIndicesResponse>} Model Studio サービスからの応答。
     */
    static async listIndices(client, workspaceId) {
        const headers = {};
        const listIndicesRequest = new bailian20231229.ListIndicesRequest();
        const runtime = new Util.RuntimeOptions({});
        return await client.listIndicesWithOptions(workspaceId, listIndicesRequest, headers, runtime);
    }

    /**
     * 指定されたナレッジベースを完全に削除します。
     * @param {bailian20231229.Client} client クライアント。
     * @param {string} workspaceId ワークスペース ID。
     * @param {string} indexId ナレッジベース ID。
     * @returns {Promise<bailian20231229.DeleteIndexResponse>} Model Studio サービスからの応答。
     */
    static async deleteIndex(client, workspaceId, indexId) {
        const headers = {};
        const deleteIndexRequest = new bailian20231229.DeleteIndexRequest({
            indexId
        });
        const runtime = new Util.RuntimeOptions({});
        return await client.deleteIndexWithOptions(workspaceId, deleteIndexRequest, headers, runtime);
    }

    /**
     * Model Studio サービスを使用して操作 (ナレッジベースの一覧表示または削除) を実行します。
     */
    static async main(args) {
        if (!this.checkEnvironmentVariables()) {
            console.log("Environment variable verification failed.");
            return;
        }

        const readline = require('readline').createInterface({
            input: process.stdin,
            output: process.stdout
        });

        try {
            const startOption = await new Promise((resolve) => {
                readline.question("Select an operation to perform:\n1. List knowledge bases\n2. Delete a knowledge base\nEnter an option (1 or 2):", (ans) => {
                    resolve(ans.trim());
                });
            });

            if (startOption === '1') {
                console.log("\nList knowledge bases");
                const workspaceId = process.env.WORKSPACE_ID;
                const client = this.createClient();
                const response = await this.listIndices(client, workspaceId);
                console.log(JSON.stringify(response.body.data));
            } else if (startOption === '2') {
                console.log("\nDelete a knowledge base");
                const workspaceId = process.env.WORKSPACE_ID;
                const indexId = await new Promise((resolve) => {
                    readline.question("Enter the knowledge base ID:", (ans) => { // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
                        resolve(ans.trim());
                    });
                });
                // 削除前に確認します。
                let confirm = '';
                while (confirm !== 'y' && confirm !== 'n') {
                    confirm = (await new Promise((resolve) => {
                        readline.question(`Are you sure you want to permanently delete the knowledge base ${indexId}? (y/n): `, (ans) => {
                            resolve(ans.trim().toLowerCase());
                        });
                    })).toLowerCase();
                    if (confirm === 'n') {
                        console.log("The deletion is canceled.");
                        return;
                    } else if (confirm !== 'y') {
                        console.log("Invalid input. Enter y or n.");
                    }
                }
                const client = this.createClient();
                const resp = await this.deleteIndex(client, workspaceId, indexId);
                if (resp.body.status == '200')
                    console.log(`Knowledge base ${indexId} is deleted.`);
                else {
                    const errInfo = JSON.stringify(resp.body);
                    console.error(`An error occurred: ${errInfo}`)
                }
            } else {
                console.log("Invalid option. The program exits.");
            }
        } catch (err) {
            console.error(`An error occurred: ${err.message}`);
        } finally {
            readline.close();
        }
    }
}

exports.KbManage = KbManage;
KbManage.main(process.argv.slice(2));

C#

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;

using Newtonsoft.Json;
using Tea;
using Tea.Utils;


namespace AlibabaCloud.SDK.KnowledgeBase
{
    public class KnowledgeBaseManage
    {
        /// <summary>
        /// 必要な環境変数が設定されているか確認し、設定を促します。
        /// </summary>
        /// <returns>必要な環境変数がすべて設定されている場合は true を返します。それ以外の場合は false を返します。</returns>
        public static bool CheckEnvironmentVariables()
        {
            var requiredVars = new Dictionary<string, string>
            {
                { "ALIBABA_CLOUD_ACCESS_KEY_ID", "Alibaba Cloud AccessKey ID" },
                { "ALIBABA_CLOUD_ACCESS_KEY_SECRET", "Alibaba Cloud AccessKey secret" },
                { "WORKSPACE_ID", "Alibaba Cloud Model Studio workspace ID" }
            };

            var missingVars = new List<string>();
            foreach (var entry in requiredVars)
            {
                string value = Environment.GetEnvironmentVariable(entry.Key);
                if (string.IsNullOrEmpty(value))
                {
                    missingVars.Add(entry.Key);
                    Console.WriteLine($"Error: Set the {entry.Key} environment variable ({entry.Value})");
                }
            }

            return missingVars.Count == 0;
        }

        /// <summary>
        /// クライアントを初期化します。
        /// </summary>
        /// <returns>設定済みのクライアントオブジェクト。</returns>
        /// <exception cref="Exception">初期化中にエラーが発生した場合にスローされる例外。</exception>
        public static AlibabaCloud.SDK.Bailian20231229.Client CreateClient()
        {
            var config = new AlibabaCloud.OpenApiClient.Models.Config
            {
                AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
            };
            // 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
            config.Endpoint = "bailian.ap-southeast-1.aliyuncs.com";
            return new AlibabaCloud.SDK.Bailian20231229.Client(config);
        }

        /// <summary>
        /// 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
        /// </summary>
        /// <param name="client">クライアント。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <returns>Model Studio サービスからの応答。</returns>
        public static AlibabaCloud.SDK.Bailian20231229.Models.ListIndicesResponse ListIndices(AlibabaCloud.SDK.Bailian20231229.Client client, string workspaceId)
        {
            var headers = new Dictionary<string, string>() { };
            var listIndicesRequest = new Bailian20231229.Models.ListIndicesRequest();
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.ListIndicesWithOptions(workspaceId, listIndicesRequest, headers, runtime);
        }

        /// <summary>
        /// 指定されたナレッジベースを完全に削除します。
        /// </summary>
        /// <param name="client">クライアント。</param>
        /// <param name="workspaceId">ワークスペース ID。</param>
        /// <param name="indexId">ナレッジベース ID。</param>
        /// <returns>Model Studio サービスからの応答。</returns>
        public static AlibabaCloud.SDK.Bailian20231229.Models.DeleteIndexResponse DeleteIndex(AlibabaCloud.SDK.Bailian20231229.Client client, string workspaceId, string indexId)
        {
            var headers = new Dictionary<string, string>() { };
            var deleteIndexRequest = new Bailian20231229.Models.DeleteIndexRequest
            {
                IndexId = indexId
            };
            var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
            return client.DeleteIndexWithOptions(workspaceId, deleteIndexRequest, headers, runtime);
        }

        /// <summary>
        /// main 関数。
        /// </summary>
        public static void Main(string[] args)
        {
            if (!CheckEnvironmentVariables())
            {
                Console.WriteLine("Environment variable verification failed.");
                return;
            }
            try
            {
                Console.Write("Select an operation to perform:\n1. List knowledge bases\n2. Delete a knowledge base\nEnter an option (1 or 2):");
                string startOption = Console.ReadLine();
                if (startOption == "1")
                {
                    Console.WriteLine("\nList knowledge bases");
                    string workspaceId = Environment.GetEnvironmentVariable("WORKSPACE_ID");
                    Bailian20231229.Client client = CreateClient();
                    Bailian20231229.Models.ListIndicesResponse listIndicesResponse = ListIndices(client, workspaceId);
                    // Newtonsoft.Json をインストールして、応答オブジェクトを JSON 文字列に変換して出力します。
                    var json = JsonConvert.SerializeObject(listIndicesResponse.Body.Data, Formatting.Indented);
                    Console.WriteLine(json);
                }
                else if (startOption == "2")
                {
                    Console.WriteLine("\nDelete a knowledge base");
                    string workspaceId = Environment.GetEnvironmentVariable("WORKSPACE_ID");
                    Console.Write("Enter the knowledge base ID:"); // これは CreateIndex 操作によって返される Data.Id です。Model Studio コンソールのナレッジベースページから取得することもできます。
                    string indexId = Console.ReadLine();
                    // 削除前に確認します。
                    while (true)
                    {
                        Console.Write($"Are you sure you want to permanently delete the knowledge base {indexId}? (y/n): ");
                        string confirm = Console.ReadLine()?.ToLower();
                        if (confirm == "y")
                        {
                            break;
                        }
                        else if (confirm == "n")
                        {
                            Console.WriteLine("The deletion is canceled.");
                            return;
                        }
                        else
                        {
                            Console.WriteLine("Invalid input. Enter y or n.");
                        }
                    }
                    Bailian20231229.Client client = CreateClient();
                    Bailian20231229.Models.DeleteIndexResponse resp = DeleteIndex(client, workspaceId, indexId);
                    if (resp.Body.Status == "200")
                    {
                        Console.WriteLine($"Knowledge base {indexId} is deleted.");
                    }
                    else
                    {
                        var mapper = new JsonSerializerSettings { Formatting = Formatting.Indented };
                        string errInfo = JsonConvert.SerializeObject(resp.Body, mapper);
                        Console.WriteLine($"An error occurred: {errInfo}");
                    }
                }
                else
                {
                    Console.WriteLine("Invalid option. The program exits.");
                    return;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: " + e.Message);
            }
        }
    }
}

Go

// このサンプルコードは参照用です。本番環境では直接使用しないでください。
package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"

	bailian20231229 "github.com/alibabacloud-go/bailian-20231229/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
)

// checkEnvironmentVariables は、必要な環境変数が設定されているか確認し、設定を促します。
func checkEnvironmentVariables() bool {
	// 必要な環境変数とその説明。
	requiredVars := map[string]string{
		"ALIBABA_CLOUD_ACCESS_KEY_ID":     "Alibaba Cloud AccessKey ID",
		"ALIBABA_CLOUD_ACCESS_KEY_SECRET": "Alibaba Cloud AccessKey secret",
		"WORKSPACE_ID":                    "Alibaba Cloud Model Studio workspace ID",
	}

	var missingVars []string
	for varName, desc := range requiredVars {
		if os.Getenv(varName) == "" {
			fmt.Printf("Error: Set the %s environment variable (%s)\n", varName, desc)
			missingVars = append(missingVars, varName)
		}
	}

	return len(missingVars) == 0
}

// createClient は、クライアントを作成して設定します。
//
// Returns:
//   - *client.Bailian20231229Client: 設定済みのクライアント。
func createClient() (_result *bailian20231229.Client, _err error) {
	config := &openapi.Config{
		AccessKeyId:     tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
		AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
	}
	// 次のエンドポイントはパブリックエンドポイントです。必要に応じてエンドポイントを変更できます。
	config.Endpoint = tea.String("bailian.ap-southeast-1.aliyuncs.com")
	_result = &bailian20231229.Client{}
	_result, _err = bailian20231229.NewClient(config)
	return _result, _err
}

// listIndices は、指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
//
// Parameters:
//   - client      *bailian20231229.Client: クライアント。
//   - workspaceId string: ワークスペース ID。
//
// Returns:
//   - *bailian20231229.ListIndicesResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func listIndices(client *bailian20231229.Client, workspaceId string) (_result *bailian20231229.ListIndicesResponse, _err error) {
	headers := make(map[string]*string)
	listIndicesRequest := &bailian20231229.ListIndicesRequest{}
	runtime := &util.RuntimeOptions{}
	return client.ListIndicesWithOptions(tea.String(workspaceId), listIndicesRequest, headers, runtime)
}

// deleteIndex は、指定されたナレッジベースを完全に削除します。
//
// Parameters:
//   - client      *bailian20231229.Client: クライアント。
//   - workspaceId string: ワークスペース ID。
//   - indexId     string: ナレッジベース ID。
//
// Returns:
//   - *bailian20231229.DeleteIndexResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func deleteIndex(client *bailian20231229.Client, workspaceId, indexId string) (_result *bailian20231229.DeleteIndexResponse, _err error) {
	headers := make(map[string]*string)
	deleteIndexRequest := &bailian20231229.DeleteIndexRequest{
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.DeleteIndexWithOptions(tea.String(workspaceId), deleteIndexRequest, headers, runtime)

}

// main 関数。
func main() {
	if !checkEnvironmentVariables() {
		fmt.Println("Environment variable verification failed.")
		return
	}

	scanner := bufio.NewScanner(os.Stdin)
	fmt.Print("Select an operation to perform:\n1. List knowledge bases\n2. Delete a knowledge base\nEnter an option (1 or 2):")

	// 必ず入力を読み取ってください。
	if !scanner.Scan() {
		fmt.Println("Failed to read the input.")
		return
	}
	startOption := scanner.Text()

	client, err := createClient()
	if err != nil {
		fmt.Println("Failed to create a client:", err)
		return
	}

	if strings.TrimSpace(startOption) == "1" {
		fmt.Println("\nList knowledge bases")
		workspaceId := os.Getenv("WORKSPACE_ID")
		resp, err := listIndices(client, workspaceId)
		if err != nil {
			fmt.Println("Failed to obtain the list of knowledge bases:", err)
			return
		}
		fmt.Printf("List of knowledge bases:\n%+v\n", resp.Body.Data)
	} else if strings.TrimSpace(startOption) == "2" {
		fmt.Println("\nDelete a knowledge base")
		workspaceId := os.Getenv("WORKSPACE_ID")
		fmt.Print("Enter the knowledge base ID:")
		if !scanner.Scan() {
			fmt.Println("Failed to read the knowledge base ID.")
			return
		}
		indexId := scanner.Text()
		for {
			fmt.Printf("Are you sure you want to permanently delete the knowledge base %s? (y/n): ", indexId)
			if !scanner.Scan() {
				fmt.Println("Failed to read the confirmation.")
				return
			}
			confirm := strings.ToLower(strings.TrimSpace(scanner.Text()))

			if confirm == "y" {
				break
			} else if confirm == "n" {
				fmt.Println("The deletion is canceled.")
				return
			} else {
				fmt.Println("Invalid input. Enter y or n.")
			}
		}
		resp, err := deleteIndex(client, workspaceId, indexId)
		if err != nil {
			fmt.Println("Failed to delete the knowledge base:", err)
		} else {
			if tea.StringValue(resp.Body.Status) == "200" {
				fmt.Printf("Knowledge base %s is deleted.\n", indexId)
			} else {
				fmt.Println(resp.Body)
			}
		}
	} else {
		fmt.Println("Invalid option. The program exits.")
	}
}

ナレッジベースの作成

次の例では、指定されたワークスペースにドキュメント検索ナレッジベースを作成する方法を示します。

API を使用してデータクエリまたは画像 Q&A ペアナレッジベースを作成することはできません。Model Studio コンソールを使用して作成する必要があります。

1. クライアントの初期化

ファイルをアップロードしてナレッジベースを作成する前に、クライアントを初期化する必要があります。設定済みの AccessKey と AccessKey シークレットを使用して ID 検証を完了し、endpoint を設定します。

  • パブリックエンドポイント:

    クライアントがインターネットにアクセスできることを確認してください。
    • パブリッククラウド: bailian.ap-southeast-1.aliyuncs.com

  • VPC エンドポイント:

    クライアントがシンガポール ap-southeast-1VPC
    • パブリッククラウド: bailian-vpc.ap-southeast-1.aliyuncs.com

クライアントが作成されると、後続の API 呼び出し用の Client オブジェクトが取得されます。

Python

def create_client() -> bailian20231229Client:
    """
    クライアントを作成して設定します。

    Returns:
        bailian20231229Client: 設定済みのクライアント。
    """
    config = open_api_models.Config(
        access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    )
    # 次のエンドポイントは、パブリッククラウドのパブリックエンドポイントです。必要に応じて置き換えてください。
    config.endpoint = 'bailian.ap-southeast-1.aliyuncs.com'
    return bailian20231229Client(config)

Java

/**
* クライアントを初期化します。
*
* @return 設定済みのクライアントオブジェクト。
*/
public static com.aliyun.bailian20231229.Client createClient() throws Exception {
    com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
            .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
            .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
    // 次のエンドポイントは、パブリッククラウドの VPC エンドポイントです。必要に応じて置き換えてください。
    config.endpoint = "bailian-vpc.ap-southeast-1.aliyuncs.com";
    return new com.aliyun.bailian20231229.Client(config);
}

PHP

/**
 * クライアントを初期化します。
 *
 * @return Bailian 設定済みのクライアントオブジェクト。
 */
public static function createClient(){
    $config = new Config([
        "accessKeyId" => getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), 
        "accessKeySecret" => getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    ]);
    // 次のエンドポイントは、パブリッククラウドの VPC エンドポイントです。必要に応じて置き換えてください。
    $config->endpoint = 'bailian-vpc.ap-southeast-1.aliyuncs.com';
    return new Bailian($config);
}

Node.js

/**
 * クライアントを作成して設定します。
 * @return Client
 * @throws Exception
 */
static createClient() {
  const config = new OpenApi.Config({
    accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
    accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET
  });
  // 次のエンドポイントは、パブリッククラウドの VPC エンドポイントです。必要に応じて置き換えてください。
  config.endpoint = `bailian-vpc.ap-southeast-1.aliyuncs.com`;
  return new bailian20231229.default(config);
}

C#

/// <summary>
/// クライアントを初期化します。
/// </summary>
/// <returns>設定済みのクライアントオブジェクト。</returns>
/// <exception cref="Exception">初期化中にエラーが発生した場合、例外がスローされます。</exception>
public static AlibabaCloud.SDK.Bailian20231229.Client CreateClient()
{
    var config = new AlibabaCloud.OpenApiClient.Models.Config
    {
        AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
        AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
    };
    // 次のエンドポイントは、パブリッククラウドの VPC エンドポイントです。必要に応じて置き換えてください。
    config.Endpoint = "bailian-vpc.ap-southeast-1.aliyuncs.com";
    return new AlibabaCloud.SDK.Bailian20231229.Client(config);
}

Go

// CreateClient はクライアントを作成して設定します。
//
// Returns:
//   - *client.Bailian20231229Client: 設定済みのクライアント。
//   - error: エラーメッセージ。
func CreateClient() (_result *bailian20231229.Client, _err error) {
	config := &openapi.Config{
		AccessKeyId:     tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
		AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
	}
	// 次のエンドポイントは、パブリッククラウドの VPC エンドポイントです。必要に応じて置き換えてください。
	config.Endpoint = tea.String("bailian-vpc.ap-southeast-1.aliyuncs.com")
	_result = &bailian20231229.Client{}
	_result, _err = bailian20231229.NewClient(config)
	return _result, _err
}

2. ナレッジベース用のファイルのアップロード

2.1. ファイルアップロードリースのリクエスト

ナレッジベースを作成する前に、ナレッジのソースとして機能するファイルを同じワークスペースにアップロードする必要があります。ファイルをアップロードする前に、ApplyFileUploadLease 操作を呼び出してファイルアップロードリースをリクエストします。リースは、限られた時間内にファイルをアップロードできる一時的な権限付与です。リースは数分間有効です。

  • workspace_id: 詳細については、「ワークスペース ID の取得方法」をご参照ください。

  • category_id: この例では、default と入力します。Alibaba Cloud Model Studio は、カテゴリを使用してアップロードされたファイルを管理します。システムは自動的にデフォルトのカテゴリを作成します。また、AddCategory 操作を呼び出して新しいカテゴリを作成し、対応する category_id を取得することもできます。

  • file_name: アップロードするファイルの名前を拡張子を含めて入力します。値は実際のファイル名と同じでなければなりません。

  • file_md5: アップロードするファイルの MD5 ハッシュを入力します。Alibaba Cloud は現在この値を検証しません。これにより、URL からファイルをアップロードできます。

    たとえば、Python では、hashlib モジュールを使用して MD5 ハッシュを取得できます。他の言語については、「完全なサンプルコード」をご参照ください。

    コード例

    import hashlib
    
    
    def calculate_md5(file_path):
        """
        ファイルの MD5 ハッシュを計算します。
    
        Args:
            file_path (str): ファイルのローカルパス。
    
        Returns:
            str: ファイルの MD5 ハッシュ。
        """
        md5_hash = hashlib.md5()
    
        # ファイルをバイナリモードで読み取ります。
        with open(file_path, "rb") as f:
            # 大きなファイルのメモリ使用量を抑えるために、ファイルをチャンクで読み取ります。
            for chunk in iter(lambda: f.read(4096), b""):
                md5_hash.update(chunk)
    
        return md5_hash.hexdigest()
    
    
    # 使用例
    file_path = "これをアップロードするファイルの実際のローカルパス (例: /xxx/xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます"
    md5_value = calculate_md5(file_path)
    print(f"ファイルの MD5 ハッシュは: {md5_value}")
    

    コード内の file_path 変数をファイルの実際のローカルパスに置き換えてコードを実行します。これにより、オブジェクトファイルの MD5 ハッシュを取得できます。次の値は一例です。

    ファイルの MD5 ハッシュは: 2ef7361ea907f3a1b91e3b9936f5643a
  • file_size: アップロードするファイルのサイズをバイト単位で入力します。

    たとえば、Python では、os モジュールを使用してこの値を取得できます。他の言語については、「完全なサンプルコード」をご参照ください。

    コード例

    import os
    
    
    def get_file_size(file_path: str) -> int:
        """
        ファイルのサイズをバイト単位で取得します。
    
        Args:
            file_path (str): ファイルの実際のローカルパス。
    
        Returns:
            int: ファイルサイズ (バイト単位)。
        """
        return os.path.getsize(file_path)
    
    
    # 使用例
    file_path = "これをアップロードするファイルの実際のローカルパス (例: /xxx/xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます"
    file_size = get_file_size(file_path)
    print(f"ファイルのサイズ (バイト単位) は: {file_size}")
    

    コード内の file_path 変数をファイルの実際のローカルパスに置き換えてコードを実行します。これにより、オブジェクトファイルのサイズをバイト単位で取得できます。次の値は一例です。

    ファイルのサイズ (バイト単位) は: 14015

一時的なアップロードリースを正常にリクエストすると、以下を取得します:

  • 一時的なアップロードパラメーターのセット:

    • Data.FileUploadLeaseId

    • Data.Param.Method

    • Data.Param.Headers 内の X-bailian-extra

    • Data.Param.Headers 内の Content-Type

  • 一時的なアップロード URL: Data.Param.Url

これらは次のステップで使用します。

重要
  • RAM ユーザーは、この操作を呼び出す前に、必要な API 権限 (AliyunBailianDataFullAccess ポリシー) を付与されている必要があります。

  • この操作は、オンラインデバッグ と、複数の言語の サンプルコード の生成をサポートしています。

Python

def apply_lease(client, category_id, file_name, file_md5, file_size, workspace_id):
    """
    Alibaba Cloud Model Studio にファイルアップロードリースをリクエストします。

    Args:
        client (bailian20231229Client): クライアント。
        category_id (str): カテゴリ ID。
        file_name (str): ファイル名。
        file_md5 (str): ファイルの MD5 ハッシュ。
        file_size (int): ファイルサイズ (バイト単位)。
        workspace_id (str): ワークスペース ID。

    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    headers = {}
    request = bailian_20231229_models.ApplyFileUploadLeaseRequest(
        file_name=file_name,
        md_5=file_md5,
        size_in_bytes=file_size,
    )
    runtime = util_models.RuntimeOptions()
    return client.apply_file_upload_lease_with_options(category_id, workspace_id, request, headers, runtime)

Java

/**
 * ファイルアップロードリースをリクエストします。
 *
 * @param client      クライアントオブジェクト。
 * @param categoryId  カテゴリ ID。
 * @param fileName    ファイル名。
 * @param fileMd5     ファイルの MD5 ハッシュ。
 * @param fileSize    ファイルサイズ (バイト単位)。
 * @param workspaceId ワークスペース ID。
 * @return Alibaba Cloud Model Studio からの応答オブジェクト。
 */
public ApplyFileUploadLeaseResponse applyLease(com.aliyun.bailian20231229.Client client, String categoryId, String fileName, String fileMd5, String fileSize, String workspaceId) throws Exception {
    Map<String, String> headers = new HashMap<>();
    com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest applyFileUploadLeaseRequest = new com.aliyun.bailian20231229.models.ApplyFileUploadLeaseRequest();
    applyFileUploadLeaseRequest.setFileName(fileName);
    applyFileUploadLeaseRequest.setMd5(fileMd5);
    applyFileUploadLeaseRequest.setSizeInBytes(fileSize);
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    ApplyFileUploadLeaseResponse applyFileUploadLeaseResponse = null;
    applyFileUploadLeaseResponse = client.applyFileUploadLeaseWithOptions(categoryId, workspaceId, applyFileUploadLeaseRequest, headers, runtime);
    return applyFileUploadLeaseResponse;
}

PHP

/**
 * ファイルアップロードリースをリクエストします。
 *
 * @param Bailian $client クライアント。
 * @param string $categoryId カテゴリ ID。
 * @param string $fileName ファイル名。
 * @param string $fileMd5 ファイルの MD5 ハッシュ。
 * @param int $fileSize ファイルサイズ (バイト単位)。
 * @param string $workspaceId ワークスペース ID。
 * @return ApplyFileUploadLeaseResponse Alibaba Cloud Model Studio からの応答。
 */
public function applyLease($client, $categoryId, $fileName, $fileMd5, $fileSize, $workspaceId) {
    $headers = [];
    $applyFileUploadLeaseRequest = new ApplyFileUploadLeaseRequest([
        "fileName" => $fileName,
        "md5" => $fileMd5,
        "sizeInBytes" => $fileSize
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->applyFileUploadLeaseWithOptions($categoryId, $workspaceId, $applyFileUploadLeaseRequest, $headers, $runtime);
}

Node.js

/**
 * ファイルアップロードリースをリクエストします。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} categoryId - カテゴリ ID。
 * @param {string} fileName - ファイル名。
 * @param {string} fileMd5 - ファイルの MD5 ハッシュ。
 * @param {string} fileSize - ファイルサイズ (バイト単位)。
 * @param {string} workspaceId - ワークスペース ID。
 * @returns {Promise<bailian20231229.ApplyFileUploadLeaseResponse>} - Alibaba Cloud Model Studio からの応答。
 */
async function applyLease(client, categoryId, fileName, fileMd5, fileSize, workspaceId) {
  const headers = {};
  const req = new bailian20231229.ApplyFileUploadLeaseRequest({
    md5: fileMd5,
    fileName,
    sizeInBytes: fileSize
 });
 const runtime = new Util.RuntimeOptions({});
 return await client.applyFileUploadLeaseWithOptions(
    categoryId,
    workspaceId,
    req,
    headers,
    runtime
  );
}

C#

/// <summary>
/// ファイルアップロードリースをリクエストします。
/// </summary>
/// <param name="client">クライアントオブジェクト。</param>
/// <param name="categoryId">カテゴリ ID。</param>
/// <param name="fileName">ファイル名。</param>
/// <param name="fileMd5">ファイルの MD5 ハッシュ。</param>
/// <param name="fileSize">ファイルサイズ (バイト単位)。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <returns>Alibaba Cloud Model Studio からの応答オブジェクト。</returns>
/// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.ApplyFileUploadLeaseResponse ApplyLease(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string categoryId,
    string fileName,
    string fileMd5,
    string fileSize,
    string workspaceId)
{
    var headers = new Dictionary<string, string>() { };
    var applyFileUploadLeaseRequest = new AlibabaCloud.SDK.Bailian20231229.Models.ApplyFileUploadLeaseRequest
    {
        FileName = fileName,
        Md5 = fileMd5,
        SizeInBytes = fileSize
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.ApplyFileUploadLeaseWithOptions(categoryId, workspaceId, applyFileUploadLeaseRequest, headers, runtime);
}

Go

// ApplyLease は Alibaba Cloud Model Studio にファイルアップロードリースをリクエストします。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - categoryId (string): カテゴリ ID。
//   - fileName (string): ファイル名。
//   - fileMD5 (string): ファイルの MD5 ハッシュ。
//   - fileSize (string): ファイルサイズ (バイト単位)。
//   - workspaceId (string): ワークスペース ID。
//
// Returns:
//   - *bailian20231229.ApplyFileUploadLeaseResponse: Alibaba Cloud Model Studio からの応答。
//   - error: エラーメッセージ。
func ApplyLease(client *bailian20231229.Client, categoryId, fileName, fileMD5 string, fileSize string, workspaceId string) (_result *bailian20231229.ApplyFileUploadLeaseResponse, _err error) {
	headers := make(map[string]*string)
	applyFileUploadLeaseRequest := &bailian20231229.ApplyFileUploadLeaseRequest{
		FileName:    tea.String(fileName),
		Md5:         tea.String(fileMD5),
		SizeInBytes: tea.String(fileSize),
	}
	runtime := &util.RuntimeOptions{}
	return client.ApplyFileUploadLeaseWithOptions(tea.String(categoryId), tea.String(workspaceId), applyFileUploadLeaseRequest, headers, runtime)
}

リクエストの例

{
  "CategoryId": "default",
  "FileName": "Bailian_Phones_Specifications.docx",
  "Md5": "2ef7361ea907f3a1b91e3b9936f5643a",
  "SizeInBytes": "14015",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "RequestId": "778C0B3B-59C2-5FC1-A947-36EDD1XXXXXX",
  "Success": true,
  "Message": "",
  "Code": "success",
  "Status": "200",
  "Data": {
    "FileUploadLeaseId": "1e6a159107384782be5e45ac4759b247.1719325231035",
    "Type": "HTTP",
    "Param": {
      "Method": "PUT",
      "Url": "https://bailian-datahub-data-origin-prod.oss-cn-hangzhou.aliyuncs.com/1005426495169178/10024405/68abd1dea7b6404d8f7d7b9f7fbd332d.1716698936847.pdf?Expires=1716699536&OSSAccessKeyId=TestID&Signature=HfwPUZo4pR6DatSDym0zFKVh9Wg%3D",
      "Headers": "        \"X-bailian-extra\": \"MTAwNTQyNjQ5NTE2OTE3OA==\",\n        \"Content-Type\": \"application/pdf\""
    }
  }
}

2.2. ファイルを一時ストレージにアップロードする

アップロードリースを取得した後、リースからの一時的なアップロードパラメーターと URL を使用して、ファイルを Model Studio サーバーにアップロードします。ファイルはローカルストレージまたはパブリック URL からアップロードできます。各ワークスペースは最大 10,000 個のファイルをサポートします。サポートされているファイル形式は、PDF、DOCX、DOC、TXT、Markdown、PPTX、PPT、XLSX、XLS、HTML、PNG、JPG、JPEG、BMP、および GIF です。

  • pre_signed_url: ファイルアップロードリースのリクエストによって返された Data.Param.Url を入力します。

    これは署名付き URL です。FormData アップロードはサポートしていません。ファイルをバイナリ形式でアップロードする必要があります。詳細については、サンプルコードをご参照ください。
重要

この操作は、オンラインデバッグやサンプルコードの生成をサポートしていません。

ローカルストレージからのアップロード

Python

import requests
from urllib.parse import urlparse

def upload_file(pre_signed_url, file_path):
    """
    ローカルファイルを一時ストレージにアップロードします。

    Args:
        pre_signed_url (str): アップロードリースからの URL。
        file_path (str): ファイルのローカルパス。
    
    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    try:
        # リクエストヘッダーを設定します。
        headers = {
            "X-bailian-extra": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
            "Content-Type": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。"
        }

        # ファイルを読み取ってアップロードします。
        with open(file_path, 'rb') as file:
            # ファイルアップロードのリクエストメソッドは、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Method フィールドの値と同じでなければなりません。
            response = requests.put(pre_signed_url, data=file, headers=headers)

        # 応答のステータスコードを確認します。
        if response.status_code == 200:
            print("ファイルは正常にアップロードされました。")
        else:
            print(f"ファイルのアップロードに失敗しました。ResponseCode: {response.status_code}")

    except Exception as e:
        print(f"エラーが発生しました: {str(e)}")

if __name__ == "__main__":

    pre_signed_url_or_http_url = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。"

    # ローカルファイルを一時ストレージにアップロードします。
    file_path = "これを、アップロードするファイルの実際のローカルパス (例: Linux の場合 /xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます。"
    upload_file(pre_signed_url_or_http_url, file_path)

Java

import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class UploadFile {
    public static void uploadFile(String preSignedUrl, String filePath) {
        HttpURLConnection connection = null;
        try {
            // URL オブジェクトを作成します。
            URL url = new URL(preSignedUrl);
            connection = (HttpURLConnection) url.openConnection();
            // ファイルアップロードのリクエストメソッドは、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Method フィールドの値と同じでなければなりません。
            connection.setRequestMethod("PUT");
            // この接続はファイルのアップロードに使用されるため、接続への出力を許可します。
            connection.setDoOutput(true);
            connection.setRequestProperty("X-bailian-extra", "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。");
            connection.setRequestProperty("Content-Type", "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。");
            // ファイルを読み取り、接続を介してアップロードします。
            try (DataOutputStream outStream = new DataOutputStream(connection.getOutputStream());
                 FileInputStream fileInputStream = new FileInputStream(filePath)) {
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                    outStream.write(buffer, 0, bytesRead);
                }
                outStream.flush();
            }
            // 応答を確認します。
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // ファイルは正常にアップロードされました。
                System.out.println("ファイルは正常にアップロードされました。");
            } else {
                // ファイルのアップロードに失敗しました。
                System.out.println("ファイルのアップロードに失敗しました。ResponseCode: " + responseCode);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }

    public static void main(String[] args) {
        String preSignedUrlOrHttpUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";
        // ローカルファイルを一時ストレージにアップロードします。
        String filePath = "これを、アップロードするファイルの実際のローカルパス (例: Linux の場合 /xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます。";
        uploadFile(preSignedUrlOrHttpUrl, filePath);
    }
}

PHP

<?php

/**
 * ローカルファイルを一時ストレージにアップロードします。
 *
 * @param string $preSignedUrl ApplyFileUploadLease 操作から取得した署名付き URL または HTTP アドレス。
 * @param array $headers "X-bailian-extra" と "Content-Type" を含むリクエストヘッダーの配列。
 * @param string $filePath ローカルファイルパス。
 * @throws Exception アップロードが失敗した場合。
 */
function uploadFile($preSignedUrl, $headers, $filePath) {
    // ファイルの内容を読み取ります。
    $fileContent = file_get_contents($filePath);
    if ($fileContent === false) {
        throw new Exception("ファイルを読み取れません: " . $filePath);
    }

    // cURL セッションを初期化します。
    $ch = curl_init();

    // cURL オプションを設定します。
    curl_setopt($ch, CURLOPT_URL, $preSignedUrl);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // PUT メソッドを使用します。
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContent); // リクエストボディをファイルの内容に設定します。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 応答を直接出力するのではなく、返します。

    // リクエストヘッダーを構築します。
    $uploadHeaders = [
        "X-bailian-extra: " . $headers["X-bailian-extra"],
        "Content-Type: " . $headers["Content-Type"]
    ];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $uploadHeaders);

    // リクエストを実行します。
    $response = curl_exec($ch);

    // HTTP ステータスコードを取得します。
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    // cURL セッションを閉じます。
    curl_close($ch);

    // ステータスコードを確認します。
    if ($httpCode != 200) {
        throw new Exception("アップロードに失敗しました。HTTP ステータスコード: " . $httpCode . ". エラーメッセージ: " . $response);
    }

    // アップロードは成功しました。
    echo "ファイルは正常にアップロードされました。\n";
}

/**
 * メイン関数: ローカルファイルをアップロードします。
 */
function main() {
    // これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。
    $preSignedUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";

    // これらを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers の X-bailian-extra と Content-Type の値に置き換えます。
    $headers = [
        "X-bailian-extra" => "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
        "Content-Type" => "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。"
    ];

    // ローカルファイルを一時ストレージにアップロードします。
    $filePath = "これを、アップロードするファイルの実際のローカルパス (例: Linux の場合 /xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます。";

    try {
        uploadFile($preSignedUrl, $headers, $filePath);
    } catch (Exception $e) {
        echo "エラー: " . $e->getMessage() . "\n";
    }
}

// メイン関数を呼び出します。
main();

?>

Node.js

const fs = require('fs');
const axios = require('axios');

/**
 * ローカルファイルを一時ストレージにアップロードします。
 *
 * @param {string} preSignedUrl - アップロードリースからの URL。
 * @param {Object} headers - アップロードリクエストのヘッダー。
 * @param {string} filePath - ファイルのローカルパス。
 * @throws {Error} アップロードが失敗した場合。
 */
async function uploadFile(preSignedUrl, headers, filePath) {
    // アップロードに必要なリクエストヘッダーを構築します。
    const uploadHeaders = {
        "X-bailian-extra": headers["X-bailian-extra"],
        "Content-Type": headers["Content-Type"]
    };

    // ファイル読み取りストリームを作成します。
    const fileStream = fs.createReadStream(filePath);

    try {
        // axios を使用して PUT リクエストを送信します。
        const response = await axios.put(preSignedUrl, fileStream, {
            headers: uploadHeaders
        });

        // 応答のステータスコードを確認します。
        if (response.status === 200) {
            console.log("ファイルは正常にアップロードされました。");
        } else {
            console.error(`ファイルのアップロードに失敗しました。ResponseCode: ${response.status}`);
            throw new Error(`アップロードはステータスコード: ${response.status} で失敗しました`);
        }
    } catch (error) {
        // エラーを処理します。
        console.error("アップロード中のエラー:", error.message);
        throw new Error(`アップロードに失敗しました: ${error.message}`);
    }
}

/**
 * メイン関数: ローカルファイルをアップロードします。
 */
function main() {
    const preSignedUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";

    const headers = {
        "X-bailian-extra": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
        "Content-Type": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。"
    };

    // ローカルファイルを一時ストレージにアップロードします。
    const filePath = "これを、アップロードするファイルの実際のローカルパス (例: Linux の場合 /xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます。";

    uploadFile(preSignedUrl, headers, filePath)
        .then(() => {
            console.log("アップロードが完了しました。");
        })
        .catch((err) => {
            console.error("アップロードに失敗しました:", err.message);
        });
}

// メイン関数を呼び出します。
main();

C#

using System;
using System.IO;
using System.Net;

public class UploadFilExample
{
    public static void UploadFile(string preSignedUrl, string filePath)
    {
        HttpWebRequest connection = null;
        try
        {
            // URL オブジェクトを作成します。
            Uri url = new Uri(preSignedUrl);
            connection = (HttpWebRequest)WebRequest.Create(url);
            // ファイルアップロードのリクエストメソッドは、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Method フィールドの値と同じでなければなりません。
            connection.Method = "PUT";
            // この接続はファイルのアップロードに使用されるため、接続への出力を許可します。
            connection.AllowWriteStreamBuffering = false;
            connection.SendChunked = false;
            // リクエストヘッダーを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers フィールドの値と同じに設定します。
            connection.Headers["X-bailian-extra"] = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。";
            connection.ContentType = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。";
            // ファイルを読み取り、接続を介してアップロードします。
            using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            using (var requestStream = connection.GetRequestStream())
            {
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    requestStream.Write(buffer, 0, bytesRead);
                }
                requestStream.Flush();
            }
            // 応答を確認します。
            using (HttpWebResponse response = (HttpWebResponse)connection.GetResponse())
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    // ファイルは正常にアップロードされました。
                    Console.WriteLine("ファイルは正常にアップロードされました。");
                }
                else
                {
                    // ファイルのアップロードに失敗しました。
                    Console.WriteLine($"ファイルのアップロードに失敗しました。ResponseCode: {response.StatusCode}");
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            e.StackTrace.ToString();
        }
        finally
        {
            if (connection != null)
            {
                connection.Abort();
            }
        }
    }

    public static void Main(string[] args)
    {
        string preSignedUrlOrHttpUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";
        // ローカルファイルを一時ストレージにアップロードします。
        string filePath = "これを、アップロードするファイルの実際のローカルパス (例: Linux の場合 /xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます。";
        UploadFile(preSignedUrlOrHttpUrl, filePath);
    }
}

Go

package main

import (
    "fmt"
    "io"
    "os"

    "github.com/go-resty/resty/v2"
)

// UploadFile はローカルファイルを一時ストレージにアップロードします。
//
// Args:
//   - preSignedUrl (string): アップロードリースからの URL。
//   - headers (map[string]string): アップロードリクエストのヘッダー。
//   - filePath (string): ファイルのローカルパス。
//
// Returns:
//   - error: アップロードが失敗した場合はエラーメッセージ、それ以外は nil。
func UploadFile(preSignedUrl string, headers map[string]string, filePath string) error {
    // ローカルファイルを開きます。
    file, err := os.Open(filePath)
    if err != nil {
        return fmt.Errorf("ファイルのオープンに失敗しました: %w", err)
    }
    defer file.Close()

    // 内容を読み取ります。
    body, err := io.ReadAll(file)
    if err != nil {
        return fmt.Errorf("ファイルの読み取りに失敗しました: %w", err)
    }

    // REST クライアントを作成します。
    client := resty.New()

    // アップロードに必要なリクエストヘッダーを構築します。
    uploadHeaders := map[string]string{
        "X-bailian-extra": headers["X-bailian-extra"],
        "Content-Type":    headers["Content-Type"],
    }

    // PUT リクエストを送信します。
    resp, err := client.R().
        SetHeaders(uploadHeaders).
        SetBody(body).
        Put(preSignedUrl)

    if err != nil {
        return fmt.Errorf("リクエストの送信に失敗しました: %w", err)
    }

    // HTTP 応答ステータスコードを確認します。
    if resp.IsError() {
        return fmt.Errorf("HTTP エラー: %d", resp.StatusCode())
    }

    fmt.Println("ファイルは正常にアップロードされました。")
    return nil
}

// main 関数
func main() {
    // これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。
    preSignedUrl := "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。"

    // これらを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers の X-bailian-extra と Content-Type の値に置き換えます。
    headers := map[string]string{
        "X-bailian-extra": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
        "Content-Type":    "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。",
    }

    // ローカルファイルを一時ストレージにアップロードします。
    filePath := "これを、アップロードするファイルの実際のローカルパス (例: Linux の場合 /xxx/xxx/Bailian_Phones_Specifications.docx) に置き換えます。"

    // アップロード関数を呼び出します。
    err := UploadFile(preSignedUrl, headers, filePath)
    if err != nil {
        fmt.Printf("アップロードに失敗しました: %v\n", err)
    }
}

URL からのアップロード

URL が公開アクセス可能で、有効なファイルを指していることを確認してください。

Python

import requests
from urllib.parse import urlparse

def upload_file_link(pre_signed_url, source_url_string):
    """
    パブリック URL から一時ストレージにファイルをアップロードします。

    Args:
        pre_signed_url (str): アップロードリースからの URL。
        source_url_string (str): ファイルの URL。
    
    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    try:
        # リクエストヘッダーを設定します。
        headers = {
            "X-bailian-extra": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
            "Content-Type": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。"
        }

        # ファイル URL にアクセスするためにリクエストメソッドを GET に設定します。
        source_response = requests.get(source_url_string)
        if source_response.status_code != 200:
            raise RuntimeError("ソースファイルの取得に失敗しました。")

        # ファイルアップロードのリクエストメソッドは、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Method フィールドの値と同じでなければなりません。
        response = requests.put(pre_signed_url, data=source_response.content, headers=headers)

        # 応答のステータスコードを確認します。
        if response.status_code == 200:
            print("ファイルは正常にアップロードされました。")
        else:
            print(f"ファイルのアップロードに失敗しました。ResponseCode: {response.status_code}")

    except Exception as e:
        print(f"エラーが発生しました: {str(e)}")

if __name__ == "__main__":

    pre_signed_url_or_http_url = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。"

    # ファイルの URL。
    source_url = "これを、アップロードするファイルの URL に置き換えます。"
    upload_file_link(pre_signed_url_or_http_url, source_url)

Java

import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class UploadFile {
    public static void uploadFileLink(String preSignedUrl, String sourceUrlString) {
        HttpURLConnection connection = null;
        try {
            // URL オブジェクトを作成します。
            URL url = new URL(preSignedUrl);
            connection = (HttpURLConnection) url.openConnection();
            // ファイルアップロードのリクエストメソッドは、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Method フィールドの値と同じでなければなりません。
            connection.setRequestMethod("PUT");
            // この接続はファイルのアップロードに使用されるため、接続への出力を許可します。
            connection.setDoOutput(true);
            connection.setRequestProperty("X-bailian-extra", "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。");
            connection.setRequestProperty("Content-Type", "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。");
            URL sourceUrl = new URL(sourceUrlString);
            HttpURLConnection sourceConnection = (HttpURLConnection) sourceUrl.openConnection();
            // ファイル URL にアクセスするためにリクエストメソッドを GET に設定します。
            sourceConnection.setRequestMethod("GET");
            // 応答コードを取得します。200 はリクエストが成功したことを示します。
            int sourceFileResponseCode = sourceConnection.getResponseCode();
            // URL からファイルを読み取り、接続を介してアップロードします。
            if (sourceFileResponseCode != HttpURLConnection.HTTP_OK) {
                throw new RuntimeException("ソースファイルの取得に失敗しました。");
            }
            try (DataOutputStream outStream = new DataOutputStream(connection.getOutputStream());
                 InputStream in = new BufferedInputStream(sourceConnection.getInputStream())) {
                byte[] buffer = new byte[4096];
                int bytesRead;
                while ((bytesRead = in.read(buffer)) != -1) {
                    outStream.write(buffer, 0, bytesRead);
                }
                outStream.flush();
            }
            // 応答を確認します。
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // ファイルは正常にアップロードされました。
                System.out.println("ファイルは正常にアップロードされました。");
            } else {
                // ファイルのアップロードに失敗しました。
                System.out.println("ファイルのアップロードに失敗しました。ResponseCode: " + responseCode);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
    }

    public static void main(String[] args) {
        String preSignedUrlOrHttpUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";
        
        String sourceUrl = "これを、アップロードするファイルの URL に置き換えます。";
        uploadFileLink(preSignedUrlOrHttpUrl, sourceUrl);
    }
}

PHP

<?php

/**
 * パブリック URL から一時ストレージにファイルをアップロードします。
 *
 * @param string $preSignedUrl ApplyFileUploadLease 操作から取得した署名付き URL または HTTP アドレス。
 * @param array $headers "X-bailian-extra" と "Content-Type" を含むリクエストヘッダーの配列。
 * @param string $sourceUrl ファイルの URL。
 * @throws Exception アップロードが失敗した場合。
 */
function uploadFile($preSignedUrl, $headers, $sourceUrl) {

    $fileContent = file_get_contents($sourceUrl);
    if ($fileContent === false) {
        throw new Exception("指定された URL からファイルをダウンロードできません: " . $sourceUrl);
    }
    // cURL セッションを初期化します。
    $ch = curl_init();

    // cURL オプションを設定します。
    curl_setopt($ch, CURLOPT_URL, $preSignedUrl);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); // PUT メソッドを使用します。
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fileContent); // リクエストボディをファイルの内容に設定します。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 応答を直接出力するのではなく、返します。

    // リクエストヘッダーを構築します。
    $uploadHeaders = [
        "X-bailian-extra: " . $headers["X-bailian-extra"],
        "Content-Type: " . $headers["Content-Type"]
    ];
    curl_setopt($ch, CURLOPT_HTTPHEADER, $uploadHeaders);

    // リクエストを実行します。
    $response = curl_exec($ch);

    // HTTP ステータスコードを取得します。
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    // cURL セッションを閉じます。
    curl_close($ch);

    // ステータスコードを確認します。
    if ($httpCode != 200) {
        throw new Exception("アップロードに失敗しました。HTTP ステータスコード: " . $httpCode . ". エラーメッセージ: " . $response);
    }

    // アップロードは成功しました。
    echo "ファイルは正常にアップロードされました。\n";
}

/**
 * メイン関数: パブリック URL から一時ストレージにファイルをアップロードします。
 */
function main() {
    // これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。
    $preSignedUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";

    // これらを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers の X-bailian-extra と Content-Type の値に置き換えます。
    $headers = [
        "X-bailian-extra" => "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
        "Content-Type" => "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。"
    ];

    $sourceUrl = "これを、アップロードするファイルの URL に置き換えます。";

    try {
        uploadFile($preSignedUrl, $headers, $sourceUrl);
    } catch (Exception $e) {
        echo "エラー: " . $e->getMessage() . "\n";
    }
}

// メイン関数を呼び出します。
main();

?>

Node.js

const axios = require('axios');

/**
 * パブリック URL から一時ストレージにファイルをアップロードします。
 *
 * @param {string} preSignedUrl - アップロードリースからの URL。
 * @param {Object} headers - アップロードリクエストのヘッダー。
 * @param {string} sourceUrl - ファイルの URL。
 * @throws {Error} アップロードが失敗した場合。
 */
async function uploadFileFromUrl(preSignedUrl, headers, sourceUrl) {
    // アップロードに必要なリクエストヘッダーを構築します。
    const uploadHeaders = {
        "X-bailian-extra": headers["X-bailian-extra"],
        "Content-Type": headers["Content-Type"]
    };

    try {
        // 指定された URL からファイルをダウンロードします。
        const response = await axios.get(sourceUrl, {
            responseType: 'stream'
        });

        // axios を使用して PUT リクエストを送信します。
        const uploadResponse = await axios.put(preSignedUrl, response.data, {
            headers: uploadHeaders
        });

        // 応答のステータスコードを確認します。
        if (uploadResponse.status === 200) {
            console.log("URL からファイルが正常にアップロードされました。");
        } else {
            console.error(`ファイルのアップロードに失敗しました。ResponseCode: ${uploadResponse.status}`);
            throw new Error(`アップロードはステータスコード: ${uploadResponse.status} で失敗しました`);
        }
    } catch (error) {
        // エラーを処理します。
        console.error("アップロード中のエラー:", error.message);
        throw new Error(`アップロードに失敗しました: ${error.message}`);
    }
}

/**
 * メイン関数: 公開ダウンロード可能なファイルを一時ストレージにアップロードします。
 */
function main() {
    const preSignedUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";

    const headers = {
        "X-bailian-extra": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
        "Content-Type": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。"
    };

    const sourceUrl = "これを、アップロードするファイルの URL に置き換えます。";

    uploadFileFromUrl(preSignedUrl, headers, sourceUrl)
        .then(() => {
            console.log("アップロードが完了しました。");
        })
        .catch((err) => {
            console.error("アップロードに失敗しました:", err.message);
        });
}

// メイン関数を呼び出します。
main();

C#

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

public class UploadFileExample
{
    public static async Task UploadFileFromUrl(string preSignedUrl, string url)
    {
        try
        {
            // 指定された URL からファイルをダウンロードするための HTTP クライアントを作成します。
            using (HttpClient httpClient = new HttpClient())
            {
                HttpResponseMessage response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
                response.EnsureSuccessStatusCode();

                // ファイルストリームを取得します。
                using (Stream fileStream = await response.Content.ReadAsStreamAsync())
                {
                    // URL オブジェクトを作成します。
                    Uri urlObj = new Uri(preSignedUrl);
                    HttpWebRequest connection = (HttpWebRequest)WebRequest.Create(urlObj);

                    // ファイルアップロードのリクエストメソッドを設定します。
                    connection.Method = "PUT";
                    connection.AllowWriteStreamBuffering = false;
                    connection.SendChunked = false;

                    // リクエストヘッダーを設定します。実際の値に置き換えてください。
                    connection.Headers["X-bailian-extra"] = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。";
                    connection.ContentType = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。";

                    // リクエストストリームを取得し、それにファイルストリームを書き込みます。
                    using (Stream requestStream = connection.GetRequestStream())
                    {
                        byte[] buffer = new byte[4096];
                        int bytesRead;
                        while ((bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
                        {
                            await requestStream.WriteAsync(buffer, 0, bytesRead);
                        }
                        await requestStream.FlushAsync();
                    }

                    // 応答を確認します。
                    using (HttpWebResponse responseResult = (HttpWebResponse)connection.GetResponse())
                    {
                        if (responseResult.StatusCode == HttpStatusCode.OK)
                        {
                            Console.WriteLine("URL からファイルが正常にアップロードされました。");
                        }
                        else
                        {
                            Console.WriteLine($"ファイルのアップロードに失敗しました。ResponseCode: {responseResult.StatusCode}");
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }
    }

    public static async Task Main(string[] args)
    {
        string preSignedUrlOrHttpUrl = "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。";
        string url = "これを、アップロードするファイルの URL に置き換えます。";   

        await UploadFileFromUrl(preSignedUrlOrHttpUrl, url);
    }
}

Go

package main
 
import (
    "fmt"
    "net/http"
 
    "github.com/go-resty/resty/v2"
)
 
// UploadFileFromUrl はパブリック URL から一時ストレージにファイルをアップロードします。
//
// Args:
//   - preSignedUrl (string): アップロードリースからの URL。
//   - headers (map[string]string): アップロードリクエストのヘッダー。
//   - sourceUrl (string): ファイルの URL。
//
// Returns:
//   - error: アップロードが失敗した場合はエラーメッセージ、それ以外は nil。
func UploadFileFromUrl(preSignedUrl string, headers map[string]string, sourceUrl string) error {
    // 指定された URL からファイルをダウンロードします。
    resp, err := http.Get(sourceUrl)
    if err != nil {
        return fmt.Errorf("ファイルの取得に失敗しました: %w", err)
    }
    defer resp.Body.Close()
 
    if resp.StatusCode != http.StatusOK {
        return fmt.Errorf("ファイルの取得に失敗しました、ステータスコード: %d", resp.StatusCode)
    }
 
    // REST クライアントを作成します。
    client := resty.New()
 
    // アップロードに必要なリクエストヘッダーを構築します。
    uploadHeaders := map[string]string{
        "X-bailian-extra": headers["X-bailian-extra"],
        "Content-Type":    headers["Content-Type"],
    }
 
    // PUT リクエストを送信します。
    response, err := client.R().
        SetHeaders(uploadHeaders).
        SetBody(resp.Body).
        Put(preSignedUrl)
 
    if err != nil {
        return fmt.Errorf("リクエストの送信に失敗しました: %w", err)
    }
 
    if err != nil {
        return fmt.Errorf("リクエストの送信に失敗しました: %w", err)
    }
 
    // HTTP 応答ステータスコードを確認します。
    if response.IsError() {
        return fmt.Errorf("HTTP エラー: %d", response.StatusCode())
    }
 
    fmt.Println("URL からファイルが正常にアップロードされました。")
    return nil
}
 
// main 関数
func main() {
    // これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。
    preSignedUrl := "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Url フィールドの値に置き換えます。"
 
    // これらを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers の X-bailian-extra と Content-Type の値に置き換えます。
    headers := map[string]string{
        "X-bailian-extra": "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.X-bailian-extra フィールドの値に置き換えます。",
        "Content-Type":    "これを、前のステップの ApplyFileUploadLease 操作によって返された Data.Param.Headers.Content-Type フィールドの値に置き換えます。空の値が返された場合は、空の値を渡します。",
    }
 
    sourceUrl := "これを、アップロードするファイルの URL に置き換えます。"
 
    // アップロード関数を呼び出します。
    err := UploadFileFromUrl(preSignedUrl, headers, sourceUrl)
    if err != nil {
        fmt.Printf("アップロードに失敗しました: %v\n", err)
    }
}

2.3. ファイルをカテゴリに追加する

Alibaba Cloud Model Studio は、カテゴリを使用してアップロードされたファイルを管理します。したがって、AddFile 操作を呼び出して、アップロードされたファイルを同じワークスペースのカテゴリに追加する必要があります。

  • parser: DASHSCOPE_DOCMIND と入力します。

  • lease_id: ファイルアップロードリースのリクエストによって返された Data.FileUploadLeaseId を入力します。

  • category_id: この例では、default と入力します。ファイルをカスタムカテゴリにアップロードした場合は、対応する category_id を入力します。

ファイルが追加されると、Model Studio はファイルの FileId を返し、自動的に解析を開始します。lease_id は無効になります。同じリース ID を使用してリクエストを再度送信しないでください

重要
  • RAM ユーザーは、この操作を呼び出す前に、必要な API 権限 (AliyunBailianDataFullAccess ポリシー) を付与されている必要があります。

  • この操作は、オンラインデバッグ と、複数の言語の サンプルコード の生成をサポートしています。

Python

def add_file(client: bailian20231229Client, lease_id: str, parser: str, category_id: str, workspace_id: str):
    """
    Alibaba Cloud Model Studio の指定されたカテゴリにファイルを追加します。

    Args:
        client (bailian20231229Client): クライアント。
        lease_id (str): リース ID。
        parser (str): ファイルのパーサ。
        category_id (str): カテゴリ ID。
        workspace_id (str): ワークスペース ID。

    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    headers = {}
    request = bailian_20231229_models.AddFileRequest(
        lease_id=lease_id,
        parser=parser,
        category_id=category_id,
    )
    runtime = util_models.RuntimeOptions()
    return client.add_file_with_options(workspace_id, request, headers, runtime)

Java

/**
 * ファイルをカテゴリに追加します。
 *
 * @param client      クライアントオブジェクト。
 * @param leaseId     リース ID。
 * @param parser      ファイルのパーサ。
 * @param categoryId  カテゴリ ID。
 * @param workspaceId ワークスペース ID。
 * @return Alibaba Cloud Model Studio からの応答オブジェクト。
 */
public AddFileResponse addFile(com.aliyun.bailian20231229.Client client, String leaseId, String parser, String categoryId, String workspaceId) throws Exception {
    Map<String, String> headers = new HashMap<>();
    com.aliyun.bailian20231229.models.AddFileRequest addFileRequest = new com.aliyun.bailian20231229.models.AddFileRequest();
    addFileRequest.setLeaseId(leaseId);
    addFileRequest.setParser(parser);
    addFileRequest.setCategoryId(categoryId);
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    return client.addFileWithOptions(workspaceId, addFileRequest, headers, runtime);
}

PHP

/**
 * ファイルをカテゴリに追加します。
 *
 * @param Bailian $client クライアント。
 * @param string $leaseId リース ID。
 * @param string $parser ファイルのパーサ。
 * @param string $categoryId カテゴリ ID。
 * @param string $workspaceId ワークスペース ID。
 * @return AddFileResponse Alibaba Cloud Model Studio からの応答。
 */
public function addFile($client, $leaseId, $parser, $categoryId, $workspaceId) {
    $headers = [];
    $addFileRequest = new AddFileRequest([
        "leaseId" => $leaseId,
        "parser" => $parser,
        "categoryId" => $categoryId
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->addFileWithOptions($workspaceId, $addFileRequest, $headers, $runtime);
}

Node.js

/**
 * ファイルをカテゴリに追加します。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} leaseId - リース ID。
 * @param {string} parser - ファイルのパーサ。
 * @param {string} categoryId - カテゴリ ID。
 * @param {string} workspaceId - ワークスペース ID。
 * @returns {Promise<bailian20231229.AddFileResponse>} - Alibaba Cloud Model Studio からの応答。
 */
async function addFile(client, leaseId, parser, categoryId, workspaceId) {
 const headers = {};
 const req = new bailian20231229.AddFileRequest({
  leaseId,
  parser,
  categoryId
});
 const runtime = new Util.RuntimeOptions({});
 return await client.addFileWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// ファイルをカテゴリに追加します。
/// </summary>
/// <param name="client">クライアントオブジェクト。</param>
/// <param name="leaseId">リース ID。</param>
/// <param name="parser">ファイルのパーサ。</param>
/// <param name="categoryId">カテゴリ ID。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <returns>Alibaba Cloud Model Studio からの応答オブジェクト。</returns>
/// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.AddFileResponse AddFile(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string leaseId,
    string parser,
    string categoryId,
    string workspaceId)
{
    var headers = new Dictionary<string, string>() { };
    var addFileRequest = new AlibabaCloud.SDK.Bailian20231229.Models.AddFileRequest
    {
        LeaseId = leaseId,
        Parser = parser,
        CategoryId = categoryId
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.AddFileWithOptions(workspaceId, addFileRequest, headers, runtime);
}

Go

// AddFile は Alibaba Cloud Model Studio の指定されたカテゴリにファイルを追加します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - leaseId (string): リース ID。
//   - parser (string): ファイルのパーサ。
//   - categoryId (string): カテゴリ ID。
//   - workspaceId (string): ワークスペース ID。
//
// Returns:
//   - *bailian20231229.AddFileResponse: Alibaba Cloud Model Studio からの応答。
//   - error: エラーメッセージ。
func AddFile(client *bailian20231229.Client, leaseId, parser, categoryId, workspaceId string) (_result *bailian20231229.AddFileResponse, _err error) {
	headers := make(map[string]*string)
	addFileRequest := &bailian20231229.AddFileRequest{
		LeaseId:    tea.String(leaseId),
		Parser:     tea.String(parser),
		CategoryId: tea.String(categoryId),
	}
	runtime := &util.RuntimeOptions{}
	return client.AddFileWithOptions(tea.String(workspaceId), addFileRequest, headers, runtime)
}

リクエストの例

{
  "CategoryId": "default",
  "LeaseId": "d92bd94fa9b54326a2547415e100c9e2.1742195250069",
  "Parser": "DASHSCOPE_DOCMIND",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": "200",
  "Message": "",
  "RequestId": "5832A1F4-AF91-5242-8B75-35BDC9XXXXXX",
  "Data": {
    "FileId": "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx",
    "Parser": "DASHSCOPE_DOCMIND"
  },
  "Code": "Success",
  "Success": "true"
}

2.4. ファイル解析ステータスのクエリ

解析されていないファイルは、ナレッジベースでは使用できません。ピーク時には、このプロセスに数時間かかることがあります。DescribeFile 操作を呼び出して、ファイルの解析ステータスをクエリできます。

応答の Data.Status フィールドが PARSE_SUCCESS の場合、ファイルは解析されています。その後、ナレッジベースにインポートできます。

重要
  • RAM ユーザーは、この操作を呼び出す前に、必要な API 権限 (AliyunBailianDataFullAccess または AliyunBailianDataReadOnlyAccess ポリシー) を付与されている必要があります。

  • この操作は、オンラインデバッグ と、複数の言語の サンプルコード の生成をサポートしています。

Python

def describe_file(client, workspace_id, file_id):
    """
    ファイルに関する基本情報を取得します。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        file_id (str): ファイル ID。

    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    headers = {}
    runtime = util_models.RuntimeOptions()
    return client.describe_file_with_options(workspace_id, file_id, headers, runtime)

Java

/**
 * ファイルに関する基本情報をクエリします。
 *
 * @param client      クライアントオブジェクト。
 * @param workspaceId ワークスペース ID。
 * @param fileId      ファイル ID。
 * @return Alibaba Cloud Model Studio からの応答オブジェクト。
 */
public DescribeFileResponse describeFile(com.aliyun.bailian20231229.Client client, String workspaceId, String fileId) throws Exception {
    Map<String, String> headers = new HashMap<>();
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    return client.describeFileWithOptions(workspaceId, fileId, headers, runtime);
}

PHP

/**
 * ファイルに関する基本情報をクエリします。
 *
 * @param Bailian $client クライアント。
 * @param string $workspaceId ワークスペース ID。
 * @param string $fileId ファイル ID。
 * @return DescribeFileResponse Alibaba Cloud Model Studio からの応答。
 */
public function describeFile($client, $workspaceId, $fileId) {
    $headers = [];
    $runtime = new RuntimeOptions([]);
    return $client->describeFileWithOptions($workspaceId, $fileId, $headers, $runtime);
}

Node.js

/**
 * ファイルの解析ステータスをクエリします。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} workspaceId - ワークスペース ID。
 * @param {string} fileId - ファイル ID。
 * @returns {Promise<bailian20231229.DescribeFileResponse>} - Alibaba Cloud Model Studio からの応答。
 */
async function describeFile(client, workspaceId, fileId) {
 const headers = {};
 const runtime = new Util.RuntimeOptions({});
 return await client.describeFileWithOptions(workspaceId, fileId, headers, runtime);
}

C#

/// <summary>
/// ファイルに関する基本情報をクエリします。
/// </summary>
/// <param name="client">クライアントオブジェクト。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="fileId">ファイル ID。</param>
/// <returns>Alibaba Cloud Model Studio からの応答オブジェクト。</returns>
/// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.DescribeFileResponse DescribeFile(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string fileId)
{
    var headers = new Dictionary<string, string>() { };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.DescribeFileWithOptions(workspaceId, fileId, headers, runtime);
}

Go

// DescribeFile はファイルに関する基本情報を取得します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - fileId (string): ファイル ID。
//
// Returns:
//   - any: Alibaba Cloud Model Studio からの応答。
//   - error: エラーメッセージ。
func DescribeFile(client *bailian20231229.Client, workspaceId, fileId string) (_result *bailian20231229.DescribeFileResponse, _err error) {
	headers := make(map[string]*string)
	runtime := &util.RuntimeOptions{}
	return client.DescribeFileWithOptions(tea.String(workspaceId), tea.String(fileId), headers, runtime)
}

リクエストの例

{
  "FileId": "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": "200",
  "Message": "",
  "RequestId": "B9246251-987A-5628-8E1E-17BB39XXXXXX",
  "Data": {
    "CategoryId": "cate_206ea350f0014ea4a324adff1ca13011_10xxxxxx",
    "Status": "PARSE_SUCCESS",
    "FileType": "docx",
    "CreateTime": "2025-03-17 15:47:13",
    "FileName": "Bailian_Phones_Specifications.docx",
    "FileId": "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx",
    "SizeInBytes": "14015",
    "Parser": "DASHSCOPE_DOCMIND"
  },
  "Code": "Success",
  "Success": "true"
}

3. ナレッジベースの作成

3.1. ナレッジベースの初期化

ファイルが解析された後、同じワークスペースのナレッジベースにインポートできます。ドキュメント検索ナレッジベースを初期化するには、CreateIndex 操作を呼び出します。これにより送信が確定するわけではありません。

  • workspace_id: 詳細については、「ワークスペース ID の取得方法」をご参照ください。

  • file_id: ファイルをカテゴリに追加したときに返された FileId を入力します。

    `source_type` が DATA_CENTER_FILE に設定されている場合、このパラメーターは必須です。そうでない場合、エラーが報告されます。
  • structure_type: この例では、unstructured と入力します。

    API を使用してデータクエリまたは画像 Q&A ペアナレッジベースを作成することはできません。Model Studio コンソールを使用して作成する必要があります。
  • source_type: この例では、DATA_CENTER_FILE と入力します。

  • sink_type: この例では、BUILT_IN と入力します。

応答の Data.Id フィールドの値はナレッジベース ID です。この ID は、後続のインデックス構築に使用されます。

ナレッジベース ID は安全に保管してください。このナレッジベースに関連する後続のすべての API 操作で必要になります。
重要
  • RAM ユーザーは、この操作を呼び出す前に、必要な API 権限 (AliyunBailianDataFullAccess ポリシー) を付与されている必要があります。

  • この操作は、オンラインデバッグ と、複数の言語の サンプルコード の生成をサポートしています。

Python

def create_index(client, workspace_id, file_id, name, structure_type, source_type, sink_type):
    """
    Alibaba Cloud Model Studio でナレッジベースを作成 (初期化) します。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        file_id (str): ファイル ID。
        name (str): ナレッジベースの名前。
        structure_type (str): ナレッジベースのデータの型。
        source_type (str): アプリケーションデータのデータの型。カテゴリとファイルタイプがサポートされています。
        sink_type (str): ナレッジベースのベクターストレージタイプ。

    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    headers = {}
    request = bailian_20231229_models.CreateIndexRequest(
        structure_type=structure_type,
        name=name,
        source_type=source_type,
        sink_type=sink_type,
        document_ids=[file_id]
    )
    runtime = util_models.RuntimeOptions()
    return client.create_index_with_options(workspace_id, request, headers, runtime)

Java

/**
 * Alibaba Cloud Model Studio でナレッジベースを作成 (初期化) します。
 *
 * @param client        クライアントオブジェクト。
 * @param workspaceId   ワークスペース ID。
 * @param fileId        ファイル ID。
 * @param name          ナレッジベースの名前。
 * @param structureType ナレッジベースのデータの型。
 * @param sourceType    アプリケーションデータのデータの型。カテゴリとファイルタイプがサポートされています。
 * @param sinkType      ナレッジベースのベクターストレージタイプ。
 * @return Alibaba Cloud Model Studio からの応答オブジェクト。
 */
public CreateIndexResponse createIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String fileId, String name, String structureType, String sourceType, String sinkType) throws Exception {
    Map<String, String> headers = new HashMap<>();
    com.aliyun.bailian20231229.models.CreateIndexRequest createIndexRequest = new com.aliyun.bailian20231229.models.CreateIndexRequest();
    createIndexRequest.setStructureType(structureType);
    createIndexRequest.setName(name);
    createIndexRequest.setSourceType(sourceType);
    createIndexRequest.setSinkType(sinkType);
    createIndexRequest.setDocumentIds(Collections.singletonList(fileId));
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    return client.createIndexWithOptions(workspaceId, createIndexRequest, headers, runtime);
}

PHP

/**
 * Alibaba Cloud Model Studio でナレッジベースを作成 (初期化) します。
 *
 * @param Bailian $client クライアント。
 * @param string $workspaceId ワークスペース ID。
 * @param string $fileId ファイル ID。
 * @param string $name ナレッジベースの名前。
 * @param string $structureType ナレッジベースのデータの型。
 * @param string $sourceType アプリケーションデータのデータの型。カテゴリとファイルタイプがサポートされています。
 * @param string $sinkType ナレッジベースのベクターストレージタイプ。
 * @return CreateIndexResponse Alibaba Cloud Model Studio からの応答。
 */
public function createIndex($client, $workspaceId, $fileId, $name, $structureType, $sourceType, $sinkType) {
    $headers = [];
    $createIndexRequest = new CreateIndexRequest([
        "structureType" => $structureType,
        "name" => $name,
        "sourceType" => $sourceType,
        "documentIds" => [
            $fileId
        ],
        "sinkType" => $sinkType
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->createIndexWithOptions($workspaceId, $createIndexRequest, $headers, $runtime);
}

Node.js

/**
 * ナレッジベース (インデックス) を初期化します。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} workspaceId - ワークスペース ID。
 * @param {string} fileId - ファイル ID。
 * @param {string} name - ナレッジベースの名前。
 * @param {string} structureType - ナレッジベースのデータの型。
 * @param {string} sourceType - アプリケーションデータのデータの型。カテゴリとファイルタイプがサポートされています。
 * @param {string} sinkType - ナレッジベースのベクターストレージタイプ。
 * @returns {Promise<bailian20231229.CreateIndexResponse>} - Alibaba Cloud Model Studio からの応答。
 */
async function createIndex(client, workspaceId, fileId, name, structureType, sourceType, sinkType) {
 const headers = {};
 const req = new bailian20231229.CreateIndexRequest({
   name,
   structureType,
   documentIds: [fileId],
   sourceType,
   sinkType
 });
 const runtime = new Util.RuntimeOptions({});
 return await client.createIndexWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// Alibaba Cloud Model Studio でナレッジベースを作成 (初期化) します。
/// </summary>
/// <param name="client">クライアントオブジェクト。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="fileId">ファイル ID。</param>
/// <param name="name">ナレッジベースの名前。</param>
/// <param name="structureType">ナレッジベースのデータの型。</param>
/// <param name="sourceType">アプリケーションデータのデータの型。カテゴリとファイルタイプがサポートされています。</param>
/// <param name="sinkType">ナレッジベースのベクターストレージタイプ。</param>
/// <returns>Alibaba Cloud Model Studio からの応答オブジェクト。</returns>
/// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.CreateIndexResponse CreateIndex(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string fileId,
    string name,
    string structureType,
    string sourceType,
    string sinkType)
{
    var headers = new Dictionary<string, string>() { };
    var createIndexRequest = new AlibabaCloud.SDK.Bailian20231229.Models.CreateIndexRequest
    {
        StructureType = structureType,
        Name = name,
        SourceType = sourceType,
        SinkType = sinkType,
        DocumentIds = new List<string> { fileId }
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.CreateIndexWithOptions(workspaceId, createIndexRequest, headers, runtime);
}

Go

// CreateIndex は Alibaba Cloud Model Studio でナレッジベースを作成 (初期化) します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - fileId (string): ファイル ID。
//   - name (string): ナレッジベースの名前。
//   - structureType (string): ナレッジベースのデータの型。
//   - sourceType (string): アプリケーションデータのデータの型。カテゴリとファイルタイプがサポートされています。
//   - sinkType (string): ナレッジベースのベクターストレージタイプ。
//
// Returns:
//   - *bailian20231229.CreateIndexResponse: Alibaba Cloud Model Studio からの応答。
//   - error: エラーメッセージ。
func CreateIndex(client *bailian20231229.Client, workspaceId, fileId, name, structureType, sourceType, sinkType string) (_result *bailian20231229.CreateIndexResponse, _err error) {
	headers := make(map[string]*string)
	createIndexRequest := &bailian20231229.CreateIndexRequest{
		StructureType: tea.String(structureType),
		Name:          tea.String(name),
		SourceType:    tea.String(sourceType),
		SinkType:      tea.String(sinkType),
		DocumentIds:   []*string{tea.String(fileId)},
	}
	runtime := &util.RuntimeOptions{}
	return client.CreateIndexWithOptions(tea.String(workspaceId), createIndexRequest, headers, runtime)
}

リクエストの例

{
  "Name": "Model Studio Phone Knowledge Base",
  "SinkType": "BUILT_IN",
  "SourceType": "DATA_CENTER_FILE",
  "StructureType": "unstructured",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx",
  "DocumentIds": [
    "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx"
  ]
}

応答の例

{
  "Status": "200",
  "Message": "success",
  "RequestId": "87CB0999-F1BB-5290-8C79-A875B2XXXXXX",
  "Data": {
    "Id": "mymxbdxxxx"
  },
  "Code": "Success",
  "Success": "true"
}

3.2. インデックスジョブの送信

ナレッジベースを初期化した後、SubmitIndexJob 操作を呼び出してインデックスジョブを送信する必要があります。これにより、ナレッジベースのインデックス構築が開始されます。

ジョブを送信すると、Alibaba Cloud Model Studio は非同期タスクとしてインデックスの構築を開始します。この操作によって返される Data.Id は、対応するジョブ ID です。次のステップでは、この ID を使用してジョブの最新のステータスをクエリします。

重要
  • RAM ユーザーは、この操作を呼び出す前に、必要な API 権限 (AliyunBailianDataFullAccess ポリシー) を付与されている必要があります。

  • この操作は、オンラインデバッグ と、複数の言語の サンプルコード の生成をサポートしています。

Python

def submit_index(client, workspace_id, index_id):
    """
    Alibaba Cloud Model Studio にインデックスジョブを送信します。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。

    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    headers = {}
    submit_index_job_request = bailian_20231229_models.SubmitIndexJobRequest(
        index_id=index_id
    )
    runtime = util_models.RuntimeOptions()
    return client.submit_index_job_with_options(workspace_id, submit_index_job_request, headers, runtime)

Java

/**
 * Alibaba Cloud Model Studio にインデックスジョブを送信します。
 *
 * @param client      クライアントオブジェクト。
 * @param workspaceId ワークスペース ID。
 * @param indexId     ナレッジベース ID。
 * @return Alibaba Cloud Model Studio からの応答オブジェクト。
 */
public SubmitIndexJobResponse submitIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId) throws Exception {
    Map<String, String> headers = new HashMap<>();
    com.aliyun.bailian20231229.models.SubmitIndexJobRequest submitIndexJobRequest = new com.aliyun.bailian20231229.models.SubmitIndexJobRequest();
    submitIndexJobRequest.setIndexId(indexId);
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    return client.submitIndexJobWithOptions(workspaceId, submitIndexJobRequest, headers, runtime);
}

PHP

/**
 * Alibaba Cloud Model Studio にインデックスジョブを送信します。
 *
 * @param Bailian $client クライアント。
 * @param string $workspaceId ワークスペース ID。
 * @param string $indexId ナレッジベース ID。
 * @return SubmitIndexJobResponse Alibaba Cloud Model Studio からの応答。
 */
public static function submitIndex($client, $workspaceId, $indexId) {
    $headers = [];
    $submitIndexJobRequest = new SubmitIndexJobRequest([
        'indexId' => $indexId
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->submitIndexJobWithOptions($workspaceId, $submitIndexJobRequest, $headers, $runtime);
}

Node.js

/**
 * インデックスジョブを送信します。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} workspaceId - ワークスペース ID。
 * @param {string} indexId - ナレッジベース ID。
 * @returns {Promise<bailian20231229.SubmitIndexJobResponse>} - Alibaba Cloud Model Studio からの応答。
 */
async function submitIndex(client, workspaceId, indexId) {
  const headers = {};
  const req = new bailian20231229.SubmitIndexJobRequest({ indexId });
  const runtime = new Util.RuntimeOptions({});
  return await client.submitIndexJobWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// Alibaba Cloud Model Studio にインデックスジョブを送信します。
/// </summary>
/// <param name="client">クライアントオブジェクト。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="indexId">ナレッジベース ID。</param>
/// <returns>Alibaba Cloud Model Studio からの応答オブジェクト。</returns>
/// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexJobResponse SubmitIndex(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string indexId)
{
    var headers = new Dictionary<string, string>() { };
    var submitIndexJobRequest = new AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexJobRequest
    {
           IndexId = indexId
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.SubmitIndexJobWithOptions(workspaceId, submitIndexJobRequest, headers, runtime);
}

Go

// SubmitIndex はインデックスジョブを送信します。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): ナレッジベース ID。
//
// Returns:
//   - *bailian20231229.SubmitIndexJobResponse: Alibaba Cloud Model Studio からの応答。
//   - error: エラーメッセージ。
func SubmitIndex(client *bailian20231229.Client, workspaceId, indexId string) (_result *bailian20231229.SubmitIndexJobResponse, _err error) {
	headers := make(map[string]*string)
	submitIndexJobRequest := &bailian20231229.SubmitIndexJobRequest{
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.SubmitIndexJobWithOptions(tea.String(workspaceId), submitIndexJobRequest, headers, runtime)
}

リクエストの例

{
  "IndexId": "mymxbdxxxx",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": "200",
  "Message": "success",
  "RequestId": "7774575F-571D-5854-82C2-634AB8XXXXXX",
  "Data": {
    "IndexId": "mymxbdxxxx",
    "Id": "3cd6fb57aaf44cd0b4dd2ca584xxxxxx"
  },
  "Code": "Success",
  "Success": "true"
}

3.3. インデックスジョブの完了を待つ

インデックスジョブの完了には時間がかかります。ピーク時には、このプロセスに数時間かかることがあります。実行ステータスをクエリするには、GetIndexJobStatus 操作を呼び出すことができます。

応答の Data.Status フィールドが COMPLETED の場合、ナレッジベースが作成されます。

重要
  • RAM ユーザーは、この操作を呼び出す前に、必要な API 権限 (AliyunBailianDataFullAccess ポリシー) を付与されている必要があります。

  • この操作は、オンラインデバッグ と、複数の言語の サンプルコード の生成をサポートしています。

Python

def get_index_job_status(client, workspace_id, index_id, job_id):
    """
    インデックスジョブのステータスをクエリします。

    Args:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        job_id (str): ジョブ ID。

    Returns:
        Alibaba Cloud Model Studio からの応答。
    """
    headers = {}
    get_index_job_status_request = bailian_20231229_models.GetIndexJobStatusRequest(
        index_id=index_id,
        job_id=job_id
    )
    runtime = util_models.RuntimeOptions()
    return client.get_index_job_status_with_options(workspace_id, get_index_job_status_request, headers, runtime)

Java

/**
 * インデックスジョブのステータスをクエリします。
 *
 * @param client      クライアントオブジェクト。
 * @param workspaceId ワークスペース ID。
 * @param jobId       ジョブ ID。
 * @param indexId     ナレッジベース ID。
 * @return Alibaba Cloud Model Studio からの応答オブジェクト。
 */
public GetIndexJobStatusResponse getIndexJobStatus(com.aliyun.bailian20231229.Client client, String workspaceId, String jobId, String indexId) throws Exception {
    Map<String, String> headers = new HashMap<>();
    com.aliyun.bailian20231229.models.GetIndexJobStatusRequest getIndexJobStatusRequest = new com.aliyun.bailian20231229.models.GetIndexJobStatusRequest();
    getIndexJobStatusRequest.setIndexId(indexId);
    getIndexJobStatusRequest.setJobId(jobId);
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    GetIndexJobStatusResponse getIndexJobStatusResponse = null;
    getIndexJobStatusResponse = client.getIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
    return getIndexJobStatusResponse;
}

PHP

/**
 * インデックスジョブのステータスをクエリします。
 *
 * @param Bailian $client クライアント。
 * @param string $workspaceId ワークスペース ID。
 * @param string $indexId ナレッジベース ID。
 * @param string $jobId ジョブ ID。
 * @return GetIndexJobStatusResponse Alibaba Cloud Model Studio からの応答。
 */
public function getIndexJobStatus($client, $workspaceId, $jobId, $indexId) {
    $headers = [];
    $getIndexJobStatusRequest = new GetIndexJobStatusRequest([
        'indexId' => $indexId,
        'jobId' => $jobId
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->getIndexJobStatusWithOptions($workspaceId, $getIndexJobStatusRequest, $headers, $runtime);
}

Node.js

/**
 * インデックスジョブのステータスをクエリします。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} workspaceId - ワークスペース ID。
 * @param {string} jobId - ジョブ ID。
 * @param {string} indexId - ナレッジベース ID。
 * @returns {Promise<bailian20231229.GetIndexJobStatusResponse>} - Alibaba Cloud Model Studio からの応答。
 */
async function getIndexJobStatus(client, workspaceId, jobId, indexId) {
  const headers = {};
  const req = new bailian20231229.GetIndexJobStatusRequest({ jobId, indexId });
  const runtime = new Util.RuntimeOptions({});
  return await client.getIndexJobStatusWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// インデックスジョブのステータスをクエリします。
/// </summary>
/// <param name="client">クライアントオブジェクト。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="jobId">ジョブ ID。</param>
/// <param name="indexId">ナレッジベース ID。</param>
/// <returns>Alibaba Cloud Model Studio からの応答オブジェクト。</returns>
/// <exception cref="Exception">呼び出し中にエラーが発生した場合、例外がスローされます。</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusResponse GetIndexJobStatus(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string jobId,
    string indexId)
{
    var headers = new Dictionary<string, string>() { };
    var getIndexJobStatusRequest = new AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusRequest
    {
        IndexId = indexId,
        JobId = jobId
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.GetIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
}

Go

// GetIndexJobStatus はインデックスジョブのステータスをクエリします。
//
// Args:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - jobId (string): ジョブ ID。
//   - indexId (string): ナレッジベース ID。
//
// Returns:
//   - *bailian20231229.GetIndexJobStatusResponse: Alibaba Cloud Model Studio からの応答。
//   - error: エラーメッセージ。
func GetIndexJobStatus(client *bailian20231229.Client, workspaceId, jobId, indexId string) (_result *bailian20231229.GetIndexJobStatusResponse, _err error) {
	headers := make(map[string]*string)
	getIndexJobStatusRequest := &bailian20231229.GetIndexJobStatusRequest{
		JobId:   tea.String(jobId),
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.GetIndexJobStatusWithOptions(tea.String(workspaceId), getIndexJobStatusRequest, headers, runtime)
}

リクエストの例

{
  "IndexId": "mymxbdxxxx",
  "JobId": "3cd6fb57aaf44cd0b4dd2ca584xxxxxx",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": "200",
  "Message": "success",
  "RequestId": "E83423B9-7D6D-5283-836B-CF7EAEXXXXXX",
  "Data": {
    "Status": "COMPLETED",
    "Documents": [
      {
        "Status": "FINISH",
        "DocId": "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx",
        "Message": "インポート成功",
        "DocName": "Bailian Phones Specifications",
        "Code": "FINISH"
      }
    ],
    "JobId": "3cd6fb57aaf44cd0b4dd2ca584xxxxxx"
  },
  "Code": "Success",
  "Success": "true"
}

これらの手順に従うことで、アップロードされたファイルを含むナレッジベースが正常に作成されました。

ナレッジベースの取得

ナレッジベースから情報を取得するには、2 つの方法があります。

  • Alibaba Cloud Model Studio アプリケーションの使用: アプリケーションを呼び出す際、モデルアプリケーションを非公開の知識で補完し、最新の情報を提供するために、rag_options パラメーターでナレッジベース ID index_id を指定します。

  • Alibaba Cloud API の使用: Retrieve API を呼び出して、指定されたナレッジベースから情報を取得し、元のテキストセグメントを返します。

最初のメソッドは、取得したテキストセグメントを構成済みのモデルに送信します。モデルはこれらのセグメントをユーザーの元のクエリと組み合わせて、最終的な回答を生成して返します。2 番目のメソッドは、テキストセグメントを直接返します。

この Topic では、Alibaba Cloud API の使用方法について説明します。

Retrieve API を呼び出して、指定されたナレッジベースから情報を取得し、テキストセグメントを返すことができます。

この操作によって返された結果に無関係な情報が過剰に含まれている場合は、リクエストで SearchFilters を指定して、タグによるフィルタリングなどのフィルター条件を設定し、無関係な情報を除外できます。

重要

Python

def retrieve_index(client, workspace_id, index_id, query):
    """
    指定されたナレッジベースから情報を取得します。
        
    引数:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        query (str): 元の入力プロンプト。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    retrieve_request = bailian_20231229_models.RetrieveRequest(
        index_id=index_id,
        query=query
    )
    runtime = util_models.RuntimeOptions()
    return client.retrieve_with_options(workspace_id, retrieve_request, headers, runtime)

Java

/**
 * 指定されたナレッジベースから情報を取得します。
 *
 * @param client         クライアントオブジェクト (bailian20231229Client)
 * @param workspaceId    ワークスペース ID
 * @param indexId        ナレッジベース ID
 * @param query          検索文
 * @return               Model Studio サービスからの応答
 */
public RetrieveResponse retrieveIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String query) throws Exception {
    RetrieveRequest retrieveRequest = new RetrieveRequest();
    retrieveRequest.setIndexId(indexId);
    retrieveRequest.setQuery(query);
    RuntimeOptions runtime = new RuntimeOptions();
    return client.retrieveWithOptions(workspaceId, retrieveRequest, null, runtime);
}

PHP

/**
 * 指定されたナレッジベースから情報を取得します。
 *
 * @param Bailian $client クライアントオブジェクト (Client)。
 * @param string $workspaceId ワークスペース ID
 * @param string $indexId ナレッジベース ID
 * @param string $query 検索文
 * @return RetrieveResponse Model Studio サービスからの応答
 * @throws Exception
 */
public function retrieveIndex($client, $workspaceId, $indexId, $query) {
    $headers = [];
    $retrieveRequest = new RetrieveRequest([
        "query" => $query,
        "indexId" => $indexId
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->retrieveWithOptions($workspaceId, $retrieveRequest, $headers, $runtime);
}

Node.js

/**
 * 指定されたナレッジベースから情報を取得します
 * @param {bailian20231229.Client} client クライアント。
 * @param {string} workspaceId ワークスペース ID
 * @param {string} indexId ナレッジベース ID
 * @param {string} query 取得クエリ
 * @returns {Promise<bailian20231229.RetrieveResponse>} Model Studio サービスからの応答
 */
async function retrieveIndex(client, workspaceId, indexId, query) {
    const headers = {};
    const req = new bailian20231229.RetrieveRequest({
        indexId,
        query
    });
    const runtime = new Util.RuntimeOptions({});
    return await client.retrieveWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// 指定されたナレッジベースから情報を取得します。
/// </summary>
/// <param name="client">クライアントオブジェクト (bailian20231229Client)</param>
/// <param name="workspaceId">ワークスペース ID</param>
/// <param name="indexId">ナレッジベース ID</param>
/// <param name="query">検索文</param>
/// <returns>Model Studio サービスからの応答</returns>
/// <exception cref="Exception">呼び出しが失敗した場合</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.RetrieveResponse RetrieveIndex(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string indexId,
    string query)
{
    var headers = new Dictionary<string, string>() { };
    var retrieveRequest = new AlibabaCloud.SDK.Bailian20231229.Models.RetrieveRequest
    {
        IndexId = indexId,
        Query = query
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.RetrieveWithOptions(workspaceId, retrieveRequest, headers, runtime);
}

Go

// retrieveIndex は、指定されたナレッジベースから情報を取得します。
//
// 引数:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): ナレッジベース ID。
//   - query (string): 検索文
//
// 戻り値:
//   - *bailian20231229.RetrieveResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func retrieveIndex(client *bailian20231229.Client, workspaceId, indexId, query string) (*bailian20231229.RetrieveResponse, error) {
	headers := make(map[string]*string)
	request := &bailian20231229.RetrieveRequest{
		IndexId: tea.String(indexId),
		Query:   tea.String(query),
	}
	runtime := &util.RuntimeOptions{}
	return client.RetrieveWithOptions(tea.String(workspaceId), request, headers, runtime)
}

リクエストの例

{
  "IndexId": "mymxbdxxxx",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx",
  "Query": "Alibaba Cloud Model Studio X1 スマートフォンを紹介してください。"
}

応答の例

{
  "Status": "200",
  "Message": "success",
  "RequestId": "17316EA2-1F4D-55AC-8872-53F6F1XXXXXX",
  "Data": {
    "Nodes": [
      {
        "Score": 0.6294550895690918,
        "Metadata": {
          "file_path": "https://bailian-datahub-data-prod.oss-cn-beijing.aliyuncs.com/10285263/multimodal/docJson/Model_Studio_Series_Phone_Product_Introduction_1742197778230.json?Expires=1742457465&OSSAccessKeyId=TestID&Signature=ptFkSObdnBrbJNEw8CnlOSP%2FTeI%3D",
          "is_displayed_chunk_content": "true",
          "_rc_v_score": 0.7449869735535081,
          "image_url": [],
          "nid": "9ad347d9e4d7465d2c1e693a08b0077c|d6f7fbf8403e0df796258e5ada1ee1c1|4772257e93ed64ea087ff4be0d5e4620|7ce1370e4a1958842c9268144a452cc7",
          "_q_score": 1,
          "source": "0",
          "_score": 0.6294550895690918,
          "title": "Alibaba Cloud Model Studio スマートフォン製品紹介",
          "doc_id": "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx",
          "content": "Alibaba Cloud Model Studio スマートフォン製品紹介 Alibaba Cloud Model Studio X1 — 究極のビジュアル体験をお楽しみください: 6.7 インチ 1440 × 3200 ピクセルの超高解像度スクリーンと 120 Hz の更新頻度を搭載し、滑らかで鮮やかなビジュアル体験を提供します。256 GB のマスストレージと 12 GB の RAM の強力な組み合わせにより、大規模なゲームやマルチタスキングも容易に処理します。長持ちする 5000 mAh のバッテリーと超高感度クアッドカメラシステムが、あなたの人生のあらゆる素晴らしい瞬間を捉えます。参考価格: 4599–4999 Tongyi Vivid 7 — スマート写真撮影の新しい体験: 6.5 インチ 1080 × 2400 ピクセルの全画面を搭載しています。AI スマート写真撮影機能により、すべての写真がプロ級の色とディテールで表現されます。8 GB の RAM と 128 GB のストレージがスムーズな操作を保証し、4500 mAh のバッテリーが日常のニーズに応えます。側面指紋認証は便利で安全です。参考価格: 2999–3299 Stardust S9 Pro — 革新的なビジュアルの饗宴: 画期的な 6.9 インチ 1440 × 3088 ピクセルの画面下カメラ設計により、ボーダーレスなビジュアル体験を提供します。512 GB のストレージと 16 GB の RAM を備えた最高級の構成に、6000 mAh のバッテリーと 100 W の高速充電技術を組み合わせ、パフォーマンスと耐久性の両方を提供し、技術トレンドをリードします。参考価格: 5999–6499。",
          "_rc_score": 0,
          "workspace_id": "llm-4u5xpd1xdjqpxxxx",
          "hier_title": "Alibaba Cloud Model Studio スマートフォン製品紹介",
          "_rc_t_score": 0.05215025693178177,
          "doc_name": "Alibaba Cloud Model Studio シリーズスマートフォン製品紹介",
          "pipeline_id": "mymxbdxxxx",
          "_id": "llm-4u5xpd1xdjqp8itj_mymxbd6172_file_0b21e0a852cd40cd9741c54fefbb61cd_10285263_0_0"
        },
        "Text": "Alibaba Cloud Model Studio スマートフォン製品紹介 Alibaba Cloud Model Studio X1 — 究極のビジュアル体験をお楽しみください: 6.7 インチ 1440 × 3200 ピクセルの超高解像度スクリーンと 120 Hz の更新頻度を搭載し、滑らかで鮮やかなビジュアル体験を提供します。256 GB のマスストレージと 12 GB の RAM の強力な組み合わせにより、大規模なゲームやマルチタスキングも容易に処理します。長持ちする 5000 mAh のバッテリーと超高感度クアッドカメラシステムが、あなたの人生のあらゆる素晴らしい瞬間を捉えます。参考価格: 4599–4999 Tongyi Vivid 7 — スマート写真撮影の新しい体験: 6.5 インチ 1080 × 2400 ピクセルの全画面を搭載しています。AI スマート写真撮影機能により、すべての写真がプロ級の色とディテールで表現されます。8 GB の RAM と 128 GB のストレージがスムーズな操作を保証し、4500 mAh のバッテリーが日常のニーズに応えます。側面指紋認証は便利で安全です。参考価格: 2999–3299 Stardust S9 Pro — 革新的なビジュアルの饗宴: 画期的な 6.9 インチ 1440 × 3088 ピクセルの画面下カメラ設計により、ボーダーレスなビジュアル体験を提供します。512 GB のストレージと 16 GB の RAM を備えた最高級の構成に、6000 mAh のバッテリーと 100 W の高速充電技術を組み合わせ、パフォーマンスと耐久性の両方を提供し、技術トレンドをリードします。参考価格: 5999–6499。"
      },
      {
        "Score": 0.5322970747947693,
        "Metadata": {
          "file_path": "https://bailian-datahub-data-prod.oss-cn-beijing.aliyuncs.com/10285263/multimodal/docJson/Model_Studio_Series_Phone_Product_Introduction_1742197778230.json?Expires=1742457465&OSSAccessKeyId=TestID&Signature=ptFkSObdnBrbJNEw8CnlOSP%2FTeI%3D",
          "is_displayed_chunk_content": "true",
          "_rc_v_score": 0.641660213470459,
          "image_url": [],
          "nid": "00be1864c18b4c39c59f83713af80092|4f2bfb02cc9fc4e85597b2e717699207",
          "_q_score": 0.9948930557644994,
          "source": "0",
          "_score": 0.5322970747947693,
          "title": "Alibaba Cloud Model Studio スマートフォン製品紹介",
          "doc_id": "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx",
          "content": "Alibaba Cloud Model Studio Flex Fold+ — 折りたたみ画面の新時代: 革新と豪華さを兼ね備え、7.6 インチ 1800 × 2400 ピクセルのメインスクリーンと 4.7 インチ 1080 × 2400 ピクセルの外部スクリーンを搭載しています。マルチアングルフリーストップヒンジ設計は、さまざまなシナリオのニーズに応えます。Alibaba Cloud Model Studio Flex Fold+ — 折りたたみ画面の新時代: 革新と豪華さを兼ね備え、7.6 インチ 1800 × 2400 ピクセルのメインスクリーンと 4.7 インチ 1080 × 2400 ピクセルの外部スクリーンを搭載しています。マルチアングルフリーストップヒンジ設計は、さまざまなシナリオのニーズに応えます。512 GB のストレージ、12 GB の RAM、4700 mAh のバッテリー、そして UTG 超薄型フレキシブルガラスが、折りたたみ画面時代の新たな章を開きます。さらに、このスマートフォンはデュアル SIM デュアルスタンバイと衛星通話をサポートしており、世界のどこにいても接続を維持できます。参考小売価格: 9999–10999。各スマートフォンは職人技の傑作であり、あなたの手の中の技術芸術作品となるように設計されています。あなたのスマートな相棒を選び、未来のテクノロジーライフの新たな章を始めましょう。",
          "_rc_score": 0,
          "workspace_id": "llm-4u5xpd1xdjqpxxxx",
          "hier_title": "Alibaba Cloud Model Studio スマートフォン製品紹介",
          "_rc_t_score": 0.05188392847776413,
          "doc_name": "Alibaba Cloud Model Studio シリーズスマートフォン製品紹介",
          "pipeline_id": "mymxbdxxxx",
          "_id": "llm-4u5xpd1xdjqp8itj_mymxbd6172_file_0b21e0a852cd40cd9741c54fefbb61cd_10285263_0_2"
        },
        "Text": "Alibaba Cloud Model Studio Flex Fold+ — 折りたたみ画面の新時代: 革新と豪華さを兼ね備え、7.6 インチ 1800 × 2400 ピクセルのメインスクリーンと 4.7 インチ 1080 × 2400 ピクセルの外部スクリーンを搭載しています。マルチアングルフリーストップヒンジ設計は、さまざまなシナリオのニーズに応えます。Alibaba Cloud Model Studio Flex Fold+ — 折りたたみ画面の新時代: 革新と豪華さを兼ね備え、7.6 インチ 1800 × 2400 ピクセルのメインスクリーンと 4.7 インチ 1080 × 2400 ピクセルの外部スクリーンを搭載しています。マルチアングルフリーストップヒンジ設計は、さまざまなシナリオのニーズに応えます。512 GB のストレージ、12 GB の RAM、4700 mAh のバッテリー、そして UTG 超薄型フレキシブルガラスが、折りたたみ画面時代の新たな章を開きます。さらに、このスマートフォンはデュアル SIM デュアルスタンバイと衛星通話をサポートしており、世界のどこにいても接続を維持できます。参考小売価格: 9999–10999。各スマートフォンは職人技の傑作であり、あなたの手の中の技術芸術作品となるように設計されています。あなたのスマートな相棒を選び、未来のテクノロジーライフの新たな章を始めましょう。"
      },
      {
        "Score": 0.5050643086433411,
        "Metadata": {
          "file_path": "https://bailian-datahub-data-prod.oss-cn-beijing.aliyuncs.com/10285263/multimodal/docJson/Model_Studio_Series_Phone_Product_Introduction_1742197778230.json?Expires=1742457465&OSSAccessKeyId=TestID&Signature=ptFkSObdnBrbJNEw8CnlOSP%2FTeI%3D",
          "is_displayed_chunk_content": "true",
          "_rc_v_score": 0.6757396459579468,
          "image_url": [],
          "nid": "f05d1b51eb6b033b32a162d90a9da71b|5cb6b848be8d11eb168c031025415cc5|4f2bfb02cc9fc4e85597b2e717699207",
          "_q_score": 0.9890713450653327,
          "source": "0",
          "_score": 0.5050643086433411,
          "title": "Alibaba Cloud Model Studio スマートフォン製品紹介",
          "doc_id": "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx",
          "content": "512 GB のストレージと 16 GB の RAM を備えた最高級の構成に、6000 mAh のバッテリーと 100 W の高速充電技術を組み合わせ、パフォーマンスと耐久性の両方を提供し、技術トレンドをリードします。参考価格: 5999–6499。Alibaba Cloud Model Studio Ace Ultra — ゲーマーの選択: 6.67 インチ 1080 × 2400 ピクセルのスクリーン、10 GB の RAM、256 GB のストレージを搭載し、シルクのように滑らかなゲームプレイを保証します。液体冷却システムを備えた 5500 mAh のバッテリーは、長時間のゲームセッション中でも低温を保ちます。高ダイナミックデュアルスピーカーが、没入感のある効果音でゲーム体験をアップグレードします。参考価格: 3999–4299。Alibaba Cloud Model Studio Zephyr Z9 — 薄くてポータブルであることの芸術: 128 GB のストレージと 6 GB の RAM を備えた軽量の 6.4 インチ 1080 × 2340 ピクセル設計は、日常使用には十分すぎるほどです。4000 mAh のバッテリーにより、一日中使用しても安心です。30 倍のデジタルズームレンズが遠くのディテールを捉えます。薄くてもパワフルです。参考価格: 2499–2799。Alibaba Cloud Model Studio Flex Fold+ — 折りたたみ画面の新時代: 革新と豪華さを兼ね備え、7.6 インチ 1800 × 2400 ピクセルのメインスクリーンと 4.7 インチ 1080 × 2400 ピクセルの外部スクリーンを搭載しています。マルチアングルフリーストップヒンジ設計は、さまざまなシナリオのニーズに応えます。",
          "_rc_score": 0,
          "workspace_id": "llm-4u5xpd1xdjqpxxxx",
          "hier_title": "Alibaba Cloud Model Studio スマートフォン製品紹介",
          "_rc_t_score": 0.05158032476902008,
          "doc_name": "Alibaba Cloud Model Studio シリーズスマートフォン製品紹介",
          "pipeline_id": "mymxbdxxxx",
          "_id": "llm-4u5xpd1xdjqp8itj_mymxbd6172_file_0b21e0a852cd40cd9741c54fefbb61cd_10285263_0_1"
        },
        "Text": "512 GB のストレージと 16 GB の RAM を備えた最高級の構成に、6000 mAh のバッテリーと 100 W の高速充電技術を組み合わせ、パフォーマンスと耐久性の両方を提供し、技術トレンドをリードします。参考価格: 5999–6499。Alibaba Cloud Model Studio Ace Ultra — ゲーマーの選択: 6.67 インチ 1080 × 2400 ピクセルのスクリーン、10 GB の RAM、256 GB のストレージを搭載し、シルクのように滑らかなゲームプレイを保証します。液体冷却システムを備えた 5500 mAh のバッテリーは、長時間のゲームセッション中でも低温を保ちます。高ダイナミックデュアルスピーカーが、没入感のある効果音でゲーム体験をアップグレードします。参考価格: 3999–4299。Alibaba Cloud Model Studio Zephyr Z9 — 薄くてポータブルであることの芸術: 128 GB のストレージと 6 GB の RAM を備えた軽量の 6.4 インチ 1080 × 2340 ピクセル設計は、日常使用には十分すぎるほどです。4000 mAh のバッテリーにより、一日中使用しても安心です。30 倍のデジタルズームレンズが遠くのディテールを捉えます。薄くてもパワフルです。参考価格: 2499–2799。Alibaba Cloud Model Studio Flex Fold+ — 折りたたみ画面の新時代: 革新と豪華さを兼ね備え、7.6 インチ 1800 × 2400 ピクセルのメインスクリーンと 4.7 インチ 1080 × 2400 ピクセルの外部スクリーンを搭載しています。マルチアングルフリーストップヒンジ設計は、さまざまなシナリオのニーズに応えます。"
      }
    ]
  },
  "Code": "Success",
  "Success": "true"
}

ナレッジベースの更新

この Topic では、ドキュメント検索ナレッジベースを更新する方法について説明します。ナレッジベースを使用するアプリケーションは、更新をリアルタイムで反映します。新しいコンテンツは検索および取得可能になり、削除されたコンテンツは利用できなくなります。

API を使用して、データクエリまたはイメージ Q&A ペアナレッジベースを更新することはできません。詳細については、「ナレッジベースを更新する」をご参照ください。
  • 増分更新: 更新されたファイルのアップロード、ナレッジベースへのファイルの追加、そして古いファイルの削除の 3 つのステップに従うことができます。他のメソッドは利用できません。

  • 完全更新: ナレッジベース内の各ファイルに対して、3 つのステップを実行して更新を完了します。

  • 自動更新または同期: 詳細については、「ナレッジベースを自動的に更新または同期する方法」をご参照ください。

  • 1 回の更新でのファイル制限: 一度に 10,000 個を超えるファイルを更新しないでください。この制限を超えると、ナレッジベースが正しく更新されない可能性があります。

1. 更新されたファイルのアップロード

ナレッジベースの作成: ステップ 2 のプロシージャに従って、更新されたファイルをナレッジベースのワークスペースにアップロードします。

新しいファイルアップロードリースをリクエストして、更新されたファイル用の新しいアップロードパラメーターのセットを生成します。

2. ナレッジベースへのファイルの追加

2.1. ファイルを追加するタスクの送信

アップロードされたファイルが解析された後、SubmitIndexAddDocumentsJob 操作を呼び出して、新しいファイルをナレッジベースに追加し、ナレッジベースのインデックスを再構築できます。

タスクを送信すると、Alibaba Cloud Model Studio は非同期タスクとしてナレッジベースの再構築を開始します。この操作によって返される Data.Id はタスク ID (job_id) です。この ID は、次のステップでタスクのステータスをクエリするために使用します。

重要
  • SubmitIndexAddDocumentsJob 操作を呼び出した後、タスクは一定期間実行されます。job_id を使用してタスクのステータスをクエリできます。タスクが完了する前に再送信しないでください。

重要

Python

def submit_index_add_documents_job(client, workspace_id, index_id, file_id, source_type):
    """
    解析済みのファイルをドキュメント検索ナレッジベースに追加してインポートします。

    Parameters:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        file_id (str): ファイル ID。
        source_type(str): データの型。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    submit_index_add_documents_job_request = bailian_20231229_models.SubmitIndexAddDocumentsJobRequest(
        index_id=index_id,
        document_ids=[file_id],
        source_type=source_type
    )
    runtime = util_models.RuntimeOptions()
    return client.submit_index_add_documents_job_with_options(workspace_id, submit_index_add_documents_job_request, headers, runtime)

Java

/**
 * 解析済みのファイルをドキュメント検索ナレッジベースに追加してインポートします。
 *
 * @param client      クライアント。
 * @param workspaceId ワークスペース ID。
 * @param indexId     ナレッジベース ID。
 * @param fileId      ファイル ID。
 * @param sourceType  データの型。
 * @return Model Studio サービスからの応答。
 */
public SubmitIndexAddDocumentsJobResponse submitIndexAddDocumentsJob(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String fileId, String sourceType) throws Exception {
    Map<String, String> headers = new HashMap<>();
    SubmitIndexAddDocumentsJobRequest submitIndexAddDocumentsJobRequest = new SubmitIndexAddDocumentsJobRequest();
    submitIndexAddDocumentsJobRequest.setIndexId(indexId);
    submitIndexAddDocumentsJobRequest.setDocumentIds(Collections.singletonList(fileId));
    submitIndexAddDocumentsJobRequest.setSourceType(sourceType);
    RuntimeOptions runtime = new RuntimeOptions();
    return client.submitIndexAddDocumentsJobWithOptions(workspaceId, submitIndexAddDocumentsJobRequest, headers, runtime);
}

PHP

/**
 * 解析済みのファイルをドキュメント検索ナレッジベースに追加してインポートします。
 *
 * @param Bailian $client クライアントオブジェクト。
 * @param string $workspaceId ワークスペース ID。
 * @param string $indexId ナレッジベース ID。
 * @param string $fileId ファイル ID。
 * @param string $sourceType データの型。
 * @return SubmitIndexAddDocumentsJobResponse Model Studio サービスからの応答。
 * @throws Exception
 */
public function submitIndexAddDocumentsJob($client, $workspaceId, $indexId, $fileId, $sourceType) {
    $headers = [];
    $submitIndexAddDocumentsJobRequest = new SubmitIndexAddDocumentsJobRequest([
        "indexId" =>$indexId,
        "sourceType" => $sourceType,
        "documentIds" => [
            $fileId
        ]
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->submitIndexAddDocumentsJobWithOptions($workspaceId, $submitIndexAddDocumentsJobRequest, $headers, $runtime);
}

Node.js

/**
 * ファイルを追加するタスクを送信します。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} workspaceId - ワークスペース ID。
 * @param {string} indexId - ナレッジベース ID。
 * @param {string} fileId - ファイル ID。
 * @param {string} sourceType - データの型。
 * @returns {Promise<bailian20231229.SubmitIndexAddDocumentsJobResponse>} - Model Studio サービスからの応答。
 */
async function submitIndexAddDocumentsJob(client, workspaceId, indexId, fileId, sourceType) {
    const headers = {};
    const req = new bailian20231229.SubmitIndexAddDocumentsJobRequest({
        indexId,
        documentIds: [fileId],
        sourceType,
    });
    const runtime = new Util.RuntimeOptions({});
    return await client.submitIndexAddDocumentsJobWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// 解析済みのファイルをドキュメント検索ナレッジベースに追加してインポートします。
/// </summary>
/// <param name="client">クライアント。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="indexId">ナレッジベース ID。</param>
/// <param name="fileId">ファイル ID。</param>
/// <param name="sourceType">データの型。</param>
/// <returns>Model Studio サービスからの応答。</returns>
public AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexAddDocumentsJobResponse SubmitIndexAddDocumentsJob(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string indexId,
    string fileId,
    string sourceType)
{
    var headers = new Dictionary<string, string>() { };
    var submitIndexAddDocumentsJobRequest = new AlibabaCloud.SDK.Bailian20231229.Models.SubmitIndexAddDocumentsJobRequest
    {
        IndexId = indexId,
        DocumentIds = new List<string> { fileId },
        SourceType = sourceType
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.SubmitIndexAddDocumentsJobWithOptions(workspaceId, submitIndexAddDocumentsJobRequest, headers, runtime);
}

Go

// SubmitIndexAddDocumentsJob は、解析済みのファイルをドキュメント検索ナレッジベースに追加してインポートします。
//
// Parameters:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): ナレッジベース ID。
//   - fileId(string): ファイル ID。
//   - sourceType(string): データの型。
//
// Returns:
//   - *bailian20231229.SubmitIndexAddDocumentsJobResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func SubmitIndexAddDocumentsJob(client *bailian20231229.Client, workspaceId, indexId, fileId, sourceType string) (_result *bailian20231229.SubmitIndexAddDocumentsJobResponse, _err error) {
	headers := make(map[string]*string)
	submitIndexAddDocumentsJobRequest := &bailian20231229.SubmitIndexAddDocumentsJobRequest{
		IndexId:     tea.String(indexId),
		SourceType:  tea.String(sourceType),
		DocumentIds: []*string{tea.String(fileId)},
	}
	runtime := &util.RuntimeOptions{}
	return client.SubmitIndexAddDocumentsJobWithOptions(tea.String(workspaceId), submitIndexAddDocumentsJobRequest, headers, runtime)
}

リクエストの例

{
  "IndexId": "mymxbdxxxx",
  "SourceType": "DATA_CENTER_FILE",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx",
  "DocumentIds": [
    "file_247a2fd456a349ee87d071404840109b_10xxxxxx"
  ]
}

応答の例

{
  "Status": "200",
  "RequestId": "F693EB60-FEFC-559A-BF56-A41F52XXXXXX",
  "Message": "success",
  "Data": {
    "Id": "d8d189a36a3248438dca23c078xxxxxx"
  },
  "Code": "Success",
  "Success": "true"
}

2.2. 追加タスクの完了を待機

インデックス作成タスクの完了には時間がかかります。ピーク時には、このプロセスに数時間かかることがあります。GetIndexJobStatus 操作を呼び出して、実行ステータスをクエリできます。

応答の Data.Status フィールドの値が COMPLETED の場合、すべての更新されたファイルがナレッジベースに正常に追加されています。

応答の Documents リストには、指定した job_id によって一意に識別される追加タスクのすべてのファイルが含まれています。

重要

Python

def get_index_job_status(client, workspace_id, index_id, job_id):
    """
    インデックス作成タスクのステータスをクエリします。

    Parameters:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        job_id (str): タスク ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    get_index_job_status_request = bailian_20231229_models.GetIndexJobStatusRequest(
        index_id=index_id,
        job_id=job_id
    )
    runtime = util_models.RuntimeOptions()
    return client.get_index_job_status_with_options(workspace_id, get_index_job_status_request, headers, runtime)

Java

/**
 * インデックス作成タスクのステータスをクエリします。
 *
 * @param client      クライアントオブジェクト。
 * @param workspaceId ワークスペース ID。
 * @param jobId       タスク ID。
 * @param indexId     ナレッジベース ID。
 * @return Model Studio サービスからの応答オブジェクト。
 */
public GetIndexJobStatusResponse getIndexJobStatus(com.aliyun.bailian20231229.Client client, String workspaceId, String jobId, String indexId) throws Exception {
    Map<String, String> headers = new HashMap<>();
    com.aliyun.bailian20231229.models.GetIndexJobStatusRequest getIndexJobStatusRequest = new com.aliyun.bailian20231229.models.GetIndexJobStatusRequest();
    getIndexJobStatusRequest.setIndexId(indexId);
    getIndexJobStatusRequest.setJobId(jobId);
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    GetIndexJobStatusResponse getIndexJobStatusResponse = null;
    getIndexJobStatusResponse = client.getIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
    return getIndexJobStatusResponse;
}

PHP

/**
 * インデックス作成タスクのステータスをクエリします。
 *
 * @param Bailian $client クライアント。
 * @param string $workspaceId ワークスペース ID。
 * @param string $indexId ナレッジベース ID。
 * @param string $jobId タスク ID。
 * @return GetIndexJobStatusResponse Model Studio サービスからの応答。
 */
public function getIndexJobStatus($client, $workspaceId, $jobId, $indexId) {
    $headers = [];
    $getIndexJobStatusRequest = new GetIndexJobStatusRequest([
        'indexId' => $indexId,
        'jobId' => $jobId
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->getIndexJobStatusWithOptions($workspaceId, $getIndexJobStatusRequest, $headers, $runtime);
}

Node.js

/**
 * インデックス作成タスクのステータスをクエリします。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} workspaceId - ワークスペース ID。
 * @param {string} jobId - タスク ID。
 * @param {string} indexId - ナレッジベース ID。
 * @returns {Promise<bailian20231229.GetIndexJobStatusResponse>} - Model Studio サービスからの応答。
 */
static getIndexJobStatus(client, workspaceId, jobId, indexId) {
    const headers = {};
    const req = new bailian20231229.GetIndexJobStatusRequest({ jobId, indexId });
    const runtime = new Util.RuntimeOptions({});
    return await client.getIndexJobStatusWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// インデックス作成タスクのステータスをクエリします。
/// </summary>
/// <param name="client">クライアントオブジェクト。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="jobId">タスク ID。</param>
/// <param name="indexId">ナレッジベース ID。</param>
/// <returns>Model Studio サービスからの応答オブジェクト。</returns>
/// <exception cref="Exception">呼び出し中にエラーが発生した場合にスローされます。</exception>
public AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusResponse GetIndexJobStatus(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string jobId,
    string indexId)
{
    var headers = new Dictionary<string, string>() { };
    var getIndexJobStatusRequest = new AlibabaCloud.SDK.Bailian20231229.Models.GetIndexJobStatusRequest
    {
        IndexId = indexId,
        JobId = jobId
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.GetIndexJobStatusWithOptions(workspaceId, getIndexJobStatusRequest, headers, runtime);
}

Go

// GetIndexJobStatus は、インデックス作成タスクのステータスをクエリします。
//
// Parameters:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - jobId (string): タスク ID。
//   - indexId (string): ナレッジベース ID。
//
// Returns:
//   - *bailian20231229.GetIndexJobStatusResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func GetIndexJobStatus(client *bailian20231229.Client, workspaceId, jobId, indexId string) (_result *bailian20231229.GetIndexJobStatusResponse, _err error) {
	headers := make(map[string]*string)
	getIndexJobStatusRequest := &bailian20231229.GetIndexJobStatusRequest{
		JobId:   tea.String(jobId),
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.GetIndexJobStatusWithOptions(tea.String(workspaceId), getIndexJobStatusRequest, headers, runtime)
}

リクエストの例

{
  "IndexId": "mymxbdxxxx",
  "JobId": "76f243b9ee534d59a61f156ff0xxxxxx",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": 200,
  "Message": "success",
  "RequestId": "7F727D58-D90E-51E7-B56E-985A42XXXXXX",
  "Data": {
    "Status": "COMPLETED",
    "Documents": [
      {
        "Status": "FINISH",
        "DocId": "file_247a2fd456a349ee87d071404840109b_10xxxxxx",
        "Message": "Import successful",
        "DocName": "Alibaba Cloud Model Studio Series Mobile Phone Product Introduction",
        "Code": "FINISH"
      }
    ],
    "JobId": "76f243b9ee534d59a61f156ff0xxxxxx"
  },
  "Code": "Success",
  "Success": true
}

3. 古いファイルの削除

最後に、DeleteIndexDocument 操作を呼び出して、古いバージョンのファイルをナレッジベースから完全に削除できます。これにより、古い情報が誤って取得されるのを防ぎます。

  • file_id: 古いファイルの FileId を入力します。

説明

インポートに失敗した (INSERT_ERROR) またはインポートに成功した (FINISH) ステータスのファイルのみを削除できます。ナレッジベース内のファイルのステータスをクエリするには、ListIndexDocuments 操作を呼び出すことができます。

重要

Python

def delete_index_document(client, workspace_id, index_id, file_id):
    """
    指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを完全に削除します。

    Parameters:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。
        file_id (str): ファイル ID。

    Returns:
        Model Studio サービスからの応答。
    """
    headers = {}
    delete_index_document_request = bailian_20231229_models.DeleteIndexDocumentRequest(
        index_id=index_id,
        document_ids=[file_id]
    )
    runtime = util_models.RuntimeOptions()
    return client.delete_index_document_with_options(workspace_id, delete_index_document_request, headers, runtime)

Java

/**
 * 指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを完全に削除します。
 *
 * @param client      クライアント。
 * @param workspaceId ワークスペース ID。
 * @param indexId     ナレッジベース ID。
 * @param fileId      ファイル ID。
 * @return Model Studio サービスからの応答。
 */
public DeleteIndexDocumentResponse deleteIndexDocument(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId, String fileId) throws Exception {
    Map<String, String> headers = new HashMap<>();
    DeleteIndexDocumentRequest deleteIndexDocumentRequest = new DeleteIndexDocumentRequest();
    deleteIndexDocumentRequest.setIndexId(indexId);
    deleteIndexDocumentRequest.setDocumentIds(Collections.singletonList(fileId));
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    return client.deleteIndexDocumentWithOptions(workspaceId, deleteIndexDocumentRequest, headers, runtime);
}

PHP

/**
 * 指定されたドキュメント検索ナレッジベースからファイルを完全に削除します。
 *
 * @param Bailian $client クライアントオブジェクト。
 * @param string $workspaceId ワークスペース ID。
 * @param string $indexId ナレッジベース ID。
 * @param string $fileId ファイル ID。
 * @return mixed Model Studio サービスからの応答。
 * @throws Exception
 */
public function deleteIndexDocument($client, $workspaceId, $indexId, $fileId) {
    $headers = [];
    $deleteIndexDocumentRequest = new DeleteIndexDocumentRequest([
        "indexId" => $indexId,
        "documentIds" => [
            $fileId
        ]
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->deleteIndexDocumentWithOptions($workspaceId, $deleteIndexDocumentRequest, $headers, $runtime);
}

Node.js

/**
 * 古いファイルを削除します。
 * @param {Bailian20231229Client} client - クライアント。
 * @param {string} workspaceId - ワークスペース ID。
 * @param {string} indexId - ナレッジベース ID。
 * @param {string} fileId - ファイル ID。
 * @returns {Promise<bailian20231229.DeleteIndexDocumentResponse>} - Model Studio サービスからの応答。
 */
async function deleteIndexDocument(client, workspaceId, indexId, fileId) {
    const headers = {};
    const req = new bailian20231229.DeleteIndexDocumentRequest({
        indexId,
        documentIds: [fileId],
    });
    const runtime = new Util.RuntimeOptions({});
    return await client.deleteIndexDocumentWithOptions(workspaceId, req, headers, runtime);
}

C#

/// <summary>
/// 指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを完全に削除します。
/// </summary>
/// <param name="client">クライアント。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="indexId">ナレッジベース ID。</param>
/// <param name="fileId">ファイル ID。</param>
/// <returns>Model Studio サービスからの応答。</returns>
public AlibabaCloud.SDK.Bailian20231229.Models.DeleteIndexDocumentResponse DeleteIndexDocument(
    AlibabaCloud.SDK.Bailian20231229.Client client,
    string workspaceId,
    string indexId,
    string fileId)
{
    var headers = new Dictionary<string, string>() { };
    var deleteIndexDocumentRequest = new AlibabaCloud.SDK.Bailian20231229.Models.DeleteIndexDocumentRequest
    {
        IndexId = indexId,
        DocumentIds = new List<string> { fileId }
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.DeleteIndexDocumentWithOptions(workspaceId, deleteIndexDocumentRequest, headers, runtime);
}

Go

// DeleteIndexDocument は、指定されたドキュメント検索ナレッジベースから 1 つ以上のファイルを完全に削除します。
//
// Parameters:
//   - client (bailian20231229.Client): クライアント。
//   - workspaceId (string): ワークスペース ID。
//   - indexId (string): ナレッジベース ID。
//   - fileId (string): ファイル ID。
//
// Returns:
//   - *bailian20231229.DeleteIndexDocumentResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func DeleteIndexDocument(client *bailian20231229.Client, workspaceId, indexId, fileId string) (*bailian20231229.DeleteIndexDocumentResponse, error) {
	headers := make(map[string]*string)
	deleteIndexDocumentRequest := &bailian20231229.DeleteIndexDocumentRequest{
		IndexId:     tea.String(indexId),
		DocumentIds: []*string{tea.String(fileId)},
	}
	runtime := &util.RuntimeOptions{}
	return client.DeleteIndexDocumentWithOptions(tea.String(workspaceId), deleteIndexDocumentRequest, headers, runtime)
}

リクエストの例

{
  "DocumentIds": [
    "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx"
  ],
  "IndexId": "mymxbdxxxx",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": "200",
  "RequestId": "2D8505EC-C667-5102-9154-00B6FEXXXXXX",
  "Message": "success",
  "Data": {
    "DeletedDocument": [
      "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx"
    ]
  },
  "Code": "Success",
  "Success": "true"
}

ナレッジベースの管理

ナレッジベースの作成と使用は API 操作ではサポートされていません。これらの操作はModel Studio コンソールで実行する必要があります。

ナレッジベースの表示

ListIndices API 操作を呼び出して、指定されたワークスペース内の 1 つ以上のナレッジベースに関する情報を表示できます。

重要

Python

def list_indices(client, workspace_id):
    """
    指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。

    パラメーター:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    list_indices_request = bailian_20231229_models.ListIndicesRequest()
    runtime = util_models.RuntimeOptions()
    return client.list_indices_with_options(workspace_id, list_indices_request, headers, runtime)

Java

/**
 * 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
 *
 * @param client      クライアント。
 * @param workspaceId ワークスペース ID。
 * @return Model Studio サービスからの応答。
 */
public ListIndicesResponse listIndices(com.aliyun.bailian20231229.Client client, String workspaceId) throws Exception {
    java.util.Map<String, String> headers = new java.util.HashMap<>();
    com.aliyun.bailian20231229.models.ListIndicesRequest listIndicesRequest = new com.aliyun.bailian20231229.models.ListIndicesRequest();
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    return client.listIndicesWithOptions(workspaceId, listIndicesRequest, headers, runtime);
}

PHP

/**
 * 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
 *
 * @param Bailian $client クライアントオブジェクト。
 * @param string $workspaceId ワークスペース ID。
 * @return ListIndicesResponse Model Studio サービスからの応答。
 * @throws Exception
 */
public function listIndices($client, $workspaceId) {
    $headers = [];
    $listIndexDocumentsRequest = new ListIndexDocumentsRequest([]);
    $runtime = new RuntimeOptions([]);
    return $client->listIndicesWithOptions($workspaceId, $listIndexDocumentsRequest, $headers, $runtime);
}

Node.js

/**
 * 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
 * @param {bailian20231229.Client} client クライアント。
 * @param {string} workspaceId ワークスペース ID。
 * @returns {Promise<bailian20231229.ListIndicesResponse>} Model Studio サービスからの応答。
 */
async function listIndices(client, workspaceId) {
    const headers = {};
    const listIndicesRequest = new bailian20231229.ListIndicesRequest();
    const runtime = new Util.RuntimeOptions({});
    return await client.listIndicesWithOptions(workspaceId, listIndicesRequest, headers, runtime);
}

C#

/// <summary>
/// 指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
/// </summary>
/// <param name="client">クライアント。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <returns>Model Studio サービスからの応答。</returns>
public AlibabaCloud.SDK.Bailian20231229.Models.ListIndicesResponse ListIndices(AlibabaCloud.SDK.Bailian20231229.Client client, string workspaceId)
{
    var headers = new System.Collections.Generic.Dictionary<string, string>() { };
    var listIndicesRequest = new Bailian20231229.Models.ListIndicesRequest();
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.ListIndicesWithOptions(workspaceId, listIndicesRequest, headers, runtime);
}

Go

// listIndices は、指定されたワークスペース内の 1 つ以上のナレッジベースの詳細を取得します。
//
// パラメーター:
//   - client      *bailian20231229.Client: クライアント。
//   - workspaceId string: ワークスペース ID。
//
// 戻り値:
//   - *bailian20231229.ListIndicesResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func listIndices(client *bailian20231229.Client, workspaceId string) (_result *bailian20231229.ListIndicesResponse, _err error) {
	headers := make(map[string]*string)
	listIndicesRequest := &bailian20231229.ListIndicesRequest{}
	runtime := &util.RuntimeOptions{}
	return client.ListIndicesWithOptions(tea.String(workspaceId), listIndicesRequest, headers, runtime)
}

リクエストの例

{
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": "200",
  "RequestId": "5ACB2EB3-6C9A-5B0F-8E60-3FBE7EXXXXXX",
  "Message": "success",
  "Data": {
    "TotalCount": "1",
    "PageSize": "10",
    "PageNumber": "1",
    "Indices": [
      {
        "DocumentIds": [
          "file_0b21e0a852cd40cd9741c54fefbb61cd_10xxxxxx"
        ],
        "Description": "",
        "OverlapSize": 100,
        "SinkInstanceId": "gp-2zegk3i6ca4xxxxxx",
        "SourceType": "DATA_CENTER_FILE",
        "RerankModelName": "gte-rerank-hybrid",
        "SinkRegion": "cn-beijing",
        "Name": "Model Studio Phone Knowledge Base",
        "ChunkSize": 500,
        "EmbeddingModelName": "text-embedding-v2",
        "RerankMinScore": 0.01,
        "Id": "mymxbdxxxx",
        "SinkType": "BUILT_IN",
        "Separator": " |,|,|。|?|!|\n|\\?|\\!"
      }
    ]
  },
  "Code": "Success",
  "Success": "true"
}

ナレッジベースの削除

ナレッジベースを完全に削除するには、DeleteIndex API を呼び出します。ナレッジベースを削除する前に、関連付けられているすべての Alibaba Cloud Model Studio アプリケーションの関連付けを解除する必要があります。これは Model Studio コンソールでのみ実行できます。そうしないと、削除は失敗します。

注: この操作では、カテゴリに追加したファイルは削除されません。

重要

Python

def delete_index(client, workspace_id, index_id):
    """
    指定されたナレッジベースを完全に削除します。

    パラメーター:
        client (bailian20231229Client): クライアント。
        workspace_id (str): ワークスペース ID。
        index_id (str): ナレッジベース ID。

    戻り値:
        Model Studio サービスからの応答。
    """
    headers = {}
    delete_index_request = bailian_20231229_models.DeleteIndexRequest(
        index_id=index_id
    )
    runtime = util_models.RuntimeOptions()
    return client.delete_index_with_options(workspace_id, delete_index_request, headers, runtime)

Java

/**
 * 指定されたナレッジベースを完全に削除します。
 *
 * @param client      クライアント。
 * @param workspaceId ワークスペース ID。
 * @param indexId     ナレッジベース ID。
 * @return Model Studio サービスからの応答。
 */
public DeleteIndexResponse deleteIndex(com.aliyun.bailian20231229.Client client, String workspaceId, String indexId) throws Exception {
    java.util.Map<String, String> headers = new java.util.HashMap<>();
    com.aliyun.bailian20231229.models.DeleteIndexRequest deleteIndexRequest = new com.aliyun.bailian20231229.models.DeleteIndexRequest();
    deleteIndexRequest.setIndexId(indexId);
    com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
    return client.deleteIndexWithOptions(workspaceId, deleteIndexRequest, headers, runtime);
}

PHP

/**
 * 指定されたナレッジベースを完全に削除します。
 *
 * @param Bailian $client クライアントオブジェクト。
 * @param string $workspaceId ワークスペース ID。
 * @param string $indexId ナレッジベース ID。
 * @return mixed Model Studio サービスからの応答。
 * @throws Exception
 */
public function deleteIndex($client, $workspaceId, $indexId) {
    $headers = [];
    $deleteIndexRequest = new DeleteIndexRequest([
        "indexId" => $indexId
    ]);
    $runtime = new RuntimeOptions([]);
    return $client->deleteIndexWithOptions($workspaceId, $deleteIndexRequest, $headers, $runtime);
}

Node.js

/**
 * 指定されたナレッジベースを完全に削除します。
 * @param {bailian20231229.Client} client クライアント。
 * @param {string} workspaceId ワークスペース ID。
 * @param {string} indexId ナレッジベース ID。
 * @returns {Promise<bailian20231229.DeleteIndexResponse>} Model Studio サービスからの応答。
 */
async function deleteIndex(client, workspaceId, indexId) {
    const headers = {};
    const deleteIndexRequest = new bailian20231229.DeleteIndexRequest({
        indexId
    });
    const runtime = new Util.RuntimeOptions({});
    return await client.deleteIndexWithOptions(workspaceId, deleteIndexRequest, headers, runtime);
}

C#

/// <summary>
/// 指定されたナレッジベースを完全に削除します。
/// </summary>
/// <param name="client">クライアント。</param>
/// <param name="workspaceId">ワークスペース ID。</param>
/// <param name="indexId">ナレッジベース ID。</param>
/// <returns>Model Studio サービスからの応答。</returns>
public AlibabaCloud.SDK.Bailian20231229.Models.DeleteIndexResponse DeleteIndex(AlibabaCloud.SDK.Bailian20231229.Client client, string workspaceId, string indexId)
{
    var headers = new System.Collections.Generic.Dictionary<string, string>() { };
    var deleteIndexRequest = new Bailian20231229.Models.DeleteIndexRequest
    {
        IndexId = indexId
    };
    var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
    return client.DeleteIndexWithOptions(workspaceId, deleteIndexRequest, headers, runtime);
}

Go

// deleteIndex は、指定されたナレッジベースを完全に削除します。
//
// パラメーター:
//   - client      *bailian20231229.Client: クライアント。
//   - workspaceId string: ワークスペース ID。
//   - indexId     string: ナレッジベース ID。
//
// 戻り値:
//   - *bailian20231229.DeleteIndexResponse: Model Studio サービスからの応答。
//   - error: エラーメッセージ。
func deleteIndex(client *bailian20231229.Client, workspaceId, indexId string) (_result *bailian20231229.DeleteIndexResponse, _err error) {
	headers := make(map[string]*string)
	deleteIndexRequest := &bailian20231229.DeleteIndexRequest{
		IndexId: tea.String(indexId),
	}
	runtime := &util.RuntimeOptions{}
	return client.DeleteIndexWithOptions(tea.String(workspaceId), deleteIndexRequest, headers, runtime)

}

リクエストの例

{
  "IndexId": "mymxbdxxxx",
  "WorkspaceId": "llm-4u5xpd1xdjqpxxxx"
}

応答の例

{
  "Status": "200",
  "Message": "success",
  "RequestId": "118CB681-75AA-583B-8D84-25440CXXXXXX",
  "Code": "Success",
  "Success": "true"
}

API リファレンス

ナレッジベース API とそのリクエストおよびレスポンスパラメーターの最新かつ完全なリストについては、「API カタログ (ナレッジベース)」をご参照ください。

よくある質問

  1. ナレッジベースを自動的に更新または同期するにはどうすればよいですか。

    ドキュメント検索ナレッジベース

    これを行うには、Alibaba Cloud OSS、FC、および Model Studio ナレッジベースの API を統合する必要があります。次のステップに従ってください。

    1. バケットの作成: OSS コンソールに移動し、ソースファイルを格納するための OSS バケットを作成します。

    2. ナレッジベースの作成: ドキュメント検索ナレッジベースを作成して、非公開のナレッジコンテンツを格納します。

    3. ユーザー定義関数の作成: FC コンソールに移動し、追加や削除などのファイル変更イベント用の関数を作成します。詳細については、「関数を作成する」をご参照ください。これらの関数は、関連する ナレッジベースを更新する API を呼び出して、OSS からナレッジベースへのファイル変更を同期します。

    4. OSS トリガーの作成: FC で、前のステップで作成したユーザー定義関数に OSS トリガーを関連付けます。OSS への新しいファイルのアップロードなど、ファイルの変更イベントが検出されると、トリガーがアクティブになり、FC が関数を実行します。詳細については、「トリガー」をご参照ください。

    データクエリまたはイメージ Q&A ナレッジベース

    これはサポートされていません。

  1. 新しいナレッジベースが空なのはなぜですか。

    これは通常、インデックスジョブを送信するステップが実行されなかったか、実行に失敗したことが原因です。CreateIndex API を呼び出しても SubmitIndexJob API の呼び出しに成功しない場合、空のナレッジベースが取得されます。この場合、インデックスジョブを送信するステップを再度実行し、インデックスジョブが完了するのを待つだけで済みます。

  1. 「アップロードされたファイルへのアクセスに失敗しました。アップロード操作が成功したかどうかを確認してください」というエラーが表示された場合はどうすればよいですか。

    このエラーは通常、ファイルを一時ストレージにアップロードするステップが実行されなかったか、正常に実行されなかったことが原因で発生します。このステップが正常に実行されたことを確認した後、AddFile API 操作を呼び出すことができます。

  1. 「アクセスが拒否されました: このワークスペースにアクセスする権限がないか、ワークスペースが存在しません」というエラーが表示された場合はどうすればよいですか。

    このエラーは通常、次の理由で発生します。

    • リクエストされたエンドポイント (サービスエンドポイント) が正しくありません: たとえば、インターネット経由でサービスにアクセスする場合、中国サイト (aliyun.com) のユーザーは、パブリッククラウドの場合は北京リージョンのエンドポイントを、金融クラウドの場合は上海リージョンのエンドポイントを使用する必要があります。国際サイト (alibabacloud.com) のユーザーは、シンガポールリージョンのエンドポイントを使用する必要があります。オンラインデバッグ機能を使用している場合は、次の図に示すように、正しいエンドポイントを選択していることを確認してください。

      image

    • WorkspaceId の値が正しくないか、ワークスペースのメンバーではありません: API を呼び出す前に、WorkspaceId が正しいこと、およびワークスペースのメンバーであることを確認してください。詳細については、「ワークスペースのメンバーとして追加される方法」をご参照ください。

  1. 「指定されたアクセスキーが見つからないか、無効です」というエラーが表示された場合はどうすればよいですか。

    このエラーは通常、指定された access_key_id または access_key_secret が正しくないか、access_key_id無効化されているために発生します。API を呼び出す前に、access_key_id が正しく、無効になっていないことを確認してください。

課金

  • ナレッジベースのすべての特徴と API 呼び出しは無料です。詳細については、「ナレッジベース: 課金」をご参照ください。

  • Model Studio にインポートされたファイルなどのデータのストレージ容量は無料です。

エラーコード

この Topic の API の呼び出しが失敗してエラーメッセージが返された場合は、問題を解決するには エラーセンター をご参照ください。