a9cd0e07cb
Self-review follow-up. check_web_api_key() had a hand-rolled 'walk all registered providers and probe each' fallback that duplicated the registry's own availability-filtered resolvers (get_active_search_provider / get_active_extract_provider, backed by _resolve()) — a second resolution path that could diverge (the hand-rolled walk ignored capability, so a search-only custom provider was handled inconsistently). Delegate to the registry's resolvers so there is one authority for 'is a custom provider usable'. Also: _get_backend()'s tail walk now probes provider.is_available() directly instead of round-tripping through _is_backend_available(provider.name), which redundantly re-did the registry get_provider() lookup on a provider object already in hand. Both fallback loops guard is_available() against exceptions. Documented that _LEGACY_WEB_BACKENDS intentionally includes 'xai' (probed via has_xai_credentials, not a registered provider) while the registry's _LEGACY_PREFERENCE excludes it, so the two built-in sets don't silently drift.