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

Platform For AI:Python SDK

最終更新日:Aug 18, 2026

このトピックでは、公式の Python SDK の詳細な API リファレンスと、一般的な入力および出力フォーマット向けの完全なコード例を掲載しています。

説明

SDK のユースケースと動作原理については、「サービス呼び出し用SDK」をご参照ください。

前提条件

pip install -U eas-prediction --user

クイックスタート

モデルの入力データ形式に一致する Request クラスを選択します。 次のコードは、文字列リクエストを使用するエンドツーエンドのサービスコールの最小限の例です。 詳細については、「」をご参照ください。

#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import StringRequest

if __name__ == '__main__':
    client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'my_service')
    client.set_token('YOUR_SERVICE_TOKEN')
    client.init()

    request = StringRequest('[{}]')
    resp = client.predict(request)
    print(resp)

API リファレンス

Python SDK は、目的に応じてグループ化された次のクラスを提供します。

グループ

説明

メインクライアント

PredictClient: エンドポイント、サービス名、トークンなどのサービス情報を設定し、リクエストを送信してレスポンスを受信します。

入力と出力

  • StringRequest / StringResponse: カスタムプロセッサや PMML モデルなど、文字列ベースのシナリオの入力と出力をカプセル化します。

  • TFRequest / TFResponse: TensorFlow モデルのリクエストとレスポンスをカプセル化します。

  • TorchRequest / TorchResponse: PyTorch モデルのリクエストとレスポンスをカプセル化します。

  • BladeRequest / BladeResponse などがあります。サポートされている全タイプの一覧については、SDK を参照してください。

キューサービス

  • QueueClient: 非同期キュークライアントであり、データの送信、データプッシュのサブスクライブ、キュー状態のクエリに使用します。

  • WatcherQueueClient.watch() で作成されるキューサブスクライバーで、プッシュされたデータを受信します。

共通パラメーター

エンドポイント:サーバーのエンドポイントアドレスです。

  • 標準サービスの場合、このパラメーターをデフォルトゲートウェイのエンドポイントに設定します。例: 182848887922***.cn-shanghai.pai-eas.aliyuncs.com

  • VPC 専用接続リクエストの場合、このパラメーターをサービスの VPC 専用接続エンドポイントに設定します。フォーマットは <uid>.vpc.<region-id>.pai-eas.aliyuncs.com です。例: 182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com

PredictClient クラス

メソッド

説明

PredictClient(endpoint, service_name, custom_url)

  • PredictClient オブジェクトを作成します。

  • パラメーター:

    • エンドポイント: サーバーのエンドポイントアドレスです。「共通パラメーター」をご参照ください。

    • service_name: サービスの名前です。

    • custom_url: サービスの URL です。このパラメーターはオプションです。標準のエンドポイント形式 (<uid>.<region>.pai-eas.aliyuncs.com) ではないサービス (Web UI サービスなど) でのみ使用します。例: client = PredictClient(custom_url='<url>')

set_endpoint(endpoint)

  • 説明: サーバーのエンドポイントアドレスを設定します。「共通パラメーター」をご参照ください。

  • endpoint パラメーターで、サーバー側のエンドポイントを指定します。

set_service_name(service_name)

  • 説明: リクエストするサービスの名前を設定します。

  • パラメーター: service_name。リクエストするサービスの名前です。

set_endpoint_type(endpoint_type)

  • 説明: サーバーのゲートウェイタイプを設定します。

  • パラメーター: endpoint_type。設定するゲートウェイのタイプ。サポートされているタイプは次のとおりです:

    • ENDPOINT_TYPE_GATEWAY: デフォルトゲートウェイです。

    • ENDPOINT_TYPE_DIRECT: 直接接続リクエストを示します。このパラメーターを設定しない場合、クライアントはデフォルトでゲートウェイ経由でサービスにアクセスします。

set_token(token)

  • 説明: サービスのアクセストークンを設定します。

  • token パラメーターでサービスのアクセストークンを指定します。

set_retry_count(max_retry_count)

  • 説明: リクエストが失敗した場合の再試行回数を設定します。

  • max_retry_count パラメーターは、失敗したリクエストの再試行回数を指定します。デフォルト値は 5 です。

    重要

    サーバー側のプロセス例外、サーバーの異常、ゲートウェイへの永続的な接続の切断などの断続的な問題でリクエストが失敗した場合、クライアントはリクエストを再送信する必要があります。そのため、このパラメーターを 0 に設定しないでください。

set_max_connection_count(max_connection_count)

  • 説明: クライアントのコネクションプール内の永続的な接続の最大数を設定します。パフォーマンス上の理由から、クライアントはサーバーとの永続的な接続を確立し、それらをコネクションプールに配置します。各リクエストに対して、クライアントはコネクションプールからアイドル接続を取得してサービスにアクセスします。

  • max_connection_count パラメーターは、コネクションプール内の永続的な接続の最大数を指定します。デフォルト値は 100 です。

set_timeout(timeout)

  • 説明: リクエストタイムアウト期間を設定します。

  • パラメーター: timeout は、リクエストのタイムアウト期間をミリ秒単位で指定します。デフォルト値は 5000 です。

init()

PredictClient オブジェクトを初期化します。パラメーターを設定した後、設定を有効にするには init() メソッドを呼び出す必要があります。

predict(request)

  • 説明: オンライン予測サービスに予測リクエストを送信します。

  • request パラメーターは抽象クラスであり、StringRequest や TFRequest など、さまざまなタイプの request を渡すことができます。

  • 戻り値: リクエストに対応する Response オブジェクトです。

StringRequest クラス

メソッド

説明

StringRequest(request_data)

  • StringRequest オブジェクトを作成します。

  • パラメーター: request_data は、送信するリクエスト文字列を指定します。

StringResponse クラス

メソッド

説明

to_string()

  • 説明: StringResponse オブジェクトを文字列に変換します。

  • 戻り値: レスポンスボディです。

TFRequest クラス

メソッド

説明

TFRequest(signature_name)

  • TFRequest オブジェクトを作成します。

  • パラメーター: signature_name は、リクエストするモデルの Signature Name を指定します。

add_feed(self, input_name, shape, data_type, content)

  • 説明: TensorFlow モデルに必要な input データを設定します。

  • パラメーター:

    • input_name: 入力テンソルのエイリアスです。

    • shape: 入力テンソルの形状です。

    • data_type: 入力テンソルのデータ型です。サポートされている型は次のとおりです:

      • TFRequest.DT_FLOAT

      • TFRequest.DT_DOUBLE

      • TFRequest.DT_INT8

      • TFRequest.DT_INT16

      • TFRequest.DT_INT32

      • TFRequest.DT_INT64

      • TFRequest.DT_STRING

      • TFRequest.TF_BOOL

    • content: フラット化された 1 次元配列で表される入力テンソルの内容です。

add_fetch(self, output_name)

  • 説明: TensorFlow オンライン予測サービスモデルをリクエストするときに出力されるテンソルのエイリアスを設定します。

  • output_name パラメーターは、出力テンソルのエイリアスを指定します。

    このパラメーターは SavedModel モデルではオプションです。このパラメーターが設定されていない場合、すべての outputs が返されます。

    このパラメーターは frozen モデルでは必須です。

to_string()

  • 説明: TFRequest Protobuf オブジェクトを文字列にシリアル化します。

  • 戻り値: TFRequest オブジェクトのシリアル化された文字列です。

TFResponse クラス

メソッド

説明

get_tensor_shape(output_name)

  • 説明: 指定されたエイリアスを持つ出力テンソルの形状を取得します。

  • output_name パラメーターは、形状を取得したいテンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルの形状です。

