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/activateInstall dependencies
uv pip install -U agno openaiExport 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