# Clone the repository (contains the server)git clone https://github.com/agentcontrol/agent-control.gitcd agent-control# Install dependenciesmake sync# Start the Agent Control server (boots Postgres + runs migrations)make server-run# Start the UI (in a separate shell)make ui-installmake ui-dev
Server runs at http://localhost:8000 ✅
UI runs at http://localhost:4000 ✅
💡 Verify the server: Open http://localhost:8000/health — you should see {"status": "healthy", "version": "..."}.
Agent must be registered with the server. You should also add @control decorator around tools and LLM call functions.Here is a contrived example. Reference our Examples for real world examples for specific frameworks.
# my_agent.pyimport asyncioimport agent_controlfrom agent_control import control, ControlViolationError# Protect any function (like LLM calls)@control()async def chat(message: str) -> str: # In production: response = await LLM.ainvoke(message) # For demo: simulate LLM that might leak sensitive data if "test" in message.lower(): return "Your SSN is 123-45-6789" # Will be blocked! return f"Echo: {message}"# Initialize your agentagent_control.init( agent_name="awesome_bot_3000", # Unique name agent_description="My Chatbot",)async def main(): try: print(await chat("test")) # ❌ Blocked except ControlViolationError as e: print(f"❌ Blocked: {e.control_name}")asyncio.run(main())
The easiest way to add controls is through the UI — see the UI Quickstart for a step-by-step guide. Alternatively, use the SDK as shown below or call the API directly.Run following setup script to create controls to protect your agent.
# setup.py - Run once to configure agent controlsimport asynciofrom datetime import datetime, UTCfrom agent_control import AgentControlClient, controls, agentsfrom agent_control_models import Agentasync def setup(): async with AgentControlClient() as client: # Defaults to localhost:8000 # 1. Register agent first agent = Agent( agent_name="awesome_bot_3000", agent_description="My Chatbot", agent_created_at=datetime.now(UTC).isoformat(), ) await agents.register_agent(client, agent, steps=[]) # 2. Create control (blocks SSN patterns in output) control = await controls.create_control( client, name="block-ssn", data={ "enabled": True, "execution": "server", "scope": {"stages": ["post"]}, "condition": { "selector": {"path": "output"}, "evaluator": { "name": "regex", "config": {"pattern": r"\b\d{3}-\d{2}-\d{4}\b"}, }, }, "action": {"decision": "deny"}, }, ) # 3. Associate control directly with agent await agents.add_agent_control( client, agent_name=agent.agent_name, control_id=control["control_id"], ) print("✅ Setup complete!") print(f" Control ID: {control['control_id']}")asyncio.run(setup())
Controls store leaf selector and evaluator definitions under condition, which also enables composite and, or, and not trees.Now, run your agent code.🎉 Done! Your agent now blocks SSN patterns automatically.
Authentication is disabled by default for local development. When you’re ready to deploy, see the Enable Authentication guide.