acd8737c10
Harden the models.dev catalog refresh path (#35838) with three missing pieces: 1. ETag conditional GET — every network request sends If-None-Match with the last-known ETag (persisted alongside the cache file). A 304 Not Modified re-confirms the existing cache without re-downloading the full ~2 MB registry. This makes the 4-hour TTL effectively free to maintain. 2. No-network-on-hot-paths invariant — allow_network=False is now the default for every query function called on the conversation hot path: get_model_capabilities, get_model_info, lookup_models_dev_context, _get_provider_models. These are called during vision routing, image routing, cost-guard checks, and context-length resolution on every turn — they must never block on the network. Interactive flows (model picker, model switch) explicitly pass allow_network=True. 3. Mirror URL override — models_dev.url in config.yaml lets deployments point at a self-hosted mirror without code changes. Follows the same pattern as model_catalog.url. Additional hardening: - Cache TTL bumped from 1h to 4h (ETag makes refresh cheap) - Corrupt/empty disk cache is rejected with a warning instead of being served as {} and silently breaking provider/model resolution - _validate_registry() guards against non-dict and empty-dict payloads Fixes #35838