NousResearch/hermes-agent · warning · BlueprintFillError

missing required value: {s.name} ({s.label})

Error message

missing required value: {s.name} ({s.label})

What it means

BlueprintFillError: iterating the blueprint's slots, a non-optional slot resolved to None or '' (no value given and no usable default). The message names both the slot's machine name and its human label so a form can attach the error to the right field.

Source

Thrown at cron/blueprint_catalog.py:774

    slot, so a form can show field errors and the agent knows what to ask.
    Unknown slot names are rejected (a typo'd ``tiem=07:15`` must not silently
    create a job with the default time). Enum values are checked against their
    options. The result is passed straight to ``create_job`` — no second schema.
    """
    known = {s.name for s in blueprint.slots}
    unknown = sorted(set(values) - known)
    if unknown:
        raise BlueprintFillError(
            f"unknown slot{'s' if len(unknown) > 1 else ''}: "
            f"{', '.join(unknown)} — valid: {', '.join(s.name for s in blueprint.slots)}"
        )
    resolved: Dict[str, Any] = {}
    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,

View on GitHub (pinned to c896c09c42)

Solutions

  1. Provide a value for the named slot in the next fill_blueprint call
  2. Drive collection from blueprint.slots (required = not s.optional) so you know upfront which fields to ask for

Example fix

# before
fill_blueprint(bp, {"day": "monday"})  # 'time' slot required
# BlueprintFillError: missing required value: time (Time of day)

# after
fill_blueprint(bp, {"day": "monday", "time": "09:00"})
Defensive patterns

Strategy: validation

Validate before calling

def missing_required(bp, values: dict) -> list[str]:
    return [
        s.name for s in bp.slots
        if not s.optional and values.get(s.name, s.default) in (None, "")
    ]

Try / catch

try:
    spec = fill_blueprint(bp, values)
except BlueprintFillError as e:
    if str(e).startswith("missing required value"):
        slot = str(e).split(": ", 1)[1].split(" ")[0]
        values[slot] = ask_for(slot)
        spec = fill_blueprint(bp, values)
    else:
        raise

Prevention

When it happens

Trigger: fill_blueprint(bp, {}) on a blueprint whose 'time' slot is non-optional with default None; or a partial submission that fills some required slots but leaves one blank.

Common situations: Multi-step conversational job creation where the agent submits before collecting every required field; a form where a required field was left empty and the client did not enforce it client-side.

Related errors


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