Update LLM selector serializer to support ObjectSelector fields and arrays (#148094)

This commit is contained in:
Allen Porter 2025-07-04 04:05:16 -07:00 committed by GitHub
parent 8641a2141c
commit 1fc624c7a7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 70 additions and 1 deletions

View File

@ -777,7 +777,23 @@ def _selector_serializer(schema: Any) -> Any: # noqa: C901
return result
if isinstance(schema, selector.ObjectSelector):
return {"type": "object", "additionalProperties": True}
result = {"type": "object"}
if fields := schema.config.get("fields"):
result["properties"] = {
field: convert(
selector.selector(field_schema["selector"]),
custom_serializer=_selector_serializer,
)
for field, field_schema in fields.items()
}
else:
result["additionalProperties"] = True
if schema.config.get("multiple"):
result = {
"type": "array",
"items": result,
}
return result
if isinstance(schema, selector.SelectSelector):
options = [

View File

@ -1139,6 +1139,59 @@ async def test_selector_serializer(
"type": "object",
"additionalProperties": True,
}
assert selector_serializer(
selector.ObjectSelector(
{
"fields": {
"name": {
"required": True,
"selector": {"text": {}},
},
"percentage": {
"selector": {"number": {"min": 30, "max": 100}},
},
},
"multiple": False,
"label_field": "name",
},
)
) == {
"type": "object",
"properties": {
"name": {"type": "string"},
"percentage": {"type": "number", "minimum": 30, "maximum": 100},
},
}
assert selector_serializer(
selector.ObjectSelector(
{
"fields": {
"name": {
"required": True,
"selector": {"text": {}},
},
"percentage": {
"selector": {"number": {"min": 30, "max": 100}},
},
},
"multiple": True,
"label_field": "name",
},
)
) == {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {"type": "string"},
"percentage": {
"type": "number",
"minimum": 30,
"maximum": 100,
},
},
},
}
assert selector_serializer(
selector.SelectSelector(
{