get_values(output_name)

  • 説明: 出力テンソルのデータベクトルを取得します。

  • output_name パラメーターは、出力テンソルのエイリアスです。

  • 戻り値: このメソッドは、出力を 1 次元配列として返します。get_tensor_shape() を使用してテンソルの形状を取得して配列を再形成できます。このメソッドは、output のタイプに基づいて、さまざまなタイプの結果配列を返します。

TorchRequest クラス

メソッド

説明

TorchRequest()

TorchRequest オブジェクトを作成します。

add_feed(self, index, shape, data_type, content)

  • 説明: PyTorch モデルに必要な入力テンソルを設定します。

  • パラメーター:

    • index: 入力テンソルのインデックスです。

    • shape: 入力テンソルの形状です。

    • data_type: 入力テンソルのデータ型です。サポートされている型は次のとおりです:

      • TorchRequest.DT_FLOAT

      • TorchRequest.DT_DOUBLE

      • TorchRequest.DT_INT8

      • TorchRequest.DT_INT16

      • TorchRequest.DT_INT32

      • TorchRequest.DT_INT64

      • TorchRequest.DT_STRING

      • TorchRequest.TF_BOOL

    • content: フラット化された 1 次元配列で表される入力テンソルの内容です。

add_fetch(self, output_index)

  • 説明: PyTorch オンライン予測サービスモデルをリクエストするときに出力されるテンソルのインデックスを設定します。このメソッドはオプションです。このメソッドを呼び出して出力テンソルのインデックスを設定しない場合、すべての outputs が返されます。

  • パラメーター: output_index は、出力テンソルのインデックスを指定します。

to_string()

  • 説明: TorchRequest Protobuf オブジェクトを文字列にシリアル化します。

  • 戻り値: TorchRequest オブジェクトのシリアル化された文字列です。

TorchResponse クラス

メソッド

説明

get_tensor_shape(output_index)

  • 説明: 指定されたインデックスを持つ出力テンソルの形状を取得します。

  • パラメーター: output_index: 形状を取得したい出力テンソルのインデックスです。

  • 戻り値: 指定されたインデックスに対応する出力テンソルの形状です。

get_values(output_index)

  • 説明: 出力テンソルのデータベクトルを取得します。このメソッドは、出力を 1 次元配列として返します。get_tensor_shape() メソッドを使用して対応するテンソルの形状を取得して、必要な多次元テンソルに再形成できます。このメソッドは、output のタイプに基づいて、さまざまなタイプの結果配列を返します。

  • パラメーター: output_index は、取得する出力テンソルのインデックスを指定します。

  • 戻り値: 結果のテンソルのデータ配列です。

QueueClient クラス

メソッド

説明

QueueClient(endpoint, queue_name)

  • QueueClient オブジェクトを作成します。

  • パラメーター:

    • エンドポイント: サーバーのエンドポイントアドレスです。

    • queue_name: キューサービスの名前です。

set_token(token)

  • 説明: キューサービスの認証トークンを設定します。

  • パラメーター: token はキューサービスのトークンです。

init(uid=None,gid='eas')

  • 説明: QueueClient オブジェクトを初期化します。

  • パラメーター:

    • uid: サーバーに登録されているクライアントのユーザー ID です。各クライアントインスタンスの uid は一意である必要があります。uid は一度しか登録できません。サーバーは、プッシュされたデータを異なる uid 間で均等に分散します。

    • gid: サーバーに登録されているクライアントのグループ ID です。デフォルトでは、すべてのクライアントが同じグループに属します。異なるグループが存在する場合、同じデータのコピーがすべてのグループにプッシュされます。

set_logger(logger=None)

  • 説明: QueueClient のロガーオブジェクトを設定します。デフォルトでは、ランタイムの警告メッセージは標準出力に出力されます。この情報を無効にするには、ロガーオブジェクトを None に設定します。

  • パラメーター: logger。設定するロギングオブジェクトを指定します。

truncate(index)

  • 説明: 指定されたインデックスより前のキュー内のデータを切り捨てます。

  • パラメーター: index: キューを切り捨てるデータのインデックスを指定します。

put(data,tags:dict={})

  • 説明: キューにデータを書き込みます。

  • パラメーター:

    • data: キューに書き込むデータの内容です。

    • tags (オプション): キューに書き込むデータのタグです。

  • 戻り値:

    • index: 書き込まれたデータのキュー内でのインデックス値です。この値を使用して、キューからデータをクエリできます。

    • requestId: 書き込まれたデータのキュー内で自動生成されたリクエスト ID です。リクエスト ID は特別なタグであり、キュー内のデータをクエリするためにも使用できます。

get(request_id=None, index=0, length=1, timeout='5s', auto_delete=True, tags={})

  • 説明: 指定された条件に基づいてキューからデータをクエリします。

  • パラメーター:

    • request_id: クエリするデータのリクエスト ID です。このパラメーターを指定すると、クエリは index から始まる最大 length レコードをスキャンします。指定されたリクエスト ID のデータが見つかった場合は返されます。それ以外の場合は、空の結果が返されます。

    • index: クエリを開始するデータの開始インデックスです。デフォルト値は 0 で、キューの最初のデータからクエリが開始されることを示します。

    • length: クエリするデータの数です。index を含め、そこから最大 length 個のデータが返されます。

    • timeout: クエリの待機時間です。待機時間内にキュー内のデータ数が length に達した場合、データはすぐに返されます。それ以外の場合、クエリは timeout に達すると停止します。

    • auto_delete: クエリされたデータをキューから自動的に削除するかどうかを指定します。このパラメーターを False に設定すると、データを繰り返しクエリできます。delete() メソッドを呼び出して、データを手動で削除できます。

    • tags: フィルタリングに使用されるタグの DICT です。クエリは、指定された index から始まる length 個のデータを走査し、指定されたタグを含むデータを返します。

  • 戻り値: キューからクエリされたデータ (DataFrame として)。

attributes()

  • 説明: キューの属性 (キューの全長や現在のデータ長など) を取得します。

  • 戻り値: attrs: キューの属性です。データ型は DICT です。

delete(indexes)

  • 説明: 指定されたインデックスを持つデータをキューから削除します。

  • パラメーター: indexes: キューから削除するデータのインデックスです。このパラメーターには、String 型の単一インデックス、または List 型のインデックスリストを指定できます。

search(index)

  • 説明: データのキューイング情報をクエリします。

  • パラメーター: index: クエリするデータのインデックスです。

  • 戻り値: JSONObject 型のデータキューイング情報。次のフィールドが含まれます:

    • ConsumerId: データを処理しているインスタンスの ID です。

    • IsPending: データが処理中かどうかを示します。

      • True は、データが処理中であることを示します。

      • False は、データがキュー内にあることを示します。

    • WaitCount: このデータ項目の前にキューで待機しているデータ数です。このフィールドは IsPendingFalse の場合にのみ有効です。IsPendingTrue の場合、値は 0 です。

    返される内容の例:

    • レスポンス {'ConsumerId': 'eas.****', 'IsPending': False, 'WaitCount':2} は、リクエストがキューイングされていることを示します。

    • ログに search error:Code 404, Message: b'no data in stream' と表示され、{} が返された場合、キューでデータが見つからなかったことを示します。これは、データがサーバーによって正常に処理されて結果が返されたか、または index パラメーターが正しく設定されていないことが原因である可能性があります。ご確認ください。

