Интеграцию, которую в поиске называют OpenAI Completions API, переносят на Responses API по одному рабочему сценарию: меняют адрес вызова, форму входа и чтение ответа, а прежний путь держат включённым рядом до тех пор, пока результаты сходятся. В руководстве OpenAI по миграции Chat Completions описан как поддерживаемый интерфейс, поэтому срочности нет, и перенос оправдан там, где сервису нужны встроенные инструменты или память диалога на стороне платформы. Если текущий вызов стабилен, покрыт тестами, а встроенные инструменты и память платформы ему без надобности, оставьте его как есть.

Что переносим

TL;DR

Chat Completions остаётся поддерживаемым, а Responses рекомендован для новых проектов, поэтому переносят по одному сценарию, с переключателем и сравнением выходов на фиксированном наборе примеров.

Возьмём внутренний сервис, который разбирает входящие письма по темам: на входе текст письма, на выходе JSON с темой и признаком срочности. Сейчас он шлёт запрос на /v1/chat/completions, передаёт массив messages с ролями system и user, читает choices[0].message.content и разбирает JSON собственным кодом. Именно такой вызов обычно и называют «completions api»: отдельная функция, одна задача, понятный контракт.

Причины для переноса OpenAI перечисляет в руководстве по миграции: несколько вызовов инструментов внутри одного запроса, состояние на стороне платформы, поддержка будущих моделей. Общий разбор нового интерфейса вынесен в статью про Responses API под один бизнес-сценарий, а здесь речь только о переезде уже работающей интеграции. Ключ и доступ к проекту описаны в материале про выдачу ключа и управление доступом.

Перед любыми правками составьте опись вызова: какие роли сообщений используются, есть ли описания функций, задан ли формат ответа, включён ли потоковый режим, где хранится история диалога, как обрабатываются ошибки. Опись превращается в список проверок, и каждый её пункт получает свой тест на следующих шагах.

Что меняется в вызове

Руководство OpenAI описывает различия по нескольким точкам. Таблица ниже сводит их к тому, что нужно найти в вашем коде и чем проверить.

ЭлементChat CompletionsResponsesЧто проверить у себя
Адрес/v1/chat/completions/v1/responsesЕдиная точка в клиенте, без десятка разбросанных строк
ВходМассив messages с ролямиПоле input: строка или набор элементовКак собирается контекст: инструкция, письмо, примеры
Чтение ответаchoices[0].message.contentСвойство output_text; полный выход состоит из типизированных элементовВесь код, который разбирает ответ, включая обработку пустого результата
Формат ответаПараметр response_formatПараметр text.formatСхема JSON и разбор на вашей стороне
ФункцииОписание обёрнуто полем typeОписание без обёрткиВсе схемы инструментов, имена и обязательные поля
Строгость схемПо умолчанию нестрогиеБез указания strict платформа пробует строгий режим, а при несовместимой схеме работает нестрогоСхемы, поведение которых меняется без правки кода; задайте strict явно

Последняя строка таблицы скрывает сюрприз: поведение схемы меняется без единой правки в вашем коде. Строгий режим предъявляет к схеме дополнительные требования, и схема, прежде принимавшая лишние поля, может перестать им соответствовать. Задайте strict явно на обоих путях, запустите каждую схему отдельным тестовым вызовом и сохраните тексты ошибок. Эту работу выполняет разработчик с доступом к коду, и языковая модель здесь разве что собеседник: приняты ли все схемы, проверяет скрипт.

Если сервис выводит ответ по частям, обработчики потока тоже переписываются: события становятся типизированными, и каждый тип нужно обработать явно. Приёмы работы с потоком, отмену запроса и ошибку посреди ответа разбирает статья про потоковый режим OpenAI API; в переносе достаточно убедиться, что собранный из фрагментов текст совпадает с результатом обычного вызова.

Отдельно найдите места, где код опирается на форму ответа Chat Completions: поле choices, причину остановки, подсчёт токенов. Каждое такое место заверните в маленькую функцию-адаптер, чтобы остальной код получал одну и ту же внутреннюю структуру при любом интерфейсе. Адаптер потом и делает откат дешёвым.

Инструменты и состояние

Сервис разбора писем обходится без истории диалога, и переносить ему нечего: каждый вызов самодостаточен. Состояние понадобится, если рядом живёт другой сценарий, например уточняющий чат по сложному письму. Руководство называет три способа: связать ответы через previous_response_id, вручную вернуть в следующий запрос элементы предыдущего выхода либо воспользоваться Conversations API с постоянным объектом диалога.

Выбор определяется тем, кто хранит данные. Передача элементов вручную оставляет историю у вас: вы решаете, что сохранить, как долго и кому показать. Цепочка через идентификатор и объект диалога перекладывает хранение на платформу, и до включения на данных клиентов прочтите в документации, где и как долго они лежат. Для писем с персональными данными безопаснее начать с варианта, при котором история остаётся в вашей базе.

