Todos os produtos
Search
Central de documentação

Platform For AI:SDK for Go

Última atualização: Aug 25, 2026

O SDK for Go encapsula diversos formatos de entrada e saída, incluindo TensorFlow, PyTorch e strings, além de suportar a invocação assíncrona do queue service. Este tópico descreve cada API e fornece exemplos completos de código.

Nota

Para obter informações sobre os casos de uso e os princípios de invocação do SDK, consulte Service invocation SDKs.

Pré-requisitos

A ferramenta de gerenciamento de pacotes Go baixa automaticamente o código do SDK durante a compilação. Não é necessário instalar o SDK antecipadamente. Para personalizar a lógica de invocação, primeiro baixe o código do SDK for Go e depois modifique-o.

Para importar o SDK, use o seguinte código:

import (
    "github.com/pai-eas/eas-golang-sdk/eas"
)

Início rápido

Selecione a classe Request correspondente ao formato dos dados de entrada do seu modelo. O exemplo abaixo demonstra uma invocação mínima e completa usando uma requisição do tipo string.

package main

import (
    "fmt"
    "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "my_service")
    client.SetToken("YOUR_SERVICE_TOKEN")
    client.Init()

    resp, err := client.StringPredict("[{}]")
    if err != nil {
        fmt.Printf("failed to predict: %v\n", err.Error())
    } else {
        fmt.Printf("%v\n", resp)
    }
}

Referência da API

O SDK for Go oferece as seguintes classes de API, divididas em três grupos conforme sua finalidade:

Grupo

Descrição

Cliente principal

PredictClient: Configura as informações do service (Endpoint / ServiceName / Token), envia requisições e recebe respostas.

Entrada e saída

  • TFRequest / TFResponse: Encapsula requisições e respostas para modelos TensorFlow.

  • TorchRequest / TorchResponse: Encapsula requisições e respostas para modelos PyTorch.

  • Cenários com String não exigem uma classe Request ou Response dedicada. Passe uma string para StringPredict() e receba uma string como retorno.

queue service

  • QueueClient: Cliente assíncrono de fila usado para enviar dados, inscrever-se em notificações de dados e consultar o status da fila.

  • types.Watcher: Assinante da fila criado por QueueClient.Watch() que recebe os dados enviados.

PredictClient

Classe principal do cliente usada para configurar informações do service, enviar requisições e receber resultados de previsão.

Método

Descrição

NewPredictClient(endpoint string, serviceName string) *PredictClient

  • Construtor da classe PredictClient.

  • Parâmetros:

    • endpoint: Obrigatório. Endereço do endpoint do servidor. Para um service padrão, defina este parâmetro como o endpoint de gateway padrão.

    • serviceName: Obrigatório. Nome do service.

  • Retorna: o objeto PredictClient criado.

SetEndpoint(endpointName string)

  • Define o endpoint do service.

  • endpointName especifica o endereço do endpoint do servidor. Para um service padrão, defina este parâmetro como o endpoint de gateway padrão.

SetServiceName(serviceName string)

  • Define o nome do service a ser chamado.

  • serviceName especifica o nome do service a ser chamado.

SetEndpointType(endpointType string)

  • Define o tipo de gateway para o servidor.

  • endpointType especifica o tipo de gateway. O sistema suporta os seguintes tipos:

    • "DEFAULT": Gateway padrão. Usado quando nenhum tipo de gateway é especificado.

    • "DIRECT": Acessa o service por meio de um canal de conexão direta de alta velocidade.

SetToken(token string)

  • Define o token para acesso ao service.

  • token especifica o token de autenticação usado para acessar o service.

SetHttpTransport(transport *http.Transport)

  • Define a propriedade Transport do cliente HTTP.

  • transport especifica o objeto Transport usado ao enviar requisições HTTP.

SetRetryCount(max_retry_count int)

  • Define o número de tentativas para requisições com falha.

  • max_retry_count especifica quantas vezes tentar novamente uma requisição com falha. O valor padrão é 5.

    Importante

    Se uma requisição individual falhar devido a erro no processo do servidor, erro no servidor ou queda na conexão persistente do gateway, o cliente deve reenviar a requisição. Portanto, não defina este parâmetro como 0.

SetTimeout(timeout int)

  • Define o tempo limite da requisição.

  • timeout especifica a duração do tempo limite da requisição em milissegundos (ms). O valor padrão é 5000.

Init()

