Never route vision to an adapter that cannot send an image

FixAIService
Shipped
July 22, 2026 at 5:13 PM UTC
Author
Kamo
Commit
6b6151b

AiProvider.supportsVision is a hand-editable database flag, and routing trusted it alone. The HuggingFace and Cohere adapters never read imageUrls at all, and their own supportsVision() — which correctly returns false — was consulted NOWHERE: dead code. So an org that ticked "supports vision" on a HuggingFace provider got the image silently dropped, a bare prompt sent, and a confident answer the model INVENTED. The rate-sheet extractor then staged those invented numbers as candidates carrying document provenance and a plausible 0.55 confidence, indistinguishable from values actually read off the sheet. A fabricated mortgage price is far worse than no price. The adapter is now the ground truth about what can go on the wire: selectVisionCandidates filters on adapter.supportsVision(), which also makes /vision-capability honest since it resolves through the same path. An unknown provider type is treated as incapable rather than risking an invented answer. Defense in depth: both adapters now refuse a request carrying imageUrls instead of dropping it, so anything that bypasses routing fails loudly.

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