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
- Fix the blueprint: every {name} in prompt_template must have a corresponding slot (or a default) in blueprint.slots
- If the slot is genuinely optional, give it a default so it is always resolved
- 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
- Lint blueprints at load time: every prompt_template placeholder must have a slot
- Give optional slots defaults if the prompt references them
- Treat this error as a catalog authoring bug — do not retry with user input
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
- a time is required
- invalid time {time_val!r} — use HH:MM (24h)
- unknown recurrence {preset!r} — one of {', '.join(WEEKDAY_PR
- unknown day {day!r}
- invalid interval {iv!r} — minutes as a positive integer
AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14).
Data as JSON: /api/errors/1fe48bb91e815b95.
Report an issue: GitHub.