Inicializa o objeto PredictClient. Após definir todos os parâmetros, chame Init() para aplicar a configuração.

Predict(request Request) Response

  • Envia uma requisição de previsão para o service de previsão online.

  • Parâmetro: o objeto Request é interface(StringRequest, TFRequest, TorchRequest).

  • Retorna: o objeto Response é interface(StringResponse, TFResponse, TorchResponse).

StringPredict(request string) string

  • Envia uma requisição de previsão para o service de previsão online.

  • request especifica a string de requisição a ser enviada.

  • Retorna: a resposta do service do tipo STRING.

TorchPredict(request TorchRequest) TorchResponse

  • Envia uma requisição de previsão PyTorch para o service de previsão online.

  • request especifica um objeto da classe TorchRequest.

  • Retorna o objeto TorchResponse correspondente.

TFPredict(request TFRequest) TFResponse

  • Envia uma requisição de previsão para o service de previsão online.

  • request especifica um objeto da classe TFRequest.

  • Retorna o objeto TFResponse correspondente.

TFRequest

Monta os dados de entrada para modelos TensorFlow.

Método

Descrição

TFRequest(signatureName string)

  • Construtor da classe TFRequest.

  • signatureName especifica o Signature Name do modelo requisitado.

AddFeed(?)(inputName string, shape []int64{}, content []?)

  • Define o tensor de entrada ao enviar uma requisição para um modelo TensorFlow no service de previsão online.

  • Parâmetros:

    • inputName: Alias do tensor de entrada.

    • shape: TensorShape do tensor de entrada.

    • content: conteúdo do tensor de entrada, expresso como um array unidimensional achatado. Os tipos suportados incluem INT32, INT64, FLOAT32, FLOAT64, STRING e BOOL. O nome do método depende do tipo de dado, por exemplo, AddFeedInt32(). Para outros tipos de dados, consulte o source code e construa a requisição no formato PB.

AddFetch(outputName string)

  • Define o alias do tensor de saída ao enviar uma requisição para um modelo TensorFlow no service de previsão online.

  • outputName especifica o alias do tensor de saída a ser recuperado.

    Para um modelo SavedModel, este parâmetro é opcional. Se não for definido, todas as saídas serão retornadas.

    Para um modelo congelado (frozen model), este parâmetro é obrigatório.

TFResponse

Analisa os dados de saída de modelos TensorFlow.

Método

Descrição

GetTensorShape(outputName string) []int64

  • Obtém o TensorShape do tensor de saída para o alias especificado.

  • outputName especifica o alias do tensor cuja forma de saída você deseja recuperar.

  • Retorna: A forma do tensor, com cada dimensão representada em um array.

Get(?)Val(outputName string)

  • Obtém o vetor de dados do tensor de saída. A saída é um array unidimensional. Use este método juntamente com GetTensorShape() para reconstruir o tensor multidimensional. Os tipos suportados incluem FLOAT, DOUBLE, INT, INT64, STRING e BOOL. O nome do método indica o tipo de dado, por exemplo, GetFloatVal().

  • outputName especifica o alias do tensor cujos dados de saída você deseja recuperar.

  • Retorna: Um array unidimensional contendo os dados achatados do tensor de saída.

TorchRequest

Monta os dados de entrada para modelos PyTorch.

Método

Descrição

TorchRequest()

Construtor da classe TorchRequest.

AddFeed(?)(index int, shape []int64{}, content []?)

  • Define o tensor de entrada ao enviar uma requisição para um modelo PyTorch no service de previsão online.

  • Parâmetros:

    • index: Índice do tensor de entrada.

    • shape: TensorShape do tensor de entrada.

    • content: conteúdo do tensor de entrada, expresso como um array unidimensional achatado. Os tipos suportados incluem INT32, INT64, FLOAT32 e FLOAT64. O nome do método depende do tipo de dado, por exemplo, AddFeedInt32(). Para outros tipos de dados, consulte o source code e construa a requisição no formato PB.

AddFetch(outputIndex int)

  • Define o índice do tensor de saída ao enviar uma requisição para um modelo PyTorch no service de previsão online. Este método é opcional. Se você não o chamar para definir o índice do tensor de saída, todas as saídas serão retornadas.

  • outputIndex especifica o índice do tensor de saída.

TorchResponse

Analisa os dados de saída de modelos PyTorch.

Método

Descrição

