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

  1. Switch to a provider that supports web fetch (one with fetchConfig in open-sse/providers/registry) such as jina or exa
  2. If you own the provider definition, add a fetchConfig block to its registry entry to enable fetch
  3. Check the dashboard's provider capabilities to see which providers are fetch-enabled
  4. 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

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


AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30). Data as JSON: /api/errors/8aa64c12c533889e. Report an issue: GitHub.