Todos los productos
Search
Centro de documentos

Platform For AI:Python SDK

Última actualización: Sep 04, 2026

Este tema proporciona una referencia detallada de la API para el SDK oficial de Python e incluye ejemplos de código completos para los formatos de entrada y salida más comunes.

Nota

Para conocer los casos de uso y los principios de funcionamiento del SDK, consulte SDK for service calls.

Requisitos previos

pip install -U eas-prediction --user

Inicio rápido

Elija una clase Request que coincida con el formato de datos de entrada de su modelo. A continuación se muestra un ejemplo mínimo de una llamada de servicio integral que utiliza una solicitud de tipo cadena. Para consultar más ejemplos, vea Examples.

#!/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)

Referencia de la API

El SDK de Python proporciona las siguientes clases, agrupadas según su propósito:

Grupo

Descripción

Cliente principal

PredictClient: Configura la información del servicio, como el endpoint, el nombre del servicio y el token; además, envía solicitudes y recibe respuestas.

Entrada y salida

  • StringRequest / StringResponse: Encapsula las entradas y salidas para escenarios basados en cadenas de texto, como procesadores personalizados o modelos PMML.

  • TFRequest / TFResponse: Encapsula las solicitudes y respuestas para modelos de TensorFlow.

  • TorchRequest / TorchResponse: Encapsula las solicitudes y respuestas para modelos de PyTorch.

  • BladeRequest / BladeResponse, entre otros. Para consultar la lista completa de tipos compatibles, consulte el SDK.

Servicio de cola

  • QueueClient: Cliente de cola asíncrono que se utiliza para enviar datos, suscribirse a notificaciones push de datos y consultar el estado de la cola.

  • Watcher: Suscriptor de cola creado mediante QueueClient.watch() para recibir datos enviados por notificación push.

Parámetros comunes

Endpoint: La dirección del endpoint del servidor.

  • Para un servicio estándar, establezca este parámetro en el endpoint de puerta de enlace predeterminado. Ejemplo: 182848887922***.cn-shanghai.pai-eas.aliyuncs.com.

  • Para una solicitud de conexión directa VPC, establezca este parámetro en el endpoint de conexión directa VPC del servicio. El formato es <uid>.vpc.<region-id>.pai-eas.aliyuncs.com. Ejemplo: 182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com.

Clase PredictClient

Método

Descripción

PredictClient(endpoint, service_name, custom_url)

  • Crea un objeto PredictClient.

  • Parámetros:

    • Endpoint: La dirección del endpoint del servidor. Consulte Common parameters.

    • service_name: El nombre del servicio.

    • custom_url: La URL del servicio. Este parámetro es opcional. Úselo solo para servicios que tienen un formato de endpoint no estándar (que no sigue el formato <uid>.<region>.pai-eas.aliyuncs.com), como los servicios de interfaz web. Ejemplo: client = PredictClient(custom_url='<url>').

set_endpoint(endpoint)

  • Descripción: Establece la dirección del endpoint del servidor. Consulte Common parameters.

  • El parámetro endpoint especifica el endpoint del lado del servidor.

set_service_name(service_name)

  • Descripción: Establece el nombre del servicio al que se enviará la solicitud.

  • Parámetro: service_name. El nombre del servicio solicitado.

set_endpoint_type(endpoint_type)

  • Descripción: Establece el tipo de puerta de enlace del servidor.

  • Parámetro: endpoint_type. El tipo de puerta de enlace que se va a configurar. Se admiten los siguientes tipos de puerta de enlace:

    • ENDPOINT_TYPE_GATEWAY: La puerta de enlace predeterminada.

    • ENDPOINT_TYPE_DIRECT: Indica una solicitud de conexión directa. Si no establece este parámetro, el cliente accede al servicio a través de la puerta de enlace de forma predeterminada.

set_token(token)

  • Descripción: Establece el token de acceso para el servicio.

  • El parámetro token especifica el token de acceso al servicio.

set_retry_count(max_retry_count)

  • Descripción: Establece el número de reintentos después de que una solicitud falla.

  • El parámetro max_retry_count especifica el número de reintentos para una solicitud fallida. El valor predeterminado es 5.

    Importante

    El cliente debe reenviar las solicitudes que fallen debido a problemas intermitentes, como excepciones en los procesos del servidor, anomalías del servidor o pérdida de la conexión persistente con la puerta de enlace. Por lo tanto, no establezca este parámetro en 0.