GetTensorShape(outputIndex int) []int64

  • Obtém o TensorShape do tensor de saída para o índice especificado.

  • outputIndex especifica o índice do tensor de saída.

  • Retorna: A forma do tensor, com cada dimensão representada em um array.

Get(?)Val(outputIndex int)

  • Obtém o vetor de dados do tensor de saída. A saída é um array unidimensional. Use este método juntamente com GetTensorShape() para reconstruir o tensor multidimensional. Os tipos suportados incluem FLOAT, DOUBLE, INT e INT64. O nome do método indica o tipo de dado, por exemplo, GetFloatVal().

  • outputIndex especifica o índice do tensor cujos dados de saída você deseja recuperar.

  • Retorna: Um array unidimensional contendo os dados achatados do tensor de saída.

QueueClient

Interage com o queue service do EAS para produzir, consumir e gerenciar dados.

Método

Descrição

NewQueueClient(endpoint, queueName, token string) (*QueueClient, error)

  • Construtor da classe QueueClient.

  • Parâmetros:

    • endpoint: Endereço do endpoint do servidor.

    • queueName: Nome do queue service.

    • token: Token para o queue service.

  • Retorna: o objeto QueueClient criado.

Truncate(ctx context.Context, index uint64) error

  • Trunca os dados na fila antes do índice especificado, mantendo apenas os dados a partir desse índice.

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • index: Índice dos dados na fila a serem truncados.

Put(ctx context.Context, data []byte, tags types.Tags) (index uint64, requestId string, err error)

  • Grava um registro na fila.

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • data: Conteúdo dos dados a serem gravados na fila.

  • Retorna:

    • index: Índice do registro de dados atual na fila. Use este índice para consultar dados na fila.

    • requestId: ID de requisição gerado automaticamente para o registro de dados. Este ID é uma tag especial que também pode ser usada para consultar o registro.

GetByIndex(ctx context.Context, index uint64) (dfs []types.DataFrame, err error)

  • Obtém um registro da fila pelo seu índice. O registro é excluído automaticamente da fila após a recuperação.

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • index: Índice dos dados a serem consultados na fila.

  • dfs: Resultado da consulta, encapsulado como um objeto DataFrame.

GetByRequestId(ctx context.Context, requestId string) (dfs []types.DataFrame, err error)

  • Obtém um registro da fila pelo seu ID de requisição. O registro é excluído automaticamente da fila após a recuperação.

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • requestId: ID de requisição dos dados a serem consultados na fila.

  • dfs: Resultado da consulta, encapsulado como um objeto DataFrame.

Get(ctx context.Context, index uint64, length int, timeout time.Duration, autoDelete bool, tags types.Tags) (dfs []types.DataFrame, err error)

  • Consulta dados na fila com base em condições especificadas. Os métodos GetByIndex() e GetByRequestId() são wrappers simples para o método Get().

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • index: Índice inicial dos dados a serem consultados.

    • length: Número de registros de dados a serem consultados. No máximo length registros a partir de index (inclusivo) são retornados.

    • timeout: Tempo de espera para a consulta. Se length registros estiverem disponíveis dentro deste período, a chamada retorna imediatamente. Caso contrário, a chamada retorna após o tempo limite ser atingido.

    • autoDelete: Valor booleano que especifica se os dados consultados devem ser excluídos automaticamente da fila. Se o valor for false, os dados podem ser consultados repetidamente. É possível excluir os dados manualmente chamando o método Del().

    • tags: Consulta dados que contenham tags especificadas. Este parâmetro é do tipo map[string]string. O sistema itera por length registros a partir do index especificado e retorna os dados que contêm as tags indicadas.

  • dfs: Resultado da consulta, encapsulado como um objeto DataFrame.

Del(ctx context.Context, indexes ...uint64)

  • Exclui dados com os índices especificados da fila.

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • indexes: Lista de índices dos dados a serem excluídos da fila.

Attributes() (attrs types.Attributes, err error)

  • Obtém as informações de atributo da fila, incluindo o comprimento total e o comprimento atual dos dados.

  • attrs: informações de atributo da fila, que são do tipo map[string]string.

