Raw LLM Clients
For agents that call a provider's SDK directly, with no framework in between. In Python, govern_client() wraps the client once and hands back the same object — use it exactly as before. TypeScript doesn't have a per-provider wrapper yet, so gate manually with checkPrompt() / checkResponse() around the call.
See Custom Agents first if you haven't installed the SDK or called start() yet.
OpenAI
from netzilo.openai_sdk import govern, govern_client
from openai import OpenAI
govern()
client = govern_client(OpenAI())
resp = client.chat.completions.create(
model="gpt-4o", messages=[{"role": "user", "content": "..."}]
)
Anthropic
from netzilo.anthropic_sdk import govern, govern_client
from anthropic import Anthropic
govern()
client = govern_client(Anthropic())
resp = client.messages.create(
model="claude-sonnet-4-6", max_tokens=1024,
messages=[{"role": "user", "content": "..."}],
)
AWS Bedrock
from netzilo.bedrock import govern, govern_client
import boto3
govern()
client = govern_client(boto3.client("bedrock-runtime"))
resp = client.converse(
modelId="anthropic.claude-sonnet-4-6-v1:0",
messages=[{"role": "user", "content": [{"text": "..."}]}],
)
Google Gemini
from netzilo.gemini import govern, govern_client
from google import genai
govern()
client = govern_client(genai.Client())
resp = client.models.generate_content(model="gemini-2.5-flash", contents="...")
Mistral
from netzilo.mistral import govern, govern_client
from mistralai import Mistral
govern()
client = govern_client(Mistral(api_key="..."))
resp = client.chat.complete(
model="mistral-large-latest", messages=[{"role": "user", "content": "..."}]
)
Streaming calls aren't covered by any of the raw-client wrappers above — there's no single response object to redact before the agent starts consuming chunks. The outbound prompt is still gated either way.

