| import json |
| from types import SimpleNamespace |
| from typing import Any |
|
|
| import pytest |
|
|
| from figment.config import FigmentConfig |
| from figment.model_client import ModelClient, ModelClientError |
| from scripts import smoke_model_route |
|
|
|
|
| class _FakeResponse: |
| def __init__(self, payload: dict[str, Any]) -> None: |
| self.payload = payload |
|
|
| def __enter__(self) -> "_FakeResponse": |
| return self |
|
|
| def __exit__(self, *_: Any) -> None: |
| return None |
|
|
| def read(self) -> bytes: |
| return json.dumps(self.payload).encode("utf-8") |
|
|
|
|
| def _clear_route_env(monkeypatch: pytest.MonkeyPatch) -> None: |
| for key in ( |
| "FIGMENT_MODE", |
| "MODEL_STACK", |
| "MODEL_BACKEND", |
| "LOCAL_MODEL_ID", |
| "LLAMA_BASE_URL", |
| "NVIDIA_API_KEY", |
| "HF_TOKEN", |
| "HF_ENDPOINT_URL", |
| "OMNI_ENDPOINT_URL", |
| "FIGMENT_SMOKE_ALLOW_NETWORK", |
| "FIGMENT_SMOKE_TIMEOUT_SECONDS", |
| "FIGMENT_MODEL_TIMEOUT_SECONDS", |
| "ALLOW_SELF_HOSTED_OMNI", |
| ): |
| monkeypatch.delenv(key, raising=False) |
| monkeypatch.setenv("PYTHON_DOTENV_DISABLED", "true") |
|
|
|
|
| def test_canned_smoke_reports_canned_route_without_network(monkeypatch: pytest.MonkeyPatch) -> None: |
| _clear_route_env(monkeypatch) |
| monkeypatch.setenv("MODEL_BACKEND", "canned") |
|
|
| result = smoke_model_route.run_smoke() |
|
|
| assert result["status"] == "passed" |
| assert result["network_enabled"] is False |
| assert result["network_attempted"] is False |
| assert result["route"]["model_backend"] == "canned" |
| assert result["fallback_tier"] == "canned" |
| assert result["bounded_field_source"] == "canned_fallback" |
| assert result["validation"]["passed"] is True |
| assert result["model_id"] |
| assert result["latency_ms"] >= 0 |
|
|
|
|
| def test_local_llama_smoke_requires_network_gate(monkeypatch: pytest.MonkeyPatch) -> None: |
| _clear_route_env(monkeypatch) |
| monkeypatch.setenv("FIGMENT_MODE", "local") |
| monkeypatch.setenv("MODEL_BACKEND", "llama_cpp") |
| monkeypatch.setenv("LLAMA_BASE_URL", "http://127.0.0.1:65534/v1") |
| monkeypatch.setenv("LOCAL_MODEL_ID", "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16") |
|
|
| def fail_if_called(*_: Any, **__: Any) -> None: |
| raise AssertionError("local smoke must not call the model route without FIGMENT_SMOKE_ALLOW_NETWORK") |
|
|
| monkeypatch.setattr(smoke_model_route, "run_navigation", fail_if_called) |
|
|
| result = smoke_model_route.run_smoke() |
|
|
| assert result["status"] == "skipped" |
| assert result["skip_reason"] == "network_disabled_for_configured_route" |
| assert result["network_enabled"] is False |
| assert result["network_attempted"] is False |
| assert result["route"]["route_kind"] == "local_openai_compatible" |
| assert result["model_id"] == "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16" |
| assert result["local_llm_evidence"]["proof_status"] == "skipped_no_network_call" |
| assert result["local_llm_evidence"]["counts_as_no_cloud_route_proof"] is False |
| assert result["local_llm_evidence"]["counts_as_50_case_local_llm_competence"] is False |
| assert "MODEL_BACKEND=llama_cpp" in result["local_llm_evidence"]["real_eval_command"] |
| assert "comprehensive_hosted_cases.jsonl" in result["local_llm_evidence"]["real_eval_command"] |
| assert "self-hosted Omni" in result["off_grid_note"] |
|
|
|
|
| def test_gated_local_llama_smoke_reports_configured_route_for_any_local_model_id( |
| monkeypatch: pytest.MonkeyPatch, |
| ) -> None: |
| _clear_route_env(monkeypatch) |
| monkeypatch.setenv("FIGMENT_MODE", "local") |
| monkeypatch.setenv("MODEL_BACKEND", "llama_cpp") |
| monkeypatch.setenv("FIGMENT_SMOKE_ALLOW_NETWORK", "true") |
| monkeypatch.setenv("LLAMA_BASE_URL", "http://127.0.0.1:8001/v1") |
| monkeypatch.setenv("LOCAL_MODEL_ID", "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16") |
|
|
| captured: dict[str, Any] = {} |
|
|
| def fake_run_navigation(*args: Any, **kwargs: Any) -> tuple[dict[str, Any], Any]: |
| captured["config"] = kwargs["config"] |
| output = { |
| "candidate_protocol_pathways": [{"card_id": "SAFETY-BOUNDARIES-v1"}], |
| "missing_info_to_collect": ["repeat vitals"], |
| "next_observations_to_collect": ["mental status"], |
| "conflicts_or_uncertainties": ["synthetic smoke case"], |
| "responder_checklist": ["keep red flags visible"], |
| "handoff_note_sbar": {"situation": "fatigue"}, |
| } |
| trace = SimpleNamespace( |
| model_route={ |
| "model_stack": "local_4b_parakeet", |
| "model_backend": "llama_cpp", |
| "model_id": "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16", |
| "fallback_tier": "configured", |
| "fallback_reason": None, |
| }, |
| validator_result={"passed": True, "failures": []}, |
| navigator_output=output, |
| to_dict=lambda: { |
| "model_route": trace.model_route, |
| "validator_result": trace.validator_result, |
| "navigator_output": output, |
| }, |
| ) |
| return output, trace |
|
|
| monkeypatch.setattr(smoke_model_route, "run_navigation", fake_run_navigation) |
|
|
| result = smoke_model_route.run_smoke() |
|
|
| assert isinstance(captured["config"], FigmentConfig) |
| assert captured["config"].local_model_id == "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16" |
| assert result["status"] == "passed" |
| assert result["network_enabled"] is True |
| assert result["network_attempted"] is True |
| assert result["route"]["base_url"] == "http://127.0.0.1:8001/v1" |
| assert result["fallback_tier"] == "configured" |
| assert result["bounded_field_source"] == "configured_model" |
| assert result["model_id"] == "nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-BF16" |
| assert all(result["bounded_fields_present"].values()) |
| assert result["local_llm_evidence"]["proof_status"] == "one_case_route_smoke_passed" |
| assert result["local_llm_evidence"]["counts_as_no_cloud_route_proof"] is True |
| assert result["local_llm_evidence"]["counts_as_50_case_local_llm_competence"] is False |
|
|
|
|
| def test_model_client_error_mentions_sanitized_route_and_model(monkeypatch: pytest.MonkeyPatch) -> None: |
| def fake_urlopen(request: Any, timeout: float) -> _FakeResponse: |
| raise OSError("endpoint unavailable") |
|
|
| monkeypatch.setattr("urllib.request.urlopen", fake_urlopen) |
|
|
| client = ModelClient( |
| FigmentConfig( |
| model_backend="llama_cpp", |
| llama_base_url="http://127.0.0.1:8001/v1?token=secret", |
| local_model_id="local-smoke-model", |
| ) |
| ) |
|
|
| with pytest.raises(ModelClientError) as excinfo: |
| client.generate_json("Return JSON.", {}) |
|
|
| message = str(excinfo.value) |
| assert "local-smoke-model" in message |
| assert "http://127.0.0.1:8001/v1/chat/completions" in message |
| assert "secret" not in message |
|
|
|
|
| def test_model_client_timeout_can_be_shortened_for_smoke_without_changing_default( |
| monkeypatch: pytest.MonkeyPatch, |
| ) -> None: |
| captured: dict[str, Any] = {} |
|
|
| def fake_urlopen(request: Any, timeout: float) -> _FakeResponse: |
| captured["timeout"] = timeout |
| return _FakeResponse({"choices": [{"message": {"content": '{"source_cards": ["SAFETY-BOUNDARIES-v1"]}'}}]}) |
|
|
| monkeypatch.setattr("urllib.request.urlopen", fake_urlopen) |
| monkeypatch.setenv("FIGMENT_MODEL_TIMEOUT_SECONDS", "3.5") |
|
|
| client = ModelClient( |
| FigmentConfig( |
| model_backend="llama_cpp", |
| llama_base_url="http://127.0.0.1:8001/v1", |
| local_model_id="local-smoke-model", |
| ) |
| ) |
| client.generate_json("Return JSON.", {}) |
|
|
| assert captured["timeout"] == 3.5 |
|
|