zeroclaw-labs/zeroclaw · error · anyhow::Error

Unsupported proxy service selector '{selector}'. Use tool `p

Error message

Unsupported proxy service selector '{selector}'. Use tool `proxy_config` action `list_services` for valid values

What it means

ProxyConfig::validate checks every entry of proxy.services against the known service keys and selector families, case-insensitively. Valid values are concrete keys like tool.browser, channel.slack, or model_provider.openai, or the wildcard families model_provider.*, channel.*, tool.*, memory.*, tunnel.*, transcription.*. Anything else is refused with a pointer at the proxy_config tool's list_services action.

Source

Thrown at crates/zeroclaw-config/src/schema.rs:9862

    pub fn normalized_no_proxy(&self) -> Vec<String> {
        normalize_no_proxy_list(self.no_proxy.clone())
    }

    pub fn validate(&self) -> Result<()> {
        for (field, value) in [
            ("http_proxy", self.http_proxy.as_deref()),
            ("https_proxy", self.https_proxy.as_deref()),
            ("all_proxy", self.all_proxy.as_deref()),
        ] {
            if let Some(url) = normalize_proxy_url_option(value) {
                validate_proxy_url(field, &url)?;
            }
        }

        for selector in self.normalized_services() {
            if !is_supported_proxy_service_selector(&selector) {
                anyhow::bail!(
                    "Unsupported proxy service selector '{selector}'. Use tool `proxy_config` action `list_services` for valid values"
                );
            }
        }

        if self.enabled && !self.has_any_proxy_url() {
            anyhow::bail!(
                "Proxy is enabled but no proxy URL is configured. Set at least one of http_proxy, https_proxy, or all_proxy"
            );
        }

        if self.enabled
            && self.scope == ProxyScope::Services
            && self.normalized_services().is_empty()
        {
            anyhow::bail!(
                "proxy.scope='services' requires a non-empty proxy.services list when proxy is enabled"
            );

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Query the authoritative list: the proxy_config tool's list_services action, or ProxyConfig::supported_service_keys() / supported_service_selectors() from code.
  2. Prefix each service with its family: browser → tool.browser, slack → channel.slack.
  3. Use a family wildcard like tool.* when you mean all services in that family.
  4. Fix typos and re-validate the config before enabling.

Example fix

# before
[proxy]
services = ["browser", "slack"]

# after
[proxy]
services = ["tool.browser", "channel.slack"]
Defensive patterns

Strategy: type-guard

Validate before calling

for s in &cfg.proxy.services {
    if !is_supported_proxy_selector(s) {
        return Err(anyhow::anyhow!("invalid proxy service selector {s:?}"));
    }
}

Type guard

fn is_supported_proxy_selector(selector: &str) -> bool {
    let keys = zeroclaw_config::schema::ProxyConfig::supported_service_keys();
    let selectors = zeroclaw_config::schema::ProxyConfig::supported_service_selectors();
    keys.iter().chain(selectors.iter())
        .any(|k| k.eq_ignore_ascii_case(selector))
}

Try / catch

match cfg.proxy.validate() {
    Err(e) if e.to_string().contains("Unsupported proxy service selector") => {
        // call proxy_config list_services, replace the entry, re-validate
    }
    other => other,
}

Prevention

When it happens

Trigger: proxy.services containing "web", "browser" (missing the tool. prefix), "storage.*" (a family that does not exist), or any other string not in the supported keys/selectors lists, whenever proxy config validation runs.

Common situations: Guessing service names instead of listing them; typos in wildcard families; configs written against a version whose service set differed; dropping the family prefix when shortening entries.

Related errors


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