Before your agent executes a supported tool or model call, the SDK asks the gate.
allow, block, or
require_approval — backed by tool patterns, budgets, rate limits, and human approvals.
@protect
call — no round-trip cost when the answer is "yes". Hard
blocks on overrun; soft mode allows a bounded overrun
when an active chain is present.
money_amount / tool_parameters).
Every approval is bound to the exact action payload via a
SHA-256 action_digest — the grant is refused
if the SDK then executes a different amount or
different arguments.
killed /
paused to every connected SDK. WorkflowKilledInterrupt
reaches the top of the agent loop, not a swallowed
except Exception.
mcp://payments/refund*,
bash, db.drop) decide which
canonical tool names are allowed. Always Hard:
fails closed on transport error, regardless of the budget's
enforcement_mode.
nullrun.init() patches OpenAI, Anthropic,
LangGraph, OpenAI Agents, Mistral, Gemini, Cohere, Bedrock,
LlamaIndex, CrewAI, and AutoGen — cost tracking without
@protect.
NullRun runs as a managed control plane at nullrun.io.
There is no self-hosted deployment option today. The Python
SDK runs inside your process and talks to the hosted gateway
over HTTPS; the dashboard at nullrun.io hosts the
control plane. See
the docs for the SDK
surface and /about for
the runtime contract.