Google Vertex AI su gRPC in Delphi

· Componenti

Vertex AI è la piattaforma di AI generativa di Google su Google Cloud. Espone i modelli Gemini tramite un PredictionService gRPC, dove una chiamata GenerateContent invia il tuo prompt e restituisce la risposta del modello. sgcWebSockets Enterprise include un client gRPC Vertex AI tipizzato che poggia sopra TsgcGRPCClient, così puoi chiamare Gemini da Delphi e C++Builder direttamente su gRPC, senza alcun runtime esterno e senza assemblare a mano i Protocol Buffers.

Come funziona

gRPC è costituito da messaggi Protocol Buffers incapsulati su HTTP/2, quindi una chiamata Vertex AI è una richiesta HTTP/2 verso l'endpoint regionale aiplatform.googleapis.com. Il trasporto è un TsgcHTTP2Client puntato all'host della regione sulla porta 443 con TLS abilitato e TsgcGRPCClient gestisce sopra di esso l'incapsulamento, gli header, i timeout e i trailer.

L'helper Vertex AI è un insieme di classi di messaggi tipizzate in sgcGRPC_Google_VertexAI. Costruisci un TsgcGRPCVertexAIGenerateContentRequest nel codice, lo serializzi con ToBytes, consegni i byte al client gRPC, poi ricarichi i byte della risposta in un TsgcGRPCVertexAIGenerateContentResponse. La richiesta rispecchia lo schema di Vertex AI: una richiesta porta un nome di risorsa del modello e una lista di contenuti, ogni contenuto ha un ruolo e una o più parti e una parte contiene testo oppure dati binari inline.

Vertex AI usa l'autenticazione con account di servizio Google Cloud. Il client firma un JWT dell'account di servizio e lo invia come header authorization: Bearer nei metadata gRPC, così ogni chiamata è autenticata verso l'endpoint regionale di Vertex AI.

Autenticarsi con un account di servizio

Il client Google Cloud firma un JWT autofirmato dell'account di servizio dalla tua chiave JSON dell'account di servizio. Quel JWT è vincolato all'audience, quindi deve puntare all'endpoint regionale di Vertex AI, altrimenti aiplatform.googleapis.com lo rifiuta con UNAUTHENTICATED. Una volta acquisito un token, aggiungilo al DefaultMetadata del client gRPC in modo che viaggi con ogni chiamata.

uses
  sgcHTTP_Google_Cloud, sgcGRPC_Client;

// CloudClient is a TsgcHTTPGoogleCloud_PubSub_Client used here only to sign the JWT
CloudClient.GoogleCloudOptions.Authentication := gcaJWT;
CloudClient.GoogleCloudOptions.JWT.ClientEmail   := ClientEmail;
CloudClient.GoogleCloudOptions.JWT.PrivateKeyId  := PrivateKeyId;
CloudClient.GoogleCloudOptions.JWT.PrivateKey.Text := PrivateKey;
CloudClient.GoogleCloudOptions.JWT.ProjectId     := ProjectId;
CloudClient.GoogleCloudOptions.JWT.API_Endpoint  :=
  'https://' + Region + '-aiplatform.googleapis.com/';

// after the token arrives in OnAuthToken
GRPC.DefaultMetadata.Clear;
GRPC.DefaultMetadata.Add('authorization', 'Bearer ' + Token);

Configurare il trasporto

Crea un TsgcHTTP2Client per l'host regionale e assegnalo al client gRPC. Vertex AI parla application/grpc+proto, quindi lascia il content type del canale su grpcProto.

uses
  sgcHTTP2_Client, sgcGRPC_Client, sgcGRPC_Types;

HTTP2 := TsgcHTTP2Client.Create(nil);
HTTP2.Host := Region + '-aiplatform.googleapis.com';   // e.g. us-central1-...
HTTP2.Port := 443;
HTTP2.TLS  := True;

GRPC := TsgcGRPCClient.Create(nil);
GRPC.Client := HTTP2;
GRPC.ChannelOptions.ContentType := grpcProto;
GRPC.ChannelOptions.Compression := grpcNoCompression;

HTTP2.Active := True;

Generare contenuto da un prompt

Costruisci la richiesta dalle classi di messaggi tipizzate. Il modello è il nome di risorsa completo, l'unico contenuto ha il ruolo user e il prompt va in una parte di testo. Call blocca finché non arriva la risposta e restituisce un TsgcGRPCResponse con i byte grezzi di Data, che carichi in una risposta tipizzata.

