Skip to main content
RotaGrant governs the action, not the framework. You keep whatever orchestration you already chose; these adapters exist so you do not write the same wiring twice.

Four ways in

They differ in one thing that matters more than convenience: whether the check is on the causal path or beside it.

SDK

A few lines. You decide where authority is asked for, which means you can also decide not to — enforcement here is cooperative.

Middleware

One line per runtime. Captures what your framework was already doing, so the trajectory fills in without hand-instrumenting each call.

MCP proxy

Zero code in the agent. It sits between the decision and the tool call, so an agent cannot route around a check it never makes.

OpenTelemetry

Nothing deployed alongside the agent. Point a collector at the receiver and existing spans become governed records.
Capture and enforcement are different questions. Middleware and OTel capture what happened. Only the proxy — and a resource verifying a capability token — can refuse an action the agent did not ask permission for. Choosing an adapter is choosing how much you record; choosing the proxy is choosing what can be stopped.

Supported runtimes

OpenAI

watch_openai

Anthropic

watch_anthropic

Google Gemini

watch_gemini

AWS Bedrock

watch_bedrock

LangChain

watch_langchain

LangGraph

watch_langgraph

Google ADK

watch_adk

CrewAI

watch_crew

AWS Strands

watch_strands

AutoGen

watch_autogen

MCP

watch_mcp

Function reference

Everything below is exported from rotascale.middleware.

What they all do, and what none of them do

Every adapter records steps: model calls, tool calls, retrievals and delegations, written onto the open trajectory with taint propagated. None of them asks for authority. That stays an explicit call, because a middleware that silently authorised would make an import into a spend decision:
Capture fails open and enforcement fails closed. Losing a record must never stop the work; losing a decision must never let it through.

Content capture

Every adapter takes capture_content=False, which records shape and metadata — model, latency, token counts, tool names — and not the text. Use it where the prompt or the response is the sensitive part. The governance record is just as complete: what an agent did is the governed fact, and the words it used to do it are usually the part you are least able to store.