set_max_connection_count(max_connection_count)

  • Descripción: Establece el número máximo de conexiones persistentes en el pool de conexiones del cliente. Por motivos de rendimiento, el cliente establece conexiones persistentes con el servidor y las coloca en un pool de conexiones. Para cada solicitud, el cliente obtiene una conexión inactiva del pool para acceder al servicio.

  • El parámetro max_connection_count especifica el número máximo de conexiones persistentes en el pool, con un valor predeterminado de 100.

set_timeout(timeout)

  • Descripción: Establece la duración del tiempo de espera de la solicitud.

  • Parámetro: timeout especifica el período de tiempo de espera para una solicitud en milisegundos. El valor predeterminado es 5000.

init()

Inicializa el objeto PredictClient. Después de establecer los parámetros, debe llamar al método init() para que la configuración surta efecto.

predict(request)

  • Descripción: Envía una solicitud de predicción a un servicio de predicción en línea.

  • El parámetro request es una clase abstracta, y puede pasar diferentes tipos de request, como StringRequest o TFRequest.

  • Valor de retorno: El objeto Response que corresponde a la solicitud.

Clase StringRequest

Método

Descripción

StringRequest(request_data)

  • Crea un objeto StringRequest.

  • Parámetro: request_data especifica la cadena de solicitud que se va a enviar.

Clase StringResponse

Método

Descripción

to_string()

  • Descripción: Convierte un objeto StringResponse en una cadena de texto.

  • Valor de retorno: El cuerpo de la respuesta.

Clase TFRequest

Método

Descripción

TFRequest(signature_name)

  • Crea un objeto TFRequest.

  • Parámetro: signature_name especifica el Signature Name del modelo que se va a solicitar.

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

  • Descripción: Establece los datos de input necesarios para un modelo de TensorFlow.

  • Parámetros:

    • input_name: El alias del tensor de entrada.

    • shape: La forma del tensor de entrada.

    • data_type: El tipo de datos del tensor de entrada. Los tipos compatibles son:

      • 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: El contenido del tensor de entrada, representado por un arreglo unidimensional aplanado.

add_fetch(self, output_name)

  • Descripción: Establece el alias del tensor que se generará como salida al solicitar un modelo de servicio de predicción en línea de TensorFlow.

  • El parámetro output_name especifica el alias del Tensor de salida.

    Este parámetro es opcional para modelos SavedModel. Si no se establece, se devuelven todas las outputs.

    Este parámetro es obligatorio para modelos congelados.

to_string()

  • Descripción: Serializa el objeto ProtoBuf de TFRequest en una cadena de texto.

  • Valor de retorno: La cadena serializada del objeto TFRequest.

Clase TFResponse

Método

Descripción

get_tensor_shape(output_name)

  • Descripción: Obtiene la forma del tensor de salida con el alias especificado.

  • El parámetro output_name especifica el alias del Tensor cuya forma desea obtener.

  • Valor de retorno: La forma del tensor de salida.

get_values(output_name)

  • Descripción: Obtiene el vector de datos del tensor de salida.

  • El parámetro output_name es el alias del Tensor de salida.

  • Valor de retorno: Este método devuelve la salida como un arreglo unidimensional. Utilice get_tensor_shape() para recuperar la forma del tensor y remodelar el arreglo. El método devuelve diferentes tipos de arreglos de resultados según el tipo de la output.

Clase TorchRequest

Método

Descripción

TorchRequest()

Crea un objeto TorchRequest.

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

  • Descripción: Establece el tensor de entrada necesario para un modelo de PyTorch.

  • Parámetros:

    • index: El índice del tensor de entrada.

    • shape: La forma del tensor de entrada.

    • data_type: El tipo de datos del tensor de entrada. Los tipos compatibles son:

      • 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: El contenido del tensor de entrada, representado por un arreglo unidimensional aplanado.

add_fetch(self, output_index)

  • Descripción: Establece el índice del tensor que se generará como salida al solicitar un modelo de servicio de predicción en línea de PyTorch. Este método es opcional. Si no llama a este método para establecer el índice del tensor de salida, se devuelven todas las outputs.

  • Parámetro: output_index especifica el índice del Tensor de salida.

to_string()

  • Descripción: Serializa el objeto ProtoBuf de TorchRequest en una cadena de texto.

  • Valor de retorno: La cadena serializada del objeto TorchRequest.

Clase TorchResponse

Método

Descripción

