Input Validation Pre-Hook

Run a validator agent in a pre-hook to reject off-topic, vague, or unsafe requests before the main agent responds.

Use a pre-hook to validate the input of an Agent before it is presented to the LLM.

These curated examples check the returned run status and the validator's structured result. A validator call makes an additional model request; its assessment is probabilistic. The example treats an unavailable or malformed assessment as a failed check.

Code

from agno.agent import Agent
from agno.exceptions import CheckTrigger, InputCheckError
from agno.models.openai import OpenAIResponses
from agno.run.agent import RunInput
from agno.run import RunStatus
from pydantic import BaseModel


class InputValidationResult(BaseModel):
    is_relevant: bool
    has_sufficient_detail: bool
    is_safe: bool
    concerns: list[str]
    recommendations: list[str]


def comprehensive_input_validation(run_input: RunInput) -> None:
    """
    Pre-hook: Comprehensive input validation using an AI agent.

    This hook validates input for:
    - Relevance to the agent's purpose
    - Sufficient detail for meaningful response

    Could also be used to check for safety, prompt injection, etc.
    """

    # Input validation agent
    validator_agent = Agent(
        name="Input Validator",
        model=OpenAIResponses(id="gpt-5.2"),
        instructions=[
            "You are an input validation specialist. Analyze user requests for:",
            "1. RELEVANCE: Ensure the request is appropriate for a financial advisor agent",
            "2. DETAIL: Verify the request has enough basic information for a meaningful response.",
            "   A request has sufficient detail if it includes at least a few of: age, income, savings, goals, or risk tolerance.",
            "   Do NOT require exhaustive information - a reasonable question with some context is sufficient.",
            "3. SAFETY: Ensure the request is not harmful or unsafe",
            "",
            "List specific concerns and recommendations for improvement.",
            "",
            "Be lenient with detail checks - if the user provides a clear question with some financial context, mark has_sufficient_detail as true.",
            "Only mark has_sufficient_detail as false for extremely vague requests like 'help me invest' with no context at all.",
        ],
        output_schema=InputValidationResult,
    )

    try:
        validation_result = validator_agent.run(
            input=f"Validate this user request: '{run_input.input_content}'"
        )
    except Exception as exc:
        raise InputCheckError("Validator unavailable; validation is required.") from exc

    if validation_result.status != RunStatus.completed or not isinstance(
        validation_result.content, InputValidationResult
    ):
        raise InputCheckError("Validator did not return a valid assessment.")
    result = validation_result.content

    # Check validation results
    if not result.is_safe:
        raise InputCheckError(
            f"Input is harmful or unsafe. {result.recommendations[0] if result.recommendations else ''}",
            check_trigger=CheckTrigger.INPUT_NOT_ALLOWED,
        )

    if not result.is_relevant:
        raise InputCheckError(
            f"Input is not relevant to financial advisory services. {result.recommendations[0] if result.recommendations else ''}",
            check_trigger=CheckTrigger.OFF_TOPIC,
        )

    if not result.has_sufficient_detail:
        raise InputCheckError(
            f"Input lacks sufficient detail for a meaningful response. Suggestions: {', '.join(result.recommendations)}",
            check_trigger=CheckTrigger.INPUT_NOT_ALLOWED,
        )


def main():
    print("🚀 Input Validation Pre-Hook Example")
    print("=" * 60)

    # Create a financial advisor agent with comprehensive hooks
    agent = Agent(
        name="Financial Advisor",
        model=OpenAIResponses(id="gpt-5.2"),
        pre_hooks=[comprehensive_input_validation],
        description="A professional financial advisor providing investment guidance and financial planning advice.",
        instructions=[
            "You are a knowledgeable financial advisor with expertise in:",
            "• Investment strategies and portfolio management",
            "• Retirement planning and savings strategies",
            "• Risk assessment and diversification",
            "• Tax-efficient investing",
            "",
            "Provide clear, actionable advice while being mindful of individual circumstances.",
            "Always remind users to consult with a licensed financial advisor for personalized advice.",
        ],
    )

    requests = ['I am 35 and save $1000 per month for retirement. How should I compare investment risks?', 'Help me invest', 'What is the best pizza recipe?']
    for request in requests:
        response = agent.run(request)
        if response.status != RunStatus.completed:
            print("Request rejected or run failed; no answer displayed.")
            continue
        print(response.content)


if __name__ == "__main__":
    main()

Usage

Set up your virtual environment

uv venv --python 3.12
source .venv/bin/activate

Install dependencies

uv pip install -U agno openai

Export your OpenAI API key

export OPENAI_API_KEY="your_openai_api_key_here"

Run example

Save the code above as input_validation_pre_hook.py, then run:

python input_validation_pre_hook.py