Skip to content

Google ADK ​

Integrate Intutic governance with Google's Agent Development Kit (ADK).

ADK is governed on two independent surfaces:

  1. LLM egress — point the model client's base_url at the Intutic proxy (or launch under intutic exec).
  2. Local tool execution — ADK tools run as plain Python callables inside your process. No config or hook file can gate them, so the blocking gate ships SDK-side in intutic-clawde.

How it works ​

The google-adk adapter is detected when pyproject.toml, requirements.txt, or uv.lock declares a google-adk dependency. It writes a .env.intutic file with proxy base-URL env vars plus a comment block pointing at the SDK gate.

Setup ​

1. Initialize Intutic ​

bash
intutic init

2. Route LLM traffic through the proxy ​

Source .env.intutic, launch under intutic exec, or set base_url explicitly — same as LangGraph.

3. Gate local tool execution (SDK) ​

bash
pip install intutic-clawde[google-adk]

ADK documents before_tool_callback — returning a non-None dict skips the real tool call and that dict becomes the (synthetic) tool result. Two ways to wire it, matching ADK's own two registration surfaces:

Global, via a plugin (every tool call across an App):

python
from google.adk.apps.app import App
from intutic_clawde.gate import Gate, GateConfig, install
from intutic_clawde.gate.adapters.google_adk import IntuticPlugin

install(Gate(GateConfig()))

app = App(name="my_app", root_agent=agent, plugins=[IntuticPlugin()])

Per-agent fallback (for callers not using App(plugins=[...])):

python
from google.adk.agents.llm_agent import LlmAgent
from intutic_clawde.gate.adapters.google_adk import intutic_before_tool_callback

agent = LlmAgent(..., before_tool_callback=intutic_before_tool_callback)

The two surfaces use different keyword conventions on ADK's own call sites (tool_args= for the plugin, args= for the per-agent callback) — both adapter functions match their respective site exactly.

On deny, either callback returns a synthetic error dict ({"status": "error", "error": "[Intutic Governance] BLOCKED: ...", ...}) instead of letting the tool run.

4. Trace attribution ​

python
from google.adk.models.lite_llm import LiteLlm  # needs google-adk[extensions]
from intutic_clawde.gate import intutic_headers

model = LiteLlm(
    model="openai/gpt-5-mini",
    api_base="http://localhost:4000/v1",
    extra_headers=intutic_headers(session_id=run_id, harness="google-adk"),
)

LiteLlm passes api_base and extra_headers through to each LiteLLM completion call.

What gets written ​

Same shape as LangGraph's .env.intutic — proxy URLs plus a pointer at intutic_clawde.gate.adapters.google_adk.IntuticPlugin.

To undo what intutic gates install writes here, run intutic disconnect --harness google-adk: each file goes back to what it held before Intutic first wrote it, or is deleted if Intutic created it, and edits you made since are kept. .env.intutic stays while another harness that writes it is still connected. See intutic disconnect.

What the adapter does NOT do ​

Same structural gaps as every SDK-gated framework — see LangGraph's "What the adapter does NOT do". In short: there is no sync-daemon hook file, argument-level gating requires wiring the plugin/callback into your own agent code, and x-intutic-harness attribution is client-supplied, not authorization.

Config details ​

PropertyValue
Harness typegoogle-adk
Config file.env.intutic
Detectiongoogle-adk in pyproject.toml, requirements.txt, or uv.lock
FormatShell environment variables
Write strategyAtomic (write to .intutic-tmp, then rename)
Tool gateSDK-side (intutic_clawde.gate.adapters.google_adk.IntuticPlugin, ADK's before_tool_callback) — no sync-daemon hook file

The circuit breaker for AI agents