watch(index, window, index_only=False, auto_commit=False)

  • 説明: キュー内のデータをサブスクライブします。キューサービスは、指定された条件に基づいてクライアントにデータをプッシュします。

  • パラメーター:

    • index: データサブスクリプションの開始インデックスです。

    • window: サブスクリプションウィンドウのサイズです。これは、キューサービスが一度に 1 つのクライアントインスタンスにプッシュできるデータの最大量です。

      説明

      プッシュされたデータがコミットされない場合、サーバーは新しいデータをプッシュしません。N 個のデータがコミットされると、サービスキューは N 個の新しいデータをクライアントにプッシュします。これにより、クライアントが一度に処理するデータ項目数がウィンドウサイズを超えないようになり、クライアントの同時実行数が制限されます。

    • index_only: インデックス値のみをプッシュするかどうかを指定します。

    • auto_commit: プッシュされた後、データを自動的にコミットするかどうかを指定します。これを False に設定することを推奨します。プッシュされたデータを受信して計算が完了したら、手動でデータをコミットしてください。計算が完了する前にインスタンスが失敗した場合、インスタンス上のコミットされていないデータは、キューサービスによって他のインスタンスに分散されて処理されます。

  • 戻り値: プッシュされたデータを読み取るために使用できる watcher オブジェクトです。

commit(index)

  • 説明: 指定されたインデックスを持つデータをコミットします。

    説明

    コミットは、サービスキューによってプッシュされたデータが処理されたことを示します。データはキューからクリアされ、他のインスタンスにプッシュする必要はありません。

  • パラメーター: index: キューにコミットするデータのインデックスを指定します。このパラメーターには、String 型の単一インデックス、または複数のインデックスを含むリストを指定できます。

Watcher クラス

メソッド

説明

run()

  • 説明: Watcher を実行し、サーバーとの WebSocket 接続を確立してデータプッシュを受信し、結果をリアルタイムで呼び出し元に返します。

  • 戻り値: キューサービスからクライアントにリアルタイムでプッシュされる DataFrame オブジェクトです。

close()

説明: Watcher オブジェクトを閉じて、バックエンドのデータ接続を終了します。

説明

クライアントは、一度に 1 つのアクティブな Watcher しか持つことができません。新しい Watcher を開始する前に、現在の Watcher を閉じる必要があります。

同期推論の例 (入出力フォーマット別)

サービスの入出力タイプに基づいてサンプルコードを選択してください。

文字列

カスタムプロセッサでサービスをデプロイするユーザーは、通常、PMML モデルサービスなどのサービスコールに文字列を使用します。以下はサンプルコードです。

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import StringRequest

if __name__ == '__main__':
    client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'scorecard_pmml_example')
    client.set_token('YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****')
    client.init()

    request = StringRequest('[{"fea1": 1, "fea2": 2}]')
    for x in range(0, 1000000):
        resp = client.predict(request)
        print(resp)

TensorFlow

TensorFlow を使用する場合、入出力データフォーマットとして TFRequest と TFResponse を使用します。以下はサンプルコードです。

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest

if __name__ == '__main__':
    client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
    client.set_token('YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****')
    client.init()

    #request = StringRequest('[{}]')
    req = TFRequest('predict_images')
    req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
    for x in range(0, 1000000):
        resp = client.predict(req)
        print(resp)

PyTorch

PyTorch を使用する場合、入出力データフォーマットとして TorchRequest と TorchResponse を使用します。以下はサンプルコードです。

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import TorchRequest

if __name__ == '__main__':
    client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'pytorch_gpu_wl')
    client.init()

    req = TorchRequest()
    req.add_feed(0, [1, 3, 224, 224], TorchRequest.DT_FLOAT, [1] * 150528)
    # req.add_fetch(0)
    import time
    st = time.time()
    timer = 0
    for x in range(0, 10):
        resp = client.predict(req)
        timer += (time.time() - st)
        st = time.time()
        print(resp.get_tensor_shape(0))
        # print(resp)
    print("average response time: %s s" % (timer / 10) )

BladeProcessor

BladeProcessor を使用する場合、入出力データフォーマットとして BladeRequest と BladeResponse を使用します。以下はサンプルコードです。

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import BladeRequest

