From c362d1242525ba2d9c4c41fc716596bd7622fc18 Mon Sep 17 00:00:00 2001 From: matevip Date: Tue, 9 Jun 2026 10:41:10 +0800 Subject: [PATCH] test(llm): update MultimodalRouterTest for honour-explicit-sidecar behavior The multimodal sidecar selector change made resolveSidecar honour an explicit sidecar selection even when the built-in capability heuristics don't recognize the model (it now logs a diagnostic and returns the model instead of rejecting to NONE). The test still asserted the old reject->NONE path. Update it to assert SIDECAR and the honoured model, matching the current production behavior. --- .../vip/mate/llm/routing/MultimodalRouterTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mateclaw-server/src/test/java/vip/mate/llm/routing/MultimodalRouterTest.java b/mateclaw-server/src/test/java/vip/mate/llm/routing/MultimodalRouterTest.java index ee7ced22..690d5f90 100644 --- a/mateclaw-server/src/test/java/vip/mate/llm/routing/MultimodalRouterTest.java +++ b/mateclaw-server/src/test/java/vip/mate/llm/routing/MultimodalRouterTest.java @@ -145,8 +145,8 @@ class MultimodalRouterTest { } @Test - @DisplayName("Configured sidecar that does not actually support VISION → fallback to NONE") - void sidecarLacksClaimedCapability() { + @DisplayName("Explicit sidecar is honoured even when heuristics don't confirm VISION capability") + void sidecarHonouredDespiteUnconfirmedCapability() { ModelConfigEntity primary = chatModel("deepseek", "deepseek-chat", null); ModelConfigEntity vision = chatModel("acme", "acme-chat", "[]"); vision.setId(42L); @@ -161,8 +161,12 @@ class MultimodalRouterTest { MultimodalRoutingDecision decision = router.route(List.of(imagePart("a.png")), primary); - assertEquals(MultimodalRoutingDecision.Strategy.NONE, decision.strategy()); - assertEquals("vision_model_unavailable", decision.skipped().get(0).reason()); + // An explicit sidecar selection is the user's own capability declaration: + // honour it even when the built-in heuristics don't recognize the model as + // vision-capable (a wrong pick degrades gracefully at caption time, rather + // than the attachment being silently dropped). + assertEquals(MultimodalRoutingDecision.Strategy.SIDECAR, decision.strategy()); + assertEquals(vision, decision.sidecarModel()); } @Test