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

# Integrations Overview

> Wrap your provider client with a Sakshi middleware, add one line, and every model call your agent makes lands on the same tamper-evident chain.

Sakshi witnesses the AI agents you already run. You do not rewrite the agent. You
wrap the client it calls, and every model call is recorded on the chain, with the
served model identity, tokenized inputs, and outcome. Sakshi never sees a raw
identifier: PII is tokenized at ingest, before anything is stored or hashed.

export const wwGrid = {
  display: 'flex',
  flexWrap: 'wrap',
  gap: '10px',
  justifyContent: 'center',
  margin: '26px 0 6px'
};
export const wwChip = {
  display: 'inline-flex',
  alignItems: 'center',
  gap: '7px',
  padding: '8px 14px',
  border: '1px solid rgba(128,128,128,0.28)',
  borderRadius: '9px',
  fontSize: '14px',
  fontWeight: 600,
  lineHeight: 1
};
export const wwMark = {
  width: 16,
  height: 16,
  fill: 'currentColor',
  opacity: 0.85,
  flexShrink: 0
};

<div style={wwGrid}>
  <span style={wwChip}>OpenAI</span>
  <span style={wwChip}><svg viewBox="0 0 24 24" style={wwMark}><path d="M17.3041 3.541h-3.6718l6.696 16.918H24Zm-10.6082 0L0 20.459h3.7442l1.3693-3.5527h7.0052l1.3693 3.5528h3.7442L10.5363 3.5409Zm-.3712 10.2232 2.2914-5.9456 2.2914 5.9456Z" /></svg>Anthropic</span>
  <span style={wwChip}><svg viewBox="0 0 24 24" style={wwMark}><path d="M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81" /></svg>Google Gemini</span>
  <span style={wwChip}>AWS Bedrock</span>
  <span style={wwChip}><svg viewBox="0 0 24 24" style={wwMark}><path d="M13.796 0a6.93 6.93 0 0 0-4.91 2.019L5.451 5.455l3.273 3.27 3.432-3.432a2.284 2.284 0 0 1 3.277 0 2.28 2.28 0 0 1 0 3.275L12 12.001l3.273 3.273 3.433-3.435c2.692-2.692 2.692-7.127 0-9.82A6.92 6.92 0 0 0 13.796 0m-5.07 8.728-3.433 3.434c-2.692 2.693-2.692 7.126 0 9.819A6.92 6.92 0 0 0 10.203 24a6.93 6.93 0 0 0 4.911-2.02l3.432-3.432-3.271-3.272-3.433 3.433a2.284 2.284 0 0 1-3.277 0 2.28 2.28 0 0 1 0-3.276L12 12z" /></svg>LangChain</span>
  <span style={wwChip}>LangGraph</span>
  <span style={wwChip}>Google ADK</span>
  <span style={wwChip}><svg viewBox="0 0 24 24" style={wwMark}><path d="M12.482.18C7.161 1.319 1.478 9.069 1.426 15.372c-.051 5.527 3.1 8.68 8.68 8.627 6.716-.05 14.259-6.87 12.09-10.9-.672-1.292-1.396-1.344-2.687-.207-1.602 1.395-1.654.31-.207-2.893 1.757-3.98 1.705-5.322-.31-7.544C17.03.388 14.962-.388 12.482.181Zm5.322 2.068c2.273 2.015 2.376 4.236.465 8.42-1.395 3.1-2.17 3.515-3.824 1.86-1.24-1.24-1.343-3.46-.258-6.044 1.137-2.635.982-3.1-.568-1.653-3.72 3.358-6.458 9.765-5.424 12.503.464 1.189.825 1.395 2.737 1.395 2.79 0 6.303-1.705 7.957-3.926 1.756-2.274 2.79-2.274 2.79-.052 0 3.875-6.459 8.627-11.625 8.627-6.251 0-9.351-4.752-7.491-11.47.878-2.995 4.443-7.904 7.077-9.66 3.255-2.17 5.684-2.17 8.164 0z" /></svg>CrewAI</span>
  <span style={wwChip}>AWS Strands</span>
  <span style={wwChip}>AutoGen</span>
  <span style={wwChip}><svg viewBox="0 0 24 24" style={wwMark}><path d="M13.85 0a4.16 4.16 0 0 0-2.95 1.217L1.456 10.66a.835.835 0 0 0 0 1.18.835.835 0 0 0 1.18 0l9.442-9.442a2.49 2.49 0 0 1 3.541 0 2.49 2.49 0 0 1 0 3.541L8.59 12.97l-.1.1a.835.835 0 0 0 0 1.18.835.835 0 0 0 1.18 0l.1-.098 7.03-7.034a2.49 2.49 0 0 1 3.542 0l.049.05a2.49 2.49 0 0 1 0 3.54l-8.54 8.54a1.96 1.96 0 0 0 0 2.755l1.753 1.753a.835.835 0 0 0 1.18 0 .835.835 0 0 0 0-1.18l-1.753-1.753a.266.266 0 0 1 0-.394l8.54-8.54a4.185 4.185 0 0 0 0-5.9l-.05-.05a4.16 4.16 0 0 0-2.95-1.218c-.2 0-.401.02-.6.048a4.17 4.17 0 0 0-1.17-3.552A4.16 4.16 0 0 0 13.85 0m0 3.333a.84.84 0 0 0-.59.245L6.275 10.56a4.186 4.186 0 0 0 0 5.902 4.186 4.186 0 0 0 5.902 0L19.16 9.48a.835.835 0 0 0 0-1.18.835.835 0 0 0-1.18 0l-6.985 6.984a2.49 2.49 0 0 1-3.54 0 2.49 2.49 0 0 1 0-3.54l6.983-6.985a.835.835 0 0 0 0-1.18.84.84 0 0 0-.59-.245" /></svg>MCP</span>
</div>

<p style={{textAlign: 'center', fontSize: '12.5px', opacity: 0.6, marginTop: '4px'}}>Product names and marks are trademarks of their respective owners, shown to indicate compatibility, not endorsement.</p>

## The integration doctrine

There are three ways in, and every one lands on the same chain.

<CardGroup cols={3}>
  <Card title="SDK" icon="code" href="/sdk/python">
    A few lines. You open a witness session and record the steps of a decision
    yourself. Full control over what becomes evidence.
  </Card>

  <Card title="Middleware" icon="plug" href="/integrations/openai">
    One line. Wrap the provider client once and every model call inside a witness
    session is recorded automatically, with no rewrite of the agent.
  </Card>

  <Card title="MCP" icon="server" href="/sdk/mcp">
    Govern any agent that speaks the Model Context Protocol, including agents you
    cannot instrument, through a client session wrapper or a proxy.
  </Card>
</CardGroup>

The middlewares are the shortest path. They are duck-typed, so the Sakshi SDK
carries no dependency on any provider SDK: a middleware wraps any object with the
right shape, attaches to the active witness session, and auto-fills the served
model identity from the provider's response (the RBI draft para-56 evidence, per
decision).

## Supported providers

<CardGroup cols={2}>
  <Card title="OpenAI and OpenAI-compatible" icon="robot" href="/integrations/openai">
    The OpenAI client, plus Ollama, vLLM, TGI, and LM Studio through a base URL.
    The sovereign, self-hosted path.
  </Card>

  <Card title="Anthropic" icon="comment" href="/integrations/anthropic">
    The Anthropic Messages API shape.
  </Card>

  <Card title="Google Gemini" icon="google" href="/integrations/gemini">
    The google-genai SDK shape.
  </Card>

  <Card title="AWS Bedrock" icon="aws" href="/integrations/bedrock">
    The bedrock-runtime Converse API. Residency-compliant in AWS Mumbai.
  </Card>

  <Card title="LangChain" icon="link" href="/integrations/langchain">
    The same provider middlewares underneath, plus the LangGraph path for graph
    apps.
  </Card>

  <Card title="LangGraph" icon="diagram-project" href="/integrations/langgraph">
    Bracket a compiled graph and witness individual nodes.
  </Card>

  <Card title="Google ADK" icon="google" href="/integrations/adk">
    Register one plugin on the Runner to witness the whole agent tree, and
    optionally enforce in the tool path.
  </Card>

  <Card title="CrewAI" icon="users" href="/integrations/crewai">
    Register one event listener to witness a crew's model and tool calls.
  </Card>

  <Card title="AWS Strands" icon="aws" href="/integrations/strands">
    One hook provider to witness tool and model calls, and cancel a tool through
    the envelope.
  </Card>

  <Card title="AutoGen" icon="microsoft" href="/integrations/autogen">
    Govern at the tool boundary and the model client. The honest paths that work.
  </Card>
</CardGroup>

| Runtime                              | Function                          | Wraps                                                     |
| ------------------------------------ | --------------------------------- | --------------------------------------------------------- |
| OpenAI, Ollama, vLLM, TGI, LM Studio | `watch_openai_compatible`         | `chat.completions.create`                                 |
| Anthropic                            | `watch_anthropic`                 | `messages.create`                                         |
| Google Gemini                        | `watch_gemini`                    | `models.generate_content`                                 |
| AWS Bedrock                          | `watch_bedrock`                   | `converse`                                                |
| LangGraph                            | `watch_langgraph`, `witness_node` | a compiled graph, a node callable                         |
| Google ADK                           | `SakshiAdkPlugin`                 | a Runner plugin (witness the tree, enforce the tool path) |
| CrewAI                               | `SakshiCrewListener`              | an event listener (witness the crew's model + tool calls) |
| AWS Strands                          | `SakshiStrandsHooks`              | a hook provider (witness + enforce the tool path)         |
| AutoGen                              | (tool-boundary pattern)           | witness + enforce inside your tools                       |
| MCP                                  | `watch_mcp`                       | an MCP client session                                     |

Every function lives in `sakshi.middleware`:

```python theme={null}
from sakshi.middleware import (
    watch_openai_compatible,
    watch_anthropic,
    watch_gemini,
    watch_bedrock,
    watch_langgraph,
    witness_node,
    watch_mcp,
    SakshiAdkPlugin,
    SakshiCrewListener,
    SakshiStrandsHooks,
)
```

## The shared shape

Every integration follows the same four steps: point the SDK at your deployment,
register the agent, wrap the provider client once, then make calls inside a
witness session.

```python theme={null}
from sakshi import SakshiClient
from sakshi.middleware import watch_openai_compatible
from openai import OpenAI

# 1. Point the SDK at your Sakshi deployment.
sakshi = SakshiClient(
    base_url="https://sakshi.your-company.internal",
    api_key="sks_...",
)

# 2. Register the agent. Idempotent by name, so safe on every startup.
agent_id = sakshi.register(
    "loan-decision-agent",
    owner_name="Priya Sharma",
    owner_email="priya@your-company.com",
    autonomy_tier="L1",
)

# 3. Wrap the provider client once. This is the one line.
llm = watch_openai_compatible(OpenAI())

# 4. Calls made inside a witness session are recorded automatically.
with sakshi.witness(agent_id, client_ref="APP-2026-04471") as decision:
    reply = llm.chat.completions.create(
        model="gpt-5.2",
        messages=[{"role": "user", "content": "Assess this applicant."}],
    )
    decision.action(outcome="approved", amount=1_500_000, mode="auto")
```

You do not pass the model to `witness` when a middleware is in play. The
middleware fills the served model identity from the provider's response, so the
record reflects what actually answered, not what you intended to call.

<Note>
  Evidence belongs to decisions. A model call made outside a witness session
  passes through untouched and is not recorded. Recording is also fail-open: a
  problem writing evidence never breaks or delays the host agent's call.
</Note>

## Where to go next

<CardGroup cols={2}>
  <Card title="Python SDK" icon="code" href="/sdk/python">
    The client, the witness session, enforcement, and the exception model.
  </Card>

  <Card title="MCP governance" icon="server" href="/sdk/mcp">
    The MCP server and the interception proxy for zero-code governance.
  </Card>

  <Card title="The decision chain" icon="link" href="/concepts/decision-chain">
    How steps become a tamper-evident record anyone can recompute.
  </Card>

  <Card title="Quickstart" icon="rocket" href="/quickstart">
    Register, witness, and verify the chain in a few minutes.
  </Card>
</CardGroup>
