Structured Outputs
Возвращайте машиночитаемый JSON из chat completions.
Для большинства structured outputs в GonkaGate chat completions начинайте с response_format: { "type": "json_object" }.
Переходите на json_schema только когда клиент зависит от более жёсткого контракта ответа и выбранная пара model/provider это поддерживает.
Быстрый старт
Установите response_format в json_object, явно попросите модель вернуть только JSON и затем распарсьте choices[0].message.content в приложении.
export GONKAGATE_API_KEY="gp-your-api-key"
curl https://api.gonkagate.com/v1/chat/completions \
-H "Authorization: Bearer $GONKAGATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen/qwen3-235b-a22b-instruct-2507-fp8",
"messages": [
{ "role": "system", "content": "Return JSON only. Output must be valid JSON." },
{ "role": "user", "content": "Extract: name (string) and age (integer). Text: Alice is 30." }
],
"response_format": { "type": "json_object" },
"temperature": 0
}'Что должно получиться после парсинга:
{"name":"Alice","age":30}В самом API-ответе choices[0].message.content всё ещё строка. Сначала распарсьте её на клиенте, потом валидируйте.
Когда выбирать json_object или json_schema
- Парсимый JSON, а поля вы уже валидируете в приложении: используйте
json_object. - Обязательные поля,
enum, вложенные объекты илиadditionalProperties: false: используйтеjson_schema. - Дополнительное усиление для non-stream structured responses: добавьте
response-healing, еслиresponse_formatуже выбран правильно. - Модель должна вызывать ваш backend или другую внешнюю систему: используйте Tool Calling вместо structured outputs.
Переходите на json_schema, только если контракт действительно важен
Используйте json_schema для обязательных полей, enum, вложенных объектов и additionalProperties: false.
Оставайтесь на json_object, если вам достаточно парсимого JSON и клиентской валидации после парсинга.
Замените поле response_format из запроса выше на:
{
"type": "json_schema",
"json_schema": {
"name": "person",
"strict": true,
"schema": {
"type": "object",
"properties": {
"name": { "type": "string", "description": "Person name" },
"age": { "type": "integer", "description": "Age in years" }
},
"required": ["name", "age"],
"additionalProperties": false
}
}
}Если строгий schema mode не поддерживается выбранной парой model/provider, откатывайтесь к json_object и валидируйте результат после парсинга.
Как валидировать ответ модели на клиенте
Считайте вывод модели недоверенными данными, даже если JSON уже успешно распарсился.
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: int
person = Person.model_validate_json(response.choices[0].message.content)
print(person)Частые проблемы со structured outputs
| Проблема | Что проверить |
|---|---|
| Непонятно, поддерживаются ли structured outputs | GonkaGate пробрасывает response_format в выбранную upstream model/provider. Поддержка зависит от конкретной пары, а GET /v1/models не показывает capability flags для structured outputs. |
| Ответ невалидный JSON | Ужесточите system-инструкцию и оставляйте слово JSON в промпте, если выбранный upstream этого требует. |
Падает JSON.parse или валидация по схеме | Упростите контракт, уменьшите неоднозначность в промпте или откатитесь с json_schema на json_object. |
| Во время стриминга JSON выглядит сломанным | Промежуточные чанки не обязаны быть валидным JSON. Сначала буферизуйте ответ целиком, потом парсите. |
| JSON обрезается | Увеличьте max_tokens или уменьшите ожидаемый размер ответа. |
См. также
- Response Healing, если нужен дополнительный hardening для non-stream structured responses после того, как
response_formatуже настроен правильно. - Tool Calling, когда модель должна запросить работу у вашего backend или другой внешней системы.
- Параметры chat completions, когда нужен точный контракт поля
response_format.