> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rotascale.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Google Gemini

> Govern Google Gemini with one line: watch_gemini wraps `generate_content`, and every model call, tool call and retrieval lands on the trajectory.

Gemini, through the Google GenAI SDK.

```python theme={"system"}
from google import genai
from rotascale.middleware import watch_gemini

client = watch_gemini(genai.Client())
```

That is the whole integration. From here every call the client makes is recorded
on the open trajectory.

## What is distinctive

Function calls are read off the response and recorded individually. A response proposing three functions produces three steps, because one of them being refused is the interesting case.

## In context

```python theme={"system"}
from rotascale import Rotascale

client = Rotascale()
agent = client.agent("refund-bot")

with client.witness(agent) as trajectory:
    trajectory.authorize(GRANT, {"tools": ["issue_refund"]}, amount_minor=4_500)
    # ... your Google Gemini calls here, already wrapped ...
```

The `witness` block opens the trajectory and closes it on exit, including when
the body raises — an episode that ended badly is exactly the one worth having a
record of.

## Recording without content

```python theme={"system"}
watch_gemini(client, capture_content=False)
```

Shape and metadata only: model, latency, token counts, tool names. No prompt or
response text. The governed facts are unchanged.

<Tip>
  Authority is never asked for by an adapter. It stays an explicit
  `trajectory.authorize(...)` call, so importing a middleware can never become a
  spend decision. See [authorise an action](/guides/authorise-an-action).
</Tip>
