pub async fn thinking_parity(
handle: &PluginHandle,
smaller: Value,
larger: Value,
expect_delta: usize,
want: &(dyn Fn(&str) -> bool + Sync),
timeout: Duration,
) -> CellExpand description
2026-09-26: Vision with thinking on, through chat completions.
The chat-completions legs built by image_request turn thinking off,
because a reasoning block can consume the whole of max_tokens and leave
empty content. This leg covers thinking on. The assertion is a difference,
so the unknown thinking overhead cancels: two images whose vision-token
counts differ by a known amount are sent, both with thinking on, and the
gap between their prompt sizes must equal that amount exactly:
(tokens_b - tokens_a) == (vision_b - vision_a)Whatever the thinking envelope costs, it costs the same in both, so it vanishes from the subtraction. A thinking-on path that mis-sized, dropped or double-counted the image moves it.