diff --git a/homeassistant/components/fan/llm.py b/homeassistant/components/fan/llm.py index 0e3c3262b8c6..e28dfd5a7e43 100644 --- a/homeassistant/components/fan/llm.py +++ b/homeassistant/components/fan/llm.py @@ -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_FAN_SET_SPEED +# 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_FAN_SET_SPEED,) +LLM_INTENTS = { + INTENT_FAN_SET_SPEED: "Set fan speed", +} @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 ] diff --git a/tests/components/fan/test_llm.py b/tests/components/fan/test_llm.py index c27ac4ae652d..365e84fea228 100644 --- a/tests/components/fan/test_llm.py +++ b/tests/components/fan/test_llm.py @@ -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 fan entity.""" - assert "fan__HassFanSetSpeed" 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 "fan__HassFanSetSpeed" in tools + + tool = tools["fan__HassFanSetSpeed"] + assert tool.title == "Set fan speed" + assert tool.integration == "fan" + assert tool.annotations == llm.ToolAnnotations(idempotent=True, open_world=False) async def test_intent_tool_not_exposed(hass: HomeAssistant) -> None: