A few weeks ago we published the technical account of how we left a single AI provider behind: Eliminating LLM Vendor Lock-In with a Single-Tenant Router. It covered the architecture, the routing, and the six-week build.
This is the same story without the engineering. The first post was written for the people building it. This one is for anyone weighing the same move: less about how we built it, more about why we did, and how we knew the moment had come.
For three years we ran on one provider, and for most of that time it was the right call. They offered the strongest models and made it easy to connect our software, so standardising on one let us ship fast. We watched the trade-offs the whole time. The discipline was in not tearing up a setup that was still letting us move faster than the alternatives, just because we could see weather on the horizon.
What we were really tracking was the moment the maths flipped: the point where the convenience stopped paying for itself and started setting limits on what we could do. Moving too early would have been its own mistake. You don't rebuild your foundations to solve a problem you don't have yet. The judgment was in spotting when "still working well" had become "working well, but on someone else's terms."
When that moment came, the cost showed up in one place above all. Everything we'd built was shaped around one provider's way of working. Our software had to phrase every request exactly as that provider expected, and read every answer back with code written for that provider alone. Switching models was never a setting we could change. It meant rewriting all of that, every time.
| "Real lock-in isn't a contract you can't exit. It's a system that quietly costs more to leave than to stay."
We could absorb a price rise. What held us in place was the prospect of weeks of engineering every time we wanted to move.
There was a second cost we rarely said out loud. Anything sensitive had to be stripped out before it went near the model, which left our most useful context the context we were least able to use.