Перейти к основному содержимому

Обработка запросов 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 действует следующий порядок:

  1. один response.created;
  2. событие начала элемента или содержимого до его delta;
  3. части аргументов функции до соответствующего события done;
  4. сведения об использовании токенов только после их получения;
  5. одно завершающее событие: 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 исчезнет, а файлы профилей останутся неактивными. Состояние ответов при этом не переписывается.
  • Выбор обработчика не меняет публичный алиас и не подставляет другую модель.

Ссылки