diegosouzapw/OmniRoute · error · WebFetchExecutionError
No credentials configured for any web-fetch provider. Add…
Error message
No credentials configured for any web-fetch provider. Add an API key for one of: ${WEB_FETCH_PROVIDERS.join(", ")}. What it means
Credential-resolution dead end in resolveProviderAndCredentials: neither a pinned provider with credentials nor an anonymous-capable provider matched, and autoSelectProvider() found no configured web-fetch provider API key. No backend exists to serve the fetch, so the request fails with 400 and guidance listing the acceptable providers (WEB_FETCH_PROVIDERS).
Solutions
- Add an API key for one of the listed web-fetch providers in settings
- Pin the request to an anonymous-capable provider if one is available
- Retry after saving credentials so auto-selection has a candidate
Defensive patterns
Strategy: fallback
When it happens
Trigger: Thrown at src/lib/skills/webFetchExecution.ts:130 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of diegosouzapw/OmniRoute@a179ffed5b (2026-08-25).
Data as JSON: /api/errors/1d576d0ddc603647.
Report an issue: GitHub.
Appendix: source
Thrown at src/lib/skills/webFetchExecution.ts:130
async function resolveProviderAndCredentials(
input: ExecuteWebFetchInput
): Promise<{ provider: WebFetchProviderId; credentials: WebFetchCredentials }> {
const pinnedProvider = resolvePinnedBackend(input);
const pinnedCredentials = pinnedProvider ? await resolveCredentials(pinnedProvider) : null;
if (pinnedProvider && pinnedCredentials) {
return { provider: pinnedProvider, credentials: pinnedCredentials };
}
if (pinnedProvider && ANONYMOUS_CAPABLE_PROVIDERS.has(pinnedProvider)) {
// Anonymous tier: no connection configured (or the credential resolution
// came back rate-limited — the anonymous tier does not consume key quota,
// so a rate-limited key must not block the anonymous attempt either).
return { provider: pinnedProvider, credentials: {} };
}
const auto = await autoSelectProvider();
if (!auto) {
throw new WebFetchExecutionError(
`No credentials configured for any web-fetch provider. Add an API key for one of: ${WEB_FETCH_PROVIDERS.join(", ")}.`,
400
);
}
return auto;
}
export async function executeWebFetch(input: ExecuteWebFetchInput): Promise<WebFetchResponse> {
if (!input.url || typeof input.url !== "string") {
throw new WebFetchExecutionError("Missing required field: url", 400);
}
const { provider, credentials } = await resolveProviderAndCredentials(input);
const result = await handleWebFetch(
{
url: input.url,
format: input.format,View on GitHub (pinned to a179ffed5b)