From 41998f2a17f0dcaba206e4ce9f49fd66585c977b Mon Sep 17 00:00:00 2001 From: Saurabh Gupta Date: Mon, 31 Aug 2026 16:19:30 +0530 Subject: [PATCH] docs(integrations): add Model Armor integration page Partially addresses google/adk-docs#2179. --- docs/integrations/assets/model-armor.png | Bin 0 -> 40911 bytes docs/integrations/model-armor.md | 95 +++++++++++++++++++++++ docs/safety/index.md | 2 +- 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 docs/integrations/assets/model-armor.png create mode 100644 docs/integrations/model-armor.md diff --git a/docs/integrations/assets/model-armor.png b/docs/integrations/assets/model-armor.png new file mode 100644 index 0000000000000000000000000000000000000000..fb32b9a59dbdb48c594438ea4556bf948c6ca35c GIT binary patch literal 40911 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 a@#+emnT#3p8`{LWJ`hUx70cxi literal 0 HcmV?d00001 diff --git a/docs/integrations/model-armor.md b/docs/integrations/model-armor.md new file mode 100644 index 0000000000..a327178abf --- /dev/null +++ b/docs/integrations/model-armor.md @@ -0,0 +1,95 @@ +--- +catalog_title: Model Armor Plugin +catalog_description: Screen user input and model output with Google Cloud Model Armor +catalog_icon: /integrations/assets/model-armor.png +catalog_tags: ["security", "google"] +--- + +# Model Armor plugin for ADK + +

+ Supported in ADKPython v2.8.0 +
+ +`ModelArmorPlugin` screens user input and model output against [Google Cloud Model Armor](https://cloud.google.com/security-command-center/docs/model-armor-overview) templates. When a filter matches, or when screening cannot complete (fail-closed by default), content is replaced with a safe message before it reaches the model or the user. + +The integration provides `ModelArmorPlugin` (a `BasePlugin`) and `ModelArmorConfig` (template paths, blocked messages, `block_on_screening_failure`). + +## Use cases + +- **Prompt-injection / jailbreak mitigation** on inbound user text before the model call. +- **Unsafe model output blocking** before responses reach the user (unary and live transcription paths). +- **Fail-closed deployments** where unscreened content is treated as unsafe. + +## Prerequisites + +- Google Cloud project with [Model Armor templates](https://cloud.google.com/security-command-center/docs/manage-model-armor-templates) in a supported region (for example `us-central1`). +- `pip install 'google-adk[gcp]'` (pulls `google-cloud-modelarmor`). +- Application Default Credentials with permission to invoke Model Armor (for example `roles/modelarmor.user` on the templates). + +## Installation + +```shell +pip install 'google-adk[gcp]' +``` + +## Use with agent + +```python +from google.adk.agents import LlmAgent +from google.adk.apps import App +from google.adk.integrations.model_armor import ModelArmorConfig +from google.adk.integrations.model_armor import ModelArmorPlugin + +agent = LlmAgent( + name="screened_agent", + description="Assistant whose input and output are screened.", + instruction="You are a helpful assistant.", +) + +app = App( + name="model_armor_demo", + root_agent=agent, + plugins=[ + ModelArmorPlugin( + config=ModelArmorConfig( + prompt_template_name=( + "projects/PROJECT_ID/locations/us-central1/templates/PROMPT_TEMPLATE" + ), + response_template_name=( + "projects/PROJECT_ID/locations/us-central1/templates/RESPONSE_TEMPLATE" + ), + ) + ) + ], +) +``` + +Prompt and response templates must use full resource paths and reside in the **same** region. The plugin targets `modelarmor.{location}.rep.googleapis.com`. + +## Configuration + +| Field | Description | +| --- | --- | +| `prompt_template_name` | Screen user input (`before_model_callback`). Optional. | +| `response_template_name` | Screen model output (`after_model_callback`). Optional. | +| `input_blocked_message` / `output_blocked_message` | Replacement text when blocked. | +| `block_on_screening_failure` | Default `True`: block when Model Armor cannot return SUCCESS. | + +At least one template name is required. + +Blocked responses include `custom_metadata['model_armor_blocked']` for UI handling. + +## Limitations + +- **Tool output is not screened.** The plugin reads the latest `user` content with text parts only. Tool results arrive as `function_response` parts and do not reach Model Armor. Pipelines that ingest GitHub issues, email, or web search via tools need a separate `after_tool_callback` guardrail if tool output is in scope for your threat model. +- **Regional binding:** one plugin instance maps to one Model Armor region; prompt and response templates must match. +- **Live audio** is screened via transcriptions, not raw audio. + +For plugin architecture background, see [Plugins](/plugins/) and [Safety guardrails](/safety/). + +## Resources + +- [Model Armor overview](https://cloud.google.com/security-command-center/docs/model-armor-overview) +- [Manage Model Armor templates](https://cloud.google.com/security-command-center/docs/manage-model-armor-templates) +- [adk-python source guide](https://github.com/google/adk-python/blob/main/docs/guides/integrations/model_armor/index.md) diff --git a/docs/safety/index.md b/docs/safety/index.md index 4083ce9752..770697040a 100644 --- a/docs/safety/index.md +++ b/docs/safety/index.md @@ -549,7 +549,7 @@ Some examples include: * **Gemini as a Judge Plugin**: This plugin uses Gemini Flash Lite to evaluate user inputs, tool input and output, and agent's response for appropriateness, prompt injection, and jailbreak detection. The plugin configures Gemini to act as a safety filter to mitigate against content safety, brand safety, and agent misalignment. The plugin is configured to pass user input, tool input and output, and model output to Gemini Flash Lite, who decides if the input to the agent is safe or unsafe. If Gemini decides the input is unsafe, the agent returns a predetermined response: "Sorry I cannot help with that. Can I help you with something else?". -* **Model Armor Plugin**: A plugin that queries the model armor API to check for potential content safety violations at specified points of agent execution. Similar to the _Gemini as a Judge_ plugin, if Model Armor finds matches of harmful content, it returns a predetermined response to the user. +* **Model Armor Plugin**: First-party plugin (`google.adk.integrations.model_armor`) that screens user input and model output via Google Cloud Model Armor templates. See the [Model Armor integration guide](/integrations/model-armor/) for install, configuration, and limitations (including tool-output screening). * **PII Redaction Plugin**: A specialized plugin with design for the [Before Tool Callback](/plugins/#tool-callbacks) and specifically created to redact personally identifiable information before it’s processed by a tool or sent to an external service.