С инструментами схема похожая: функции вашей системы вызываются так же, но их результаты возвращаются в виде элементов нового формата. Платформенные инструменты вроде веб-поиска или поиска по файлам в первом переносе подключать незачем. Сначала добейтесь совпадения старого результата, затем добавляйте возможности по одной, каждую со своим тестовым набором. Первым переносят самый простой вызов, без инструментов и состояния.

● Discovery · 1 час · бесплатно

Какой из ваших вызовов OpenAI перенести первым?

Прийти на Discovery →

Тест совместимости

Если сервис разбора писем уже живёт на проде, его результаты есть, и это лучший тестовый материал. Соберите фиксированный набор обезличенных писем: типовые случаи, пограничные, пустое письмо, очень длинное, письмо на другом языке. Набор версионируйте рядом с кодом.

  1. Заведите переключатель в конфигурации: старый путь остаётся по умолчанию, новый включается для тестового запуска.
  2. Прогоните весь набор через оба пути и сохраните пары ответов вместе с техническим статусом каждого вызова.
  3. Сравнивайте смысл, а текст слово в слово оставьте в покое: совпала ли тема, признак срочности, структура JSON. Расхождения разберите вручную.
  4. Отдельно проверьте ошибочные случаи: неверная схема, слишком длинный вход, отозванный ключ. Платформа должна возвращать ошибку, а адаптер превращать её во внутренний статус.
  5. Зафиксируйте результат в журнале прогона: версия набора, версия инструкции, список расхождений и решение владельца сценария.

Совместимость допускает разные тексты: две корректные формулировки темы письма расходятся, а вот разный признак срочности для одного и того же письма считается дефектом. Заранее договоритесь, какие расхождения допустимы. Сравнение объёма расходов по токенам тоже включите в отчёт, но решение принимайте по качеству, а потом по цене, и цифры берите со страницы цен вендора, без опоры на память. Для общей практики замеров пригодится заметка про оценку моделей.

Откат и допуск

Откат готовят до первого запуска. Он состоит из переключателя, рабочего старого пути и условия, при котором переключатель возвращают: рост доли ответов с ошибкой разбора, расхождение признака срочности на контрольных письмах, жалобы сотрудников на качество. Условие записывают числом и владельцем решения до пилота. Без этого откат превращается в спор в момент сбоя, когда времени на разговоры уже нет, а у каждого участника своё представление о допустимом.

Запускайте новый путь на малой доле обращений, например на одном почтовом ящике, и держите старый путь работающим всё время наблюдения. Когда результаты стабильны, расширяйте долю. Старый код удаляют лишь после того, как на новом пути прошла полная смена обращений разных типов, а решение об удалении принимает владелец сервиса.

Пока работают оба пути, храните версию интерфейса в журнале каждого вызова: по ней видно, где возникла ошибка. Секреты и тексты писем в журнал исключены, достаточно технического идентификатора. Если перенос затрагивает сразу несколько сервисов, общий порядок работ описан на странице про внедрение ИИ в рабочие сервисы.

// с чего начать

Выберите один вызов с одним форматом ответа, составьте опись по шести пунктам и соберите тестовый набор писем до первой строки нового кода. Первой метрикой возьмите долю совпавших признаков на контрольном наборе, а типичную ошибку ищите в схемах функций: режим strict подводит первым.

Частые вопросы

Устарел ли Chat Completions в OpenAI API?
По руководству OpenAI по миграции, Chat Completions остаётся поддерживаемым для существующих интеграций, а Responses рекомендован для всех новых проектов. Срочного отказа от старого вызова в руководстве нет; о сроках и новых объявлениях читайте на официальных страницах платформы.
Чем Responses API отличается от Chat Completions?
Вместо массива messages используется поле input, ответ состоит из типизированных элементов, структурированный выход задаётся параметром text.format, а определения функций записываются без внешней обёртки. Состояние можно вести через previous_response_id или объект диалога.
Как перенести запрос на Responses API без простоя?
Держите оба пути за переключателем, прогоните фиксированный набор примеров через оба и сравните смысл ответов. Включайте новый путь на малой доле обращений, а старый оставляйте рабочим, пока результаты стабильны.
Нужно ли переписывать схемы функций?
Скорее всего, да: формат описания изменился, а при отсутствии параметра strict платформа пробует строгий режим. Задайте strict явно, прогоните каждую схему тестовым вызовом и сохраните тексты ошибок, чтобы увидеть, какие свойства требуют явного описания.
Где хранится история диалога в Responses API?
Это зависит от выбранного способа: при ручной передаче элементов история остаётся у вас, а при связке ответов или объекте диалога часть данных хранит платформа. До включения на клиентских данных прочтите в документации условия хранения.