Pub

Vertex AI plugin for Genkit Dart.

Usage

To use Google's Vertex AI models, simply import this package and pass vertexAI to the Genkit initialization.

Authentication is handled automatically via Application Default Credentials (e.g. gcloud auth application-default login), keeping the implementation clean and avoiding dependencies on dart:io in the core components.

import 'dart:io';

import 'package:genkit/genkit.dart';
import 'package:genkit_vertexai/genkit_vertexai.dart';

void main() async {
  // Initialize Genkit with the Vertex AI plugin
  // Authentication is handled automatically via Application Default Credentials.
  // Project ID and location can be specified explicitly or inferred from the environment.
  final ai = Genkit(
    plugins: [
      vertexAI(
        projectId: Platform.environment['GCLOUD_PROJECT'],
        location: Platform.environment['GCLOUD_LOCATION'] ?? 'us-central1',
      )
    ],
  );

  // Generate text
  final response = await ai.generate(
    model: vertexAI.gemini('gemini-flash-latest'),
    prompt: 'Tell me a joke about a developer.',
  );

  print(response.text);
}

Embeddings

import 'dart:io';

import 'package:genkit/genkit.dart';
import 'package:genkit_vertexai/genkit_vertexai.dart';

void main() async {
  final ai = Genkit(
    plugins: [
      vertexAI(
        projectId: Platform.environment['GCLOUD_PROJECT'],
        location: Platform.environment['GCLOUD_LOCATION'] ?? 'us-central1',
      )
    ],
  );

  final embeddings = await ai.embedMany(
    embedder: vertexAI.textEmbedding('text-embedding-004'),
    documents: [
      DocumentData(content: [TextPart(text: 'Hello world')]),
      DocumentData(content: [TextPart(text: 'Genkit is awesome')]),
    ],
  );

  print(embeddings[0].embedding);
}

Both the legacy text-embedding-* models and the newer gemini-embedding-* models are supported through the same textEmbedding call; the correct request shape is selected from the model name.

Embedding options

TextEmbedderOptions lets you tune a request. outputDimensionality reduces the vector size, while taskType and title tailor the embedding to its use case (supported by the Gemini and text-embedding-* models).

final embeddings = await ai.embedMany(
  embedder: vertexAI.textEmbedding('gemini-embedding-001'),
  documents: [
    DocumentData(content: [TextPart(text: 'Hello world')]),
  ],
  options: TextEmbedderOptions(
    outputDimensionality: 256,
    taskType: 'RETRIEVAL_DOCUMENT',
  ),
);

Multimodal embeddings

The multimodalembedding model embeds text, images, and video. Provide each input as a MediaPart using either an inline data: URI or a gs:// / https Google Cloud Storage URI (with a contentType). Text parts are embedded too.

A single document can produce more than one embedding: one per modality (and one per video segment). The flat result is therefore not 1:1 with the input documents, so each embedding carries metadata (documentIndex, modality, partIndex, segmentIndex, ...) that you use to map it back to its source.

final embeddings = await ai.embedMany(
  embedder: vertexAI.textEmbedding('multimodalembedding'),
  documents: [
    DocumentData(
      content: [
        TextPart(text: 'A photo of a cat.'),
        MediaPart(
          media: Media(
            url: 'gs://my-bucket/cat.jpg',
            contentType: 'image/jpeg',
          ),
        ),
      ],
    ),
  ],
);

for (final e in embeddings) {
  print('${e.metadata?['modality']}: ${e.embedding.length} dims');
}

Libraries

genkit_vertexai