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_modelView on GitHub (pinned to 88bb9c8533)
Solutions
- Set `model` on the offending route to a real embedding model id, e.g. `model = "text-embedding-3-small"` for the `openai` provider.
- If the route is unused, delete the whole `[[embedding_routes]]` block instead of leaving an empty stub.
- 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
- Generate zeroclaw.toml via quickstart/tooling instead of hand-writing route tables.
- Never leave placeholder empty strings for required route fields; delete unused routes.
- Run `zeroclaw doctor` in CI on every config change so empty models never reach production.
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
- embedding route "{}" has invalid dimensions=0
- memory.embedding_model uses hint "{hint}" but no matching [[
- config at {} does not deserialize strictly; the resilient lo
- model route "{}" uses invalid model_provider "{}": {}
- embedding route "{}" uses invalid model_provider "{}": {}
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/d55475133f00eca7.
Report an issue: GitHub.