Replace vision hotswap with native multimodal profiles

This commit is contained in:
Mikei386
2026-08-20 14:24:56 +02:00
parent 8a45a0d851
commit cb07779f5a
19 changed files with 169 additions and 719 deletions
+31 -7
View File
@@ -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):