Skip to content

API Reference

The main class for wrapping Pydantic AI agents with guardrails.

from pydantic_ai_guardrails import GuardedAgent
class GuardedAgent:
def __init__(
self,
agent: Agent,
input_guardrails: list[InputGuardrail] | None = None,
output_guardrails: list[OutputGuardrail] | None = None,
parallel: bool = False,
on_block: Literal['raise', 'log'] = 'raise',
max_retries: int = 0,
telemetry: bool = False,
) -> None: ...
async def run(
self,
prompt: str,
*,
deps: Any = None,
**kwargs,
) -> AgentResult: ...
ParameterTypeDefaultDescription
agentAgentrequiredPydantic AI agent to wrap
input_guardrailslist[InputGuardrail]NoneInput validation guardrails
output_guardrailslist[OutputGuardrail]NoneOutput validation guardrails
parallelboolFalseRun guardrails concurrently
on_blockstr'raise'Action on violation
max_retriesint0Auto-retry attempts
telemetryboolFalseEnable OpenTelemetry

Validates input before agent execution.

from pydantic_ai_guardrails import InputGuardrail
class InputGuardrail:
def __init__(
self,
validate_fn: Callable[[str], Awaitable[GuardrailResult]] | Callable[[str], GuardrailResult],
name: str | None = None,
description: str | None = None,
) -> None: ...
async def validate(
self,
prompt: str,
context: GuardrailContext,
) -> GuardrailResult: ...

Validates output after agent execution.

from pydantic_ai_guardrails import OutputGuardrail
class OutputGuardrail:
def __init__(
self,
validate_fn: Callable[..., Awaitable[GuardrailResult]] | Callable[..., GuardrailResult],
name: str | None = None,
description: str | None = None,
) -> None: ...
async def validate(
self,
output: str,
context: GuardrailContext,
) -> GuardrailResult: ...

Result returned by guardrail validation.

from pydantic_ai_guardrails import GuardrailResult
class GuardrailResult(TypedDict, total=False):
tripwire_triggered: bool # Required
message: str
severity: Literal['low', 'medium', 'high', 'critical']
suggestion: str
metadata: dict[str, Any]
FieldTypeRequiredDescription
tripwire_triggeredboolYesWhether violation occurred
messagestrNoHuman-readable message
severitystrNoViolation severity
suggestionstrNoFeedback for auto-retry
metadatadictNoAdditional data

Context passed to guardrail validation functions.

from pydantic_ai_guardrails import GuardrailContext
class GuardrailContext:
prompt: str
deps: Any
agent: Agent
metadata: dict[str, Any]

Create a GuardedAgent from a configuration file.

from pydantic_ai_guardrails import create_guarded_agent_from_config
def create_guarded_agent_from_config(
agent: Agent,
config_path: str | Path,
) -> GuardedAgent: ...

Load a configuration file.

from pydantic_ai_guardrails import load_config
def load_config(path: str | Path) -> GuardrailConfig: ...

Extract guardrails and settings from config.

from pydantic_ai_guardrails import load_guardrails_from_config
def load_guardrails_from_config(
config: GuardrailConfig,
) -> tuple[list[InputGuardrail], list[OutputGuardrail], dict]: ...

Create a GuardrailContext for testing.

from pydantic_ai_guardrails import create_context
def create_context(
prompt: str = '',
deps: Any = None,
**metadata,
) -> GuardrailContext: ...
from pydantic_ai_guardrails.guardrails.input import length_limit
def length_limit(
max_chars: int | None = None,
max_tokens: int | None = None,
) -> InputGuardrail: ...
from pydantic_ai_guardrails.guardrails.input import pii_detector
def pii_detector(
detect_types: list[str] | None = None,
action: Literal['block', 'warn'] = 'block',
) -> InputGuardrail: ...

Supported types: email, phone, ssn, credit_card, ip_address

