Set tool metadata in light (#182705)

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Paulus Schoutsen
2026-09-21 18:35:11 +02:00
committed by GitHub
co-authored by Claude
parent 8229631d3f
commit 3c49717915
2 changed files with 29 additions and 4 deletions
+21 -3
View File
@@ -4,13 +4,25 @@ from homeassistant.components.homeassistant import async_should_expose
from homeassistant.components.llm import LLMTools
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import intent
from homeassistant.helpers.llm import LLM_API_ASSIST, IntentTool, LLMContext, Tool
from homeassistant.helpers.llm import (
LLM_API_ASSIST,
IntentTool,
LLMContext,
Tool,
ToolAnnotations,
)
from .const import DOMAIN
from .intent import INTENT_SET
# Each intent sets a value on the user's own entities, so calling one again
# with the same arguments has no further effect.
LLM_ANNOTATIONS = ToolAnnotations(idempotent=True, open_world=False)
# Intents owned by this integration that are exposed as LLM tools.
LLM_INTENTS = (INTENT_SET,)
LLM_INTENTS = {
INTENT_SET: "Set light",
}
@callback
@@ -31,7 +43,13 @@ def async_get_tools(
return None
tools: list[Tool] = [
IntentTool(f"{DOMAIN}__{handler.intent_type}", handler)
IntentTool(
f"{DOMAIN}__{handler.intent_type}",
handler,
title=LLM_INTENTS[handler.intent_type],
integration=DOMAIN,
annotations=LLM_ANNOTATIONS,
)
for handler in intent.async_get(hass)
if handler.intent_type in LLM_INTENTS
]
+8 -1
View File
@@ -43,7 +43,14 @@ async def _tool_names(hass: HomeAssistant) -> set[str]:
async def test_intent_tool_exposed(hass: HomeAssistant) -> None:
"""Test the intent tool is offered for an exposed light entity."""
assert "light__HassLightSet" in await _tool_names(hass)
result = await llm_component.async_get_tools(hass, _llm_context(), "assist")
tools = {tool.name: tool for tool in result.tools}
assert "light__HassLightSet" in tools
tool = tools["light__HassLightSet"]
assert tool.title == "Set light"
assert tool.integration == "light"
assert tool.annotations == llm.ToolAnnotations(idempotent=True, open_world=False)
async def test_intent_tool_not_exposed(hass: HomeAssistant) -> None: