@@ -632,49 +632,45 @@ def _to_litellm_role(role: Optional[str]) -> Literal["user", "assistant"]:
632632}
633633
634634
635- def _schema_to_dict (schema : types .Schema ) -> dict :
636- """Recursively converts a types.Schema to a pure-python dict
637-
638- with all enum values written as lower-case strings.
635+ def _schema_to_dict (schema : types .Schema | dict [str , Any ]) -> dict :
636+ """Recursively converts a schema object or dict to a pure-python dict.
639637
640638 Args:
641639 schema: The schema to convert.
642640
643641 Returns:
644642 The dictionary representation of the schema.
645643 """
646- # Dump without json encoding so we still get Enum members
647- schema_dict = schema .model_dump (exclude_none = True )
644+ schema_dict = (
645+ schema .model_dump (exclude_none = True )
646+ if isinstance (schema , types .Schema )
647+ else dict (schema )
648+ )
649+ enum_values = schema_dict .get ("enum" )
650+ if isinstance (enum_values , (list , tuple )):
651+ schema_dict ["enum" ] = [value for value in enum_values if value is not None ]
648652
649- # ---- normalise this level ------------------------------------------------
650- if "type" in schema_dict :
651- # schema_dict["type"] can be an Enum or a str
653+ if "type" in schema_dict and schema_dict ["type" ] is not None :
652654 t = schema_dict ["type" ]
653- schema_dict ["type" ] = (t .value if isinstance (t , types .Type ) else t ).lower ()
655+ schema_dict ["type" ] = (
656+ t .value if isinstance (t , types .Type ) else str (t )
657+ ).lower ()
654658
655- # ---- recurse into `items` -----------------------------------------------
656659 if "items" in schema_dict :
657- schema_dict ["items" ] = _schema_to_dict (
658- schema .items
659- if isinstance (schema .items , types .Schema )
660- else types .Schema .model_validate (schema_dict ["items" ])
660+ items = schema_dict ["items" ]
661+ schema_dict ["items" ] = (
662+ _schema_to_dict (items )
663+ if isinstance (items , (types .Schema , dict ))
664+ else items
661665 )
662666
663- # ---- recurse into `properties` ------------------------------------------
664667 if "properties" in schema_dict :
665668 new_props = {}
666669 for key , value in schema_dict ["properties" ].items ():
667- # value is a dict → rebuild a Schema object and recurse
668- if isinstance (value , dict ):
669- new_props [key ] = _schema_to_dict (types .Schema .model_validate (value ))
670- # value is already a Schema instance
671- elif isinstance (value , types .Schema ):
670+ if isinstance (value , (types .Schema , dict )):
672671 new_props [key ] = _schema_to_dict (value )
673- # plain dict without nested schemas
674672 else :
675673 new_props [key ] = value
676- if "type" in new_props [key ]:
677- new_props [key ]["type" ] = new_props [key ]["type" ].lower ()
678674 schema_dict ["properties" ] = new_props
679675
680676 return schema_dict
0 commit comments