get_tensor_shape(output_index)

  • Descripción: Obtiene la forma del tensor de salida con el índice especificado.

  • Parámetros: output_index: El índice del tensor de salida cuya forma desea recuperar.

  • Valor de retorno: La forma del tensor de salida que corresponde al índice especificado.

get_values(output_index)

  • Descripción: Obtiene el vector de datos de un tensor de salida. Este método devuelve la salida como un arreglo unidimensional. Puede utilizar el método get_tensor_shape() para obtener la forma del tensor correspondiente y remodelarlo en el tensor multidimensional requerido. El método devuelve diferentes tipos de arreglos de resultados según el tipo de la output.

  • Parámetro: output_index especifica el índice del Tensor de salida que se va a recuperar.

  • Valor de retorno: El arreglo de datos del tensor resultante.

Clase QueueClient

Método

Descripción

QueueClient(endpoint, queue_name)

  • Crea un objeto QueueClient.

  • Parámetros:

    • Endpoint: La dirección del endpoint del servidor.

    • queue_name: El nombre del servicio de cola.

set_token(token)

  • Descripción: Establece el token de autenticación para el servicio de cola.

  • Parámetro: token es el token para el servicio de cola.

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

  • Descripción: Inicializa un objeto QueueClient.

  • Parámetros:

    • uid: El ID de usuario del cliente registrado en el servidor. El uid de cada instancia de cliente debe ser único. Un uid solo puede registrarse una vez. El servidor distribuye los datos enviados por notificación push de manera uniforme entre los diferentes uids.

    • Gid: El ID de grupo del cliente registrado en el servidor. De forma predeterminada, todos los clientes pertenecen al mismo grupo. Si existen diferentes grupos, se envía una copia de los mismos datos a todos los grupos.

set_logger(logger=None)

  • Descripción: Establece un objeto logger para QueueClient. De forma predeterminada, los mensajes de advertencia de ejecución se imprimen en la salida estándar. Para deshabilitar esta información, establezca el objeto logger en None.

  • Parámetro: logger. Especifica el objeto de registro que se va a configurar.

truncate(index)

  • Descripción: Trunca los datos en la cola antes del índice especificado.

  • Parámetro: index: Especifica el índice de los datos en el cual se debe truncar la cola.

put(data,tags:dict={})

  • Descripción: Escribe un dato en la cola.

  • Parámetros:

    • data: El contenido de los datos que se van a escribir en la cola.

    • tags (opcional): Las etiquetas de los datos que se van a escribir en la cola.

  • Valor de retorno:

    • index: El valor de índice de los datos escritos actualmente en la cola. Puede usar este valor para consultar datos de la cola.

    • requestId: El ID de solicitud generado automáticamente para los datos escritos actualmente en la cola. El ID de solicitud es una etiqueta especial que también se puede usar para consultar datos en la cola.

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

  • Descripción: Consulta datos de la cola según condiciones específicas.

  • Parámetros:

    • request_id: El ID de solicitud de los datos que se van a consultar. Si se especifica este parámetro, la consulta examina hasta length registros comenzando desde index. Si se encuentran datos con el ID de solicitud especificado, se devuelven. De lo contrario, se devuelve un resultado vacío.

    • index: El índice inicial de los datos que se van a consultar. El valor predeterminado es 0, lo que indica que la consulta comienza desde el primer dato en la cola.

    • length: La cantidad de datos que se van a consultar. Se devuelve un máximo de length datos, comenzando desde e incluyendo el index.

    • timeout: El tiempo de espera de la consulta. Si la cantidad de datos en la cola alcanza length dentro del tiempo de espera, los datos se devuelven inmediatamente. De lo contrario, la consulta se detiene cuando se alcanza el timeout.

    • auto_delete: Especifica si se deben eliminar automáticamente los datos consultados de la cola. Si establece este parámetro en False, puede consultar los datos repetidamente. Puede llamar al método delete() para eliminar los datos manualmente.

    • tags: Un DICT de etiquetas utilizadas para filtrar. La consulta recorre length datos comenzando desde el index especificado y devuelve los datos que contienen las etiquetas indicadas.

  • Valor de retorno: Los datos consultados de la cola, como un DataFrame.

attributes()

  • Descripción: Obtiene los atributos de la cola, como la longitud total de la cola y la longitud actual de los datos.

  • Valor de retorno: attrs: Los atributos de la cola. El tipo de datos es DICT.

delete(indexes)

  • Descripción: Elimina datos con el índice especificado de la cola.

  • Parámetro: indexes: El índice o índices de los datos que se van a quitar de la cola. Este parámetro admite un solo índice de tipo String o una lista de índices de tipo List.

