@@ -666,6 +666,66 @@ def _filter_invalid_constraints(
666666 filtered_constraints .append (constraint )
667667 return filtered_constraints
668668
669+ def _filter_properties_required_field (
670+ self , node_types : List [Dict [str , Any ]]
671+ ) -> List [Dict [str , Any ]]:
672+ """Sanitize the 'required' field in node type properties. Ensures 'required' is a valid boolean.
673+ converts known string values (true, yes, 1, false, no, 0) to booleans and removes unrecognized values.
674+ """
675+ for node_type in node_types :
676+ properties = node_type .get ("properties" , [])
677+ if not properties :
678+ continue
679+ for prop in properties :
680+ if not isinstance (prop , dict ):
681+ continue
682+
683+ required_value = prop .get ("required" )
684+
685+ # Not provided - will use Pydantic default (false)
686+ if required_value is None :
687+ continue
688+
689+ # already a valid boolean
690+ if isinstance (required_value , bool ):
691+ continue
692+
693+ prop_name = prop .get ("name" , "unknown" )
694+ node_label = node_type .get ("label" , "unknown" )
695+
696+ if isinstance (required_value , str ):
697+ if required_value .lower () in ("true" , "yes" , "1" ):
698+ prop ["required" ] = True
699+ logging .info (
700+ f"Converted 'required' value { required_value } to True "
701+ f"for property '{ prop_name } ' on node '{ node_label } '"
702+ )
703+ elif required_value .lower () in ("false" , "no" , "0" ):
704+ prop ["required" ] = False
705+ logging .info (
706+ f"Converted 'required' value '{ required_value } ' to False "
707+ f"for property '{ prop_name } ' on node '{ node_label } ' "
708+ )
709+ # Unknown string values
710+ else :
711+ logging .info (
712+ f"Removing unrecognized 'required' value '{ required_value } ' "
713+ f"for property '{ prop_name } ' on node '{ node_label } '. "
714+ f"Using default (False) " # TODO: Not sure if we have to convert it to the default value - double check!
715+ )
716+ prop .pop ("required" , None )
717+ else :
718+ # Non-string, non-boolean - remove
719+ logging .info (
720+ f"Removing invalid 'required' value '{ required_value } ' (type: { type (required_value ).__name__ } ) "
721+ f"for property '{ prop_name } ' on node '{ node_label } '. "
722+ f"Using default (False). "
723+ )
724+ prop .pop ("required" , None )
725+
726+ return node_types
727+
728+
669729 def _clean_json_content (self , content : str ) -> str :
670730 content = content .strip ()
671731
@@ -746,6 +806,10 @@ async def run(self, text: str, examples: str = "", **kwargs: Any) -> GraphSchema
746806 extracted_relationship_types
747807 )
748808
809+ extracted_node_types = self ._filter_properties_required_field (
810+ extracted_node_types
811+ )
812+
749813 # Filter out invalid patterns before validation
750814 if extracted_patterns :
751815 extracted_patterns = self ._filter_invalid_patterns (
0 commit comments