Java idiomatic SDK for the Gemini Developer APIs and Vertex AI APIs
Common types and data models used throughout the SDK including Content, Part, Schema, configurations, and media types.
import com.google.genai.types.Content;
import com.google.genai.types.Part;
import com.google.genai.types.Blob;
import com.google.genai.types.FileData;
import com.google.genai.types.Image;
import com.google.genai.types.Video;
import com.google.genai.types.Schema;
import com.google.genai.types.SafetySetting;
import com.google.genai.types.Tool;
import com.google.genai.types.FunctionDeclaration;
import com.google.genai.types.FunctionCall;
import com.google.genai.types.FunctionResponse;package com.google.genai.types;
public final class Content {
public static Content fromParts(Part... parts);
public static Content fromParts(List<Part> parts);
public static Builder builder();
public Optional<List<Part>> parts();
public Optional<String> role();
public Builder toBuilder();
}Usage:
// Simple text content
Content content = Content.fromParts(Part.fromText("Hello"));
// With role
Content content = Content.builder()
.parts(ImmutableList.of(Part.fromText("Hello")))
.role("user")
.build();
// Multimodal content
Content content = Content.fromParts(
Part.fromText("Describe this image"),
Part.fromImage(image)
);package com.google.genai.types;
public final class Part {
// Factory methods
public static Part fromText(String text);
public static Part fromImage(Image image);
public static Part fromVideo(Video video);
public static Part fromFileData(FileData fileData);
public static Part fromFunctionCall(FunctionCall functionCall);
public static Part fromFunctionResponse(FunctionResponse functionResponse);
public static Part fromUri(String uri, String mimeType);
public static Builder builder();
// Fields (mutually exclusive)
public Optional<String> text();
public Optional<Blob> inlineData();
public Optional<FileData> fileData();
public Optional<FunctionCall> functionCall();
public Optional<FunctionResponse> functionResponse();
public Optional<ExecutableCode> executableCode();
public Optional<CodeExecutionResult> codeExecutionResult();
public Optional<String> thought();
}Usage:
// Text part
Part textPart = Part.fromText("Hello world");
// Image part
Part imagePart = Part.fromImage(image);
// File reference part
Part filePart = Part.fromUri("gs://bucket/file.pdf", "application/pdf");
// Function call part
Part functionPart = Part.fromFunctionCall(functionCall);package com.google.genai.types;
public final class Blob {
public static Builder builder();
public Optional<String> data();
public Optional<String> mimeType();
public Optional<String> displayName();
}Usage:
import java.util.Base64;
byte[] imageBytes = Files.readAllBytes(Paths.get("image.jpg"));
String base64Data = Base64.getEncoder().encodeToString(imageBytes);
Blob blob = Blob.builder()
.data(base64Data)
.mimeType("image/jpeg")
.build();
Part part = Part.builder()
.inlineData(blob)
.build();package com.google.genai.types;
public final class FileData {
public static Builder builder();
public Optional<String> fileUri();
public Optional<String> mimeType();
public Optional<String> displayName();
}Usage:
FileData fileData = FileData.builder()
.fileUri("gs://bucket/document.pdf")
.mimeType("application/pdf")
.displayName("My Document")
.build();
Part part = Part.fromFileData(fileData);package com.google.genai.types;
public final class Image {
public static Image fromFile(String filePath);
public static Builder builder();
public Optional<String> imageUri();
public Optional<byte[]> imageBytes();
public Optional<String> gcsUri();
public Optional<String> mimeType();
}Usage:
// From file
Image image = Image.fromFile("path/to/image.jpg");
// From URI
Image image = Image.builder()
.imageUri("https://example.com/image.jpg")
.mimeType("image/jpeg")
.build();
// From GCS
Image image = Image.builder()
.gcsUri("gs://bucket/image.jpg")
.mimeType("image/jpeg")
.build();
// From bytes
Image image = Image.builder()
.imageBytes(imageBytes)
.mimeType("image/png")
.build();package com.google.genai.types;
public final class Video {
public static Builder builder();
public Optional<String> videoUri();
public Optional<byte[]> videoBytes();
public Optional<String> gcsUri();
public Optional<String> mimeType();
}Usage:
Video video = Video.builder()
.gcsUri("gs://bucket/video.mp4")
.mimeType("video/mp4")
.build();
Video video2 = Video.builder()
.videoUri("https://example.com/video.mp4")
.mimeType("video/mp4")
.build();package com.google.genai.types;
public final class Schema {
public static Builder builder();
public Optional<String> type();
public Optional<String> format();
public Optional<String> description();
public Optional<Boolean> nullable();
public Optional<List<String>> enum_();
public Optional<Map<String, Schema>> properties();
public Optional<List<String>> required();
public Optional<Schema> items();
public Optional<Long> minItems();
public Optional<Long> maxItems();
public Optional<Double> minimum();
public Optional<Double> maximum();
}Type Constants:
package com.google.genai.types;
public final class Type {
public static final class Known {
public static final String STRING = "STRING";
public static final String NUMBER = "NUMBER";
public static final String INTEGER = "INTEGER";
public static final String BOOLEAN = "BOOLEAN";
public static final String ARRAY = "ARRAY";
public static final String OBJECT = "OBJECT";
}
}Usage:
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableList;
// Simple string schema
Schema schema = Schema.builder()
.type(Type.Known.STRING)
.description("A person's name")
.build();
// Object schema
Schema personSchema = Schema.builder()
.type(Type.Known.OBJECT)
.properties(ImmutableMap.of(
"name", Schema.builder()
.type(Type.Known.STRING)
.build(),
"age", Schema.builder()
.type(Type.Known.INTEGER)
.minimum(0.0)
.build()
))
.required(ImmutableList.of("name"))
.build();
// Array schema
Schema arraySchema = Schema.builder()
.type(Type.Known.ARRAY)
.items(Schema.builder()
.type(Type.Known.STRING)
.build())
.minItems(1L)
.maxItems(10L)
.build();
// Enum schema
Schema colorSchema = Schema.builder()
.type(Type.Known.STRING)
.enum_(ImmutableList.of("red", "green", "blue"))
.build();package com.google.genai.types;
public final class SafetySetting {
public static Builder builder();
public Optional<String> category();
public Optional<String> threshold();
public Optional<String> method();
}Categories:
package com.google.genai.types;
public final class HarmCategory {
public static final class Known {
public static final String HARM_CATEGORY_UNSPECIFIED = "HARM_CATEGORY_UNSPECIFIED";
public static final String HARM_CATEGORY_HATE_SPEECH = "HARM_CATEGORY_HATE_SPEECH";
public static final String HARM_CATEGORY_DANGEROUS_CONTENT = "HARM_CATEGORY_DANGEROUS_CONTENT";
public static final String HARM_CATEGORY_HARASSMENT = "HARM_CATEGORY_HARASSMENT";
public static final String HARM_CATEGORY_SEXUALLY_EXPLICIT = "HARM_CATEGORY_SEXUALLY_EXPLICIT";
}
}Thresholds:
package com.google.genai.types;
public final class HarmBlockThreshold {
public static final class Known {
public static final String HARM_BLOCK_THRESHOLD_UNSPECIFIED = "HARM_BLOCK_THRESHOLD_UNSPECIFIED";
public static final String BLOCK_LOW_AND_ABOVE = "BLOCK_LOW_AND_ABOVE";
public static final String BLOCK_MEDIUM_AND_ABOVE = "BLOCK_MEDIUM_AND_ABOVE";
public static final String BLOCK_ONLY_HIGH = "BLOCK_ONLY_HIGH";
public static final String BLOCK_NONE = "BLOCK_NONE";
public static final String OFF = "OFF";
}
}Usage:
SafetySetting setting = SafetySetting.builder()
.category(HarmCategory.Known.HARM_CATEGORY_HATE_SPEECH)
.threshold(HarmBlockThreshold.Known.BLOCK_MEDIUM_AND_ABOVE)
.build();package com.google.genai.types;
public final class SafetyRating {
public Optional<String> category();
public Optional<String> probability();
public Optional<Boolean> blocked();
public Optional<Double> probabilityScore();
public Optional<String> severity();
public Optional<Double> severityScore();
}package com.google.genai.types;
public final class Tool {
public static Builder builder();
public Optional<List<FunctionDeclaration>> functionDeclarations();
public Optional<GoogleSearchRetrieval> googleSearchRetrieval();
public Optional<GoogleSearch> googleSearch();
public Optional<GoogleMaps> googleMaps();
public Optional<CodeExecution> codeExecution();
public Optional<FileSearch> fileSearch();
public Optional<ComputerUse> computerUse();
public Optional<Retrieval> retrieval();
public Optional<UrlContext> urlContext();
}Usage:
// Function tool
Tool functionTool = Tool.builder()
.functionDeclarations(ImmutableList.of(functionDeclaration))
.build();
// Google Search tool
Tool searchTool = Tool.builder()
.googleSearch(GoogleSearch.builder().build())
.build();
// Code execution tool
Tool codeExecTool = Tool.builder()
.codeExecution(CodeExecution.builder().build())
.build();package com.google.genai.types;
public final class FunctionDeclaration {
public static Builder builder();
public Optional<String> name();
public Optional<String> description();
public Optional<Schema> parameters();
}Usage:
FunctionDeclaration function = FunctionDeclaration.builder()
.name("getCurrentWeather")
.description("Get the current weather in a location")
.parameters(Schema.builder()
.type(Type.Known.OBJECT)
.properties(ImmutableMap.of(
"location", Schema.builder()
.type(Type.Known.STRING)
.description("City name")
.build(),
"unit", Schema.builder()
.type(Type.Known.STRING)
.enum_(ImmutableList.of("celsius", "fahrenheit"))
.build()
))
.required(ImmutableList.of("location"))
.build())
.build();package com.google.genai.types;
public final class FunctionCall {
public static Builder builder();
public Optional<String> name();
public Optional<JsonNode> args();
public Optional<String> id();
}package com.google.genai.types;
public final class FunctionResponse {
public static Builder builder();
public Optional<String> name();
public Optional<JsonNode> response();
public Optional<String> id();
}Usage:
// Process function call from model
Part part = response.part();
part.functionCall().ifPresent(call -> {
String functionName = call.name().orElse("");
JsonNode args = call.args().orElse(null);
// Execute function
Object result = executeFunction(functionName, args);
// Create response
FunctionResponse functionResponse = FunctionResponse.builder()
.name(functionName)
.response(objectMapper.valueToTree(result))
.id(call.id().orElse(null))
.build();
// Send back to model
Content responseContent = Content.fromParts(
Part.fromFunctionResponse(functionResponse)
);
});package com.google.genai.types;
public final class FinishReason {
public static final class Known {
public static final String FINISH_REASON_UNSPECIFIED = "FINISH_REASON_UNSPECIFIED";
public static final String STOP = "STOP";
public static final String MAX_TOKENS = "MAX_TOKENS";
public static final String SAFETY = "SAFETY";
public static final String RECITATION = "RECITATION";
public static final String OTHER = "OTHER";
public static final String BLOCKLIST = "BLOCKLIST";
public static final String PROHIBITED_CONTENT = "PROHIBITED_CONTENT";
public static final String SPII = "SPII";
public static final String MALFORMED_FUNCTION_CALL = "MALFORMED_FUNCTION_CALL";
}
}package com.google.genai.types;
public final class BlockedReason {
public static final class Known {
public static final String BLOCKED_REASON_UNSPECIFIED = "BLOCKED_REASON_UNSPECIFIED";
public static final String SAFETY = "SAFETY";
public static final String OTHER = "OTHER";
public static final String BLOCKLIST = "BLOCKLIST";
public static final String PROHIBITED_CONTENT = "PROHIBITED_CONTENT";
}
}package com.google.genai.types;
public final class FunctionCallingMode {
public static final class Known {
public static final String MODE_UNSPECIFIED = "MODE_UNSPECIFIED";
public static final String AUTO = "AUTO";
public static final String ANY = "ANY";
public static final String NONE = "NONE";
}
}package com.google.genai.types;
public final class HttpOptions {
public static Builder builder();
public Optional<String> baseUrl();
public Optional<String> apiVersion();
public Optional<Integer> timeout();
public Optional<Map<String, String>> headers();
public Optional<JsonNode> extraBody();
public Optional<JsonNode> extraQuery();
public Optional<HttpRetryOptions> retryOptions();
}package com.google.genai.types;
public final class HttpResponse {
public static Builder builder();
public Optional<Map<String, String>> headers();
public Optional<String> body();
}package com.google.genai;
public final class Pager<T> implements Iterable<T> {
public ImmutableList<T> page();
public ImmutableList<T> nextPage();
public Iterator<T> iterator();
public String name();
public int pageSize();
public int size();
public Optional<HttpResponse> sdkHttpResponse();
}package com.google.genai;
public final class AsyncPager<T> {
public CompletableFuture<ImmutableList<T>> page();
public CompletableFuture<ImmutableList<T>> nextPage();
public CompletableFuture<Void> forEach(Consumer<? super T> itemAction);
public CompletableFuture<String> name();
public CompletableFuture<Integer> pageSize();
public CompletableFuture<Integer> size();
public CompletableFuture<Optional<HttpResponse>> sdkHttpResponse();
}All configuration and data types use the builder pattern:
// Create builder
Content.Builder builder = Content.builder();
// Set fields
builder.parts(ImmutableList.of(Part.fromText("Hello")));
builder.role("user");
// Build immutable instance
Content content = builder.build();
// Modify existing instance
Content modified = content.toBuilder()
.role("model")
.build();Most fields use Optional<T>:
Content content = getContent();
// Check if present
if (content.role().isPresent()) {
String role = content.role().get();
}
// Or use orElse
String role = content.role().orElse("user");
// Or use ifPresent
content.role().ifPresent(r -> {
System.out.println("Role: " + r);
});
// Or use map
String upperRole = content.role()
.map(String::toUpperCase)
.orElse("UNKNOWN");All types are immutable after creation:
Content content = Content.builder()
.role("user")
.build();
// Cannot modify - need to create new instance
Content newContent = content.toBuilder()
.role("model")
.build();Install with Tessl CLI
npx tessl i tessl/maven-com-google-genai--google-genaidocs