# Frameworks — Guided starters for governed agent code

Decorators and drop-in clients for CrewAI, LangGraph, Anthropic Agent SDK, OpenAI Agents SDK — per-user identity, policy, PII, audit on every tool call.

<div class="acp-section" style="padding-top:56px;">
  <div class="acp-container" style="text-align:center;">
    <h1 class="acp-hero-h1" style="font-size:40px;margin:0 auto;">You're writing the agent. We give you the control layer.</h1>
    <p class="acp-subtitle" style="max-width:680px;margin:16px auto 0;">
      ACP ships an SDK for each major agent framework. One <code>pip install</code> (Python) or <code>npm i @agenticcontrolplane/governance</code> (TypeScript), one decorator or one base-URL change, and every tool call your agents make gets identity, per-user policy, PII detection, and audit &mdash; rooted in the <em>end user's</em> identity, not your service key.
    </p>
    <p class="acp-muted" style="max-width:640px;margin:12px auto 0;font-size:14px;">
      Different from <a href="/integrations">Integrations</a>, which is for plugging off-the-shelf AI clients (Claude Code, Cursor, Claude Desktop) into ACP. This page is for <strong>you building the agent</strong>.
    </p>
  </div>
</div>

<!-- Frameworks -->
<div class="acp-section" style="padding-top:8px;">
  <div class="acp-container">
    <div class="acp-card acp-card-pad">
      <div class="acp-integ-header">
        <div class="acp-integ-label">Starters</div>
        <h2 class="acp-section-title" style="margin-bottom:4px;">Pick your framework. Copy the starter. Ship controlled.</h2>
      </div>
      <p class="acp-muted" style="max-width:720px;margin-bottom:20px;">
        Each guide ships a runnable minimal example &mdash; a FastAPI or Express endpoint, one wrapped tool, an end-user JWT bound to the request. Clone, set two env vars, <code>pip install</code>, hit the endpoint, watch the audit log populate.
      </p>
      <div class="acp-grid-cards" style="display:grid;grid-template-columns:repeat(auto-fill, minmax(260px, 1fr));gap:12px;">
        <a href="/integrations/crewai" class="acp-linkcard" style="display:block;padding:18px;border:1px solid var(--gs-border, #e0e0e8);border-radius:10px;text-decoration:none;">
          <div style="font-weight:600;font-size:15px;color:var(--gs-text);">CrewAI</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:6px;">Python &middot; <code>@governed</code> decorator &middot; inter-agent handoff capture</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:4px;"><code>pip install acp-crewai</code></div>
        </a>
        <a href="/integrations/langgraph" class="acp-linkcard" style="display:block;padding:18px;border:1px solid var(--gs-border, #e0e0e8);border-radius:10px;text-decoration:none;">
          <div style="font-weight:600;font-size:15px;color:var(--gs-text);">LangChain &middot; LangGraph</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:6px;">Python &middot; <code>@governed</code> decorator &middot; ReAct, StateGraph, supervisor-worker</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:4px;"><code>pip install acp-langchain</code></div>
        </a>
        <a href="/integrations/anthropic-agent-sdk" class="acp-linkcard" style="display:block;padding:18px;border:1px solid var(--gs-border, #e0e0e8);border-radius:10px;text-decoration:none;">
          <div style="font-weight:600;font-size:15px;color:var(--gs-text);">Anthropic Agent SDK</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:6px;">TypeScript &middot; <code>governHandlers</code> wrap &middot; tool-use loops around Claude</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:4px;"><code>npm i @agenticcontrolplane/governance-anthropic</code></div>
        </a>
        <a href="/integrations/openai-agents-sdk" class="acp-linkcard" style="display:block;padding:18px;border:1px solid var(--gs-border, #e0e0e8);border-radius:10px;text-decoration:none;">
          <div style="font-weight:600;font-size:15px;color:var(--gs-text);">OpenAI Agents SDK</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:6px;">Python &middot; OpenAI-compatible proxy &middot; per-agent attribution via header</div>
          <div style="font-size:12px;color:var(--gs-text-faint);margin-top:4px;">No install &mdash; point <code>base_url</code> at ACP</div>
        </a>
      </div>
      <p class="acp-muted" style="margin-top:18px;font-size:13px;">
        Plus: <a href="/integrations/microsoft-agent-framework">Microsoft Agent Framework</a>, <a href="/integrations/strands">AWS Strands</a>, <a href="/integrations/google-agents-cli">Google ADK</a>, <a href="/integrations/vercel-ai-sdk">Vercel AI SDK</a>, <a href="/integrations/mastra">Mastra</a>, <a href="/integrations/pydantic-ai">Pydantic AI</a>, <a href="/integrations/deepagents">Deep Agents</a>, <a href="/integrations/autogen">AutoGen</a> (now <a href="/integrations/microsoft-agent-framework">Agent Framework</a>) &mdash; full coverage across the most-deployed agent SDKs in 2026. And for cloud-hosted agents: <a href="/integrations/aws-bedrock">AWS Bedrock</a>, <a href="/integrations/microsoft-foundry-agent-service">Microsoft Foundry</a>, <a href="/integrations/vertex-ai-agent-builder">Vertex AI Agent Builder</a>.
      </p>
      <p class="acp-muted" style="margin-top:8px;font-size:13px;">
        Using a framework we don't list? The <a href="/docs/governance-model">control model</a> is framework-agnostic &mdash; the <code>/govern/tool-use</code> endpoint is HTTP, and the <a href="https://github.com/agentic-control-plane/acp-governance-sdks">SDK source</a> shows what an adapter does. There is no adapter for it today.
      </p>
    </div>
  </div>
