Todos os produtos
Search
Central de documentação

Platform For AI:SDK for Go

Última atualização: Jun 27, 2026

Este guia explica as APIs do SDK for Go oficial e fornece exemplos completos de código para formatos comuns de entrada e saída.

Nota

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

Pré-requisitos

Ao chamar um serviço de inferência com o SDK for Go, o gerenciador de pacotes Go baixa automaticamente o código-fonte do SDK do GitHub durante a compilação. Não é necessário instalar o SDK previamente. Para personalizar a lógica de invocação, baixe o código-fonte do SDK for Go e modifique-o localmente.

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 modelo. O exemplo a seguir demonstra uma invocação mínima e de ponta a ponta 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 classes abaixo, organizadas por finalidade:

Grupo

Descrição

Cliente principal

PredictClient: Configura informações do serviço, como endpoint, nome do serviço e token, além de enviar requisições e receber 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.

  • Em cenários baseados em string, não são necessárias classes dedicadas de Request ou Response. Passe uma string diretamente ao método StringPredict() e receba uma resposta em string.

Serviço de fila

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

  • types.Watcher: Um observador, criado por QueueClient.Watch(), que recebe dados enviados via push.

PredictClient

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

Método

Descrição

NewPredictClient(endpoint string, serviceName string) *PredictClient

  • Cria um objeto PredictClient.

  • Parâmetros:

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

    • serviceName: Obrigatório. Nome do serviço.

  • Retorna um objeto PredictClient.

SetEndpoint(endpointName string)

  • Define o endpoint do serviço.

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

SetServiceName(serviceName string)

  • Define o nome do serviço a ser chamado.

  • serviceName especifica o nome do serviço 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 caso nenhum outro tipo seja especificado.

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

SetToken(token string)

  • Define o token para acesso ao serviço.

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

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

    As requisições são repetidas automaticamente se falharem devido a erro de processo no servidor, erro do servidor ou queda de conexão persistente do gateway. 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 os parâmetros com os métodos anteriores, chame Init() para aplicar as alterações.

Predict(request Request) Response

  • Envia uma requisição de previsão para um serviço de inferência.

  • Parâmetro: Um objeto que implementa a interface Request, como StringRequest, TFRequest ou TorchRequest.

  • Retorno: Um objeto que implementa a interface Response, como StringResponse, TFResponse ou TorchResponse.

StringPredict(request string) string

  • Envia uma requisição de previsão em string para um serviço de inferência.

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

  • Retorna uma string contendo a resposta do serviço.

TorchPredict(request TorchRequest) TorchResponse

  • Envia uma requisição de previsão PyTorch para um serviço de inferência.

  • request especifica um objeto da classe TorchRequest.

  • Retorna o objeto TorchResponse correspondente.

TFPredict(request TFRequest) TFResponse

  • Envia uma requisição de previsão TensorFlow para um serviço de inferência.

  • request especifica um objeto da classe TFRequest.

  • Retorna o objeto TFResponse correspondente.

TFRequest

Constrói dados de entrada para modelos TensorFlow.

Método

Descrição

TFRequest(signatureName string)

  • Cria um objeto TFRequest.

  • signatureName especifica o Signature Name do modelo requisitado.

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

  • Especifica um tensor de entrada para a requisição do serviço TensorFlow.

  • Parâmetros:

    • inputName: Alias do tensor de entrada.

    • shape: TensorShape do tensor de entrada.

    • content: Conteúdo do tensor de entrada, achatado em um array unidimensional. Os tipos suportados incluem INT32, INT64, FLOAT32, FLOAT64, STRING e BOOL. O nome do método indica o tipo de dado (por exemplo, AddFeedInt32()). Para outros tipos de dados, construa a requisição no formato PB consultando o código-fonte.

AddFetch(outputName string)

  • Especifica o alias de um tensor de saída a ser recuperado.

  • 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 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.

  • Retorno: 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.

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

TorchRequest

