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.1.7.tar.gz (38.4 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.1.7-py3-none-any.whl (10.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: nanny_sdk-0.1.7.tar.gz
  • Upload date:
  • Size: 38.4 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.1.7.tar.gz
Algorithm Hash digest
SHA256 83fa6cb08bee7886a356fb1207f77444b38abc7ebdc05494a7d5491d6328afa0
MD5 8db1bc484028ce39fe8fa42a4429db6f
BLAKE2b-256 da4be23ac1291a6c69691d5ef8baec7134c5b8373e86daa8ae78099d95b5f225

See more details on using hashes here.

Provenance

The following attestation bundles were made for nanny_sdk-0.1.7.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.1.7-py3-none-any.whl.

File metadata

  • Download URL: nanny_sdk-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 10.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.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 2902da2fe9e1315e76c845d0c0be1e83cbf2b9bb03bd4b79edcf0189ccc08f04
MD5 f170042510ae8b453e1fb883e95b1bc7
BLAKE2b-256 5b46456a4d9a14444663c5b52768a16c9ad07dca6ca551d4b5eb5830162fd475

See more details on using hashes here.

Provenance

The following attestation bundles were made for nanny_sdk-0.1.7-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