Vertex AI es la plataforma de IA generativa de Google en Google Cloud. Expone los modelos Gemini a través de un PredictionService gRPC, donde una llamada GenerateContent envía tu prompt y devuelve la respuesta del modelo. sgcWebSockets Enterprise incluye un cliente gRPC de Vertex AI tipado que se apoya sobre TsgcGRPCClient, así que puedes llamar a Gemini desde Delphi y C++Builder directamente sobre gRPC, sin ningún runtime externo y sin ensamblar Protocol Buffers a mano.
Cómo funciona
gRPC son mensajes de Protocol Buffers enmarcados sobre HTTP/2, así que una llamada a Vertex AI es una petición HTTP/2 al endpoint regional aiplatform.googleapis.com. El transporte es un TsgcHTTP2Client apuntando al host de la región en el puerto 443 con TLS habilitado, y TsgcGRPCClient gestiona el enmarcado, las cabeceras, los timeouts y los trailers por encima.
El helper de Vertex AI es un conjunto de clases de mensaje tipadas en sgcGRPC_Google_VertexAI. Construyes un TsgcGRPCVertexAIGenerateContentRequest en código, lo serializas con ToBytes, entregas los bytes al cliente gRPC, luego cargas los bytes de la respuesta de vuelta en un TsgcGRPCVertexAIGenerateContentResponse. La petición refleja el esquema de Vertex AI: una petición lleva un nombre de recurso de modelo y una lista de contenidos, cada contenido tiene un rol y una o más partes, y una parte contiene texto o datos binarios en línea.
Vertex AI usa autenticación de cuenta de servicio de Google Cloud. El cliente firma un JWT de cuenta de servicio y lo envía como una cabecera authorization: Bearer en la metadata gRPC, de modo que cada llamada se autentica contra el endpoint regional de Vertex AI.
Autenticación con una cuenta de servicio
El cliente de Google Cloud firma un JWT de cuenta de servicio autofirmado a partir de tu clave JSON de cuenta de servicio. Ese JWT está vinculado a la audiencia, así que tiene que apuntar al endpoint regional de Vertex AI, de lo contrario aiplatform.googleapis.com lo rechaza con UNAUTHENTICATED. Una vez que se adquiere un token, añádelo al DefaultMetadata del cliente gRPC para que viaje con cada llamada.
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);
Configurar el transporte
Crea un TsgcHTTP2Client para el host regional y asígnalo al cliente gRPC. Vertex AI habla application/grpc+proto, así que deja el content type del canal en 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;
Generar contenido a partir de un prompt
Construye la petición a partir de las clases de mensaje tipadas. El modelo es el nombre completo del recurso, el único contenido tiene el rol user, y el prompt va en una parte de texto. Call bloquea hasta que llega la respuesta y devuelve un TsgcGRPCResponse con los bytes Data en bruto, que cargas en una respuesta tipada.
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;
Leer la respuesta
Carga los bytes de la respuesta en un TsgcGRPCVertexAIGenerateContentResponse. Expone los candidatos, cada uno con sus partes de contenido y un motivo de finalización, además de un bloque UsageMetadata con los recuentos de tokens del prompt, los candidatos y el 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;
Configuración de generación y ajustes de seguridad
La petición también lleva un GenerationConfig opcional y una lista de ajustes de seguridad. Usa la configuración para controlar el muestreo y la longitud: Temperature, TopP, TopK, CandidateCount, MaxOutputTokens y StopSequences. Cada ajuste de seguridad empareja una Category de daño con un Threshold de bloqueo.
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;
Respuestas en streaming
Vertex AI también expone StreamGenerateContent, la contraparte con streaming desde el servidor que devuelve la respuesta como una secuencia de fragmentos parciales en lugar de un solo bloque. Como el helper de Vertex AI está construido sobre TsgcGRPCClient, la misma petición tipada alimenta la API de streaming desde el servidor del cliente: inicia la llamada, decodifica cada fragmento en un TsgcGRPCVertexAIGenerateContentResponse a medida que llega, y añade el texto de sus candidatos para actualizar la interfaz mientras el modelo escribe.
Disponibilidad
El cliente gRPC de Vertex AI forma parte de la edición Enterprise de sgcWebSockets. Un ejemplo listo para ejecutar está en Demos\21.GRPC\17.Vertex_AI: pega o carga tu clave JSON de cuenta de servicio, establece el proyecto, la región y el modelo, conéctate, y luego envía un prompt con Generate Content. La referencia completa está en la página de producto del Cliente gRPC.
¿Preguntas o comentarios? Ponte en contacto. Recibirás respuesta de las personas que escribieron el código.
