from __future__ import annotations import os import sys import unittest from pathlib import Path SERVICE_ROOT = Path(__file__).resolve().parents[1] BACKEND_ROOT = SERVICE_ROOT.parent if str(SERVICE_ROOT) not in sys.path: sys.path.insert(0, str(SERVICE_ROOT)) from inference.config import reset_inference_manifest_cache # noqa: E402 from tabular_agent import model_name # noqa: E402 CANONICAL_MANIFEST = BACKEND_ROOT / "config" / "inference.manifest.json" class ModelSelectionTests(unittest.TestCase): def setUp(self) -> None: reset_inference_manifest_cache() self._old_manifest_path = os.environ.pop("INFERENCE_MANIFEST_PATH", None) self._old_model = os.environ.pop("TABULAR_AGENT_MODEL", None) os.environ["INFERENCE_MANIFEST_PATH"] = str(CANONICAL_MANIFEST) def tearDown(self) -> None: reset_inference_manifest_cache() if self._old_manifest_path is not None: os.environ["INFERENCE_MANIFEST_PATH"] = self._old_manifest_path else: os.environ.pop("INFERENCE_MANIFEST_PATH", None) if self._old_model is not None: os.environ["TABULAR_AGENT_MODEL"] = self._old_model else: os.environ.pop("TABULAR_AGENT_MODEL", None) def test_model_name_honors_request_model_id(self) -> None: self.assertEqual( model_name("gemini-3.5-flash", feature_id="python-review"), "gemini-3.5-flash", ) def test_model_name_uses_manifest_feature_for_review(self) -> None: self.assertEqual(model_name(None, feature_id="python-review"), "gemini-3.5-flash") def test_model_name_uses_python_chat_fallback(self) -> None: self.assertEqual(model_name(None, feature_id="python-chat"), "gemini-3.5-flash") def test_model_name_respects_env_override(self) -> None: os.environ["TABULAR_AGENT_MODEL"] = "gemini-3-flash" reset_inference_manifest_cache() self.assertEqual(model_name(None, feature_id="python-review"), "gemini-3-flash") if __name__ == "__main__": unittest.main()