from __future__ import annotations import unittest from typing import cast from models.minicpm_vision import MiniCPMVisionConfig, MiniCPMVisionService from models.model_catalog import load_model_catalog class MiniCPMVisionServiceTest(unittest.TestCase): def test_status_reports_transformers_availability(self) -> None: status = MiniCPMVisionService.status() self.assertEqual(status.name, "transformers-vision") self.assertIsInstance(status.available, bool) def test_unavailable_or_missing_image_path_does_not_load_weights(self) -> None: catalog = load_model_catalog("config/models.yaml") service = MiniCPMVisionService(catalog["minicpm_v46"]) response = service.vision_chat(False, "Describe it.") self.assertIn("[MiniCPM vision unavailable]", response) def test_generation_kwargs_are_explicit(self) -> None: catalog = load_model_catalog("config/models.yaml") service = MiniCPMVisionService( catalog["minicpm_v46"], MiniCPMVisionConfig(max_new_tokens=64, temperature=0.1, do_sample=False), ) self.assertEqual( service.generation_kwargs(), {"max_new_tokens": 64, "temperature": 0.1, "do_sample": False}, ) def test_formats_image_text_prompt_with_thinking_instruction(self) -> None: messages = MiniCPMVisionService.format_messages( "Read the label.", image="image-object", thinking=True, ) self.assertEqual(messages[0]["role"], "user") self.assertEqual(messages[0]["content"][0]["type"], "image") self.assertEqual(messages[0]["content"][1]["type"], "text") self.assertIn("Think carefully", messages[0]["content"][1]["text"]) def test_video_support_plan_is_documented_but_not_enabled(self) -> None: plan = MiniCPMVisionService.video_support_plan() next_steps = cast(list[str], plan["next_steps"]) self.assertFalse(plan["implemented"]) self.assertTrue(any("Sample frames locally" in step for step in next_steps)) if __name__ == "__main__": unittest.main()