Skip to content

v3.30.4

Latest

Choose a tag to compare

@goruck goruck released this 16 Aug 01:41
f9a144c

Fixed

  • Voice satellites can set timers now. "Set a timer for two minutes" used to make the agent cancel zero timers and then claim it cannot set timers at all — on every timer-capable satellite (HA Voice PE, ESPHome satellites), on the very first try. Home Assistant exposes the seven real timer tools (HassStartTimer, HassCancelTimer, …) only to requests from timer-capable devices, but the retrieval index was built once at startup with no device, so those tools could never enter it and never be retrieved — the model saw exactly one timer-shaped tool, the unconditionally exposed HassCancelAllTimers, and used it. The index now reconciles with the live tool set every turn: a cheap key comparison detects live tools the index has never seen, and any gap is indexed inline — sourced from the APIs already loaded for the turn, no second network round trip — before retrieval runs, so HassStartTimer is retrievable on the triggering turn itself (selection still follows normal relevance ranking). Turns where nothing is missing cost one set comparison, no discovery calls, no store writes. A failed top-up write never disables the index: the existing index keeps serving and the next turn retries automatically. (#554)
  • Tools of a configured-but-failed LLM API are no longer offered to the model. The same reconciliation gap had a mirror image: when an MCP server failed to load for a turn, its tools were still retrieved from the index and bound, and every call died at dispatch with "API not available". Retrieval candidates — including the GetLiveContext and add_automation force-injections — are now filtered against the tools actually loaded this turn, which also keeps device-gated tools indexed by one device (satellite timer tools) from binding in another context that doesn't have them (browser chat). PIN-confirmation injection is deliberately exempt. (#554)
  • The Tool Index sensor stays truthful under per-turn reconciliation. It reports the cumulative indexed total rather than the last batch size, returns to ready even when a top-up write fails mid-turn, and a stalled write gives up after 30 seconds instead of hanging the voice turn. One tool with an unserializable schema no longer blocks its API's other tools from being indexed, and phantom speech-to-text turns (background noise) never trigger index writes. (#554)