Watch(ctx context.Context, index, window uint64, indexOnly bool, autocommit bool) (watcher types.Watcher, err error)

  • Inscreve-se nos dados da fila. O queue service envia dados para o cliente com base nas condições especificadas.

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • index: Índice inicial para a assinatura.

    • window: Tamanho da janela de assinatura. Representa o número máximo de registros que o queue service pode enviar para uma única instância de cliente por vez.

      Nota

      O servidor não envia novos registros até que os anteriores sejam confirmados (committed). Se você confirmar N registros, o queue service enviará mais N registros. Isso garante que o cliente não processe mais registros do que o tamanho da janela em um determinado momento e ajuda a limitar a concorrência.

    • indexOnly: Valor booleano que especifica se apenas os valores de índice devem ser enviados.

    • autocommit: Valor booleano que especifica se um registro deve ser confirmado automaticamente após ser enviado. Recomendamos definir este parâmetro como false. Após receber e processar um registro, confirme-o manualmente. Se uma instância falhar antes da confirmação, o queue service redistribuirá os dados não confirmados para outras instâncias para processamento.

  • Retorna: Um objeto watcher que pode ser usado para ler os dados enviados.

Commit(ctx context.Context, indexes ...uint64) error

  • Confirma registros com os índices especificados.

    Nota

    A confirmação indica que os dados enviados pelo queue service foram processados. O service pode então remover os dados da fila e não os enviará para outras instâncias.

  • Parâmetros:

    • ctx: Contexto para a operação atual.

    • indexes: Lista de índices dos dados a serem confirmados na fila.

types.Watcher

Lê dados enviados do canal de assinatura do queue service.

Método

Descrição

FrameChan() <-chan types.DataFrame

  • Retorna um objeto channel. Os dados enviados do servidor são gravados neste channel, a partir do qual você pode iterar para ler os dados.

  • Retorna: Um objeto channel para leitura dos dados enviados.

Close()

Fecha um objeto watcher e sua conexão de dados de backend.

Nota

Um cliente pode ter apenas um objeto watcher ativo por vez. Você deve fechar o objeto watcher atual antes de criar um novo.

Exemplos

Inferência síncrona por formato

Escolha o exemplo de código com base nos tipos de entrada e saída do seu service.

String

Ao implantar um service com um processador personalizado, a invocação geralmente ocorre usando strings, como ao chamar um service de modelo PMML. O programa abaixo mostra um exemplo completo.

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
    client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
    client.Init()
    req := "[{\"fea1\": 1, \"fea2\": 2}]"
    for i := 0; i < 100; i++ {
        resp, err := client.StringPredict(req)
        if err != nil {
            fmt.Printf("failed to predict: %v\n", err.Error())
        } else {
            fmt.Printf("%v\n", resp)
        }
    }
}

TensorFlow

Para modelos TensorFlow, use TFRequest e TFResponse como formatos de dados de entrada e saída, respectivamente. O programa abaixo mostra um exemplo completo.

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "mnist_saved_model_example")
    client.SetToken("YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****")
    client.Init()

    tfreq := eas.TFRequest{}
    tfreq.SetSignatureName("predict_images")
    tfreq.AddFeedFloat32("images", []int64{1, 784}, make([]float32, 784))

    for i := 0; i < 100; i++ {
        resp, err := client.TFPredict(tfreq)
        if err != nil {
            fmt.Printf("failed to predict: %v", err)
        } else {
            fmt.Printf("%v\n", resp)
        }
    }
}

PyTorch

Para modelos PyTorch, use TorchRequest e TorchResponse como formatos de dados de entrada e saída, respectivamente. O programa abaixo mostra um exemplo completo.

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "pytorch_resnet_example")
    client.SetTimeout(500)
    client.SetToken("ZjdjZDg1NWVlMWI2NTU5YzJiMmY5ZmE5OTBmYzZkMjI0YjlmYWVl****")
    client.Init()
    req := eas.TorchRequest{}
    req.AddFeedFloat32(0, []int64{1, 3, 224, 224}, make([]float32, 150528))
    req.AddFetch(0)
    for i := 0; i < 10; i++ {
        resp, err := client.TorchPredict(req)
        if err != nil {
            fmt.Printf("failed to predict: %v", err)
        } else {
            fmt.Println(resp.GetTensorShape(0), resp.GetFloatVal(0))
        }
    }
}

Conexão direta VPC

