How to test an LLM model migration before you ship it A new open-source tool, Evalshift, provides a repeatable method for testing large language model (LLM) migrations by freezing a golden suite of recorded agent runs, running both source and target models over identical cases, and analyzing paired diffs across output quality, tool-call behavior, and cost/latency. The tool, available as PyPI packages `evalshift` and `evalshift-sdk`, addresses the gap where CI cannot validate model output changes, helping teams prove a model swap is safe before shipping. ← all posts /blog How to test an LLM model migration before you ship it A repeatable method for proving a model swap is safe: freeze a golden suite, run both models paired, and read the diff before your users do. Swapping the model behind a production feature is a code change, except nothing checks it. The provider ships a newer version, you edit one string in a config file, and CI stays green because CI never had an opinion about model output. Whatever broke shows up later as support tickets, by which point the deploy that caused it is twenty deploys back. The usual substitute for evidence is the playground: paste in twenty prompts, read the answers, decide it looks fine. That fails for a structural reason, not a diligence one. The prompts you can think of are the prompts you already handle well — the eleven-turn conversation where the model drops a constraint set in turn three, the refund request where the new model calls issue refund before lookup order , the input in a language your template never anticipated. You cannot type those from memory. You have to have recorded them. What "safe" actually means here Safe does not mean "the new model is better." It means you can state what changed, in which direction, on which cases, and with what confidence — precisely enough that a colleague who disagrees has to argue with a number instead of your intuition. That splits into three failure classes, independent enough that each needs its own instrumentation: - +Output quality drift: the answer is still fluent and on topic, but less correct, less complete, or no longer the shape your downstream code parses. - +Tool-call behavior drift: the agent picks a different tool, calls tools in a different order, skips a verification step, or passes subtly different arguments. The output text can look identical while the trace underneath has changed. - +Cost and latency drift: the same answers, slower, or at three times the tokens per turn. A migration can pass one class and fail another. A cheaper model that answers just as well but issues one extra tool call per turn is not a cost reduction, and reading outputs will never tell you that. Step 1 — freeze a golden suite The suite has to be fixed before you touch models. If you are still editing cases while you compare, you are comparing two moving things, and the diff between them tells you nothing about either. Real traffic beats invented prompts, for the same reason the playground fails. The capture SDK records agent runs in process to .evalshift/captures/ , and evalshift capture sync promotes every capture into .evalshift/suites/