from __future__ import annotations from nexus_visual_weaver.model_relay import WeaverModelRelay from nexus_visual_weaver.render import render_dashboard def test_pinned_lanes_do_not_rotate() -> None: relay = WeaverModelRelay() decision = relay.select_lane("image_generation", strategy="private_research") assert decision.pinned is True assert decision.rotatable is False assert decision.primary is not None assert decision.primary.repo_id == "black-forest-labs/FLUX.2-klein-9B" assert decision.primary.params_b == 9.0 assert [fallback.repo_id for fallback in decision.fallbacks] == ["black-forest-labs/FLUX.2-klein-4B"] assert "rotation disabled" in decision.reason def test_private_image_research_keeps_flux_9b_available() -> None: relay = WeaverModelRelay() decision = relay.select_lane("private_image_research", budget=9.0, public_demo=False, strategy="private_research") assert decision.primary is not None assert decision.primary.repo_id == "black-forest-labs/FLUX.2-klein-9B" assert decision.primary.pinned is False def test_public_private_taste_judge_respects_license_and_budget() -> None: relay = WeaverModelRelay() public = relay.select_lane("taste_judge", public_demo=True, strategy="quality_first") private = relay.select_lane("taste_judge", budget=12.0, public_demo=False, strategy="private_research") assert public.primary is not None assert public.primary.params_b <= 5.0 assert public.primary.public_safe is True assert "OFFELLIA" not in public.primary.repo_id assert private.primary is not None assert private.primary.model_id == "offellia-gemma4-12b-private" def test_audio_tts_excludes_higgs_and_keeps_one_active_model() -> None: relay = WeaverModelRelay() decision = relay.select_lane("audio_lore_tts", public_demo=True, strategy="license_safe_public") selected_ids = [decision.primary.model_id] + [record.model_id for record in decision.fallbacks] assert decision.primary is not None assert decision.primary.params_b <= 5.0 assert decision.primary.model_id != "higgs-audio-v3-excluded" assert "higgs-audio-v3-excluded" not in selected_ids assert decision.primary.lane == "audio_lore_tts" def test_quota_exhaustion_enters_cooldown_and_uses_fallback() -> None: relay = WeaverModelRelay() exhausted = relay.records["hf-api-metadata-cache"] exhausted.rpm_limit = 1 relay.record_success(exhausted.model_id) decision = relay.select_lane("hf_catalog_research", public_demo=True, strategy="quota_saver") assert exhausted.cooldown_until is not None assert decision.primary is not None assert decision.primary.model_id != exhausted.model_id assert any("quota exhausted" in reason for reason in decision.skipped) def test_metadata_dedup_prevents_repeated_hf_lookup() -> None: relay = WeaverModelRelay() calls = {"count": 0} def resolver() -> dict[str, int]: calls["count"] += 1 return {"calls": calls["count"]} first = relay.metadata_lookup("hf:black-forest-labs/FLUX.2-klein-4B", resolver) second = relay.metadata_lookup("hf:black-forest-labs/FLUX.2-klein-4B", resolver) assert first == second == {"calls": 1} assert calls["count"] == 1 assert relay.get_rotation_status()["dedup_hits"] == 1 def test_regressions_cost_speed_alias_and_failure_handlers() -> None: relay = WeaverModelRelay() record = relay.records["minicpm5-1b-router"] original_cost_hint = record.cost_hint speed_decision = relay.select_lane("router", strategy="speed") fast_decision = relay.select_lane("router", strategy="fast") relay.record_failure(record.model_id, "temporary provider error") relay.record_success(record.model_id, latency_ms=120) assert speed_decision.strategy == "latency_first" assert fast_decision.strategy == "latency_first" assert record.cost_hint == original_cost_hint assert record.failure_count == 1 assert record.success_count == 1 assert record.health == "healthy" def test_context_packet_survives_video_repair_fallback() -> None: relay = WeaverModelRelay() first = relay.select_lane("video_repair", public_demo=False, strategy="private_research") assert first.primary is not None for _ in range(3): relay.record_failure(first.primary.model_id, "modal batch unavailable") fallback = relay.select_lane("video_repair", public_demo=False, strategy="private_research") assert fallback.primary is not None assert fallback.primary.model_id != first.primary.model_id assert fallback.context_packet.lane == "video_repair" assert fallback.context_packet.task == "video_repair" assert any("health=unhealthy" in reason for reason in fallback.skipped) def test_dashboard_surfaces_gmr_pinned_models_and_fallbacks() -> None: relay = WeaverModelRelay() html = render_dashboard(relay_status=relay.dashboard_snapshot(public_demo=True)) assert "GMR ModelRelay" in html assert "FLUX.2 9B pinned" in html assert "4B sidecar" in html assert "LocateAnything pinned" in html assert "fallback:" in html assert "Rotation Safe" in html def test_optional_external_gateways_are_registered_but_excluded_by_default() -> None: relay = WeaverModelRelay() assert relay.records["netlify-ai-gateway-helper"].provider == "netlify" assert relay.records["cloudflare-agent-helper"].provider == "cloudflare" assert relay.records["fal-media-adapter"].provider == "fal" assert relay.records["netflix-void-modal"].health == "healthy" assert relay.records["netlify-ai-gateway-helper"].health == "excluded" assert relay.records["fal-media-adapter"].health == "excluded" def test_minicpm_v46_is_registered_in_taste_judge_lane() -> None: relay = WeaverModelRelay() record = relay.records["minicpm-v46-visual-judge"] assert record.lane == "taste_judge" assert record.repo_id == "openbmb/MiniCPM-V-4.6" assert record.provider == "openbmb" assert record.params_b == 1.30 assert record.license_gate == "apache-2.0" assert record.health == "healthy" def test_nemotron_parse_is_registered_in_taste_judge_lane() -> None: relay = WeaverModelRelay() record = relay.records["nemotron-parse-v12-evidence"] assert record.lane == "taste_judge" assert record.repo_id == "nvidia/NVIDIA-Nemotron-Parse-v1.2" assert record.provider == "hf_nvidia" assert record.params_b == 0.94 assert record.health == "healthy" def test_nemotron_nano_is_registered_as_fallback_for_parse() -> None: relay = WeaverModelRelay() parse_record = relay.records["nemotron-parse-v12-evidence"] nano_record = relay.records["nemotron-nano-4b-gguf-evidence"] assert "nemotron-nano-4b-gguf-evidence" in (parse_record.fallback_chain or ()) assert nano_record.repo_id == "nvidia/NVIDIA-Nemotron-3-Nano-4B-GGUF" assert nano_record.lane == "taste_judge" assert nano_record.params_b == 3.97 def test_private_image_research_lane_is_rotatable() -> None: from nexus_visual_weaver.model_relay import PINNED_LANES, ROTATABLE_LANES assert "private_image_research" not in PINNED_LANES assert "private_image_research" in ROTATABLE_LANES def test_flux2_klein_9b_is_pinned_with_4b_sidecar_fallback() -> None: relay = WeaverModelRelay() record = relay.records["flux2-klein-9b-quality"] fallback = relay.records["flux2-klein-4b-sidecar"] assert record.lane == "image_generation" assert record.pinned is True assert record.params_b == 9.0 assert record.license_gate == "review_required" assert record.repo_id == "black-forest-labs/FLUX.2-klein-9B" assert "flux2-klein-4b-sidecar" in record.fallback_chain assert fallback.repo_id == "black-forest-labs/FLUX.2-klein-4B" assert fallback.pinned is False def test_pinned_lane_fallbacks_respect_governance_filters() -> None: relay = WeaverModelRelay() fallback = relay.records["flux2-klein-4b-sidecar"] fallback.health = "unhealthy" decision = relay.select_lane("image_generation") assert decision.primary is not None assert decision.primary.model_id == "flux2-klein-9b-quality" assert decision.fallbacks == [] assert any("flux2-klein-4b-sidecar: health=unhealthy" in reason for reason in decision.skipped) def test_flux2_klein_9b_is_not_pinned_and_in_private_research() -> None: relay = WeaverModelRelay() record = relay.records["flux2-klein-9b-private"] assert record.lane == "private_image_research" assert record.pinned is False assert record.params_b == 9.0 assert record.license_gate == "review_required" def test_minicpm_has_fallback_chain_configured() -> None: relay = WeaverModelRelay() record = relay.records["minicpm-v46-visual-judge"] assert record.fallback_chain is not None assert len(record.fallback_chain) > 0