mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 12:17:07 +00:00
Update LLM selector serializer to support ObjectSelector fields and arrays (#148094)
This commit is contained in:
parent
8641a2141c
commit
1fc624c7a7
@ -777,7 +777,23 @@ def _selector_serializer(schema: Any) -> Any: # noqa: C901
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
if isinstance(schema, selector.ObjectSelector):
|
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):
|
if isinstance(schema, selector.SelectSelector):
|
||||||
options = [
|
options = [
|
||||||
|
@ -1139,6 +1139,59 @@ async def test_selector_serializer(
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": True,
|
"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(
|
assert selector_serializer(
|
||||||
selector.SelectSelector(
|
selector.SelectSelector(
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user