Models & Operations
List every model, model class, and operation with live reachability under your AI policy: provider, region, gating, and the exact constraint blocking each route.
Two read-only catalogs answer "what exists and what can we reach". GET /v1/ai/models returns every model and model class the platform knows, annotated per deployment with provider, region, and whether this workspace can reach it under the live policy; when it cannot, reason names the constraint that stopped it. GET /v1/ai/operations returns every operation type the platform runs, the class each resolves to for this workspace, whether the workspace overrode it, and whether it currently has a route.
The reason vocabulary is shared across both catalogs and the route explainer: allowed (reachable), model_denied (removed by denied_models), provider_floor (excluded by the platform deployment floor), provider_not_allowed (excluded by allowed_providers), and region_not_permitted (excluded by region_pin). Because each entry carries the specific constraint, an unreachable model is diagnosable in one read: the answer to "why can we not use this model" is in the row, not in a support ticket.
Classes carry a source: builtin (defined by the platform), platform (defined at deployment level), or org (overridden by this workspace). A class is reachable when its chain still contains at least one reachable step under the current constraints. Deployments with custom_endpoint: true are self-hosted or customer-operated inference endpoints; they participate in reachability like any other deployment, and no host or credential detail is returned for them, by design.
/v1/ai/modelsResponse fields
Response: Model catalog (excerpt)
{
"models": [
{
"model": "claude-sonnet",
"tier": "default",
"capabilities": ["generate", "tool_use"],
"reachable": true,
"reason": "allowed",
"deployments": [
{ "provider": "bedrock", "region": "eu", "custom_endpoint": false, "reachable": true, "reason": "allowed" }
]
}
],
"classes": [
{
"name": "standard",
"description": "General-purpose extraction lineage",
"source": "builtin",
"required_capabilities": [],
"fallback": "chain",
"chain": [
{ "model": "claude-sonnet", "reachable": true, "reason": "allowed" }
],
"reachable": true
}
],
"constraints": {
"region_pin": "eu",
"allowed_providers": ["bedrock"],
"denied_models": ["claude-opus"],
"platform_provider_floor": ["bedrock"]
},
"counts": { "total": 18, "reachable": 9 }
}/v1/ai/operationsResponse fields
Response: Operation catalog (excerpt)
{
"operations": [
{
"operation_type": "document_ocr",
"class": "ocr",
"source": "builtin",
"overridden": false,
"gating": "advisory",
"routable": false,
"reason": "no_compliant_route"
},
{
"operation_type": "extraction",
"class": "standard",
"source": "builtin",
"overridden": false,
"gating": "registered",
"routable": true
}
],
"counts": { "total": 60, "overridden": 1, "registered": 8, "advisory": 1 }
}gating field explains the satisfiability gate's behaviour operation by operation. A registered operation losing its route blocks activation; an advisory one only produces a warning in advisory_warnings; a none operation is not swept at all, so its routable is null rather than a claim about a check that never ran.Read these two catalogs together when designing a policy change. The operations list shows which operations are registered and would therefore block an activation; the models list shows which candidates each constraint removes. A planned constraint that turns every chain step of a registered operation's class unreachable is exactly the change the satisfiability gate will refuse.