Try the next model when a vision model rejects the image

FixAIService
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.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing