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.
There are three ways in, and every one lands on the same chain.
SDK
A few lines. You open a witness session and record the steps of a decision
yourself. Full control over what becomes evidence.
Middleware
One line. Wrap the provider client once and every model call inside a witness
session is recorded automatically, with no rewrite of the agent.
MCP
Govern any agent that speaks the Model Context Protocol, including agents you
cannot instrument, through a client session wrapper or a proxy.
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).
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.
from sakshi import SakshiClientfrom sakshi.middleware import watch_openai_compatiblefrom 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.
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.
The client, the witness session, enforcement, and the exception model.
MCP governance
The MCP server and the interception proxy for zero-code governance.
The decision chain
How steps become a tamper-evident record anyone can recompute.
Quickstart
Register, witness, and verify the chain in a few minutes.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Sakshi Documentation","colors":{"primary":"#010ED0","light":"#6B8BFF","dark":"#010ED0"},"logo":{"light":"https://mintcdn.com/rotavision/EwXYN0WT5EiTavwo/images/logo-light.png?fit=max\u0026auto=format\u0026n=EwXYN0WT5EiTavwo\u0026q=85\u0026s=49d84a9b697b7b90dda82995be2309ba","dark":"https://mintcdn.com/rotavision/EwXYN0WT5EiTavwo/images/logo-dark.png?fit=max\u0026auto=format\u0026n=EwXYN0WT5EiTavwo\u0026q=85\u0026s=516f7c0ce4861f5566e5e20fcd76b3d3","href":"https://rotavision.com"},"favicon":"https://mintcdn.com/rotavision/apm9KWQAQGkAFbpZ/images/favicon.png?fit=max\u0026auto=format\u0026n=apm9KWQAQGkAFbpZ\u0026q=85\u0026s=e3d2e405cdd0ca6806e3d4af5e8dac4e","navbar":{"links":[{"href":"mailto:support@rotavision.com","label":"Support"}],"primary":{"type":"button","label":"Get a sandbox","href":"https://rotavision.com/sandbox"}},"footer":{"socials":{"x":"https://x.com/rotavision_ai","github":"https://github.com/rotavision-ai","linkedin":"https://linkedin.com/company/rotavision"}},"integrations":{"ga4":{"measurementId":"G-9SQ3VYNMMM"}},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/rotavision-ai"},{"anchor":"PyPI","icon":"python","href":"https://pypi.org/project/sakshi-sdk/"},{"anchor":"Blog","icon":"newspaper","href":"https://rotavision.com/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"rotavision","hasAudioNarration":false,"actualSubdomain":"rotavision","customDomains":["docs.rotavision.com"],"gitSource":{"type":"github","owner":"rotavision-ai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a60e6a3c6380f33f10427de","collectionId":"367b501c-a82f-4b8b-9d6a-f7a405190885","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6a60e6a3c6380f33f10427de"},"entitlements":{},"buildId":"6a60e6a3c6380f33f10427de:success","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"API Reference","count":113},{"language":"default","tag":"Endpoints","count":110},{"language":"default","tag":"bound","count":28},{"language":"default","tag":"Integrations","count":24},{"language":"default","tag":"Documentation","count":22},{"language":"default","tag":"register","count":22},{"language":"default","tag":"vidhi","count":17},{"language":"default","tag":"access","count":11},{"language":"default","tag":"vishwas","count":9},{"language":"default","tag":"Core Concepts","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"[class*=rounded-]:not([class*=rounded-full]){border-radius:0!important}.prose code,.prose img,.prose pre,.prose table,button,code,figure,img,input,kbd,pre,select,table,tbody,textarea,thead{border-radius:0!important}"}],"page":{"pagePath":"integrations/overview","slug":"/integrations/overview","pageMetadata":{"title":"Integrations Overview","description":"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.","href":"/integrations/overview"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"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.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];const wwGrid={display:`flex`,flexWrap:`wrap`,gap:`10px`,justifyContent:`center`,margin:`26px 0 6px`};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};const wwMark={width:16,height:16,fill:`currentColor`,opacity:.85,flexShrink:0};function _createMdxContent(props){const _components={code:`code`,p:`p`,pre:`pre`,span:`span`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Heading,Note,Table}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Sakshi witnesses the AI agents you already run. You do not rewrite the agent. You\nwrap the client it calls, and every model call is recorded on the chain, with the\nserved model identity, tokenized inputs, and outcome. Sakshi never sees a raw\nidentifier: PII is tokenized at ingest, before anything is stored or hashed.`}),`\n`,`\n`,_jsxs(`div`,{style:wwGrid,children:[_jsx(`span`,{style:wwChip,children:`OpenAI`}),_jsxs(`span`,{style:wwChip,children:[_jsx(`svg`,{viewBox:`0 0 24 24`,style:wwMark,children:_jsx(`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`})}),`Anthropic`]}),_jsxs(`span`,{style:wwChip,children:[_jsx(`svg`,{viewBox:`0 0 24 24`,style:wwMark,children:_jsx(`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`})}),`Google Gemini`]}),_jsx(`span`,{style:wwChip,children:`AWS Bedrock`}),_jsxs(`span`,{style:wwChip,children:[_jsx(`svg`,{viewBox:`0 0 24 24`,style:wwMark,children:_jsx(`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`})}),`LangChain`]}),_jsx(`span`,{style:wwChip,children:`LangGraph`}),_jsx(`span`,{style:wwChip,children:`Google ADK`}),_jsxs(`span`,{style:wwChip,children:[_jsx(`svg`,{viewBox:`0 0 24 24`,style:wwMark,children:_jsx(`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`})}),`CrewAI`]}),_jsx(`span`,{style:wwChip,children:`AWS Strands`}),_jsx(`span`,{style:wwChip,children:`AutoGen`}),_jsxs(`span`,{style:wwChip,children:[_jsx(`svg`,{viewBox:`0 0 24 24`,style:wwMark,children:_jsx(`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`})}),`MCP`]})]}),`\n`,_jsx(`p`,{style:{textAlign:`center`,fontSize:`12.5px`,opacity:.6,marginTop:`4px`},children:`Product names and marks are trademarks of their respective owners, shown to indicate compatibility, not endorsement.`}),`\n`,_jsx(Heading,{level:`2`,id:`the-integration-doctrine`,children:`The integration doctrine`}),`\n`,_jsx(_components.p,{children:`There are three ways in, and every one lands on the same chain.`}),`\n`,_jsxs(CardGroup,{cols:3,children:[_jsx(Card,{title:`SDK`,icon:`code`,href:`/sdk/python`,children:_jsx(_components.p,{children:`A few lines. You open a witness session and record the steps of a decision\nyourself. Full control over what becomes evidence.`})}),_jsx(Card,{title:`Middleware`,icon:`plug`,href:`/integrations/openai`,children:_jsx(_components.p,{children:`One line. Wrap the provider client once and every model call inside a witness\nsession is recorded automatically, with no rewrite of the agent.`})}),_jsx(Card,{title:`MCP`,icon:`server`,href:`/sdk/mcp`,children:_jsx(_components.p,{children:`Govern any agent that speaks the Model Context Protocol, including agents you\ncannot instrument, through a client session wrapper or a proxy.`})})]}),`\n`,_jsx(_components.p,{children:`The middlewares are the shortest path. They are duck-typed, so the Sakshi SDK\ncarries no dependency on any provider SDK: a middleware wraps any object with the\nright shape, attaches to the active witness session, and auto-fills the served\nmodel identity from the provider’s response (the RBI draft para-56 evidence, per\ndecision).`}),`\n`,_jsx(Heading,{level:`2`,id:`supported-providers`,children:`Supported providers`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`OpenAI and OpenAI-compatible`,icon:`robot`,href:`/integrations/openai`,children:_jsx(_components.p,{children:`The OpenAI client, plus Ollama, vLLM, TGI, and LM Studio through a base URL.\nThe sovereign, self-hosted path.`})}),_jsx(Card,{title:`Anthropic`,icon:`comment`,href:`/integrations/anthropic`,children:_jsx(_components.p,{children:`The Anthropic Messages API shape.`})}),_jsx(Card,{title:`Google Gemini`,icon:`google`,href:`/integrations/gemini`,children:_jsx(_components.p,{children:`The google-genai SDK shape.`})}),_jsx(Card,{title:`AWS Bedrock`,icon:`aws`,href:`/integrations/bedrock`,children:_jsx(_components.p,{children:`The bedrock-runtime Converse API. Residency-compliant in AWS Mumbai.`})}),_jsx(Card,{title:`LangChain`,icon:`link`,href:`/integrations/langchain`,children:_jsx(_components.p,{children:`The same provider middlewares underneath, plus the LangGraph path for graph\napps.`})}),_jsx(Card,{title:`LangGraph`,icon:`diagram-project`,href:`/integrations/langgraph`,children:_jsx(_components.p,{children:`Bracket a compiled graph and witness individual nodes.`})}),_jsx(Card,{title:`Google ADK`,icon:`google`,href:`/integrations/adk`,children:_jsx(_components.p,{children:`Register one plugin on the Runner to witness the whole agent tree, and\noptionally enforce in the tool path.`})}),_jsx(Card,{title:`CrewAI`,icon:`users`,href:`/integrations/crewai`,children:_jsx(_components.p,{children:`Register one event listener to witness a crew’s model and tool calls.`})}),_jsx(Card,{title:`AWS Strands`,icon:`aws`,href:`/integrations/strands`,children:_jsx(_components.p,{children:`One hook provider to witness tool and model calls, and cancel a tool through\nthe envelope.`})}),_jsx(Card,{title:`AutoGen`,icon:`microsoft`,href:`/integrations/autogen`,children:_jsx(_components.p,{children:`Govern at the tool boundary and the model client. The honest paths that work.`})})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Runtime`}),_jsx(_components.th,{children:`Function`}),_jsx(_components.th,{children:`Wraps`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`OpenAI, Ollama, vLLM, TGI, LM Studio`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`watch_openai_compatible`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`chat.completions.create`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Anthropic`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`watch_anthropic`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`messages.create`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Google Gemini`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`watch_gemini`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`models.generate_content`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AWS Bedrock`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`watch_bedrock`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`converse`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`LangGraph`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`watch_langgraph`}),`, `,_jsx(_components.code,{children:`witness_node`})]}),_jsx(_components.td,{children:`a compiled graph, a node callable`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Google ADK`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`SakshiAdkPlugin`})}),_jsx(_components.td,{children:`a Runner plugin (witness the tree, enforce the tool path)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CrewAI`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`SakshiCrewListener`})}),_jsx(_components.td,{children:`an event listener (witness the crew’s model + tool calls)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AWS Strands`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`SakshiStrandsHooks`})}),_jsx(_components.td,{children:`a hook provider (witness + enforce the tool path)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AutoGen`}),_jsx(_components.td,{children:`(tool-boundary pattern)`}),_jsx(_components.td,{children:`witness + enforce inside your tools`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`MCP`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`watch_mcp`})}),_jsx(_components.td,{children:`an MCP client session`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Every function lives in `,_jsx(_components.code,{children:`sakshi.middleware`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`12`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sakshi.middleware `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_openai_compatible,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_anthropic,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_gemini,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_bedrock,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_langgraph,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` witness_node,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_mcp,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SakshiAdkPlugin,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SakshiCrewListener,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SakshiStrandsHooks,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`the-shared-shape`,children:`The shared shape`}),`\n`,_jsx(_components.p,{children:`Every integration follows the same four steps: point the SDK at your deployment,\nregister the agent, wrap the provider client once, then make calls inside a\nwitness session.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`28`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sakshi `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SakshiClient`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sakshi.middleware `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_openai_compatible`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` openai `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` OpenAI`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 1. Point the SDK at your Sakshi deployment.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`sakshi `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SakshiClient(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` base_url`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://sakshi.your-company.internal\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` api_key`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"sks_...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 2. Register the agent. Idempotent by name, so safe on every startup.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`agent_id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sakshi.register(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"loan-decision-agent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` owner_name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Priya Sharma\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` owner_email`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"priya@your-company.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` autonomy_tier`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"L1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 3. Wrap the provider client once. This is the one line.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`llm `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` watch_openai_compatible(OpenAI())`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 4. Calls made inside a witness session are recorded automatically.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sakshi.witness(agent_id, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`client_ref`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"APP-2026-04471\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`as`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` decision:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` reply `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` llm.chat.completions.create(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` model`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"gpt-5.2\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` messages`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[{`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"role\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"user\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"content\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Assess this applicant.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` decision.action(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`outcome`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"approved\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`amount`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1_500_000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`mode`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"auto\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`You do not pass the model to `,_jsx(_components.code,{children:`witness`}),` when a middleware is in play. The\nmiddleware fills the served model identity from the provider’s response, so the\nrecord reflects what actually answered, not what you intended to call.`]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Evidence belongs to decisions. A model call made outside a witness session\npasses through untouched and is not recorded. Recording is also fail-open: a\nproblem writing evidence never breaks or delays the host agent’s call.`})}),`\n`,_jsx(Heading,{level:`2`,id:`where-to-go-next`,children:`Where to go next`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Python SDK`,icon:`code`,href:`/sdk/python`,children:_jsx(_components.p,{children:`The client, the witness session, enforcement, and the exception model.`})}),_jsx(Card,{title:`MCP governance`,icon:`server`,href:`/sdk/mcp`,children:_jsx(_components.p,{children:`The MCP server and the interception proxy for zero-code governance.`})}),_jsx(Card,{title:`The decision chain`,icon:`link`,href:`/concepts/decision-chain`,children:_jsx(_components.p,{children:`How steps become a tamper-evident record anyone can recompute.`})}),_jsx(Card,{title:`Quickstart`,icon:`rocket`,href:`/quickstart`,children:_jsx(_components.p,{children:`Register, witness, and verify the chain in a few minutes.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{wwGrid,wwChip,wwMark,default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Integrations Overview","description":"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.","href":"/integrations/overview"}}},"mdxSourceWithNoJs":null,"noJsSplices":[[141,503,"undefined;const wwChip=undefined;const wwMark=undefined;func"],[1423,1427,""]]},"mdxExtracts":{"tableOfContents":[{"title":"The integration doctrine","slug":"the-integration-doctrine","depth":2,"children":[]},{"title":"Supported providers","slug":"supported-providers","depth":2,"children":[]},{"title":"The shared shape","slug":"the-shared-shape","depth":2,"children":[]},{"title":"Where to go next","slug":"where-to-go-next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"rotavision","siteName":"Sakshi Documentation","title":"Integrations Overview - Sakshi Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-21T14:27:46.765Z","originalFileLocation":"integrations/overview.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"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.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Sakshi Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Integrations Overview - Sakshi Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"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.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Sakshi Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.rotavision.com/integrations/overview\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://rotavision.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=Integrations+Overview\u0026amp;description=Wrap+your+provider+client+with+a+Sakshi+middleware%2C+add+one+line%2C+and+every+model+call+your+agent+makes+lands+on+the+same+tamper-evident+chain.\u0026amp;theme=dda0e1d41e0daf4a5b6aca1d\u0026amp;signature=57a54dd3d0bedb48cd352c03dd535d151ffb5f5affe5de5fb75a6e13dde0e9de\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Integrations Overview - Sakshi Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"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.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://rotavision.mintlify.app/_mintlify/api/og/v2?division=Integrations\u0026amp;title=Integrations+Overview\u0026amp;description=Wrap+your+provider+client+with+a+Sakshi+middleware%2C+add+one+line%2C+and+every+model+call+your+agent+makes+lands+on+the+same+tamper-evident+chain.\u0026amp;theme=dda0e1d41e0daf4a5b6aca1d\u0026amp;signature=57a54dd3d0bedb48cd352c03dd535d151ffb5f5affe5de5fb75a6e13dde0e9de\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/rotavision/_4Dg_RCpzfFPJUsQ/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Sakshi Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#010ED0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.rotavision.com/integrations/overview\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/overview.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.rotavision.com/#organization\",\"name\":\"Sakshi Documentation\",\"url\":\"https://docs.rotavision.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/rotavision/EwXYN0WT5EiTavwo/images/logo-light.png?fit=max\u0026auto=format\u0026n=EwXYN0WT5EiTavwo\u0026q=85\u0026s=49d84a9b697b7b90dda82995be2309ba\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.rotavision.com#website\",\"name\":\"Sakshi Documentation\",\"url\":\"https://docs.rotavision.com\",\"publisher\":{\"@id\":\"https://docs.rotavision.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.rotavision.com/integrations/overview#webpage\",\"url\":\"https://docs.rotavision.com/integrations/overview\",\"name\":\"Integrations Overview\",\"description\":\"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.\",\"dateModified\":\"2026-07-21T14:27:46.765Z\",\"isPartOf\":{\"@id\":\"https://docs.rotavision.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.rotavision.com/integrations/overview#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.rotavision.com/integrations/overview#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Sakshi Documentation\",\"item\":\"https://docs.rotavision.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrations Overview\",\"item\":\"https://docs.rotavision.com/integrations/overview\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.rotavision.com/integrations/overview#article\",\"headline\":\"Integrations Overview\",\"name\":\"Integrations Overview\",\"description\":\"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.\",\"url\":\"https://docs.rotavision.com/integrations/overview\",\"mainEntityOfPage\":{\"@id\":\"https://docs.rotavision.com/integrations/overview#webpage\"},\"dateModified\":\"2026-07-21T14:27:46.765Z\",\"publisher\":{\"@id\":\"https://docs.rotavision.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.rotavision.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Sakshi Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Sakshi Documentation","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"github","href":"https://github.com/rotavision-ai"},{"anchor":"PyPI","icon":"python","href":"https://pypi.org/project/sakshi-sdk/"},{"anchor":"Blog","icon":"newspaper","href":"https://rotavision.com/blog"}]},"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"SDK","pages":[{"title":"SDK","href":"/sdk/overview"}]},{"tab":"Integrations","groups":[{"group":"Integrations","pages":[{"title":"Integrations Overview","href":"/integrations/overview"},{"title":"OpenAI and OpenAI-compatible","description":"Witness OpenAI and any OpenAI-compatible runtime, including self-hosted Ollama, vLLM, TGI, and LM Studio, with one line.","href":"/integrations/openai"},{"title":"Anthropic","href":"/integrations/anthropic"},{"title":"Google Gemini","href":"/integrations/gemini"},{"title":"AWS Bedrock","href":"/integrations/bedrock"},{"title":"LangChain","href":"/integrations/langchain"},{"title":"LangGraph","href":"/integrations/langgraph"},{"title":"Google ADK","href":"/integrations/adk"},{"title":"CrewAI","href":"/integrations/crewai"},{"title":"AWS Strands","href":"/integrations/strands"},{"title":"AutoGen","href":"/integrations/autogen"},{"title":"MCP","href":"/integrations/mcp"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"Integrations Overview - Sakshi Documentation","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}