From a79754a58d8ad286f7346228272f69294a1ee455 Mon Sep 17 00:00:00 2001 From: vyasmanmohan Date: Wed, 14 Feb 2024 20:28:28 +0530 Subject: [PATCH 1/2] [bug] Let json validation pass when a None-able field is missing from the LLM response #562 --- guardrails/utils/pydantic_utils/v2.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/guardrails/utils/pydantic_utils/v2.py b/guardrails/utils/pydantic_utils/v2.py index 84e469ee1..465371f19 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 @@ -473,6 +473,11 @@ def pydantic_field_to_datatype( **kwargs, ) +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], From 9e8e5ed0d531ef5b5930a13e7e6a919c7f9b62f1 Mon Sep 17 00:00:00 2001 From: vyasmanmohan Date: Wed, 14 Feb 2024 22:05:08 +0530 Subject: [PATCH 2/2] formatted --- guardrails/utils/pydantic_utils/v2.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/guardrails/utils/pydantic_utils/v2.py b/guardrails/utils/pydantic_utils/v2.py index 465371f19..566086259 100644 --- a/guardrails/utils/pydantic_utils/v2.py +++ b/guardrails/utils/pydantic_utils/v2.py @@ -473,10 +473,12 @@ def pydantic_field_to_datatype( **kwargs, ) + 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) + return typing.get_origin(annotation) is Union and type(None) in typing.get_args( + annotation + ) def construct_datatype(