Kinference · Schema
InferencePolicy (kinference.buoyant.io/v1alpha1)
The policy determining which destination in an InferencePool is selected for a given request. The first rule to match wins.
CompanyInferenceKubernetesvLLMLLM GatewayRate LimitingLoad BalancingOpen SourcePlatform Engineering
Properties
| Name | Type | Description |
|---|---|---|
| apiVersion | string | |
| kind | string | |
| metadata | object | |
| spec | object | |
| status | object |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://artifacts.apis.io/kinference-ai/json-schema/kinference-ai-inferencepolicy-schema.json",
"title": "InferencePolicy (kinference.buoyant.io/v1alpha1)",
"x-source": "https://github.com/Kinference-AI/kinference/blob/main/charts/kinference-crds/templates/kinference.buoyant.io_inferencepolicies.yaml",
"x-derived-from": "Kubernetes CRD spec.versions[].schema.openAPIV3Schema, copied unmodified",
"x-generated": "2026-11-05",
"description": "The policy determining which destination in an InferencePool is\nselected for a given request. The first rule to match wins.",
"type": "object",
"properties": {
"apiVersion": {
"type": "string"
},
"kind": {
"type": "string"
},
"metadata": {
"type": "object"
},
"spec": {
"type": "object",
"properties": {
"unmatched": {
"type": "string",
"enum": [
"ServeLocal",
"Reject"
],
"default": "ServeLocal"
},
"rules": {
"type": "array",
"maxItems": 32,
"x-kubernetes-list-type": "atomic",
"items": {
"type": "object",
"required": [
"name",
"route"
],
"properties": {
"name": {
"type": "string",
"maxLength": 253
},
"matches": {
"description": "Defines which requests this rule will apply to. Fields\nwithin one entry are ANDed; entries are ORed. Note that\na rule with no matches will match everything and must be\nplaced last.",
"type": "array",
"maxItems": 16,
"x-kubernetes-list-type": "atomic",
"items": {
"description": "Request predicates. Scalar is exact match; array is\nmembership; hash is an explicit operator.",
"type": "object",
"properties": {
"model": {
"x-kubernetes-preserve-unknown-fields": true
},
"inputTokens": {
"x-kubernetes-preserve-unknown-fields": true
},
"maxTokens": {
"x-kubernetes-preserve-unknown-fields": true
},
"tenant": {
"x-kubernetes-preserve-unknown-fields": true
},
"qos": {
"description": "One of interactive | batch | deferrable. Always an\narray. Default is interactive.",
"type": "array",
"minItems": 1,
"maxItems": 3,
"x-kubernetes-list-type": "set",
"items": {
"type": "string",
"enum": [
"interactive",
"batch",
"deferrable"
]
}
},
"tag": {
"description": "A set of opaque string tags attached to the request.\n\nSet semantics. A scalar RHS means contains (`tag:\ngpu`); an array means intersects (`tag: [gpu,\nrestricted]`); `{containsAll: [...]}` means all of\nthem; `{not: gpu}` means the tag is absent.\n\nNothing sets tags on requests yet: the router sends\nan empty set, so a scalar, array or `containsAll`\nnever matches and `{not: ...}` always matches.",
"x-kubernetes-preserve-unknown-fields": true
}
}
}
},
"route": {
"type": "object",
"required": [
"select"
],
"properties": {
"consider": {
"description": "The full set of endpoints to consider. Leave blank\nto simply use all known endpoints that provide the\nmodel named in the request (including via aliases).\n\nThis field can be used to add models not named in\nthe request, including as a weighted choice.\n\nAn empty list is rejected rather than treated as the\ndefault.",
"type": "array",
"minItems": 1,
"maxItems": 16,
"x-kubernetes-list-type": "atomic",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 253
},
"type": {
"description": "Shorthand for backends.type.",
"type": "string",
"enum": [
"Local",
"Provider"
]
},
"weight": {
"description": "Relative weights (not percentages).",
"type": "integer",
"minimum": 1,
"maximum": 1000000
},
"models": {
"type": "object",
"properties": {
"fromRequest": {
"type": "boolean"
},
"names": {
"type": "array",
"maxItems": 32,
"items": {
"type": "string",
"maxLength": 512
}
}
},
"x-kubernetes-validations": [
{
"rule": "has(self.fromRequest) != has(self.names)",
"message": "exactly one of fromRequest or names"
}
]
},
"backends": {
"description": "Selector over the pool's destinations.",
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"Local",
"Provider"
]
},
"names": {
"type": "array",
"maxItems": 32,
"items": {
"type": "string",
"maxLength": 253
}
},
"selector": {
"type": "object",
"properties": {
"matchLabels": {
"type": "object",
"maxProperties": 64,
"additionalProperties": {
"type": "string"
}
}
}
}
}
}
},
"x-kubernetes-validations": [
{
"rule": "!has(self.type) || !has(self.backends)",
"message": "type is shorthand for backends.type; do not set both"
}
]
}
},
"exclude": {
"description": "Endpoints to exclude from consideration.\nOrder-independent. Two exclusions express OR, one\nexclusion with two fields expresses AND.",
"type": "array",
"maxItems": 16,
"x-kubernetes-list-type": "atomic",
"items": {
"type": "object",
"required": [
"name",
"drop"
],
"properties": {
"name": {
"type": "string",
"maxLength": 253
},
"if": {
"description": "Request parameters to which this exclusion\napplies. A single clause, ANDed.",
"type": "object",
"properties": {
"model": {
"x-kubernetes-preserve-unknown-fields": true
},
"inputTokens": {
"x-kubernetes-preserve-unknown-fields": true
},
"maxTokens": {
"x-kubernetes-preserve-unknown-fields": true
},
"tenant": {
"x-kubernetes-preserve-unknown-fields": true
},
"qos": {
"description": "One of interactive | batch | deferrable. Always an\narray. Default is interactive.",
"type": "array",
"minItems": 1,
"maxItems": 3,
"x-kubernetes-list-type": "set",
"items": {
"type": "string",
"enum": [
"interactive",
"batch",
"deferrable"
]
}
},
"tag": {
"description": "A set of opaque string tags attached to the request.\n\nSet semantics. A scalar RHS means contains (`tag:\ngpu`); an array means intersects (`tag: [gpu,\nrestricted]`); `{containsAll: [...]}` means all of\nthem; `{not: gpu}` means the tag is absent.\n\nNothing sets tags on requests yet: the router sends\nan empty set, so a scalar, array or `containsAll`\nnever matches and `{not: ...}` always matches.",
"x-kubernetes-preserve-unknown-fields": true
}
}
},
"drop": {
"type": "object",
"properties": {
"contextWindow": {
"x-kubernetes-preserve-unknown-fields": true
},
"predictedTTFT": {
"x-kubernetes-preserve-unknown-fields": true
},
"prefixCacheHitRatio": {
"x-kubernetes-preserve-unknown-fields": true
},
"queuedPrompts": {
"x-kubernetes-preserve-unknown-fields": true
},
"kvCacheUsage": {
"x-kubernetes-preserve-unknown-fields": true
},
"model": {
"type": "object",
"properties": {
"name": {
"x-kubernetes-preserve-unknown-fields": true
}
}
},
"backend": {
"type": "object",
"properties": {
"type": {
"x-kubernetes-preserve-unknown-fields": true
},
"name": {
"x-kubernetes-preserve-unknown-fields": true
},
"readyEndpoints": {
"x-kubernetes-preserve-unknown-fields": true
},
"observedTTFTP95": {
"x-kubernetes-preserve-unknown-fields": true
},
"budgetExhausted": {
"x-kubernetes-preserve-unknown-fields": true
}
}
}
}
}
}
}
},
"select": {
"description": "Which endpoint to choose, after consideration and\nexclusion. This is in ordered tiers; the first with\na surviving candidate wins outright. If an\nobjective is specified, it must defined for every\ncandidate in its tier. For example, PredictedTTFT is\nLocal-only, so a tier spanning both Local and\nProvider types cannot use it.",
"type": "array",
"minItems": 1,
"maxItems": 8,
"x-kubernetes-list-type": "atomic",
"items": {
"type": "object",
"properties": {
"type": {
"description": "Shorthand for backends.type.",
"type": "string",
"enum": [
"Local",
"Provider"
]
},
"backends": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"Local",
"Provider"
]
},
"names": {
"type": "array",
"maxItems": 32,
"items": {
"type": "string",
"maxLength": 253
}
},
"selector": {
"type": "object",
"properties": {
"matchLabels": {
"type": "object",
"maxProperties": 64,
"additionalProperties": {
"type": "string"
}
}
}
}
}
},
"minimize": {
"type": "string",
"enum": [
"PredictedTTFT",
"EstimatedTTFT"
]
},
"order": {
"type": "array",
"maxItems": 16,
"items": {
"type": "string",
"maxLength": 253
}
}
},
"x-kubernetes-validations": [
{
"rule": "has(self.minimize) != has(self.order)",
"message": "a tier ranks by exactly one of minimize or order"
},
{
"rule": "!has(self.type) || !has(self.backends)",
"message": "type is shorthand for backends.type; do not set both"
}
]
}
},
"tieBreak": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"enum": [
"PreferLocal",
"Random"
]
}
},
"onEmpty": {
"type": "string",
"enum": [
"Reject",
"FallThrough"
],
"default": "Reject"
}
}
}
},
"x-kubernetes-validations": [
{
"rule": "!has(self.route.select) || self.route.select.all(t, !has(t.minimize) || t.minimize != 'PredictedTTFT' || has(t.type) && t.type == 'Local' || has(t.backends) && has(t.backends.type) && t.backends.type == 'Local' || has(self.route.consider) && self.route.consider.all(c, has(c.type) && c.type == 'Local' || has(c.backends) && has(c.backends.type) && c.backends.type == 'Local'))",
"message": "PredictedTTFT is Local-only: constrain the tier or the candidate set to Local, or use EstimatedTTFT"
}
]
}
}
}
},
"status": {
"type": "object",
"properties": {
"state": {
"type": "string",
"maxLength": 128
},
"referencedBy": {
"type": "array",
"maxItems": 64,
"x-kubernetes-list-type": "atomic",
"items": {
"type": "string",
"maxLength": 253
}
},
"warnings": {
"type": "array",
"maxItems": 32,
"items": {
"type": "string",
"maxLength": 2048
}
},
"conditions": {
"type": "array",
"maxItems": 8,
"x-kubernetes-list-type": "map",
"x-kubernetes-list-map-keys": [
"type"
],
"items": {
"type": "object",
"required": [
"type",
"status",
"lastTransitionTime",
"reason",
"message"
],
"properties": {
"type": {
"type": "string",
"maxLength": 316
},
"status": {
"type": "string",
"enum": [
"True",
"False",
"Unknown"
]
},
"observedGeneration": {
"type": "integer",
"format": "int64",
"minimum": 0
},
"lastTransitionTime": {
"type": "string",
"format": "date-time"
},
"reason": {
"type": "string",
"maxLength": 1024
},
"message": {
"type": "string",
"maxLength": 32768
}
}
}
}
}
}
}
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/kinference-ai-inferencepolicy"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.