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
- Query the authoritative list: the proxy_config tool's list_services action, or ProxyConfig::supported_service_keys() / supported_service_selectors() from code.
- Prefix each service with its family: browser → tool.browser, slack → channel.slack.
- Use a family wildcard like tool.* when you mean all services in that family.
- 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
- Always derive selector lists from proxy_config list_services or the supported_service_* helpers instead of hand-writing them.
- Namespace entries with their family prefix (tool., channel., model_provider., ...).
- Re-validate proxy blocks after upgrading zeroclaw — the service set can change.
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
- Proxy is enabled but no proxy URL is configured. Set at leas
- proxy.scope='services' requires a non-empty proxy.services l
- '{field}' must be a string or string[]
- matrix: `homeserver` is required
- Cannot persist empty Telegram identity
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/83478a80ab4ebe93.
Report an issue: GitHub.