if __name__ == '__main__':
    client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
    client.init()

    req = BladeRequest()

    req.add_feed('input_data', 1, [1, 360, 128], BladeRequest.DT_FLOAT, [0.8] * 85680)
    req.add_feed('input_length', 1, [1], BladeRequest.DT_INT32, [187])
    req.add_feed('start_token', 1, [1], BladeRequest.DT_INT32, [104])
    req.add_fetch('output', BladeRequest.DT_FLOAT)
    import time
    st = time.time()
    timer = 0
    for x in range(0, 10):
        resp = client.predict(req)
        timer += (time.time() - st)
        st = time.time()
        # print(resp)
        # print(resp.get_values('output'))
        print(resp.get_tensor_shape('output'))
    print("average response time: %s s" % (timer / 10) )

デフォルトの TensorFlow インターフェイスと互換性のある BladeProcessor

BladeProcessor ユーザーは、TFRequest と TFResponse を入力および出力データ形式として使用できます。これらの形式は、Elastic Algorithm Service (EAS) のデフォルトの TensorFlow インターフェイスと互換性があります。以下にサンプルコードを示します。

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction.blade_tf_request import TFRequest # blade の TFRequest をインポートする必要があります

if __name__ == '__main__':
    client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'nlp_model_example')
    client.init()

    req = TFRequest(signature_name='predict_words')

    req.add_feed('input_data', [1, 360, 128], TFRequest.DT_FLOAT, [0.8] * 85680)
    req.add_feed('input_length', [1], TFRequest.DT_INT32, [187])
    req.add_feed('start_token', [1], TFRequest.DT_INT32, [104])
    req.add_fetch('output')
    import time
    st = time.time()
    timer = 0
    for x in range(0, 10):
        resp = client.predict(req)
        timer += (time.time() - st)
        st = time.time()
        # print(resp)
        # print(resp.get_values('output'))
        print(resp.get_tensor_shape('output'))
    print("average response time: %s s" % (timer / 10) )

VPC ダイレクト接続を使用したサービス呼び出しの例

ダイレクト接続を使用するには、サービス用に仮想プライベートクラウド (VPC) を設定する必要があります。詳細については、「Elastic Algorithm Service (EAS) のリソースグループの使用」および「EASからパブリックリソースまたは内部リソースへのアクセス」をご参照ください。この呼び出し方法は、通常の方法と比較して、コードを 1 行追加するだけで済みます:client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)。この方法は、トラフィックと同時実行数が多いサービスに最適です。以下はサンプルコードです。

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction import StringRequest
from eas_prediction import TFRequest
from eas_prediction import ENDPOINT_TYPE_DIRECT

if __name__ == '__main__':
    # VPC ダイレクト接続のエンドポイント形式は .vpc..pai-eas.aliyuncs.com です。エンドポイントは、EAS コンソールのサービス詳細ページの [Invocation Information] タブで確認できます。
    client = PredictClient('http://182848887922****.vpc.cn-hangzhou.pai-eas.aliyuncs.com', 'mnist_saved_model_example')
    client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****')
    client.set_endpoint_type(ENDPOINT_TYPE_DIRECT)
    client.init()

    request = TFRequest('predict_images')
    request.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
    for x in range(0, 1000000):
        resp = client.predict(request)
        print(resp)

例:キューサービスへのデータ送信とサブスクライブ

QueueClient を使用すると、キューサービスへのデータ送信、データのクエリ、サービスステータスの確認、データプッシュのサブスクライブができます。以下のサンプルコードは、2 つのスレッドを使用する例です。一方のスレッドがキューサービスにデータを送信し、もう一方のスレッドが Watcher を使用してプッシュされたデータをサブスクライブします。

#!/usr/bin/env python

from eas_prediction import QueueClient
import threading

