- Shipped
- July 18, 2026 at 7:06 PM UTC
- Author
- Kamo
- Commit
- 092d189
Probing production again after the modality fix, routing moved from a text-to-speech model to o3-mini — an o-series reasoning model that also takes no image input, so vision still returned 502. That is the lesson: supportsVision comes from a model-NAME heuristic at discovery and is hand-editable, and vendors keep shipping models whose names imply capabilities they lack. Any name rule will drift, so routing must not stake the whole feature on one pick. selectVisionCandidates returns every worth-trying provider+model, best first: names that read as image-capable ahead of the rest, alphabetical within each group so an org resolves the same way every call, non-chat modalities excluded outright (a speech model can never read an image, so trying one is a guaranteed wasted call). visionComplete walks the list and falls through when a model rejects the request, capped at 4 attempts so a misconfigured org cannot walk an entire catalogue per call. One wrong flag now costs a retry instead of breaking vision for the tenant. Each failure is logged with the model that rejected it, so the cause is visible rather than a bare 502.