uses
  sgcGRPC_Client, sgcGRPC_Types, sgcGRPC_Google_VertexAI;

var
  oRequest: TsgcGRPCVertexAIGenerateContentRequest;
  oContent: TsgcGRPCVertexAIContent;
  oPart: TsgcGRPCVertexAIPart;
  oResponse: TsgcGRPCResponse;
begin
  oRequest := TsgcGRPCVertexAIGenerateContentRequest.Create;
  try
    oRequest.Model := 'projects/' + ProjectId + '/locations/' + Region +
      '/publishers/google/models/' + Model;   // e.g. gemini-2.0-flash

    oContent := oRequest.AddContent;
    oContent.Role := 'user';
    oPart := oContent.AddPart;
    oPart.Text := 'Explain gRPC in one sentence.';

    oResponse := GRPC.Call(
      'google.cloud.aiplatform.v1.PredictionService', 'GenerateContent',
      oRequest.ToBytes);

    if oResponse.StatusCode = grpcOK then
      ParseResponse(oResponse.Data)
    else
      ShowMessage('gRPC error: ' + oResponse.StatusMessage);
  finally
    oRequest.Free;
  end;
end;

Leggere la risposta

Carica i byte della risposta in un TsgcGRPCVertexAIGenerateContentResponse. Espone i candidati, ognuno con le sue parti di contenuto e un motivo di terminazione, più un blocco UsageMetadata con i conteggi dei token del prompt, dei candidati e totali.

procedure ParseResponse(const aData: TBytes);
var
  oResponse: TsgcGRPCVertexAIGenerateContentResponse;
  oCandidate: TsgcGRPCVertexAICandidate;
  i, j: Integer;
begin
  oResponse := TsgcGRPCVertexAIGenerateContentResponse.Create;
  try
    oResponse.LoadFromBytes(aData);
    for i := 0 to oResponse.CandidateCount - 1 do
    begin
      oCandidate := oResponse.Candidate(i);
      for j := 0 to oCandidate.Content.PartCount - 1 do
        Memo1.Lines.Add(oCandidate.Content.Part(j).Text);
    end;
    Memo1.Lines.Add('Total tokens: ' +
      IntToStr(oResponse.UsageMetadata.TotalTokenCount));
  finally
    oResponse.Free;
  end;
end;

Configurazione della generazione e impostazioni di sicurezza

La richiesta porta anche un GenerationConfig opzionale e una lista di impostazioni di sicurezza. Usa la config per controllare il campionamento e la lunghezza: Temperature, TopP, TopK, CandidateCount, MaxOutputTokens e StopSequences. Ogni impostazione di sicurezza accoppia una Category di danno con una Threshold di blocco.

oRequest.GenerationConfig.Temperature     := 0.7;
oRequest.GenerationConfig.MaxOutputTokens := 1024;
oRequest.GenerationConfig.StopSequences.Add('END');

with oRequest.AddSafetySetting do
begin
  Category  := 7;   // HARM_CATEGORY_DANGEROUS_CONTENT
  Threshold := 2;   // BLOCK_MEDIUM_AND_ABOVE
end;

Risposte in streaming

Vertex AI espone anche StreamGenerateContent, la controparte server-streaming che restituisce la risposta come una sequenza di blocchi parziali invece di un unico blocco. Poiché l'helper Vertex AI è costruito su TsgcGRPCClient, la stessa richiesta tipizzata alimenta l'API server-streaming del client: avvii la chiamata, decodifichi ogni blocco in un TsgcGRPCVertexAIGenerateContentResponse man mano che arriva e accodi il testo dai suoi candidati per aggiornare l'interfaccia mentre il modello scrive.

Disponibilità

Il client gRPC Vertex AI fa parte dell'edizione Enterprise di sgcWebSockets. Un esempio pronto all'uso è in Demos\21.GRPC\17.Vertex_AI: incolla o carica la tua chiave JSON dell'account di servizio, imposta progetto, regione e modello, connettiti, poi invia un prompt con Generate Content. Il riferimento completo è sulla pagina prodotto gRPC Client.

Domande o feedback? Contattaci. Riceverai una risposta dalle persone che hanno scritto il codice.