Metadata-Version: 2.4
Name: netzilo
Version: 4.3.14
Summary: Netzilo AI Detection & Response (AIDR) — governance for Python AI agents.
Author: Netzilo
License: Proprietary
Project-URL: Homepage, https://www.netzilo.com
Keywords: ai,agent,governance,security,aidr,netzilo
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: MacOS
Classifier: Operating System :: Microsoft :: Windows
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: socksio>=1.0.0
Provides-Extra: crewai
Requires-Dist: crewai; extra == "crewai"
Provides-Extra: langgraph
Requires-Dist: langgraph; extra == "langgraph"
Provides-Extra: autogen
Requires-Dist: autogen-core; extra == "autogen"

# netzilo (Python)

Netzilo AI Detection & Response(AIDR) for Python

Provides full governance for custom AI agents written in Python

## How it works

The Netzilo client is compiled to a native shared library and loaded **in-process**
via `ctypes`. Every LLM prompt, model response, and tool call your agent makes can
be evaluated — allowed, blocked, or redacted — against policy pulled live from your
Netzilo management server. No daemon, no sidecar — nothing to stand up.

## Install

```bash
pip install netzilo
```

Wheels are published per platform (Linux, macOS, Windows) and are independent of
your Python version.

## Core API

```python
import netzilo

netzilo.start(server="https://srv.netzilo.com",   # management server
              pat="nzl_...",                       # or setup_key="..."
              agent_name="my-agent")               # non-blocking

netzilo.is_running()                       # -> bool: True once policy has synced (ready to govern)
netzilo.mcp_gateway_port()                 # -> int: scanner gateway port in use (auto-picked)
allowed, reason = netzilo.is_allowed("Bash", {"command": "rm -rf /"})
netzilo.report_result("Bash", "<stdout>")  # post-tool observability
netzilo.flush()                            # force-deliver buffered events to management
netzilo.snapshot()                         # force AIDR behavior-graph snapshot + delivery (else hourly/at-stop)
netzilo.stop()                             # graceful stop (snapshots graph + flushes events; auto-registered atexit)
```

Parameters may be passed as keyword args (above) or a single `config` dict.
`config_path` defaults to `~/.netzilo-sdk/config.json`; ports auto-pick free
ports (governance on by default). `is_running()` returns `True` only after the
initial policy sync — poll it before kicking off work.

Evaluation runs **inside the process** — `evaluate()` calls the embedded engine
directly, with no HTTP roundtrip and no local port to manage.

## Advanced governance (`enable_advanced_governance=True`)

Framework adapters (below) govern at the tool/LLM-hook layer. Advanced governance
adds deep inspection of the agent's **own** outbound traffic — covering every
prompt, response, and tool call (including from subprocesses and libraries you
have no hook for), with full content analysis and semantic classification:

```python
netzilo.start(server=..., pat=..., agent_name=..., enable_advanced_governance=True)
```

It is fully automatic and requires **no root** and no changes to the host — the
SDK prepares the process so the agent's traffic is inspected and continues to
work normally. Inspected prompts/responses are analyzed and classified, emitting
`semantic.event` records to your dashboard alongside the usual tool/LLM events.
Default off; the framework adapters govern without it.

## Framework adapters

Adapters are **submodules of the one `netzilo` package** — no separate installs.
Each is a single call. The framework is imported lazily inside the adapter, so
`pip install netzilo` never pulls crewai/langgraph/autogen unless you use it.

```python
# CrewAI — registers before/after tool and LLM hooks process-wide
from netzilo.crewai import govern
govern(config={...})

# LangGraph — wrap nodes before compile()
import netzilo.langgraph
netzilo.langgraph.govern(graph, config={...})

# AutoGen — intervention handler
from netzilo.autogen import handler
runtime = SingleThreadedAgentRuntime(intervention_handlers=[handler(config={...})])
```

### CrewAI: local vs CrewAI AMP

**Local / self-hosted** — put `govern()` once at the top of your entrypoint,
before `kickoff()`. That's it.

```python
import netzilo.crewai
netzilo.crewai.govern(config={"server": "...", "pat": "...", "agent_name": "my-agent"})

MyCrew().crew().kickoff(inputs={...})   # governed
```

**CrewAI AMP** — AMP's managed runtime only executes Flow `@start`/`@listen`
methods; it skips module-level code, lifecycle hooks, and tool bodies. So the
same `govern()` call goes inside a Flow `@start` step, then your crew runs in
`@listen`. Deploy with `[tool.crewai] type = "flow"` in `pyproject.toml`, and
**always create the automation fresh as a flow** (the type is locked at creation
— re-pushing cannot convert an existing crew automation).

```python
from crewai.flow import Flow, listen, start
import time

class MyFlow(Flow):

    @start()
    def init_governance(self):
        import netzilo, netzilo.crewai
        netzilo.crewai.govern(config={"server": "...", "pat": "...", "agent_name": "my-agent"})
        while not netzilo.is_running():   # wait until policy has synced
            time.sleep(0.5)

    @listen(init_governance)
    def run(self):
        return MyCrew().crew().kickoff(inputs={...})   # governed
```

Optional convenience extras pull a framework alongside netzilo:
`pip install netzilo[crewai]`, `netzilo[langgraph]`, `netzilo[autogen]`.

## Configuration

`start()` / `govern()` accept a config dict. Common keys:

| Key | Description |
|-----|-------------|
| `server` | Your Netzilo management server URL. (`management_url` is a legacy alias.) |
| `pat` / `setup_key` | Credential used to enroll the agent. |
| `agent_name` | Identifier this agent reports as (used for event attribution). |
| `config_path` | Local client state (default: `~/.netzilo-sdk/config.json`). |
| `mcp_gateway_port` | Optional; defaults to an auto-picked free port. `mcp_gateway_port=0` disables governance. |
| `enable_advanced_governance` | Optional (default off). Deep inspection of the agent's own outbound traffic with semantic classification. |
| `log_level` / `log_file` | Logging verbosity and destination. |

## Notes

The native library is bundled inside the wheel; pip selects the correct one
for your platform automatically. Adapters ship inside the same wheel as
submodules — a single distribution, not per-framework packages.

Netzilo is a commercial product. See <https://www.netzilo.com>.
