NousResearch/hermes-agent · error · BlueprintFillError

blueprint prompt missing value for {e}

Error message

blueprint prompt missing value for {e}

What it means

BlueprintFillError raised while rendering blueprint.prompt_template: str.format(**resolved) raised KeyError because the template references a placeholder name that is not among the resolved slot values. Per the source comment this is a template/slot mismatch — a developer error in the blueprint definition, not a user input error.

Source

Thrown at cron/blueprint_catalog.py:787

    for s in blueprint.slots:
        raw = values.get(s.name, s.default)
        if raw in (None, ""):
            if s.optional:
                continue
            raise BlueprintFillError(f"missing required value: {s.name} ({s.label})")
        if s.type == "enum" and s.strict and s.options and str(raw) not in {str(o) for o in s.options}:
            raise BlueprintFillError(
                f"{s.name}={raw!r} not allowed — one of {', '.join(map(str, s.options))}"
            )
        resolved[s.name] = raw

    schedule = _resolve_schedule(blueprint, resolved)

    # Render the prompt with whatever slots it references.
    try:
        prompt = blueprint.prompt_template.format(**resolved)
    except KeyError as e:
        raise BlueprintFillError(f"blueprint prompt missing value for {e}") from e

    spec: Dict[str, Any] = {
        "prompt": prompt,
        "schedule": schedule,
        "name": blueprint.title,
        "deliver": resolved.get("deliver", blueprint.deliver_default),
    }
    if blueprint.skills:
        spec["skills"] = list(blueprint.skills)
    if origin is not None:
        spec["origin"] = origin
    return spec

View on GitHub (pinned to c896c09c42)

Solutions

  1. Fix the blueprint: every {name} in prompt_template must have a corresponding slot (or a default) in blueprint.slots
  2. If the slot is genuinely optional, give it a default so it is always resolved
  3. Catch BlueprintFillError and surface it as a catalog-authoring bug rather than re-asking the user

Example fix

# before (blueprint definition)
prompt_template: "Summarize {city} news"
slots: [time, day]           # no 'city' slot

# after
prompt_template: "Summarize {city} news"
slots: [time, day, city]     # 'city' slot added
Defensive patterns

Strategy: try-catch

Validate before calling

import re

def template_slots_covered(bp) -> list[str]:
    defined = {s.name for s in bp.slots}
    referenced = set(re.findall(r"\{(\w+)\}", bp.prompt_template))
    return sorted(referenced - defined)

Try / catch

from cron.blueprint_catalog import BlueprintFillError

try:
    spec = fill_blueprint(bp, values)
except BlueprintFillError as e:
    if str(e).startswith("blueprint prompt missing value"):
        raise RuntimeError(f"Blueprint '{bp.title}' is malformed: {e}") from e
    raise

Prevention

When it happens

Trigger: A blueprint whose prompt_template contains {city} but defines no slot named 'city' (or the slot is optional and was skipped), so format() hits a missing key. Any fill_blueprint call against that blueprint fails regardless of user input.

Common situations: Hand-edited YAML/JSON blueprint where a placeholder was added to the prompt without a matching slot; an optional slot with no default that the prompt still references; renamed slot in template but not in slots list.

Related errors


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/1fe48bb91e815b95. Report an issue: GitHub.