В Claude /v1/messages поле output_config.format ограничивает финальный текст ответа JSON Schema. Найдите текстовый блок type: "text" в массиве content и разберите его text JSON-парсером: первым блоком могут быть рассуждения.
json
{
"model": "claude-opus-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Извлеки имя и возраст: Анна, 29 лет"}],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"}
},
"required": ["name", "age"],
"additionalProperties": false
}
}
}
}json
{"name":"Анна","age":29}json
{
"model": "claude-opus-5",
"messages": [{"role": "user", "content": "Извлеки имя и возраст: Анна, 29 лет"}],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "person",
"strict": true,
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer"}
},
"required": ["name", "age"],
"additionalProperties": false
}
}
}
}- Kimi. Поле
response_formatпринимается на/v1/chat/completionsи уходит модели как есть. Guard свою схему не подставляет и ответ по ней не проверяет, поэтому разбирайте результат у себя и обрабатывайте случай, когда JSON не пришёл. - Composer и Grok. Поля
response_formatу них нет: запрос с ним получает400 cursor_parameter_unavailableдо списания. Формат придётся просить словами в тексте запроса и проверять ответ на своей стороне.