home-assistant/core · error · InvalidBlueprintInputs

Invalid blueprint inputs: {humanize_error(config_with_bluepr

Error message

Invalid blueprint inputs: {humanize_error(config_with_blueprint, err)}

What it means

InvalidBlueprintInputs is raised in async_inputs_from_config when the config passed to the blueprint fails BLUEPRINT_INSTANCE_FIELDS (voluptuous). The humanized error identifies the bad field. This validates the consumer's use_blueprint block shape, not the blueprint file itself.

Source

Thrown at homeassistant/components/blueprint/models.py:314

            try:
                blueprint = await self.hass.async_add_executor_job(
                    self._load_blueprint, blueprint_path
                )
            except FailedToLoad:
                self._blueprints[blueprint_path] = None
                raise

            self._blueprints[blueprint_path] = blueprint
            return blueprint

    async def async_inputs_from_config(
        self, config_with_blueprint: dict
    ) -> BlueprintInputs:
        """Process a blueprint config."""
        try:
            config_with_blueprint = BLUEPRINT_INSTANCE_FIELDS(config_with_blueprint)
        except vol.Invalid as err:
            raise InvalidBlueprintInputs(
                self.domain, humanize_error(config_with_blueprint, err)
            ) from err

        bp_conf = config_with_blueprint[CONF_USE_BLUEPRINT]
        blueprint = await self.async_get_blueprint(bp_conf[CONF_PATH])
        inputs = BlueprintInputs(blueprint, config_with_blueprint)
        inputs.validate()
        return inputs

    async def async_remove_blueprint(self, blueprint_path: str) -> None:
        """Remove a blueprint file."""
        if self._blueprint_in_use(self.hass, blueprint_path):
            raise BlueprintInUse(self.domain, blueprint_path)
        path = self.blueprint_folder / blueprint_path
        await self.hass.async_add_executor_job(path.unlink)
        self._blueprints[blueprint_path] = None

    def _create_file(

View on GitHub (pinned to 58a3fdb3ea)

Solutions

  1. Follow the humanized message: ensure the block is 'use_blueprint: {path: <file>, input: {<name>: <value>}}'
  2. Fix key typos (inputs -> input) and make input a mapping of input-name to value
  3. Validate with Developer Tools > YAML before saving

Example fix

# before
- use_blueprint: motion_light.yaml
  inputs:
    - light.hall

# after
- use_blueprint:
    path: motion_light.yaml
    input:
      light: light.hall
Defensive patterns

Strategy: validation

Validate before calling

import voluptuous as vol
from homeassistant.components.blueprint.models import BLUEPRINT_INSTANCE_FIELDS

def use_blueprint_config_valid(config: dict) -> bool:
    try:
        BLUEPRINT_INSTANCE_FIELDS(config)
        return True
    except vol.Invalid:
        return False

Try / catch

from homeassistant.components.blueprint.errors import InvalidBlueprintInputs
try:
    inputs = await manager.async_inputs_from_config(config)
except InvalidBlueprintInputs as err:
    # show humanized error next to the use_blueprint editor field

Prevention

When it happens

Trigger: A config dict where use_blueprint is not a mapping containing path, or where unknown/extra keys sit next to 'input', or 'input' is not a mapping; reached via automation/script config validation or websocket API calls that build BlueprintInputs.

Common situations: Hand-written automation YAML with 'use_blueprint:' as a plain string; 'input:' given a list; typo like 'inputs:' instead of 'input:'.

Related errors


AI-assisted analysis of home-assistant/core@58a3fdb3ea (2026-08-14). Data as JSON: /api/errors/ac74effe9a3e4b4e. Report an issue: GitHub.