</div>

<!-- Two install patterns -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-card acp-card-pad">
      <div class="acp-integ-header">
        <div class="acp-integ-label">Two install patterns</div>
        <h2 class="acp-section-title" style="margin-bottom:4px;">Either wrap your tools, or proxy your LLM.</h2>
      </div>
      <p class="acp-muted" style="max-width:720px;margin-bottom:20px;">
        Depending on the framework, control enters the loop in one of two places. Both land at the same audit log.
      </p>
      <div style="display:grid;grid-template-columns:repeat(auto-fill, minmax(320px, 1fr));gap:16px;">
        <div class="acp-integ-gov-item" style="padding:20px;">
          <div class="acp-integ-gov-title">Pattern A &mdash; wrap the tool</div>
          <div class="acp-muted" style="font-size:13px;margin-top:6px;">
            You decorate each tool with <code>@governed("tool_name")</code>. Before the tool runs, ACP evaluates policy, rate limits, and PII on the input; after it runs, ACP scans the output. The LLM call goes direct to your provider.
          </div>
          <div class="acp-muted" style="font-size:12px;margin-top:10px;">Used by: <strong>CrewAI</strong>, <strong>LangGraph</strong>, <strong>Anthropic Agent SDK</strong>.</div>
        </div>
        <div class="acp-integ-gov-item" style="padding:20px;">
          <div class="acp-integ-gov-title">Pattern B &mdash; proxy the LLM</div>
          <div class="acp-muted" style="font-size:13px;margin-top:6px;">
            You point the framework's OpenAI-compatible client at <code>api.agenticcontrolplane.com/v1</code>. Every LLM call &mdash; and the tool calls it emits &mdash; is audited at the proxy. Per-agent attribution via <code>x-acp-agent-name</code> header.
          </div>
          <div class="acp-muted" style="font-size:12px;margin-top:10px;">Used by: <strong>OpenAI Agents SDK</strong>, any OpenAI-compatible client.</div>
        </div>
      </div>
      <p class="acp-muted" style="margin-top:18px;font-size:13px;">
        Deeper explanation of both paths: <a href="/docs/governance-model" style="color:var(--color-accent);">how a call is decided &rarr;</a>
      </p>
    </div>
  </div>
</div>

