windmill-labs/windmill · critical

Invalid dedicated_workers format. Got {x}, expects <workspac

Error message

Invalid dedicated_workers format. Got {x}, expects <workspace_id>:<path>

What it means

Same contract as dedicated_worker but for the dedicated_workers list: each entry must be '<workspace_id>:<path>' with exactly one colon. Any entry with a different number of colon-separated parts fails parsing.

Source

Thrown at backend/windmill-common/src/worker.rs:2173

                let script_path = splitted[1];
                Ok(WorkspacedPath {
                    workspace_id: workspace.to_string(),
                    path: script_path.to_string(),
                })
            }
        })
        .transpose()?;

    // Parse dedicated_workers (multiple dedicated workers)
    let dedicated_workers = config
        .dedicated_workers
        .map(|workers| {
            workers
                .into_iter()
                .map(|x| {
                    let splitted = x.split(':').to_owned().collect_vec();
                    if splitted.len() != 2 {
                        return Err(anyhow::anyhow!(
                            "Invalid dedicated_workers format. Got {x}, expects <workspace_id>:<path>"
                        ));
                    }
                    let workspace = splitted[0];
                    let script_path = splitted[1];
                    Ok(WorkspacedPath {
                        workspace_id: workspace.to_string(),
                        path: script_path.to_string(),
                    })
                })
                .collect::<Result<Vec<_>, _>>()
        })
        .transpose()?;
    if *WORKER_GROUP == "default" && dedicated_worker.is_none() {
        let mut all_tags = config
            .worker_tags
            .unwrap_or_default()
            .into_iter()

View on GitHub (pinned to e474e8803c)

Solutions

  1. Fix the offending list entry to '<workspace_id>:<path>' with exactly one colon
  2. Validate every entry in the list individually — one bad entry rejects the whole list
  3. Check the surrounding container/orchestrator config for mangled separators

Example fix

// before
dedicated_workers = "ws1:scripts/a, https://host/ws2:scripts/b"
// after
dedicated_workers = "ws1:scripts/a, ws2:scripts/b"
Defensive patterns

Strategy: validation

Validate before calling

for entry in list {
    let parts: Vec<&str> = entry.split(':').collect();
    assert_eq!(parts.len(), 2, "dedicated_workers entry must be <workspace_id>:<path>: {}", entry);
}

Prevention

When it happens

Trigger: One of the entries in the dedicated_workers list contains extra colons (URL, port, version suffix) or no colon at all; list configured via env var where values are comma- or whitespace-split and one entry is malformed.

Common situations: Bulk-editing worker configs and one entry keeps a URL prefix; mixing formats across entries; documentation examples adapted incorrectly for multiple workers.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/bc2a4944d9820292. Report an issue: GitHub.