Skip to main content

Python SDK for the Nanny execution boundary — @tool, @rule, @agent decorators

Project description

Nanny

nanny-sdk

Python SDK for Nanny — an execution boundary for autonomous AI agents.

@tool, @rule, and @agent decorators that enforce step limits, cost budgets, tool allowlists, and custom rules per function call. Works with LangChain, CrewAI, or any Python agent framework.

pip install nanny-sdk

Full docs: docs.nanny.run


How it works

Nanny runs as a parent process via nanny run. The SDK decorators communicate with it at each tool call to check limits before the function body executes. Outside nanny run, every decorator is a no-op — zero overhead in development and CI.

# Governed — enforcement active
nanny run

# Passthrough — decorators silent, agent runs normally
python agent.py
uv run agent.py

@tool — declare a governed tool

from nanny_sdk import tool

@tool(cost=10)
def fetch_page(url: str) -> str:
    import httpx
    return httpx.get(url).text

Before fetch_page runs, Nanny checks the allowlist, per-tool call limits, and charges 10 cost units against the budget. If any check fails, a NannyStop exception is raised and the function body never executes.

Async functions work identically:

@tool(cost=10)
async def fetch_page(url: str) -> str:
    async with httpx.AsyncClient() as client:
        r = await client.get(url)
        return r.text

@rule — enforce a custom policy

from nanny_sdk import rule

@rule("no_sensitive_files")
def block_sensitive(ctx) -> bool:
    path = ctx.last_tool_args.get("path", "")
    return ".env" not in path and "secret" not in path

Rules run before every @tool call. Return False to stop execution with RuleDenied. The ctx object exposes requested_tool, last_tool_args, and counters.


@agent — activate named limits for a scope

In a multi-agent system, each agent has a different role and a different risk profile. @agent activates the right named limit set when each role runs, then reverts automatically when it's done:

from nanny_sdk import agent

@agent("researcher")
def run_research_loop(query: str) -> str:
    ...

Activates [limits.researcher] from nanny.toml for the duration of the function. Limits revert on exit, including on exception. Each role runs under its own budget and tool allowlist — hitting the analysis ceiling does not affect the reporter, and the analysis agent cannot call the reporter's tools.

metrics_crew — ingestion, analysis, visualization, and reporter agent scopes entering and exiting


nanny.toml example

[runtime]
mode = "local"

[start]
cmd = "uv run agent.py"

[limits]
steps   = 50
cost    = 200
timeout = 120000

[limits.researcher]
steps = 30
cost  = 100

[tools]
allowed = ["fetch_page", "search"]

Stop reasons

When a limit is exceeded, a NannyStop exception is raised with one of these reasons:

Reason Cause
BudgetExhausted Cost ceiling reached
MaxStepsReached Step limit reached
TimeoutExpired Wall-clock limit reached
ToolDenied Tool not in the allowlist
RuleDenied A rule returned False
AgentCompleted Clean exit
AgentNotFound Named limit set in @agent does not exist in nanny.toml
BridgeUnavailable Bridge was active but unreachable — fails closed, never continues ungoverned

Requirements

  • Python 3.11+
  • httpx (only runtime dependency)
  • nanny CLI:
    • macOS: brew tap nanny-run/nanny && brew install nannyd
    • Linux: curl -fsSL https://install.nanny.run | sh
    • Windows: irm https://install.nanny.run/windows | iex

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nanny_sdk-0.2.0.tar.gz (41.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nanny_sdk-0.2.0-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file nanny_sdk-0.2.0.tar.gz.

File metadata

  • Download URL: nanny_sdk-0.2.0.tar.gz
  • Upload date:
  • Size: 41.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nanny_sdk-0.2.0.tar.gz
Algorithm Hash digest
SHA256 5d908a3f5c541fc16295ac9b93c3e58ce09391f64ae4eda81b7141eed2bd9ba4
MD5 40c18c6bd5de7fa74439e19d52260cc6
BLAKE2b-256 38a074783eda11e5e0dab565ff5c0ec1a82d85cd08bd0f860693bd8c656e1a00

See more details on using hashes here.

Provenance

The following attestation bundles were made for nanny_sdk-0.2.0.tar.gz:

Publisher: release.yml on nanny-run/nanny

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nanny_sdk-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: nanny_sdk-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 12.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nanny_sdk-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e56ad027f5da4c16f152cfda9f13b4676866539fac78af6e19f4780c999af0a7
MD5 96493916cd2a1425397b5f1891b57e11
BLAKE2b-256 34bbcf1893d20ef858639aa974164b80650d96ef4897853eca8bd99a418f7b27

See more details on using hashes here.

Provenance

The following attestation bundles were made for nanny_sdk-0.2.0-py3-none-any.whl:

Publisher: release.yml on nanny-run/nanny

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page