What a model is being asked to do, rather than which model to use. <p> Callers name a tier - {@link #FAST}, {@link #BALANCED}, {@link #DEEP} - and {@link LlmManager#getModelForTier(String)} resolves it to the best model that tier lists which this tenant actually has. The point is that a model release becomes one edit at the top of one list here, instead of a hunt through hardcoded model names. That hunt is not hypothetical: {@code agents-lib} pinned {@code gpt-5.1}, {@code ai-lib} pinned {@code gpt-5.1} and {@code gpt-5-mini}, and {@code content-lib} pinned {@code gpt-5.6-luna} - three libraries, already two model generations apart, each correct on the day it was written. <p> Tiers are named for the job, not the model's size or its vendor's version number, because the job is the part that does not change. A caller that wants cheap classification wants that in five years too, whatever is cheapest by then. <p> Each tier is an <b>ordered preference list</b>, best first. Resolution takes the first entry the tenant has available, so a tenant restricted to older models still gets the most appropriate one it can rather than an arbitrary pick - which is what the previous fallback, {@code getAvailableModels().get(0)}, amounted to.

To get full access to the Kademi Hub existing customers can login here, or new customers can register here.