from pydantic_ai_guardrails.guardrails.input import prompt_injection
def prompt_injection(
model: str | None = None,
threshold: float = 0.7,
) -> InputGuardrail: ...
from pydantic_ai_guardrails.guardrails.input import toxicity
def toxicity(
threshold: float = 0.5,
) -> InputGuardrail: ...
from pydantic_ai_guardrails.guardrails.input import blocked_keywords
def blocked_keywords(
keywords: list[str],
case_sensitive: bool = False,
) -> InputGuardrail: ...
from pydantic_ai_guardrails.guardrails.input import rate_limit
def rate_limit(
max_requests: int,
window_seconds: int = 60,
key_fn: Callable[[str, GuardrailContext], str] | None = None,
) -> InputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import secret_redaction
def secret_redaction(
patterns: list[str] | None = None,
) -> OutputGuardrail: ...

Default patterns: openai_api_key, github_token, aws_secret

from pydantic_ai_guardrails.guardrails.output import min_length
def min_length(
min_chars: int | None = None,
min_words: int | None = None,
) -> OutputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import llm_judge
def llm_judge(
rubric: str,
model: str | None = None,
threshold: float = 0.7,
) -> OutputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import json_validator
def json_validator(
schema: dict | None = None,
) -> OutputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import regex_match
def regex_match(
pattern: str,
must_match: bool = True,
) -> OutputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import no_refusals
def no_refusals() -> OutputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import tool_allowlist
def tool_allowlist(
allowed_tools: list[str],
) -> OutputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import require_tool_use
def require_tool_use(
required_tools: list[str] | None = None,
) -> OutputGuardrail: ...
from pydantic_ai_guardrails.guardrails.output import validate_tool_parameters
def validate_tool_parameters(
validators: dict[str, Callable[[dict], bool]],
) -> OutputGuardrail: ...
from pydantic_ai_guardrails import configure_telemetry
def configure_telemetry(
enabled: bool = True,
service_name: str = 'guardrails',
service_version: str | None = None,
) -> None: ...
from pydantic_ai_guardrails import get_telemetry
def get_telemetry() -> GuardrailTelemetry: ...
from pydantic_ai_guardrails.testing import MockAgent
class MockAgent:
def __init__(
self,
responses: list[str] | str,
) -> None: ...
from pydantic_ai_guardrails.testing import GuardrailTestCases
class GuardrailTestCases:
@staticmethod
def input_cases(guardrail: InputGuardrail) -> TestCaseBuilder: ...
@staticmethod
def output_cases(guardrail: OutputGuardrail) -> TestCaseBuilder: ...
class TestCaseBuilder:
def should_pass(self, *inputs: str) -> TestCaseBuilder: ...
def should_fail(self, *inputs: str) -> TestCaseBuilder: ...
async def run(self) -> TestResults: ...
from pydantic_ai_guardrails.evals import evaluator_guardrail
def evaluator_guardrail(
evaluator: Evaluator,
kind: Literal['input', 'output'],
name: str | None = None,
threshold: float | None = None,
threshold_mode: Literal['gte', 'gt', 'lte', 'lt', 'eq'] = 'gte',
) -> InputGuardrail | OutputGuardrail: ...
from pydantic_ai_guardrails.evals import output_contains
def output_contains(
value: str,
case_sensitive: bool = True,
) -> OutputGuardrail: ...
from pydantic_ai_guardrails.evals import output_equals
def output_equals(expected: str) -> OutputGuardrail: ...
from pydantic_ai_guardrails.evals import output_is_instance
def output_is_instance(type_name: str) -> OutputGuardrail: ...
from pydantic_ai_guardrails.evals import output_llm_judge
def output_llm_judge(
rubric: str,
model: str | None = None,
threshold: float = 0.7,
) -> OutputGuardrail: ...

All public types are exported from the main module:

from pydantic_ai_guardrails import (
# Core
GuardedAgent,
InputGuardrail,
OutputGuardrail,
GuardrailResult,
GuardrailContext,
# Config
GuardrailConfig,
load_config,
load_guardrails_from_config,
create_guarded_agent_from_config,
# Exceptions
GuardrailViolation,
InputGuardrailViolation,
OutputGuardrailViolation,
# Telemetry
configure_telemetry,
get_telemetry,
# Testing
create_context,
)