decolua/9router · error
Provider ${providerId} does not support web fetch
Error message
Provider ${providerId} does not support web fetch What it means
The provider resolved successfully but its registry entry has no fetchConfig, meaning the upstream does not support web fetch (URL content extraction). The fetch pipeline needs provider-specific config (endpoint, auth mode, response parsing) which only fetch-capable providers define, so the handler rejects with HTTP 400 'Provider <id> does not support web fetch'.
Source
Thrown at src/sse/handlers/fetch.js:126
return handleSingleProviderFetch(body, providerInput, request, apiKey, settings);
}
async function handleSingleProviderFetch(body, providerInput, request, apiKey, settings) {
const targetUrl = body.url;
const format = body.format;
const maxCharacters = body.max_characters;
const providerId = resolveProviderId(providerInput);
const resolvedProvider = AI_PROVIDERS[providerId];
if (!resolvedProvider) {
log.warn("FETCH", "Unknown provider", { provider: providerInput });
return errorResponse(HTTP_STATUS.BAD_REQUEST, `Unknown provider: ${providerInput}`);
}
const providerConfig = resolvedProvider.fetchConfig;
if (!providerConfig) {
log.warn("FETCH", "Provider does not support web fetch", { provider: providerId });
return errorResponse(HTTP_STATUS.BAD_REQUEST, `Provider ${providerId} does not support web fetch`);
}
if (providerInput !== providerId) {
log.info("ROUTING", `${providerInput} → ${providerId}`);
} else {
log.info("ROUTING", `Provider: ${providerId}`);
}
// No-auth fetch path (kept for parity though no current fetch provider sets noAuth)
if (resolvedProvider.noAuth) {
log.info("AUTH", `\x1b[32m${providerId} no-auth mode\x1b[0m`);
const result = await handleFetchCore({
url: targetUrl,
format,
maxCharacters,
provider: resolvedProvider.id,
providerConfig,View on GitHub (pinned to 90b52e06ff)
Solutions
- Switch to a provider that supports web fetch (one with fetchConfig in open-sse/providers/registry) such as jina or exa
- If you own the provider definition, add a fetchConfig block to its registry entry to enable fetch
- Check the dashboard's provider capabilities to see which providers are fetch-enabled
- For combos, ensure every model in the combo is fetch-capable or pick a fetch-only combo
Example fix
// before
{ model: 'my-openai-compatible-provider', url: 'https://example.com' }
// after
{ model: 'jina', url: 'https://example.com' } // a fetch-capable provider Defensive patterns
Strategy: fallback
Validate before calling
const FETCH_CAPABLE = new Set(['jina', 'exa', 'firecrawl']); // ids with fetchConfig in open-sse/providers/registry
if (!FETCH_CAPABLE.has(model)) {
console.warn(`${model} has no fetchConfig - falling back to a fetch-capable provider`);
model = 'jina';
} Try / catch
let res = await fetch(endpoint, { method: 'POST', body: JSON.stringify({ model, url }) });
if (res.status === 400 && (await res.clone().text()).includes('does not support web fetch')) {
res = await fetch(endpoint, { method: 'POST', body: JSON.stringify({ model: 'jina', url }) }); // fallback provider
} Prevention
- Maintain a client-side allowlist of fetch-capable provider ids and pick from it
- Check provider capabilities in the dashboard before routing fetch traffic to a provider
- For combos, verify every member provider is fetch-capable
- When adding a custom provider, add fetchConfig to its registry entry if it should support fetch
When it happens
Trigger: Sending a chat-only provider (e.g. an OpenAI-compatible endpoint with no fetch integration) to the fetch endpoint; a provider whose registry entry lacks fetchConfig; routing through a combo whose member is not fetch-capable.
Common situations: Assuming every configured provider supports URL extraction like it supports chat; a newly added custom provider missing its fetchConfig block; a combo mixing fetch and non-fetch providers.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Unknown provider: ${providerInput}
- Missing required field: url
- Invalid URL format
- err.message (SSRF guard: blocked internal/private/metadata U
- Unknown provider: ${providerInput}
AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30).
Data as JSON: /api/errors/8aa64c12c533889e.
Report an issue: GitHub.