Ask for a schema
On POST /models, send responseSchema. It needs a model whose
capabilities.structuredOutput in the catalog is jsonSchema; when no model
the call names can, the call is refused with 422 before any provider is called.
"responseSchema": {
"type": "object",
"properties": {
"city": { "type": "string" },
"celsius": { "type": "number" },
"conditions": { "type": "string" }
},
"required": ["city", "celsius", "conditions"]
},
"parameters": { "strict": true }strict holds the provider to the schema where it supports a strict mode. The answer still arrives as a content
message whose value is the JSON text.
{ "type": "content", "value": "{\"city\":\"Lagos\",\"celsius\":31,\"conditions\":\"humid, scattered thunderstorms\"}", "data": {} }The serialized schemas of a request, responseSchema and every tool's parameters together, may be at most 256 KiB.
Which models can
capabilities.structuredOutput says what an offering can be held to:
| Value | Meaning |
|---|---|
jsonSchema |
The answer can be held to a schema you give. responseSchema needs this. |
jsonObject |
The answer can be held to JSON, without a schema. |
none |
Neither. |
The catalog's Supports filter calls both jsonSchema and jsonObject Structured output.
On Chat Completions
POST /v1/chat/completions has no responseSchema: send OpenAI's
response_format, which goes to the provider as you wrote it. A call with a json_schema response format is tried
first on the offerings that take one, and the others stay behind them as backup. Anthropic is sent json_schema in
its own form; Gemini and Vertex take json_schema and json_object.
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "weather",
"strict": true,
"schema": {
"type": "object",
"properties": { "city": { "type": "string" }, "celsius": { "type": "number" } },
"required": ["city", "celsius"]
}
}
}