search(index)

  • Descripción: Consulta la información de espera en cola de los datos.

  • Parámetros: index: El índice de los datos que se van a consultar.

  • Valor de retorno: La información de espera en cola de los datos de tipo JSONObject, que incluye los siguientes campos:

    • ConsumerId: El ID de la instancia que está procesando los datos.

    • IsPending: Indica si los datos se están procesando.

      • True indica que los datos se están procesando.

      • False indica que los datos están en la cola.

    • WaitCount: La cantidad de datos que esperan en la cola antes del dato actual. Este campo es válido solo cuando IsPending es False. Si IsPending es True, el valor es 0.

    Ejemplo de contenido devuelto:

    • La respuesta {'ConsumerId': 'eas.****', 'IsPending': False, 'WaitCount':2} indica que la solicitud está en espera en la cola.

    • El registro muestra search error:Code 404, Message: b'no data in stream' y devuelve {}. Esto indica que los datos no se encontraron en la cola. Esto puede ocurrir porque los datos ya fueron procesados correctamente por el servidor y se devolvió un resultado, o porque el parámetro index está configurado incorrectamente. Compruebe y confirme la configuración.

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

  • Descripción: Se suscribe a los datos en la cola. El servicio de cola envía datos al cliente según las condiciones especificadas.

  • Parámetros:

    • index: El índice inicial para la suscripción de datos.

    • window: El tamaño de la ventana de suscripción. Esta es la cantidad máxima de datos que el servicio de cola puede enviar a una sola instancia de cliente a la vez.

      Nota

      Si los datos enviados no se confirman (commit), el servidor no envía nuevos datos. Si se confirman N datos, la cola de servicio envía N nuevos datos al cliente. Esto garantiza que la cantidad de elementos de datos que el cliente procesa en un momento dado no exceda el tamaño de la ventana, lo cual limita la concurrencia del cliente.

    • index_only: Especifica si se debe enviar solo el valor del índice.

    • auto_commit: Especifica si se deben confirmar automáticamente los datos después de enviarse. Se recomienda establecer esto en False. Confirme los datos manualmente después de recibir los datos enviados y completar el cálculo. Si una instancia falla antes de que se complete el cálculo, el servicio de cola distribuye los datos no confirmados de esa instancia a otras instancias para su procesamiento.

  • Valor de retorno: Un objeto watcher que puede usar para leer los datos enviados.

commit(index)

  • Descripción: Confirma los datos con el índice especificado.

    Nota

    Una confirmación (commit) indica que los datos enviados por la cola de servicio han sido procesados. Luego, los datos pueden eliminarse de la cola y no necesitan enviarse a otras instancias.

  • Parámetro: index: La lista de valores de índice para los datos que se van a confirmar en la cola. Este parámetro admite un solo índice de tipo String o una lista de múltiples índices.

Clase Watcher

Método

Descripción

run()

  • Descripción: Ejecuta un Watcher, establece una conexión WebSocket con el servidor para recibir notificaciones push de datos y devuelve los resultados a quien realiza la llamada en tiempo real.

  • Valor de retorno: Un objeto DataFrame que el servicio de cola envía al cliente en tiempo real.

close()

Descripción: Cierra un objeto Watcher para finalizar la conexión de datos del backend.

Nota

Un cliente solo puede tener un Watcher activo a la vez. Debe cerrar el Watcher actual antes de iniciar uno nuevo.

Ejemplos

Ejemplo de inference síncrona (por formato de entrada y salida)

Seleccione el código de ejemplo según los tipos de entrada y salida del servicio.

String

Los usuarios que despliegan servicios con un procesador personalizado suelen utilizar cadenas de texto para las llamadas al servicio, como en el caso de los servicios de modelos PMML. A continuación se muestra un programa de ejemplo.

#!/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

Si utiliza TensorFlow, emplee TFRequest y TFResponse como formatos de datos de entrada y salida. A continuación se muestra un ejemplo de código.

#!/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

Si utiliza PyTorch, emplee TorchRequest y TorchResponse como formatos de datos de entrada y salida. A continuación se muestra un ejemplo de código.

#!/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

Si utiliza BladeProcessor, emplee BladeRequest y BladeResponse como formatos de datos de entrada y salida. A continuación se muestra un ejemplo de código.

#!/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) )

BladeProcessor compatible con la interfaz predeterminada de TensorFlow

