zeroclaw-labs/zeroclaw · warning · DiagItem

embedding route "{}" has empty model

Error message

embedding route "{}" has empty model

What it means

A `zeroclaw doctor` warning from `check_config_semantics`: an `[[embedding_routes]]` entry has a `model` value that is empty after trimming. The route cannot build embedding requests without a model identifier, so memory/embedding features would fail at request time even though the config still loads. Doctor reports it per route, identified by its `hint`.

Source

Thrown at crates/zeroclaw-runtime/src/doctor/mod.rs:1279

        }
    }

    // Embedding routes validation
    for route in &config.embedding_routes {
        if route.hint.trim().is_empty() {
            items.push(DiagItem::warn(cat, "embedding route with empty hint"));
        }
        if let Some(reason) = embedding_provider_validation_error(&route.model_provider) {
            items.push(DiagItem::warn(
                cat,
                format!(
                    "embedding route \"{}\" uses invalid model_provider \"{}\": {}",
                    route.hint, route.model_provider, reason
                ),
            ));
        }
        if route.model.trim().is_empty() {
            items.push(DiagItem::warn(
                cat,
                format!("embedding route \"{}\" has empty model", route.hint),
            ));
        }
        if route.dimensions.is_some_and(|value| value == 0) {
            items.push(DiagItem::warn(
                cat,
                format!(
                    "embedding route \"{}\" has invalid dimensions=0",
                    route.hint
                ),
            ));
        }
    }

    if let Some(hint) = config
        .memory
        .embedding_model

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Set `model` on the offending route to a real embedding model id, e.g. `model = "text-embedding-3-small"` for the `openai` provider.
  2. If the route is unused, delete the whole `[[embedding_routes]]` block instead of leaving an empty stub.
  3. Re-run `zeroclaw doctor` and confirm the `embedding route "<hint>" has empty model` warning is gone before starting the daemon.

Example fix

# before (zeroclaw.toml)
[[embedding_routes]]
hint = "openai"
model_provider = "openai"
model = ""

# after
[[embedding_routes]]
hint = "openai"
model_provider = "openai"
model = "text-embedding-3-small"
dimensions = 1536
Defensive patterns

Strategy: validation

Validate before calling

// Pre-flight before starting the daemon or shipping config
for route in &config.embedding_routes {
    assert!(
        !route.model.trim().is_empty(),
        "embedding route \"{}\" needs a non-empty model",
        route.hint
    );
}

Type guard

fn embedding_model_is_set(model: &str) -> bool {
    !model.trim().is_empty()
}

Prevention

When it happens

Trigger: Running `zeroclaw doctor` (or the `diagnose` API, or any config-validation test) against a config where an `[[embedding_routes]]` table has `model = ""`, a whitespace-only model, or omits `model` entirely (serde default fills it with an empty string).

Common situations: Hand-written or templated zeroclaw.toml where the model key was forgotten; copy-pasted route stubs with placeholder values; refactors that renamed the field; a leftover route kept around after switching `model_provider = "none"`.

Understand the failure class

Background: Config validation failed: what "invalid value for {key}" and settings-rejection errors mean across 19 open-source libraries — this error's family across 19 libraries.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/d55475133f00eca7. Report an issue: GitHub.