{"record":{"id":"d14f68a3977906b1","repo":"decolua/9router","slug":"provider-providerid-does-not-support-web-search","errorCode":null,"errorMessage":"Provider ${providerId} does not support web search","messagePattern":"Provider (.+?) does not support web search","errorType":"validation","errorClass":null,"httpStatus":400,"severity":"error","filePath":"src/sse/handlers/search.js","lineNumber":107,"sourceCode":"\n  return handleSingleProviderSearch(body, providerInput, request, apiKey, settings);\n}\n\nasync function handleSingleProviderSearch(body, providerInput, request, apiKey, settings) {\n  const query = body.query;\n  const providerId = resolveProviderId(providerInput);\n  const resolvedProvider = AI_PROVIDERS[providerId];\n\n  if (!resolvedProvider) {\n    log.warn(\"SEARCH\", \"Unknown provider\", { provider: providerInput });\n    return errorResponse(HTTP_STATUS.BAD_REQUEST, `Unknown provider: ${providerInput}`);\n  }\n\n  const providerConfig = resolvedProvider.searchConfig;\n  const supportsSearch = !!providerConfig || !!resolvedProvider.searchViaChat;\n\n  if (!supportsSearch) {\n    log.warn(\"SEARCH\", \"Provider does not support web search\", { provider: providerId });\n    return errorResponse(HTTP_STATUS.BAD_REQUEST, `Provider ${providerId} does not support web search`);\n  }\n\n  if (providerInput !== providerId) {\n    log.info(\"ROUTING\", `${providerInput} → ${providerId}`);\n  } else {\n    log.info(\"ROUTING\", `Provider: ${providerId}`);\n  }\n\n  // Sanitized body forwarded to core\n  const coreBody = {\n    query: query.trim(),\n    provider: providerId,\n    max_results: body.max_results,\n    search_type: body.search_type,\n    country: body.country,\n    language: body.language,\n    time_range: body.time_range,","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/decolua/9router/blob/90b52e06ffd666b7929554211474d01588f6b1f8/src/sse/handlers/search.js#L89-L125","documentation":"The provider id resolved successfully, but its registry entry has neither a `searchConfig` nor `searchViaChat` flag, so it cannot execute web-search requests. This 400 is returned before any credential or upstream call. It is a capability mismatch: the provider exists but only supports chat/embeddings/etc.","triggerScenarios":"Posting a search request with provider set to a chat-only provider id (e.g. a plain OpenAI-compatible endpoint or an LLM provider without a searchConfig); reusing a chat combo whose models are all non-search providers; a registry file whose searchConfig was removed or renamed in a refactor.","commonSituations":"Pointing a generic search client at every configured provider assuming uniform capabilities; combo expansion routing search traffic to chat models that lack searchViaChat; upstream registry template copied without filling searchConfig; users confusing provider search (Tavily/Brave) with LLM builtin web search on non-supporting providers.","solutions":["Choose a provider whose registry entry defines `searchConfig` or `searchViaChat` (e.g. tavily, brave, searxng).","If the provider should support search, add `searchConfig` (or `searchViaChat: true`) to its registry file under open-sse/providers/registry/.","For search combos, ensure every model in the combo is a search-capable provider id.","Check the dashboard's provider list filtered by web-search support instead of all providers."],"exampleFix":"// before (registry/gpt.js)\nexport default { id: 'gpt', /* no searchConfig */ };\n// after\nexport default { id: 'gpt', searchViaChat: true, searchConfig: { endpoint: '/responses', ... } };","handlingStrategy":"validation","validationCode":"const p = AI_PROVIDERS[resolveProviderId(provider)];\nif (p && !p.searchConfig && !p.searchViaChat) {\n  throw new Error(`Provider ${resolveProviderId(provider)} does not support web search`);\n}","typeGuard":"const supportsSearch = (p) => Boolean(AI_PROVIDERS[resolveProviderId(p)]?.searchConfig || AI_PROVIDERS[resolveProviderId(p)]?.searchViaChat);","tryCatchPattern":null,"preventionTips":["Feature-gate the search UI on the provider's declared search capability.","For search combos, assert every member has searchConfig/searchViaChat.","Fill in searchConfig when templating new providers from REGISTRY_TEMPLATE if they support search."],"tags":["http-400","capability","web-search","provider-registry"],"backgroundTag":"unsupported-operation","analyzedSha":"90b52e06ffd666b7929554211474d01588f6b1f8","analyzedAt":"2026-08-30T21:05:45.952Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}