Replace vision hotswap with native multimodal profiles
This commit is contained in:
@@ -23,7 +23,11 @@ from router_support import ( # noqa: E402
|
||||
enforce_artifact_retention,
|
||||
load_profile_registry,
|
||||
)
|
||||
from ai_profile_router import _normalize_vision_image # noqa: E402
|
||||
from ai_profile_router import ( # noqa: E402
|
||||
_normalize_chat_image,
|
||||
_normalize_chat_images,
|
||||
_request_has_image,
|
||||
)
|
||||
|
||||
|
||||
class AuthPolicyTests(unittest.TestCase):
|
||||
@@ -47,9 +51,9 @@ class RuntimeStoreTests(unittest.TestCase):
|
||||
def test_atomic_roundtrip_and_delete(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp:
|
||||
store = RuntimeStore(str(Path(temp) / "state.json"))
|
||||
store.save(worker="vision", worker_pid=123, last_profile="fast")
|
||||
store.save(worker="image", worker_pid=123, last_profile="fast")
|
||||
self.assertEqual(store.load()["worker_pid"], 123)
|
||||
store.clear_worker("vision")
|
||||
store.clear_worker("image")
|
||||
state = store.load()
|
||||
self.assertNotIn("worker", state)
|
||||
self.assertEqual(state["last_profile"], "fast")
|
||||
@@ -75,18 +79,38 @@ class ProfileRegistryTests(unittest.TestCase):
|
||||
load_profile_registry("/definitely/missing/profiles.json")
|
||||
|
||||
|
||||
class VisionInputTests(unittest.TestCase):
|
||||
class ChatImageInputTests(unittest.TestCase):
|
||||
def test_small_png_data_url_is_accepted(self) -> None:
|
||||
value = "data:image/png;base64,iVBORw0KGgo="
|
||||
self.assertEqual(_normalize_vision_image(value), value)
|
||||
self.assertEqual(_normalize_chat_image(value), value)
|
||||
|
||||
def test_remote_url_is_denied_by_default(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "deaktiviert"):
|
||||
_normalize_vision_image("https://example.com/private.png")
|
||||
_normalize_chat_image("https://example.com/private.png")
|
||||
|
||||
def test_invalid_base64_is_rejected(self) -> None:
|
||||
with self.assertRaisesRegex(ValueError, "Base64"):
|
||||
_normalize_vision_image("data:image/png;base64,not!base64")
|
||||
_normalize_chat_image("data:image/png;base64,not!base64")
|
||||
|
||||
def test_multimodal_part_is_retained_for_direct_forwarding(self) -> None:
|
||||
value = "data:image/png;base64,iVBORw0KGgo="
|
||||
request = {
|
||||
"model": "qwen-fast",
|
||||
"messages": [{
|
||||
"role": "user",
|
||||
"content": [
|
||||
{"type": "text", "text": "Was ist zu sehen?"},
|
||||
{"type": "image_url", "image_url": {"url": value}},
|
||||
],
|
||||
}],
|
||||
}
|
||||
self.assertTrue(_request_has_image(request))
|
||||
normalized = _normalize_chat_images(request)
|
||||
self.assertEqual(
|
||||
normalized["messages"][0]["content"][1]["image_url"]["url"],
|
||||
value,
|
||||
)
|
||||
self.assertEqual(request, normalized)
|
||||
|
||||
|
||||
class RetentionTests(unittest.TestCase):
|
||||
|
||||
Reference in New Issue
Block a user