OpenAI создала два API-эндпоинта для похожих задач — но с принципиально разным синтаксисом. Разработчик ddp26 на Reddit назвал это классическим примером закона Конвея: компании проектируют системы, которые копируют их внутреннюю структуру коммуникаций.
Речь идёт о старом эндпоинте chat/completions и новом responses. Оба генерируют текст, вызывают функции и создают структурированный вывод — но требуют разного формата запросов.
Одинаковая задача — разный синтаксис
Для структурированного вывода в chat/completions нужно писать:
{
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "Response",
"schema": {"type": "object", "properties": ...}
}
}
}А для responses — совсем по-другому:
{
"text": {
"format": {
"type": "json_schema",
"name": "Response",
"schema": {"type": "object", "properties": ...}
}
}
}«Не вижу причин, почему они должны отличаться, — пишет автор поста. — Складывается впечатление, что миграцию между эндпоинтами специально усложняют».
Документация не помогает
Официальная документация содержит только пару примеров — причём минимум один из них неправильный. Разработчику пришлось копаться в исходном коде Python-пакета OpenAI, чтобы понять реальный синтаксис.
Похожие проблемы есть у Google. Gemini API отклоняет валидную JSON Schema {"type": "array", "items": {}} (массив из любых элементов). Официальный Python-пакет Google молча переписывает схему перед отправкой — видимо, команда SDK устала ждать, пока backend-разработчики исправят баг.
Что это значит для разработчиков
Быстро растущие AI-компании жертвуют консистентностью ради скорости выпуска фичей. В итоге разработчикам приходится изучать множество мелких quirk'ов вместо работы над продуктом.
Особенно болезненно это для команд, которые интегрируют несколько LLM-провайдеров — каждый API требует своего подхода к одинаковым задачам.
OpenAI пока не комментировала критику архитектуры своих API.