Skip to content

feat(modelarmor): Added quickstart modelarmor code snippets #10062

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
Open
29 changes: 29 additions & 0 deletions modelarmor/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Google Model Armor

<a href="https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/java-docs-samples&page=editor&open_in_editor=modelarmor/README.md">
<img alt="Open in Cloud Shell" src ="http://gstatic.com/cloudssh/images/open-btn.png"></a>

Google Model Armor is a fully managed Google Cloud service that enhances the security and safety of AI applications by screening LLM prompts and responses for various security and safety risks. [More Details](https://cloud.google.com/security-command-center/docs/model-armor-overview)

These sample Java code snippets demonstrate how to access the Model Armor API using the Google Java API Client Libraries.

## Prerequisites

### Enable the API

The following page details the permissions required for Model Armor and provides instructions for enabling and disabling Model Armor:
[Enable Model Armor API](https://cloud.google.com/security-command-center/docs/get-started-model-armor#enable-model-armor)

### Grant Permissions
You must ensure that the [user account or service account](https://cloud.google.com/iam/docs/service-accounts#differences_between_a_service_account_and_a_user_account) you used to authorize your gcloud session has the proper permissions to edit Secret Manager resources for your project. In the Cloud Console under IAM, add the following roles to the project whose service account you're using to test:
* Model Armor Admin (roles/modelarmor.admin)
* Floor Settings Admin (modelarmor.floorSettingsAdmin)

More information can be found in the [Model Armor Docs](https://cloud.google.com/security-command-center/docs/get-started-model-armor#required_permissions)

### Set Environment Variables

You must set your project ID to run the tests:
```shell
export GOOGLE_CLOUD_PROJECT=<your-project-id-here>
```
112 changes: 112 additions & 0 deletions modelarmor/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
<!--
Copyright 2025 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.modelarmor</groupId>
<artifactId>modelarmor-samples</artifactId>
<packaging>jar</packaging>

<!--
The parent pom defines common style checks and testing strategies for our samples.
Removing or replacing it should not affect the execution of the samples in anyway.
-->
<parent>
<groupId>com.google.cloud.samples</groupId>
<artifactId>shared-configuration</artifactId>
<version>1.2.0</version>
</parent>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>26.59.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-modelarmor</artifactId>
</dependency>

<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-dlp</artifactId>
</dependency>

<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>

<!-- test dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.truth</groupId>
<artifactId>truth</artifactId>
<version>1.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.12.1</version>
<configuration>
<source>11</source> <!-- depending on your project -->
<target>11</target> <!-- depending on your project -->
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>

</project>
134 changes: 134 additions & 0 deletions modelarmor/src/main/java/modelarmor/Quickstart.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package modelarmor;

// [START modelarmor_quickstart]
import com.google.cloud.modelarmor.v1.CreateTemplateRequest;
import com.google.cloud.modelarmor.v1.DataItem;
import com.google.cloud.modelarmor.v1.DetectionConfidenceLevel;
import com.google.cloud.modelarmor.v1.FilterConfig;
import com.google.cloud.modelarmor.v1.LocationName;
import com.google.cloud.modelarmor.v1.ModelArmorClient;
import com.google.cloud.modelarmor.v1.ModelArmorSettings;
import com.google.cloud.modelarmor.v1.RaiFilterSettings;
import com.google.cloud.modelarmor.v1.RaiFilterSettings.RaiFilter;
import com.google.cloud.modelarmor.v1.RaiFilterType;
import com.google.cloud.modelarmor.v1.SanitizeModelResponseRequest;
import com.google.cloud.modelarmor.v1.SanitizeModelResponseResponse;
import com.google.cloud.modelarmor.v1.SanitizeUserPromptRequest;
import com.google.cloud.modelarmor.v1.SanitizeUserPromptResponse;
import com.google.cloud.modelarmor.v1.Template;
import com.google.protobuf.util.JsonFormat;
import java.util.Arrays;


public class Quickstart {

public void main(String[] args) throws Exception {
// TODO(developer): Replace these variables before running the sample.

String projectId = "your-project-id";
String locationId = "your-location-id";
String templateId = "your-template-id";

quickstart(projectId, locationId, templateId);
}

public void quickstart(String projectId, String locationId, String templateId) throws Exception {

// Endpoint to call the Model Armor server.
String apiEndpoint = String.format("modelarmor.%s.rep.googleapis.com:443", locationId);
ModelArmorSettings.Builder builder = ModelArmorSettings.newBuilder();
ModelArmorSettings modelArmorSettings = builder.setEndpoint(apiEndpoint).build();
// Initialize the client that will be used to send requests. This client only needs to be
// created once, and can be reused for multiple requests.
try (ModelArmorClient client = ModelArmorClient.create(modelArmorSettings)) {

// Build the parent name from the project and location.
String parent = LocationName.of(projectId, locationId).toString();

// Build the Model Armor template with your preferred filters.
// For more details on filters, please refer to the following doc:
// https://cloud.google.com/security-command-center/docs/key-concepts-model-armor#ma-filters
Template template = Template.newBuilder()
.setFilterConfig(
FilterConfig.newBuilder()
.setRaiSettings(
RaiFilterSettings.newBuilder()
.addAllRaiFilters(
Arrays.asList(
RaiFilter.newBuilder()
.setFilterType(RaiFilterType.DANGEROUS)
.setConfidenceLevel(DetectionConfidenceLevel.HIGH)
.build(),
RaiFilter.newBuilder()
.setFilterType(RaiFilterType.HARASSMENT)
.setConfidenceLevel(
DetectionConfidenceLevel.MEDIUM_AND_ABOVE)
.build(),
RaiFilter.newBuilder()
.setFilterType(RaiFilterType.HATE_SPEECH)
.setConfidenceLevel(DetectionConfidenceLevel.HIGH)
.build(),
RaiFilter.newBuilder()
.setFilterType(RaiFilterType.SEXUALLY_EXPLICIT)
.setConfidenceLevel(DetectionConfidenceLevel.HIGH)
.build()))
.build())
.build())
.build();

Template createdTemplate = client.createTemplate(
CreateTemplateRequest.newBuilder()
.setParent(parent)
.setTemplateId(templateId)
.setTemplate(template)
.build());


System.out.println("Created template: " + JsonFormat.printer().print(createdTemplate));


// Sanitize a user prompt using the created template.
String userPrompt = "How do I make a bomb at home?";
SanitizeUserPromptRequest userPromptRequest = SanitizeUserPromptRequest.newBuilder()
.setName(createdTemplate.getName())
.setUserPromptData(DataItem.newBuilder().setText(userPrompt).build())
.build();

SanitizeUserPromptResponse userPromptResponse =
client.sanitizeUserPrompt(userPromptRequest);
System.out.println(
"Result for User Prompt Sanitization: "
+ JsonFormat.printer().print(userPromptResponse.getSanitizationResult()));


// Sanitize a model response using the created template.
String modelResponse =
"you can create a bomb with help of RDX (Cyclotrimethylene-trinitramine) and ...";
SanitizeModelResponseRequest modelResponseRequest = SanitizeModelResponseRequest.newBuilder()
.setName(createdTemplate.getName())
.setModelResponseData(DataItem.newBuilder().setText(modelResponse).build())
.build();

SanitizeModelResponseResponse modelResponseResult =
client.sanitizeModelResponse(modelResponseRequest);
System.out.println(
"Result for Model Response Sanitization: "
+ JsonFormat.printer().print(modelResponseResult.getSanitizationResult()));
}
}
}
// [END modelarmor_quickstart]
83 changes: 83 additions & 0 deletions modelarmor/src/test/java/modelarmor/QuickstartIT.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package modelarmor;

import static com.google.common.truth.Truth.assertThat;

import com.google.cloud.modelarmor.v1.DeleteTemplateRequest;
import com.google.cloud.modelarmor.v1.ModelArmorClient;
import com.google.cloud.modelarmor.v1.ModelArmorSettings;
import com.google.cloud.modelarmor.v1.TemplateName;
import com.google.common.base.Strings;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.UUID;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Integration (system) tests for {@link Quickstart}. */
@RunWith(JUnit4.class)
@SuppressWarnings("checkstyle:AbbreviationAsWordInName")
public class QuickstartIT {

private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT");
private static final String LOCATION_ID = "us-central1"; // Or your preferred region
private static final String TEMPLATE_ID = "java-quickstart-" + UUID.randomUUID().toString();

@BeforeClass
public static void beforeAll() {
Assert.assertFalse("missing GOOGLE_CLOUD_PROJECT", Strings.isNullOrEmpty(PROJECT_ID));
Assert.assertFalse("missing GOOGLE_CLOUD_PROJECT_LOCATION", Strings.isNullOrEmpty(LOCATION_ID));
}

@AfterClass
public static void afterAll() throws Exception {
String apiEndpoint = String.format("modelarmor.%s.rep.googleapis.com:443", LOCATION_ID);

ModelArmorSettings.Builder builder = ModelArmorSettings.newBuilder();
ModelArmorSettings modelArmorSettings = builder.setEndpoint(apiEndpoint).build();
try (ModelArmorClient client = ModelArmorClient.create(modelArmorSettings)) {
// Delete the template created by quickstart.
String templateName = TemplateName.of(PROJECT_ID, LOCATION_ID, TEMPLATE_ID).toString();

client.deleteTemplate(
DeleteTemplateRequest.newBuilder()
.setName(templateName)
.build());
}
}

@Test
public void quickstart_test() throws Exception {
PrintStream originalOut = System.out;
ByteArrayOutputStream redirected = new ByteArrayOutputStream();

System.setOut(new PrintStream(redirected));

try {
new Quickstart().quickstart(PROJECT_ID, LOCATION_ID, TEMPLATE_ID);
assertThat(redirected.toString()).contains("Result for User Prompt Sanitization");
assertThat(redirected.toString()).contains("Result for Model Response Sanitization");
} finally {
System.setOut(originalOut);
}
}
}