Model visibility
Choose which models a model list shows. Turn listing off, show only some providers or models, hide models by name, or hide undated aliases, for everyone or for an app, a team or a person. Model visibility is a Policy Engine card. With the engine off, every list shows the models a caller may use, as before.
Visibility is not access
Hiding a model only takes it off lists. It never blocks a call:
- A hidden model still works by name: in requests, in
GET /v1/models/{id}and through Add a model by name. - To stop a model from being used, reject it on the Allowed Models card.
GET /v1/modelsapplies that card first, and never lists a model it rejects, not even to callers who ask for hidden models.
Lists it applies to
Other lists are unchanged: Policy Engine pickers, the Models pages and the playground show every configured model.
The two kinds of list start from different places. GET /v1/models lists the models the caller may use, after Allowed Models. Console lookups list what the provider key can reach, so you can choose models for a provider; Allowed Models does not apply there, only these rules.
Scopes match like this:
- People and Smart group: on
GET /v1/models, the identity the request carries (a JWT, orX-User-Emailwhen the app accepts it; see Identity and network trust). In the console, the person signed in. - Application and App tag: on
GET /v1/models, the app whose key made the call. In the console, only Get available models on a provider an app already has carries the app. Creating an app, entering new credentials or adding a provider in Models carries none, so those rules do not apply there.
Model Visibility card
The card sits next to Allowed Models. Start from Quick add or from a control's add button:
Each opens New model visibility rule. Choose who it applies to (everyone, or People, Smart group, Department, IdP group, Application or App tag), then what their model lists show:
Add to draft puts the rule in the shared draft, and it applies once you publish a revision. The card lists each rule's grants, for example azureopenai · gpt-4o*. Editing a rule reopens the same form, or the full editor for a rule the form cannot show.
Grants
A grant describes a set of models. Fill in one or more of its fields, and use Add grant for another set.
- A grant matches a model when every field you filled in matches. Inside one field, any value can match.
- Providers take the exact provider type:
openaiis OpenAI Chat completions, so an OpenAI Responses provider needsopenai_responses. The field suggests the types your apps use. - Matching ignores case. A rule holds up to 16 grants, and a field up to 128 values of up to 256 characters.
- A pattern matches the whole ID:
gpt-4omatches onlygpt-4o, whilegpt-4o*also matchesgpt-4o-miniandgpt-4o-2024-08-06. Use*preview*for "contains preview". - A provider label matches only a saved provider. A provider you are still adding has no label yet, so label grants never match it.
How rules combine
The gateway builds each list in this order:
- Allowed Models removes the models the caller may not use (on
GET /v1/modelsonly). - Model listing set to Off by any matching rule empties the list.
- Show only: when matching rules have show-only grants, only the models that match one of them stay.
- Hide: models that match any hide grant are left out, even where a show-only grant matches them.
- Undated aliases: hidden when any matching rule hides them.
- Hidden models decides whether hidden models come back, marked.
- Grants add up. Show-only and hide grants from every matching rule combine, whatever their priority. A higher-priority rule cannot take back another rule's show-only grant, so hide what should not be shown instead.
- Off and hidden always win. Model listing Off and Hide undated aliases apply when any matching rule sets them. To exempt a narrower scope, such as admins, set Hidden models to Always for it.
- Hidden models follows priority. The highest-priority setting wins, and at one priority the stricter one wins (Never, then On request, then Always). The form gives a rule for a person, Smart group or app a higher priority than a rule for everyone.
- One model, two providers. When two providers offer the same model ID and only one of them is hidden, the list still shows the model, under the provider that is visible.
A model visibility rule holds only model visibility settings, plus its name, priority and risk level. In Advanced policies, validation rejects a rule that also sets other controls, because other requests would then skip the whole rule. It also rejects conditions a model list never carries: the requested model, prompt text, tools or detected data. It warns when a rule matches on the provider (use a grant's Providers instead), on the source IP of a console lookup (that is the console server's address), or hides * (set Model listing to Off instead).
Show hidden models
Hidden models decides who still sees what these rules hide. Hidden models come back marked. A model that Allowed Models rejects never comes back on GET /v1/models.
Without On request or Always, include_hidden is ignored: the caller gets the normal list and no error. Each listed hidden model carries "quilr_visibility": "hidden":
curl "https://guardrails.quilr.ai/openai_compatible/v1/models?include_hidden=true" \
-H "Authorization: Bearer $QUILR_KEY" \
-H "X-User-Email: admin@acme.com"
{
"object": "list",
"data": [
{ "id": "gpt-4.1", "object": "model", "created": 0, "owned_by": "openai" },
{ "id": "gpt-4.1-preview", "object": "model", "created": 0, "owned_by": "openai", "quilr_visibility": "hidden" }
]
}
In the console, Show models hidden by policy appears once a lookup hid something, and only for people whose role lets them view LLM Gateway policies. Hidden models then show as gpt-4.1-preview · hidden by policy in an app's providers, or with a Hidden by policy tag when you add a provider or models.
What people see
- API callers get fewer entries, in the usual format. With listing off,
datais an empty list. A hidden model still answersGET /v1/models/{id}, while a model the caller may not use returns 404 (model_not_foundin the OpenAI format). - Console lookups add a line such as "3 models hidden by policy." Hidden models are dropped before the console checks each model with the provider, so they are never called.
- Nothing left to list. With listing off, or when no show-only grant can match the provider, the console does not contact the provider. It shows "Model listing is turned off by your organization's policy. Add models by name." or "All models from this provider are hidden by your organization's policy. Add models by name." Type models into Add a model by name (or Add by ID): each is still checked against the provider, which also checks the key.
- If the policy cannot be read, lists show every model the caller may use, as they would without these rules. Visibility is presentation, so it fails open.
Scenarios
- Tidy lists for everyone. Hide
*preview*and undated aliases for everyone:
runs on requestpriority 500
- Approved providers only. Show only
azureopenaifor everyone. A team that also uses Anthropic gets its own show-only grant foranthropic_messageson its Smart group, which adds to the first. - No model list for one app. Set Model listing to Off for an Application whose users pick models from your own approved list. Requests that name a model keep working.
- Admins see everything. Set Hidden models to On request for a Platform admins Smart group. They call
GET /v1/models?include_hidden=trueand see every model they may use, with hidden ones marked:
runs on requestpriority 900
- Coding agents see one family. For an App tag shared by your coding-agent apps, with Model lists set to API (GET /v1/models), show only
azureopenai · gpt-4o*. Console lookups for those apps are unchanged. - Retire a provider's copies. Hide the provider label
legacy-openai. Models that another provider also offers stay listed, under that provider.