import { getConfig } from "../config/store.ts"; import { FETCH_PROVIDER_IDS, type FetchProviderId } from "./provider.ts"; export interface FetchRouting { providers: FetchProviderId[]; allowRemoteHostedProviders: boolean; } export const DEFAULT_FETCH_PROVIDERS: FetchProviderId[] = ["http", "firecrawl", "jina", "tinyfish", "search1api", "querit", "kagi", "ollama", "parallel", "brightdata", "gemini"]; export function getFetchRouting(): FetchRouting { const root = getConfig(); if (root.fetchRouting === undefined) return { providers: DEFAULT_FETCH_PROVIDERS, allowRemoteHostedProviders: false }; if (!root.fetchRouting || typeof root.fetchRouting !== "object" || Array.isArray(root.fetchRouting)) throw new Error("fetchRouting must be an object"); const config = root.fetchRouting as Record; let providers = DEFAULT_FETCH_PROVIDERS; if (config.providers !== undefined) { if (!Array.isArray(config.providers) || config.providers.length === 0) throw new Error("fetchRouting.providers must be a non-empty array"); providers = []; for (const value of config.providers) { const provider = typeof value === "string" ? value.trim().toLowerCase() : ""; if (!FETCH_PROVIDER_IDS.includes(provider as FetchProviderId)) throw new Error(`fetchRouting.providers contains an invalid provider: ${String(value)}`); if (providers.includes(provider as FetchProviderId)) throw new Error(`fetchRouting.providers must not contain duplicates: ${provider}`); providers.push(provider as FetchProviderId); } } if (config.allowRemoteHostedProviders !== undefined && typeof config.allowRemoteHostedProviders !== "boolean") throw new Error("fetchRouting.allowRemoteHostedProviders must be a boolean"); return { providers, allowRemoteHostedProviders: config.allowRemoteHostedProviders === true }; }