diff --git a/guardrails/utils/pydantic_utils/v2.py b/guardrails/utils/pydantic_utils/v2.py index 84e469ee1..566086259 100644 --- a/guardrails/utils/pydantic_utils/v2.py +++ b/guardrails/utils/pydantic_utils/v2.py @@ -456,7 +456,7 @@ def pydantic_field_to_datatype( else: validators = field.json_schema_extra.get("validators", []) - is_optional = not field.is_required() + is_optional = is_optional_annotation(field.annotation) or not field.is_required() if field.title is not None: name = field.title @@ -474,6 +474,13 @@ def pydantic_field_to_datatype( ) +def is_optional_annotation(annotation) -> bool: + """Check if a annotation is optional.""" + return typing.get_origin(annotation) is Union and type(None) in typing.get_args( + annotation + ) + + def construct_datatype( datatype: Type[DataTypeT], children: Optional[Dict[str, Any]] = None,