Spaces:
Build error
Build error
from types import UnionType | |
from typing import Any, get_args, get_origin | |
from pydantic import BaseModel | |
from pydantic.fields import FieldInfo | |
OH_DEFAULT_AGENT = 'CodeActAgent' | |
OH_MAX_ITERATIONS = 250 | |
def get_field_info(field: FieldInfo) -> dict[str, Any]: | |
"""Extract information about a dataclass field: type, optional, and default. | |
Args: | |
field: The field to extract information from. | |
Returns: A dict with the field's type, whether it's optional, and its default value. | |
""" | |
field_type = field.annotation | |
optional = False | |
# for types like str | None, find the non-None type and set optional to True | |
# this is useful for the frontend to know if a field is optional | |
# and to show the correct type in the UI | |
# Note: this only works for UnionTypes with None as one of the types | |
if get_origin(field_type) is UnionType: | |
types = get_args(field_type) | |
non_none_arg = next( | |
(t for t in types if t is not None and t is not type(None)), None | |
) | |
if non_none_arg is not None: | |
field_type = non_none_arg | |
optional = True | |
# type name in a pretty format | |
type_name = ( | |
str(field_type) | |
if field_type is None | |
else ( | |
field_type.__name__ if hasattr(field_type, '__name__') else str(field_type) | |
) | |
) | |
# default is always present | |
default = field.default | |
# return a schema with the useful info for frontend | |
return {'type': type_name.lower(), 'optional': optional, 'default': default} | |
def model_defaults_to_dict(model: BaseModel) -> dict[str, Any]: | |
"""Serialize field information in a dict for the frontend, including type hints, defaults, and whether it's optional.""" | |
result = {} | |
for name, field in model.model_fields.items(): | |
field_value = getattr(model, name) | |
if isinstance(field_value, BaseModel): | |
result[name] = model_defaults_to_dict(field_value) | |
else: | |
result[name] = get_field_info(field) | |
return result | |