Guardrails provide a powerful validation and quality assurance layer for task outputs in PraisonAI. They allow you to define validation criteria that are checked against task results, ensuring outputs meet specific requirements before being accepted.
from praisonaiagents import Agent, Task, GuardrailResultdef validate_length(output: str) -> GuardrailResult: """Ensure output is between 100-500 characters""" length = len(output) if 100 <= length <= 500: return GuardrailResult( is_valid=True, message="Output length is appropriate" ) else: return GuardrailResult( is_valid=False, message=f"Output must be 100-500 chars, got {length}" )task = Task( description="Write a product description", agent=agent, guardrail=validate_length)
Copy
from praisonaiagents import Agent, Task, GuardrailResultdef validate_length(output: str) -> GuardrailResult: """Ensure output is between 100-500 characters""" length = len(output) if 100 <= length <= 500: return GuardrailResult( is_valid=True, message="Output length is appropriate" ) else: return GuardrailResult( is_valid=False, message=f"Output must be 100-500 chars, got {length}" )task = Task( description="Write a product description", agent=agent, guardrail=validate_length)
Copy
from praisonaiagents import Agent, Task, LLMGuardrailguardrail = LLMGuardrail( criteria=""" Check if the output: 1. Is professional in tone 2. Contains no offensive language 3. Includes at least 3 key benefits 4. Has a clear call-to-action """, llm_model="gpt-4")task = Task( description="Write marketing copy", agent=agent, guardrail=guardrail)
Creates an LLM-based guardrail for natural language validation.
Copy
LLMGuardrail( criteria: str, # Natural language validation criteria llm_model: str = "gpt-4", # LLM model to use temperature: float = 0.1, # Low temperature for consistency max_tokens: int = 100 # Token limit for response)
def validate_email_format(output: str) -> GuardrailResult: """Ensure output contains valid email addresses""" import re email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b' if re.search(email_pattern, output): return GuardrailResult( is_valid=True, message="Valid email found in output" ) else: return GuardrailResult( is_valid=False, message="Output must contain at least one valid email address" )# Use with tasktask = Task( description="Extract contact emails from the document", agent=data_agent, guardrail=validate_email_format)
def validate_json_structure(output: str) -> GuardrailResult: """Validate JSON output has required fields""" import json try: data = json.loads(output) required_fields = ["title", "summary", "tags", "date"] missing = [f for f in required_fields if f not in data] if missing: return GuardrailResult( is_valid=False, message=f"Missing required fields: {', '.join(missing)}" ) if not isinstance(data.get("tags"), list): return GuardrailResult( is_valid=False, message="'tags' must be a list" ) return GuardrailResult( is_valid=True, message="JSON structure is valid" ) except json.JSONDecodeError as e: return GuardrailResult( is_valid=False, message=f"Invalid JSON: {str(e)}" )
# Create sophisticated content guardrailcontent_guardrail = LLMGuardrail( criteria=""" Evaluate the output based on: 1. Accuracy: Information should be factually correct 2. Completeness: All requested points should be addressed 3. Clarity: Language should be clear and unambiguous 4. Tone: Professional but approachable 5. Structure: Well-organized with clear sections The output should NOT contain: - Personal opinions presented as facts - Promotional language or bias - Technical jargon without explanation - Grammatical or spelling errors Rate as VALID only if all criteria are met. """, llm_model="gpt-4", temperature=0.1)# Apply to content generation tasktask = Task( description="Write a technical blog post about cloud computing", agent=writer_agent, guardrail=content_guardrail, max_retry=2)
from praisonaiagents import Agent, Task, GuardrailResult, LLMGuardrail# Example: E-commerce product description validationdef validate_product_description(output: str) -> GuardrailResult: """Validate product descriptions meet requirements""" # Check minimum length if len(output) < 50: return GuardrailResult( is_valid=False, message="Description too short (min 50 characters)" ) # Check for required elements required_words = ["features", "benefits", "specifications"] missing = [w for w in required_words if w.lower() not in output.lower()] if missing: return GuardrailResult( is_valid=False, message=f"Missing sections: {', '.join(missing)}" ) # Check for price format import re price_pattern = r'\$\d+\.?\d{0,2}' if not re.search(price_pattern, output): return GuardrailResult( is_valid=False, message="Must include price in format $XX.XX" ) return GuardrailResult( is_valid=True, message="Product description meets all requirements" )# Combine with LLM guardrail for qualityquality_guardrail = LLMGuardrail( criteria=""" Check if the product description: 1. Is engaging and persuasive 2. Highlights unique selling points 3. Uses active voice 4. Avoids superlatives without evidence 5. Includes sensory details where appropriate """)# Create agent and tasksproduct_agent = Agent( name="ProductWriter", role="E-commerce Copywriter")# Task with multiple validation stepsdescription_task = Task( description="Write product description for wireless headphones", agent=product_agent, guardrail=validate_product_description # Format validation)quality_task = Task( description="Enhance the description for engagement", agent=product_agent, guardrail=quality_guardrail, # Quality validation context=[description_task])
moderation_guardrail = LLMGuardrail( criteria=""" Ensure the content is appropriate for all audiences: - No profanity or offensive language - No discriminatory or biased statements - No violence or graphic descriptions - Maintains respectful tone throughout """)
compliance_guardrail = LLMGuardrail( criteria=""" Verify the output complies with GDPR requirements: 1. Includes privacy policy reference 2. Mentions data retention period 3. Explains user rights (access, deletion, portability) 4. Identifies data controller 5. No unnecessary personal data collection """)