<!-- Core concepts (shared across frameworks) -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-card acp-card-pad">
      <div class="acp-integ-header">
        <div class="acp-integ-label">Shared concepts</div>
        <h2 class="acp-section-title" style="margin-bottom:4px;">One control model. Framework-agnostic.</h2>
      </div>
      <p class="acp-muted" style="max-width:720px;margin-bottom:20px;">
        Every starter teaches the same four building blocks. Learn them once; they apply no matter which framework you pick.
      </p>
      <div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px;">
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">End-user JWT binding</div>
          <div class="acp-muted" style="font-size:13px;">Every request carries the <em>human's</em> token, not your service key. <code>set_context(user_token=...)</code> at request start.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title"><code>@governed</code> decorator</div>
          <div class="acp-muted" style="font-size:13px;">Marks a tool as policy-enforced. Deny returns a tool-error string the LLM can adapt to. Allow runs your code.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Session IDs</div>
          <div class="acp-muted" style="font-size:13px;">All tool calls for one request share a <code>session_id</code>, so the audit log groups them into a single trace.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Fail-open</div>
          <div class="acp-muted" style="font-size:13px;">If <code>/govern/tool-use</code> times out, the tool proceeds with reason <code>fail-open</code>. Control is never a single point of failure.</div>
        </div>
      </div>
      <p class="acp-muted" style="margin-top:18px;font-size:13px;"><a href="/docs/governance-model" style="color:var(--color-accent);">Deep dive on how a call is decided &rarr;</a> &middot; <a href="/docs/policies" style="color:var(--color-accent);">How workspace policies work &rarr;</a></p>
    </div>
  </div>
</div>

<!-- What you get -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-card acp-card-pad" style="text-align:center;">
      <h2 class="acp-section-title">What every framework starter gets</h2>
      <p class="acp-muted" style="max-width:620px;margin:0 auto 24px;">No matter which framework &mdash; every tool call your agent makes passes through the same control pipeline.</p>
      <div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;text-align:left;">
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Per-user policy</div>
          <div class="acp-muted" style="font-size:13px;">Allow / deny / redact evaluated against the end user's scopes and the workspace's rules.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Per-user rate limits</div>
          <div class="acp-muted" style="font-size:13px;">Budgets and throttles rooted in the human, not the shared service key.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">PII detection</div>
          <div class="acp-muted" style="font-size:13px;">Scan tool input and output; redact or flag based on policy.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Cross-framework audit</div>
          <div class="acp-muted" style="font-size:13px;">CrewAI, LangGraph, Claude Code, Cursor &mdash; one log per user across every agent surface.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Inter-agent handoffs</div>
          <div class="acp-muted" style="font-size:13px;">Multi-agent delegation audited as <code>Agent.Handoff</code> events where the framework supports it.</div>
        </div>
        <div class="acp-integ-gov-item">
          <div class="acp-integ-gov-title">Identity provider of your choice</div>
          <div class="acp-muted" style="font-size:13px;">Firebase, Auth0, Okta, Entra ID, any OIDC. Your users stay in your directory.</div>
        </div>
      </div>
    </div>
  </div>
</div>

<!-- CTA -->
<div class="acp-section">
  <div class="acp-container">
    <div class="acp-cta-card" style="text-align:center;">
      <h2 class="acp-section-title">Your framework. Our control plane.</h2>
      <p class="acp-muted" style="max-width:520px;margin:8px auto 0;">
        Free to start. Add per-user control to your agent code in minutes.
      </p>
      <div style="margin-top:24px;display:flex;justify-content:center;gap:16px;flex-wrap:wrap;">
        <a href="https://cloud.agenticcontrolplane.com/login?from=%2Fonboarding" class="acp-btn acp-btn-primary" data-track="Frameworks: Get Started Free" style="padding:14px 32px;font-size:16px;">Get started free &rarr;</a>
        <a href="/docs/governance-model" class="acp-btn acp-btn-ghost" data-track="Frameworks: Learn the Model" style="padding:14px 32px;font-size:16px;">Read the model &rarr;</a>
      </div>
    </div>
  </div>
</div>

<style>
.acp-integ-header { margin-bottom: 16px; }
.acp-integ-label {
  display: inline-block;
  padding: 5px 16px;
  border-radius: 100px;
  background: linear-gradient(135deg, rgba(79,70,229,0.14), rgba(6,182,212,0.10));
  color: var(--color-accent);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  margin-bottom: 12px;
}
.acp-integ-gov-item {
  padding: 20px;
  border-radius: var(--radius-md);
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  transition: border-color 0.15s ease;
}
.acp-integ-gov-item:hover {
  border-color: var(--color-accent);
}
.acp-integ-gov-title {
  font-size: 14px;
  font-weight: 700;
  color: var(--color-text-primary);
  margin-bottom: 4px;
}
.acp-integ-gov-title::before {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--color-accent);
  margin-right: 8px;
  vertical-align: middle;
}
.acp-linkcard code {
  font-size: 11px;
  background: rgba(91,91,214,0.08);
  padding: 1px 5px;
  border-radius: 3px;
}
</style>