if __name__ == '__main__':
    endpoint = '182848887922****.cn-shanghai.pai-eas.aliyuncs.com'
    queue_name = 'test_group.qservice/sink'
    token = 'YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****'

    queue = QueueClient(endpoint, queue_name)
    queue.set_token(token)
    queue.init()

    # キュー内のすべてのメッセージをトランケートします
    attributes = queue.attributes()
    if 'stream.lastEntry' in attributes:
        queue.truncate(int(attributes['stream.lastEntry']) + 1)

    count = 100
    # キューにメッセージを送信するスレッドを作成します
    def send_thread():
        for i in range(count):
            index, request_id = queue.put('[{}]')
            print('send: ', i, index, request_id)

    # キューからのメッセージを監視するスレッドを作成します
    def watch_thread():
        watcher = queue.watch(0, 5, auto_commit=True)
        i = 0
        for x in watcher.run():
            print('recv: ', i, x.index, x.tags['requestId'])
            i += 1
            if i == count:
                break
        watcher.close()

    thread1 = threading.Thread(target=watch_thread)
    thread2 = threading.Thread(target=send_thread)

    thread1.start()
    thread2.start()

    thread1.join()
    thread2.join()

例外処理とリクエスト ID の取得

PredictClient.predict() の呼び出しが失敗すると、PredictException がスローされます。この例外には、code (HTTP ステータスコード) と message (エラーメッセージ) の 2 つの属性のみがあります。個別の request_id 属性はありません。

リクエスト ID を取得する方法は、リクエストがサーバーに到達したかどうかによって異なります。

  • リクエストがサーバーに到達した場合:サーバーから返される XML レスポンスボディが、例外の message 属性に埋め込まれています。そのボディ内の <RequestId> 要素が呼び出しのリクエスト ID となっており、正規表現または XML パーサーを使用して抽出する必要があります。たとえば、存在しないサービス名を使用して有効なエンドポイントを呼び出すと、サーバーから HTTP 404 が返され、message から 019FEB40-3720-5073-B3E5-4532B42EFDE9 などのリクエスト ID を解析できます。

  • リクエストがサーバーに到達しなかった場合:ネットワーク層で呼び出しが失敗した場合 (DNS 名前解決の失敗や SSL ハンドシェイクの失敗など) 、message にはリクエスト ID が含まれません。たとえば、解決できないエンドポイントを呼び出すと、code が 500 で、message には Max retries exceededFailed to resolve などの情報を含む例外が発生します。この場合、サーバーを調査するのではなく、クライアント側のネットワークと証明書の設定を確認してください。

次の例は、例外をキャッチし、code を読み取り、message からリクエスト ID を解析する方法を示しています。

from eas_prediction import PredictClient, StringRequest, PredictException
import re

client = PredictClient('http://pai-eas.cn-shanghai.aliyuncs.com', 'your_service')
client.set_token('your_token')
client.init()

req = StringRequest('{"input": "test"}')
try:
    resp = client.predict(req)
    print(resp.to_string())
except PredictException as e:
    print('Error code:', e.code)
    msg = e.message.decode('utf-8') if isinstance(e.message, bytes) else str(e.message)
    match = re.search(r'<RequestId>(.*?)</RequestId>', msg)
    if match:
        print('Request ID:', match.group(1))
    else:
        print('No request ID: the request may not have reached the server')

エラーメッセージが SSL 関連の障害を示している場合は、次の手順でトラブルシューティングを行ってください。

  1. CA 証明書をアップグレードするには、 pip install --upgrade certifi を実行してください。

  2. ローカルのプロキシ設定が正しいこと、およびプロキシが HTTPS リクエストをインターセプトまたは書き換えないことを確認してください。

  3. 使用している EAS サービスエンドポイントが HTTPS アクセスをサポートしていること、およびエンドポイントのプロトコルプレフィックスが実際のゲートウェイと一致していることを確認してください。

トラブルシューティング

Python SDK の呼び出しによる例外の症状、原因、トラブルシューティングについては、「Service Call SDK」の「Troubleshooting call exceptions」セクションをご参照ください。これらの例外には、認証、ルーティング、接続、サーバーに関する一般的な問題が含まれます。

サービスステータスコード、エラーメッセージの説明、推奨ソリューションの完全なリストについては、「付録:サービスステータスコードと一般的なエラー」をご参照ください。