diff --git a/agent/image_routing.py b/agent/image_routing.py index a8337c9ac6adb..a3762fccd4aa5 100644 --- a/agent/image_routing.py +++ b/agent/image_routing.py @@ -432,7 +432,14 @@ def _lookup_supports_vision( caps = None try: from agent.models_dev import get_model_capabilities - caps = get_model_capabilities(provider, model) + # allow_network=True on purpose: vision-capability lookup runs when + # an image actually needs routing (not per turn), and the #31179 + # text-only-main guard depends on catalog data — a cold cache + # returning "unknown" would fall back to attempting the call and + # reintroduce the bug. This preserves the historical + # network-on-cold-cache behavior for this one path; the fetch is + # cached (4h TTL) and backoff-limited after failures. + caps = get_model_capabilities(provider, model, allow_network=True) except Exception as exc: # pragma: no cover - defensive logger.debug("image_routing: caps lookup failed for %s:%s — %s", provider, model, exc) if caps is not None: diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index 701c5662d6c10..a533fbc2a5964 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -1038,6 +1038,10 @@ _CATEGORY_MERGE: Dict[str, str] = { "skills": "agent", "cron": "agent", "network": "agent", + # `models_dev.url` (mirror override) is the only schema-surfaced + # models_dev field — fold it in with the other network/agent plumbing + # rather than spawning a one-field orphan tab. + "models_dev": "agent", "checkpoints": "agent", "approvals": "security", "human_delay": "display",