Обработка запросов OpenAI Responses
- Дата: 3 августа 2026 года
- Статус: принято для gpt2giga 0.3
- Ответственные направления: протокол Responses и интеграция
- Ревизия контракта:
gpt2giga.responses-execution.v2
Контекст
Пользовательские провайдеры моделей в Codex работают через OpenAI Responses API. В gpt2giga уже есть нативная реализация для GigaChat: она поддерживает встроенные инструменты, вложения, состояние диалога, API v1 и v2, обычные и потоковые ответы.
В первой версии шлюза 0.3 по умолчанию использовался более узкий
нормализованный путь, а нативная реализация называлась legacy. Из-за этого
шлюз мог отклонить возможность, которую GigaChat на самом деле поддерживает,
ещё до выбора маршрута и модели.
Решение
Сначала маршрут, затем обработчик
Каждый запрос к /responses проходит одну и ту же последовательность:
прочитать известные публичные поля и сохранить их смысл
-> выбрать неизменяемый маршрут провайдера
-> выбрать модель
-> проверить возможности маршрута, модели и режима API
-> принять или отклонить запрос
-> выбрать один обработчик
Для GigaChat используется native_gigachat, для маршрутов к другим
провайдерам — normalized_bridge. Выбор сохраняется в контексте запроса. После
начала обращения к провайдеру нельзя менять обработчик, аккаунт, провайдера или
модель. После отправки клиенту первых байтов переключение также запрещено.
Какой путь считается основным
Нативная реализация GigaChat Responses остаётся основным совместимым путём и используется по умолчанию, если отдельная конфигурация провайдера не задана. Явный маршрут к GigaChat из файла профилей тоже выбирает нативный обработчик, пока равноценность нормализованного пути не подтверждена тестами. Дополнительный флаг для обычной установки GigaChat не нужен.
Статус нативного пути — stable. Нормализованный Responses для других
провайдеров остаётся technical_preview, пока не будут полностью покрыты
встроенные инструменты, вложения и принятый набор тестов совместимости.
Проверка запроса
Декодер сохраняет все распознанные поля верхнего уровня и вложенные элементы до проверки маршрута и модели. После этого каждая возможность:
- исполняется через нормализованный контракт;
- принимается, но игнорируется по явно зафиксированному правилу с причиной и ссылкой на тестовый сценарий;
- отклоняется до чтения учётных данных и обращения к сети с точным указанием поля и причины.
Неизвестные поля отклоняются. Поля base_url, селекторы провайдера, учётные
данные, настройки TLS, произвольные заголовки и внутренний идентификатор модели
не могут попасть в расширения провайдера: для них возвращается
unsupported_semantic.
Встроенные инструменты, вложения, рассуждения (reasoning), состояние предыдущего ответа или
диалога, изображения и файлы не считаются неподдерживаемыми заранее. Решение
зависит от выбранного маршрута, модели и режима API. Если подтверждений не
хватает, возможность остаётся в состоянии unknown и обрабатывается по явной
политике маршрута.
Обычные и потоковые ответы
Обычный ответ содержит один объект Responses с фактическим status, выходными
элементами, известными данными об использовании токенов и публичным алиасом из
запроса. Неизвестные категории токенов не вычисляются задним числом.
Для SSE действует следующий порядок:
- один
response.created; - событие начала элемента или содержимого до его
delta; - части аргументов функции до соответствующего события
done; - сведения об использовании токенов только после их получения;
- одно завершающее событие:
response.completed,response.failedилиresponse.incomplete.
Событие error завершает поток. Повторное завершающее событие, данные после
него, некорректный ответ провайдера и оборванный поток превращаются в стабильную
ошибку протокола. При отключении клиента шлюз отменяет текущую операцию и
освобождает ресурсы, не повторяя запрос по другому маршруту.
Коды ошибок
Ошибки сохраняют формат OpenAI Responses.
| Код | Значение |
|---|---|
invalid_request | Запрос не соответствует принятому синтаксису. |
unknown_model_alias | Публичный алиас модели не найден. |
unsupported_semantic | Выбранный маршрут не может сохранить требуемый смысл. |
credential_unavailable | Не удалось получить учётные данные профиля. |
destination_mismatch | Фактический сетевой адрес не совпал с профилем. |
provider_timeout | Провайдер не ответил за отведённое время. |
provider_protocol_error | Провайдер вернул некорректный ответ или поток. |
provider_failure | Провайдер вернул другую сопоставленную ошибку. |
client_disconnected | Клиент отключился до завершения запроса. |
Поле param указывает на публичное поле запроса, если оно известно. Текст
ошибки не должен содержать пользовательские данные, секреты или необработанное
тело ответа провайдера.
Миграция и откат
- Существующие маршруты и варианты с префиксом
/v1сохраняются. - Установки, работающие только с GigaChat, не требуют нового флага или файла конфигурации.
- Явные профили провайдеров сохраняют точные алиасы и маршруты.
- При откате на 0.2.x нормализованный путь Responses исчезнет, а файлы профилей останутся неактивными. Состояние ответов при этом не переписывается.
- Выбор обработчика не меняет публичный алиас и не подставляет другую модель.