> ## Documentation Index
> Fetch the complete documentation index at: https://docs.agno.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Mixed Hooks and Guardrails

> Example demonstrating how to combine plain hooks with guardrails in pre_hooks.

Example demonstrating how to combine plain hooks with guardrails in pre\_hooks. Both run in order: the logging hook fires, then the PII guardrail checks for sensitive data. If PII is detected the run is rejected with RunStatus.error.

```python mixed_hooks.py theme={null}
"""
Mixed Hooks and Guardrails
=============================

Example demonstrating how to combine plain hooks with guardrails in pre_hooks.
Both run in order: the logging hook fires, then the PII guardrail checks
for sensitive data. If PII is detected the run is rejected with RunStatus.error.
"""

from agno.agent import Agent
from agno.guardrails import PIIDetectionGuardrail
from agno.models.openai import OpenAIResponses
from agno.run import RunStatus
from agno.run.agent import RunInput


# ---------------------------------------------------------------------------
# Plain hook (non-guardrail)
# ---------------------------------------------------------------------------
def log_request(run_input: RunInput) -> None:
    """Pre-hook that logs every incoming request."""
    print(f"  [log_request] Input: {run_input.input_content[:60]}")


# ---------------------------------------------------------------------------
# Create Agent
# ---------------------------------------------------------------------------
def main():
    print("Mixed Hooks and Guardrails Demo")
    print("=" * 50)

    agent = Agent(
        name="Privacy-Protected Agent",
        model=OpenAIResponses(id="gpt-4o-mini"),
        pre_hooks=[log_request, PIIDetectionGuardrail()],
        instructions="You are a helpful assistant that protects user privacy.",
    )

    # Test 1: Clean input — hook runs, guardrail passes, agent responds
    print("\n[TEST 1] Clean input (no PII)")
    print("-" * 40)
    response = agent.run(input="What is the weather today?")
    if response.status == RunStatus.error:
        print(f"  [ERROR] Unexpected block: {response.content}")
    else:
        print(f"  [OK] Agent responded: {response.content[:80]}")

    # Test 2: PII input — guardrail blocks before agent sees the data
    print("\n[TEST 2] Input with SSN")
    print("-" * 40)
    response = agent.run(input="My SSN is 123-45-6789, can you help?")
    if response.status == RunStatus.error:
        print(f"  [BLOCKED] Guardrail rejected: {response.content}")
    else:
        print("  [WARNING] Should have been blocked!")

    # Test 3: PII input with credit card
    print("\n[TEST 3] Input with credit card")
    print("-" * 40)
    response = agent.run(input="My card is 4532 1234 5678 9012, charge it.")
    if response.status == RunStatus.error:
        print(f"  [BLOCKED] Guardrail rejected: {response.content}")
    else:
        print("  [WARNING] Should have been blocked!")

    print("\n" + "=" * 50)
    print("Mixed Hooks and Guardrails Demo Complete")


# ---------------------------------------------------------------------------
# Run Agent
# ---------------------------------------------------------------------------
if __name__ == "__main__":
    main()
```

## Run the Example

<Steps>
  <Snippet file="create-venv-step.mdx" />

  <Step title="Install dependencies">
    ```bash theme={null}
    uv pip install -U agno openai
    ```
  </Step>

  <Step title="Export your OpenAI API key">
    <CodeGroup>
      ```bash Mac/Linux theme={null}
      export OPENAI_API_KEY="your_openai_api_key_here"
      ```

      ```bash Windows theme={null}
      $Env:OPENAI_API_KEY="your_openai_api_key_here"
      ```
    </CodeGroup>
  </Step>

  <Step title="Run the example">
    Save the code above as `mixed_hooks.py`, then run:

    ```bash theme={null}
    python mixed_hooks.py
    ```
  </Step>
</Steps>

Full source: [cookbook/02\_agents/08\_guardrails/mixed\_hooks.py](https://github.com/agno-agi/agno/blob/main/cookbook/02_agents/08_guardrails/mixed_hooks.py)
