Google Vertex AI via gRPC dans Delphi

· Composants

Vertex AI est la plateforme d'IA générative de Google sur Google Cloud. Elle expose les modèles Gemini à travers un PredictionService gRPC, où un appel GenerateContent envoie votre prompt et renvoie la réponse du modèle. sgcWebSockets Enterprise fournit un client gRPC Vertex AI typé qui repose sur TsgcGRPCClient, ce qui vous permet d'appeler Gemini depuis Delphi et C++Builder directement via gRPC, sans aucun runtime externe et sans assembler à la main des Protocol Buffers.

Comment ça fonctionne

gRPC, ce sont des messages Protocol Buffers encadrés sur HTTP/2, donc un appel Vertex AI est une requête HTTP/2 vers l'endpoint régional aiplatform.googleapis.com. Le transport est un TsgcHTTP2Client pointé vers l'hôte de la région sur le port 443 avec TLS activé, et TsgcGRPCClient gère l'encadrement, les en-têtes, les délais d'attente et les trailers par-dessus.

L'assistant Vertex AI est un ensemble de classes de messages typées dans sgcGRPC_Google_VertexAI. Vous construisez un TsgcGRPCVertexAIGenerateContentRequest dans le code, le sérialisez avec ToBytes, remettez les octets au client gRPC, puis chargez les octets de réponse dans un TsgcGRPCVertexAIGenerateContentResponse. La requête reflète le schéma de Vertex AI : une requête porte un nom de ressource de modèle et une liste de contenus, chaque contenu a un rôle et une ou plusieurs parties, et une partie contient soit du texte, soit des données binaires en ligne.

Vertex AI utilise l'authentification par compte de service Google Cloud. Le client signe un JWT de compte de service et l'envoie sous la forme d'un en-tête authorization: Bearer dans les métadonnées gRPC, de sorte que chaque appel est authentifié contre l'endpoint régional Vertex AI.

S'authentifier avec un compte de service

Le client Google Cloud signe un JWT auto-signé de compte de service à partir de votre clé JSON de compte de service. Ce JWT est lié à une audience, donc il doit cibler l'endpoint régional Vertex AI, sinon aiplatform.googleapis.com le rejette avec UNAUTHENTICATED. Une fois un jeton acquis, ajoutez-le au DefaultMetadata du client gRPC afin qu'il voyage avec chaque appel.

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

Configurer le transport

Créez un TsgcHTTP2Client pour l'hôte régional et affectez-le au client gRPC. Vertex AI parle application/grpc+proto, donc laissez le type de contenu du canal sur 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;

Générer du contenu à partir d'un prompt

Construisez la requête à partir des classes de messages typées. Le modèle est le nom de ressource complet, l'unique contenu a le rôle user, et le prompt va dans une partie texte. Call bloque jusqu'à l'arrivée de la réponse et renvoie un TsgcGRPCResponse avec les octets Data bruts, que vous chargez dans une réponse typée.

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;

Lire la réponse

Chargez les octets de réponse dans un TsgcGRPCVertexAIGenerateContentResponse. Il expose les candidats, chacun avec ses parties de contenu et une raison de fin, plus un bloc UsageMetadata avec les comptes de jetons du prompt, des candidats et le total.

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;

Configuration de génération et paramètres de sécurité

La requête porte aussi un GenerationConfig optionnel et une liste de paramètres de sécurité. Utilisez la config pour contrôler l'échantillonnage et la longueur : Temperature, TopP, TopK, CandidateCount, MaxOutputTokens et StopSequences. Chaque paramètre de sécurité associe une Category de préjudice à un Threshold de blocage.

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;

Réponses en flux continu

Vertex AI expose aussi StreamGenerateContent, le pendant à diffusion serveur qui renvoie la réponse sous la forme d'une séquence de morceaux partiels au lieu d'un seul bloc. Comme l'assistant Vertex AI est bâti sur TsgcGRPCClient, la même requête typée alimente l'API de diffusion serveur du client : démarrez l'appel, décodez chaque morceau en un TsgcGRPCVertexAIGenerateContentResponse à mesure qu'il arrive, et ajoutez le texte de ses candidats pour mettre à jour l'interface pendant que le modèle écrit.

Disponibilité

Le client gRPC Vertex AI fait partie de l'édition Enterprise de sgcWebSockets. Un exemple prêt à l'emploi se trouve dans Demos\21.GRPC\17.Vertex_AI : collez ou chargez votre clé JSON de compte de service, définissez le projet, la région et le modèle, connectez-vous, puis envoyez un prompt avec Generate Content. La référence complète est sur la page produit du client gRPC.

Des questions ou des commentaires ? Contactez-nous. Vous recevrez une réponse des personnes qui ont écrit le code.