google / google/adk-python

feat(model_armor): screen tool output in ModelArmorPlugin (or companion plugin)

Abierto
#6,966 4 comentarios 0 reacciones 1 asignado Reclamado por @sanketpatil06 Ver en GitHub
models needs review spam
Lenguaje dominante
Python
Estrellas
21.5k
Forks
4k
Merge medio
1 d 14 h
PR fusionados (30 d)
37

Descripción

### Is your feature request related to a specific problem?

Same problem as #6964: the documented limitation that tool output is not screened by `ModelArmorPlugin`. For agents that load untrusted text through tools, screening only user prompts and model output leaves a documented security gap.

https://github.com/google/adk-python/blob/main/docs/guides/integrations/model_armor/index.md#limitations

### Describe the Solution You'd Like

One of (maintainer choice):

1. Extend `ModelArmorConfig` with e.g. `screen_tool_output: bool = False` and implement screening in `ModelArmorPlugin.after_tool_callback`, reusing the prompt template; or
2. Ship `ToolOutputModelArmorPlugin` in `google.adk.integrations.model_armor` as an optional companion with shared config/client.

Either approach should mirror fail-closed semantics of the existing plugin and include unit tests in `tests/unittests/integrations/model_armor/`.

### Impact on your work

Production agent pipelines where tool output is the dominant untrusted input channel. Reference sample implementation: #6964 / #6965.

### Willingness to contribute

Yes. Sample PR #6965 is open; happy to contribute a core plugin PR after design alignment.

### Describe Alternatives You've Considered

- Document-only workaround: insufficient; limitation is already documented but not addressed.
- Per-app custom plugins forever: duplicates logic across every ADK 2.8 adopter with tool-heavy threat models.

### Proposed API / Implementation

```python
@dataclass
class ModelArmorConfig:
...
screen_tool_output: bool = False
tool_output_blocked_message: str = "Tool output was blocked by Model Armor."
```

```python
async def after_tool_callback(self, *, tool, tool_args, tool_context, result, **kwargs):
if not self._config.screen_tool_output:
return None
...
```

### Additional context

- Not requesting Workflow-as-sub-agent (#5872 closed; Workflow-as-Tool is the supported orchestration path).
- Separate from #6224 (durable execution hooks).

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.