1
0
mirror of https://github.com/home-assistant/core.git synced 2026-07-14 10:03:52 +01:00
Files
2026-07-10 07:08:57 +02:00

62 lines
1.9 KiB
Python

"""LLM tools for the script integration."""
from operator import attrgetter
from homeassistant.components.homeassistant import async_should_expose
from homeassistant.components.llm import LLMTools
from homeassistant.core import HomeAssistant, callback, split_entity_id
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers.llm import LLM_API_ASSIST, ActionTool, LLMContext, Tool
from .const import DOMAIN
class ScriptTool(ActionTool):
"""LLM Tool representing a Script."""
def __init__(
self,
hass: HomeAssistant,
script_entity_id: str,
) -> None:
"""Init the class."""
script_name = split_entity_id(script_entity_id)[1]
action = script_name
entity_registry = er.async_get(hass)
entity_entry = entity_registry.async_get(script_entity_id)
if entity_entry and entity_entry.unique_id:
action = entity_entry.unique_id
super().__init__(hass, DOMAIN, action)
self.name = script_name
if self.name[0].isdigit():
self.name = "_" + self.name
if entity_entry and (
aliases := er.async_get_entity_aliases(hass, entity_entry)
):
alias_text = "Aliases: " + str(sorted(aliases))
self.description = (
f"{self.description}. {alias_text}" if self.description else alias_text
)
@callback
def async_get_tools(
hass: HomeAssistant, llm_context: LLMContext, api_id: str
) -> LLMTools | None:
"""Return a script LLM tool for each exposed script."""
if api_id != LLM_API_ASSIST:
return None
tools: list[Tool] = [
ScriptTool(hass, state.entity_id)
for state in sorted(hass.states.async_all(DOMAIN), key=attrgetter("name"))
if async_should_expose(hass, llm_context.assistant, state.entity_id)
]
if not tools:
return None
return LLMTools(tools=tools)