We run a search engine for stock photography. You describe the picture you want in a sentence, in whichever language you think in, and it comes back with images that match the description rather than the caption somebody typed under it.
Underneath, every image is embedded once and searched twice: a vision model puts pictures and sentences in the same space, and a multilingual text model handles the wording. The two result sets are merged with reciprocal rank fusion. That combination is why "a quiet street in the rain" works, and why the same query works in French without a translation step.
Most of our work lives inside the product. What is useful on its own is in this organisation:
- pexafy-python — the API client, for searching the index from your own code.
- pexafy-mcp — the remote MCP server, so an assistant can search and show images inside a conversation. Hosted, OAuth, three tools.
- pexafy-openapi — the versioned description of the public API, with a differ that knows requests and responses break differently.
The measurement work behind the engine is published separately, on @matijani: rank fusion between encoders that do not share a score scale, HNSW tuning on a collection carrying two named vectors, what it costs to embed a hundred million images on rented GPUs, and the other stock image APIs put through the same hundred queries. Each of those carries the script that produced its numbers, so you can disagree with them precisely.
Issues and pull requests are welcome on any repository. If something we published does not reproduce, that is a bug and we would like to hear about it, preferably with the command you ran.
Commercial questions go to contact@pexafy.com. Everything technical is better in public, on the repository it concerns.