from __future__ import annotations import unittest from utils.api_client import DeepSeekClient class APIClientMultimodalSanitizeTest(unittest.TestCase): def test_text_only_model_adds_notice_when_only_media_parts(self): client = DeepSeekClient(web_mode=True) client.model_key = "DeepSeek-V4-Pro High" # custom_models.json: multimodal=none messages = [ { "role": "tool", "name": "mcp__playwright__browser_take_screenshot", "content": [ {"type": "image_url", "image_url": {"url": "data:image/png;base64,abc"}}, ], } ] sanitized = client._sanitize_messages_for_model_capability(messages) self.assertEqual(len(sanitized), 1) self.assertEqual( sanitized[0].get("content"), "当前模型无查看图片/视频能力,无法返回结果", sanitized[0], ) def test_text_only_model_strips_image_parts_to_text(self): client = DeepSeekClient(web_mode=True) client.model_key = "DeepSeek-V4-Pro High" # custom_models.json: multimodal=none messages = [ { "role": "tool", "name": "mcp__playwright__browser_take_screenshot", "content": [ {"type": "text", "text": "截图成功"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,abc"}}, ], } ] sanitized = client._sanitize_messages_for_model_capability(messages) self.assertEqual(len(sanitized), 1) self.assertIsInstance(sanitized[0].get("content"), str, sanitized[0]) self.assertIn("截图成功", sanitized[0].get("content") or "", sanitized[0]) self.assertIn( "当前模型无查看图片/视频能力,无法返回结果", sanitized[0].get("content") or "", sanitized[0], ) def test_profile_text_only_fallback_strips_media_parts(self): client = DeepSeekClient(web_mode=True) client.model_key = "" client.model_multimodal = "none" messages = [ { "role": "tool", "name": "view_image", "content": [ {"type": "text", "text": "已尝试查看图片"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,abc"}}, ], } ] sanitized = client._sanitize_messages_for_model_capability(messages) self.assertEqual(len(sanitized), 1) self.assertIsInstance(sanitized[0].get("content"), str, sanitized[0]) self.assertIn( "当前模型无查看图片/视频能力,无法返回结果", sanitized[0].get("content") or "", sanitized[0], ) def test_profile_multimodal_model_keeps_image_parts(self): client = DeepSeekClient(web_mode=True) client.model_key = "" client.model_multimodal = "image,video" messages = [ { "role": "user", "content": [ {"type": "text", "text": "看图"}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,abc"}}, ], } ] sanitized = client._sanitize_messages_for_model_capability(messages) self.assertEqual(len(sanitized), 1) self.assertIsInstance(sanitized[0].get("content"), list, sanitized[0]) self.assertEqual( [part.get("type") for part in sanitized[0].get("content") or []], ["text", "image_url"], sanitized[0], ) def test_profile_multimodal_fallback_works_when_model_key_missing(self): client = DeepSeekClient(web_mode=True) client.model_key = "" # 模拟未知/缺失 key,仅走 profile 兜底 client.model_multimodal = "none" messages = [ { "role": "tool", "content": [ {"type": "text", "text": "测试"}, {"type": "video_url", "video_url": {"url": "data:video/mp4;base64,abc"}}, ], } ] sanitized = client._sanitize_messages_for_model_capability(messages) self.assertEqual(len(sanitized), 1) self.assertIsInstance(sanitized[0].get("content"), str, sanitized[0]) self.assertIn( "当前模型无查看图片/视频能力,无法返回结果", sanitized[0].get("content") or "", sanitized[0], ) if __name__ == "__main__": unittest.main()