Observed since 20 Oct, 21:33 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Python SDK for AgentBouncr — Governance for AI Agents
Governance for autonomous AI agents. Every tool call is checked against your policies before execution.
Native adapters for LangChain / LangGraph (drop-in callback) and CrewAI (tool wrapper). Any other framework works via the plain HTTP evaluate() client.
pip install agentbouncr
For LangChain integration:
pip install "agentbouncr[langchain]"
For CrewAI integration:
pip install "agentbouncr[crewai]"
from agentbouncr import AgentBouncr
client = AgentBouncr(api_key="sk_live_your_key_here")
result = client.evaluate(
agent_id="my-research-agent",
tool="send_email",
params={"to": "user@example.com"},
)
if result.allowed:
send_email(to="user@example.com")
else:
print(f"Blocked by policy: {result.reason}")
from agentbouncr import AgentBouncr
from agentbouncr.langchain import AgentBouncrCallbackHandler
client = AgentBouncr(api_key="sk_live_your_key_here")
handler = AgentBouncrCallbackHandler(client, agent_id="my-research-agent")
executor = AgentExecutor(agent=agent, tools=tools)
executor.invoke({"input": "Find the latest AI news"}, config={"callbacks": [handler]})
Every tool call now passes through AgentBouncr first. Observe-first is the default
(enforce=False): denials and unreachable-API errors are logged and execution always
proceeds — governance stays off the agent's critical path (not a SPOF). Opt into the
fail-closed path with enforce=True:
handler = AgentBouncrCallbackHandler(client, agent_id="my-research-agent", enforce=True)
# enforce=True: a denied call raises GovernanceDeniedError; an unreachable API re-raises.
Important — pass callbacks at invoke time, not in the constructor. In LangChain 0.3.x, passing
callbacks=[handler]toAgentExecutor(...)attaches the handler to the executor but does not reliably propagate it to the inner tool runs. Theon_tool_starthook then never fires and governance is silently bypassed. Always pass callbacks via the per-callconfig={"callbacks": [handler]}argument to.invoke()/.stream()/.ainvoke()— this is the supported path and the one we test against.
LangGraph works the same way:
app = create_react_agent(llm, tools)
app.invoke({"messages": [...]}, config={"callbacks": [handler]})
The handler intercepts standard LangChain/LangGraph tool runs via
on_tool_start. That covers the patterns used by create_react_agent,
AgentExecutor with Tool / StructuredTool / BaseTool subclasses,
and native function-calling tool wrappers.
It does not intercept code paths that bypass the tool abstraction
— for example a raw Runnable chain that calls an external API
directly, or a custom node in a LangGraph that invokes an HTTP client
without wrapping it as a tool. For those, call client.evaluate(...)
yourself before the side effect.
from agentbouncr import AgentBouncr
from agentbouncr.crewai import govern_tools
client = AgentBouncr(api_key="sk_live_your_key_here")
# Observe-first (default): every tool call is evaluated + logged, execution always proceeds.
agent = Agent(role="researcher", tools=govern_tools(tools, client, "my-research-agent"))
For the fail-closed path, wrap a tool with enforce=True — a denied call then raises
GovernanceDeniedError and the wrapped tool never runs:
from agentbouncr.crewai import govern_tool
enforced = govern_tool(my_tool, client, agent_id="my-research-agent", enforce=True)
Both native adapters default to observe-first and share the same
enforceflag: denials are advisory (logged, never blocking) and an unreachable API does not block the tool until you opt intoenforce=True.
Get an API key from your AgentBouncr Dashboard under Settings → API Keys.
client = AgentBouncr(api_key="sk_live_...")
For multi-workspace setups:
client = AgentBouncr(
api_key="sk_live_...",
tenant_id="your-workspace-id",
)
client = AgentBouncr(
api_key="sk_live_...",
base_url="https://agentbouncr.com", # default
timeout=5.0, # request timeout in seconds
max_retries=3, # exponential backoff for 5xx/429
tenant_id=None, # optional X-Tenant-Id header
)
from agentbouncr import (
AgentBouncrError, # base class
AuthenticationError, # 401
ValidationError, # 400
RateLimitError, # 429 after retries exhausted
ServerError, # 5xx after retries exhausted
TimeoutError, # request exceeded timeout
GovernanceDeniedError, # raised by LangChain handler when policy denies
)
agentbouncr on npmMIT — see LICENSE.
The AgentBouncr backend is commercial software. The SDK is open source so you can audit, patch, and integrate freely.
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.2.0 | 2 Jul 2026 | 8 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 21:33 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:14bda62260890927823e0f4fa558e25c2a32e5bcec06978eb011cc2c25fc79c9