Com uma conexão direta VPC, você só pode acessar services implantados em um grupo de recursos dedicado do EAS, sendo necessário conectar esse grupo de recursos ao vSwitch especificado. Para obter informações sobre como adquirir um grupo de recursos dedicado do EAS e conectar a rede, consulte Use EAS resource groups e Configure EAS to access public or internal resources. Em comparação com uma invocação padrão, este método requer apenas uma linha adicional de código, client.SetEndpointType(eas.EndpointTypeDirect), tornando-o ideal para services com alto tráfego e alta concorrência. O código a seguir mostra um exemplo:

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    // Format of a VPC direct connection endpoint: {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 := eas.NewPredictClient("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
    client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
    client.SetEndpointType(eas.EndpointTypeDirect)
    client.Init()
    req := "[{\"fea1\": 1, \"fea2\": 2}]"
    for i := 0; i < 100; i++ {
        resp, err := client.StringPredict(req)
        if err != nil {
            fmt.Printf("failed to predict: %v\n", err.Error())
        } else {
            fmt.Printf("%v\n", resp)
        }
    }
}

Parâmetros de conexão do cliente

É possível definir os parâmetros de conexão do cliente de requisição usando a propriedade http.Transport. O exemplo a seguir demonstra como configurar essas definições:

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
        "net/http"
        "time"
)

func main() {
    // Format of a VPC direct connection endpoint: {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 := eas.NewPredictClient("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com", "network_test")
    client.SetToken("MDAwZDQ3NjE3OThhOTI4ODFmMjJiYzE0MDk1NWRkOGI1MmVhMGI0****")
    client.SetEndpointType(eas.EndpointTypeDirect)
    client.SetHttpTransport(&http.Transport{
        MaxConnsPerHost:       300,
        TLSHandshakeTimeout:   100 * time.Millisecond,
        ResponseHeaderTimeout: 200 * time.Millisecond,
        ExpectContinueTimeout: 200 * time.Millisecond,
    })
}

queue service

Use o QueueClient para enviar dados a um queue service, consultar dados, verificar o status do queue service e inscrever-se em notificações de dados vindas dele. Neste exemplo, uma goroutine envia dados para o queue service, enquanto outra usa um watcher para se inscrever e receber esses dados.

Nota

Ao implantar um service de inferência assíncrona no EAS, uma fila de entrada e uma fila de saída são geradas automaticamente. Os endereços seguem tipicamente os seguintes formatos:

Fila de entrada: <domain>/api/predict/<service_name>

Fila de saída: <domain>/api/predict/<service_name>/sink

Use <service_name> ou <service_name>/sink para construir o QueueClient conforme suas necessidades.

    const (
        QueueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com"
        // For example, if the EAS service name is test_qservice, the input queue name is test_qservice, and the output queue name is test_qservice/sink.
        QueueName     = "test_qservice"
        QueueToken    = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****"
    )
    queue, err := NewQueueClient(QueueEndpoint, QueueName, QueueToken)

    // truncate all messages in the queue
    attrs, err := queue.Attributes()
    if index, ok := attrs["stream.lastEntry"]; ok {
        idx, _ := strconv.ParseUint(index, 10, 64)
        queue.Truncate(context.Background(), idx+1)
    }

    ctx, cancel := context.WithCancel(context.Background())

    // create a goroutine to send messages to the queue
    go func() {
        i := 0
        for {
            select {
            case <-time.NewTicker(time.Microsecond * 1).C:
                _, _, err := queue.Put(context.Background(), []byte(strconv.Itoa(i)), types.Tags{})
                if err != nil {
                    fmt.Printf("Error occured, retry to handle it: %v\n", err)
                }
                i += 1
            case <-ctx.Done():
                break
            }
        }
    }()

    // create a watcher to watch the messages from the queue
    watcher, err := queue.Watch(context.Background(), 0, 5, false, false)
    if err != nil {
        fmt.Printf("Failed to create a watcher to watch the queue: %v\n", err)
        return
    }

    // read messages from the queue and commit manually
    for i := 0; i < 100; i++ {
        df := <-watcher.FrameChan()
        err := queue.Commit(context.Background(), df.Index.Uint64())
        if err != nil {
            fmt.Printf("Failed to commit index: %v(%v)\n", df.Index, err)
        }
    }

    // everything is done, close the watcher
    watcher.Close()
    cancel()

Solução de problemas

Para sintomas, causas e diretrizes de solução de problemas relacionados a exceções de invocação do SDK for Go, incluindo questões comuns de autenticação, roteamento, conexões e servidor, consulte a seção "Solucionar exceções de invocação" em Service invocation SDKs.

Para obter uma lista completa de códigos de status do service, mensagens de erro e ações recomendadas, consulte Appendix: Service status codes and common errors.