Constrói dados de entrada para modelos PyTorch.

Método

Descrição

TorchRequest()

Cria um objeto TorchRequest.

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

  • Especifica um tensor de entrada para a requisição do serviço PyTorch.

  • Parâmetros:

    • index: Índice do tensor de entrada.

    • shape: TensorShape do tensor de entrada.

    • content: Conteúdo do tensor de entrada, achatado em um array unidimensional. Os tipos suportados incluem INT32, INT64, FLOAT32 e FLOAT64. O nome do método indica o tipo de dado (por exemplo, AddFeedInt32()). Para outros tipos de dados, construa a requisição no formato PB consultando o código-fonte.

AddFetch(outputIndex int)

  • Especifica, por índice, um tensor de saída a ser recuperado. Este método é opcional. Se não for chamado, todas as saídas serão retornadas.

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

TorchResponse

Analisa 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.

  • Retorno: 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.

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

QueueClient

Interage com o serviço de fila do EAS para produzir, consumir e gerenciar dados.

Método

Descrição

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

  • Cria um objeto QueueClient.

  • Parâmetros:

    • endpoint: Endereço do endpoint do servidor.

    • queueName: Nome do serviço de fila.

    • token: Token do serviço de fila.

  • Retorna um objeto QueueClient e um erro, se houver.

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 da 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 da operação atual.

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

  • Retorno:

    • 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 da 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 da 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 da operação atual.

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

    • length: Quantidade de registros de dados a serem consultados. São retornados no máximo length registros começando a partir de index (inclusivo).

    • timeout: Tempo de espera para a consulta. Se length registros ficarem disponíveis dentro desse 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 for false, os dados podem ser consultados repetidamente. É possível excluir os dados manualmente chamando o método Del().

    • tags: Consulta dados que contêm 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 da 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 serviço de fila envia dados para o cliente com base nas condições especificadas.

  • Parâmetros:

    • ctx: Contexto da operação atual.

    • index: Índice inicial para a inscrição.

    • window: Tamanho da janela de inscrição. Representa o número máximo de registros que o serviço de fila pode enviar para uma única instância do cliente por vez.

      Nota

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

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

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

  • Retorno: Um objeto watcher que pode ser usado para ler os dados enviados via push.

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

  • Confirma registros com os índices especificados.

    Nota

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

  • Parâmetros:

    • ctx: Contexto da operação atual.

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

types.Watcher

Lê dados enviados via push do canal de inscrição do serviço de fila.

Método

Descrição

FrameChan() <-chan types.DataFrame

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

  • Retorno: Um objeto channel para leitura de dados enviados via push.

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. Feche 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 serviço.

String

Se você implantar um serviço com um processador personalizado, geralmente o invocará usando strings, por exemplo, ao chamar um serviço de modelo PMML. O programa a seguir 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 a seguir 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 a seguir 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

Uma conexão direta VPC permite acessar serviços implantados em um grupo de recursos dedicado do Elastic Algorithm Service (EAS). Conecte também o grupo de recursos ao vSwitch especificado antes de usar este modo. Para obter informações sobre como adquirir um grupo de recursos dedicado do EAS e configurar a conectividade de rede, consulte Usar grupos de recursos do EAS e Configurar o EAS para acessar recursos públicos ou internos. Este método difere de uma invocação padrão por exigir apenas uma linha adicional de código: client.SetEndpointType(eas.EndpointTypeDirect). Este modo é ideal para serviços de alto tráfego e alta concorrência. Veja abaixo um exemplo de código:

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

Defina os parâmetros de conexão do cliente 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,
    })
}

Serviço de fila

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

Nota

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

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 solucionar problemas comuns ao chamar serviços com o SDK for Go, incluindo causas e soluções, consulte a seção "Solucionar exceções de invocação" em SDKs de invocação de serviço.

Para obter uma lista completa de códigos de status de serviço, mensagens de erro e ações recomendadas, consulte Apêndice: Códigos de status de serviço e erros comuns.