Los usuarios de BladeProcessor pueden usar TFRequest y TFResponse como formatos de datos de entrada y salida. Estos formatos son compatibles con la interfaz predeterminada de TensorFlow de Elastic Algorithm Service (EAS). A continuación se muestra un ejemplo de código.

#!/usr/bin/env python

from eas_prediction import PredictClient
from eas_prediction.blade_tf_request import TFRequest # Need Importing 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) )

Ejemplo de llamada a un servicio mediante conexión directa VPC

Para utilizar una conexión directa, configure una Virtual Private Cloud (VPC) para el servicio. Para obtener más información, consulte Use Elastic Algorithm Service (EAS) resource groups y Access public or internal resources from EAS. Este método de llamada requiere solo una línea de código adicional en comparación con el método normal: client.set_endpoint_type(ENDPOINT_TYPE_DIRECT). Este método es ideal para servicios con alto tráfico y concurrencia. A continuación se proporciona un ejemplo de código.

#!/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__':
    # The format of a VPC direct connection endpoint is <uid>.vpc.<region-id>.pai-eas.aliyuncs.com. You can find the endpoint on the Invocation Information tab of the service details page in the EAS console.
    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)

Ejemplo: envío y suscripción a datos en un servicio de cola

Puede utilizar QueueClient para enviar datos a un servicio de cola, consultar datos, comprobar el estado del servicio y suscribirse a envíos de datos. La siguiente demostración muestra un ejemplo con dos hilos. Un hilo envía datos al servicio de cola. El otro hilo utiliza un Watcher para suscribirse a los datos enviados.

#!/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()
    queue.set_timeout(30000)

    # truncate all messages in the queue
    attributes = queue.attributes()
    if 'stream.lastEntry' in attributes:
        queue.truncate(int(attributes['stream.lastEntry']) + 1)

    count = 100
    # create a thread to send messages to the queue
    def send_thread():
        for i in range(count):
            index, request_id = queue.put('[{}]')
            print('send: ', i, index, request_id)

    # create a thread to watch messages from the queue
    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()

Manejo de excepciones y obtención del ID de solicitud

Cuando una llamada a PredictClient.predict() falla, se genera una PredictException. Esta excepción tiene solo dos atributos: code (el código de estado HTTP) y message (el mensaje de error). **No posee un atributo request_id independiente.**

La forma de obtener el ID de solicitud depende de si la petición llegó al servidor:

  • La solicitud llegó al servidor: El cuerpo de respuesta XML devuelto por el servidor está incrustado en el atributo message de la excepción. El elemento <RequestId> dentro de ese cuerpo corresponde al ID de solicitud de la llamada, y debe extraerlo mediante una expresión regular o un analizador XML. Por ejemplo, si llama a un endpoint válido con un nombre de servicio inexistente, el servidor devuelve un HTTP 404 y es posible analizar un ID de solicitud como 019FEB40-3720-5073-B3E5-4532B42EFDE9 desde message.

  • La solicitud no llegó al servidor: Si la llamada falla en la capa de red (por ejemplo, error de resolución DNS o fallo en el protocolo de enlace SSL), message no contiene un ID de solicitud. Por ejemplo, llamar a un endpoint que no se puede resolver genera una excepción cuyo code es 500 y cuyo message contiene información como Max retries exceeded y Failed to resolve. En este caso, compruebe la configuración de red y de certificados en el cliente en lugar de investigar el servidor.

El siguiente ejemplo muestra cómo capturar la excepción, leer code y analizar el ID de solicitud desde message:

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')

Si el mensaje de error indica un fallo relacionado con SSL, realice la solución de problemas de la siguiente manera:

  1. Actualice los certificados CA: ejecute pip install --upgrade certifi.

  2. Compruebe que la configuración del proxy local sea correcta y que el proxy no intercepte ni reescriba las solicitudes HTTPS.

  3. Confirme que el endpoint del servicio EAS que utiliza admita acceso HTTPS y verifique que el prefijo de protocolo del endpoint coincida con la puerta de enlace real.

Solución de problemas

Para obtener información sobre los síntomas, las causas y la solución de problemas de excepciones en llamadas del Python SDK, consulte la sección 'Solución de problemas de excepciones de llamada' en Service Call SDK. Estas excepciones incluyen problemas comunes de autenticación, enrutamiento, conexión y servidor.

Para consultar una lista completa de códigos de estado del servicio, descripciones de mensajes de error y soluciones sugeridas, consulte Appendix: Service status codes and common errors.