from __future__ import annotations import unittest from core.deployment import DeploymentPolicy from models.llama_cpp_python_service import LlamaCppPythonService from models.llama_cpp_service import LlamaCppService from models.minicpm_vision import MiniCPMVisionService from models.model_catalog import load_model_catalog from models.ollama_service import OllamaService from models.openai_compatible_service import OpenAICompatibleService from models.placeholder_service import PlaceholderModelService from models.service_factory import ( TEXT_SERVICE_REGISTRY, VISION_SERVICE_REGISTRY, backend_statuses, create_text_service, create_vision_service, ) from models.sglang_runner import SGLangService from models.transformers_text import TransformersTextService class ServiceFactoryTest(unittest.TestCase): def test_creates_placeholder_service_by_default(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_text_service(catalog["minicpm5_1b"], "placeholder") self.assertIsInstance(service, PlaceholderModelService) def test_space_policy_rejects_placeholder_service(self) -> None: catalog = load_model_catalog("config/models.yaml") with self.assertRaises(ValueError): create_text_service( catalog["minicpm5_1b"], "placeholder", DeploymentPolicy("space"), ) def test_creates_ollama_service_when_selected(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_text_service(catalog["minicpm5_1b"], "ollama") self.assertIsInstance(service, OllamaService) def test_creates_llama_cpp_service_when_selected(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_text_service(catalog["minicpm5_1b"], "llama.cpp") self.assertIsInstance(service, LlamaCppService) def test_creates_llama_cpp_python_service_when_selected(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_text_service(catalog["minicpm5_1b"], "llama-cpp-python") self.assertIsInstance(service, LlamaCppPythonService) def test_backend_statuses_include_placeholder_and_ollama(self) -> None: statuses = backend_statuses() self.assertIn("placeholder", [status.name for status in statuses]) self.assertIn("llama.cpp", [status.name for status in statuses]) self.assertIn("llama-cpp-python", [status.name for status in statuses]) self.assertIn("ollama", [status.name for status in statuses]) self.assertIn("transformers", [status.name for status in statuses]) self.assertIn("openai-compatible", [status.name for status in statuses]) self.assertIn("sglang", [status.name for status in statuses]) self.assertIn("transformers-vision", [status.name for status in statuses]) def test_space_backend_statuses_hide_placeholder(self) -> None: statuses = backend_statuses(DeploymentPolicy("space")) self.assertNotIn("placeholder", [status.name for status in statuses]) self.assertIn("transformers", [status.name for status in statuses]) def test_model_service_registries_include_all_backends(self) -> None: expected = [ "placeholder", "llama.cpp", "llama-cpp-python", "ollama", "transformers", "openai-compatible", "sglang", ] self.assertEqual(TEXT_SERVICE_REGISTRY.list(), expected) self.assertEqual( VISION_SERVICE_REGISTRY.list(), ["placeholder", "llama.cpp", "llama-cpp-python", "ollama", "transformers"], ) def test_creates_transformers_service_when_selected(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_text_service(catalog["minicpm5_1b"], "transformers") self.assertIsInstance(service, TransformersTextService) def test_creates_openai_compatible_service_when_selected(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_text_service(catalog["minicpm5_1b"], "openai-compatible") self.assertIsInstance(service, OpenAICompatibleService) def test_creates_sglang_service_when_selected(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_text_service(catalog["minicpm5_1b"], "sglang") self.assertIsInstance(service, SGLangService) def test_creates_minicpm_vision_service_when_transformers_selected(self) -> None: catalog = load_model_catalog("config/models.yaml") service = create_vision_service(catalog["minicpm_v46"], "transformers") self.assertIsInstance(service, MiniCPMVisionService) if __name__ == "__main__": unittest.main()