Files
wehub-resource-sync e4dcfc49aa
Tests / Import Check (Python 3.13) (push) Has been cancelled
Tests / Import Check (Python 3.14) (push) Has been cancelled
Tests / Python Tests (Python 3.11) (push) Has been cancelled
Tests / Python Tests (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.14) (push) Has been cancelled
Tests / Test Summary (push) Has been cancelled
Tests / Lint and Format (push) Has been cancelled
Tests / Web Node Tests (push) Has been cancelled
Tests / Import Check (Python 3.11) (push) Has been cancelled
Tests / Import Check (Python 3.12) (push) Has been cancelled
Tests / Python Tests (Python 3.13) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:00:43 +08:00

72 lines
2.2 KiB
TypeScript

// Which connection fields a web-search provider actually uses.
//
// This mirrors the backend resolver in
// `deeptutor/services/config/provider_runtime.py`
// (`resolve_search_runtime_config`): brave/tavily/jina/perplexity/serper
// authenticate with an API key, searxng is configured by its instance Base
// URL, and duckduckgo/none need no connection details at all. Every search
// provider ships an empty `base_url` from the settings API
// (`_provider_choices` in `deeptutor/api/routers/settings.py`), so the Base
// URL only ever carries a value for searxng.
//
// Keep this table in sync with SUPPORTED_SEARCH_PROVIDERS on the backend.
export type SearchProviderFieldSpec = {
/** Provider authenticates with an API key. */
apiKey: boolean;
/** Provider is configured with a Base URL. */
baseUrl: boolean;
/** The Base URL is mandatory — the provider cannot work without it. */
baseUrlRequired: boolean;
};
const KEY_ONLY: SearchProviderFieldSpec = {
apiKey: true,
baseUrl: false,
baseUrlRequired: false,
};
const NO_CREDENTIALS: SearchProviderFieldSpec = {
apiKey: false,
baseUrl: false,
baseUrlRequired: false,
};
const BASE_URL_ONLY: SearchProviderFieldSpec = {
apiKey: false,
baseUrl: true,
baseUrlRequired: true,
};
// Providers we don't model (a custom/unknown value, the deprecated
// exa/baidu/openrouter set, or an empty selection): show every field so we
// never hide a control the provider might actually need.
const UNKNOWN: SearchProviderFieldSpec = {
apiKey: true,
baseUrl: true,
baseUrlRequired: false,
};
const SEARCH_PROVIDER_FIELDS: Record<string, SearchProviderFieldSpec> = {
none: NO_CREDENTIALS,
duckduckgo: NO_CREDENTIALS,
searxng: BASE_URL_ONLY,
brave: KEY_ONLY,
tavily: KEY_ONLY,
jina: KEY_ONLY,
perplexity: KEY_ONLY,
serper: KEY_ONLY,
};
/**
* Resolve which connection fields to show for a search provider. Unknown,
* custom, or empty provider names fall back to showing every field.
*/
export function searchProviderFields(
provider: string | null | undefined,
): SearchProviderFieldSpec {
const key = (provider ?? "").trim().toLowerCase();
if (!key) return UNKNOWN;
return SEARCH_PROVIDER_FIELDS[key] ?? UNKNOWN;
}