Как перенести JSON Tool Calling после обновления API на OpenAI DevDay 2026
Сначала смените форму записи результата, потом идентификатор модели. Если цель — gpt-6-astra или gpt-6.1-sol, вызов инструментов уходит из Chat Completions в Responses API. Шаг, который только классифицирует или выбирает маршрут, можно перенести в Decisions API, публичная бета с 6 октября. Поиск заказа остаётся lookup_order. Модель только заполняет JSON. Выполняет хост.
Перед чтением
| Объект | Официальный факт | Что меняется при переносе |
|---|---|---|
| Вход | Вызовы инструментов Astra и GPT-6.1 Sol идут через Responses. Sol и Luna вызывают функции в Chat Completions только при reasoning_effort none | Перейти на POST /v1/responses или сознательно оставить none |
| Объект инструмента | В Responses name стоит рядом с type. Если опустить strict, API пробует строгий режим, при несовместимости откатывается и ставит strict: false | Пишите strict явно. Хост всё равно проверяет |
| Запись результата | function_call и function_call_output связаны call_id. async: true не отдаёт выполнение модели | role:tool заменяется на function_call_output |
| Маршрут | Decisions в публичной бете с 2026-10-06. Только gpt-6-luna. choice не выполняет инструмент | Переносите только шаг, который выбирает перечисление |
Факты из официальных документов на 2026-10-08: Using GPT-6, Migrate to the Responses API, Decisions, Async tool calling. Заказ A-1042 вымышленный. Вероятности в примере Decisions — иллюстрация.
Сначала смените форму записи, потом имя модели
После DevDay перенос — это смена полей. Это не ещё один текст о том, что такое агент. Официальные замечания сводятся к четырём строкам. Первое: если целевая модель gpt-6-astra или gpt-6.1-sol, вызов инструментов переходит на Responses. Эти две модели всё ещё могут слать запросы Chat Completions без инструментов. gpt-6-sol и gpt-6-luna вызывают функции в Chat Completions только когда reasoning_effort равен none. Рассуждение вместе с инструментами идёт через Responses. Второе: имя выходит из вложенного объекта function и встаёт рядом с type. Третье: идентификатор записи переходит с tool_calls[].id на call_id. Четвёртое: шаг, который только классифицирует или выбирает маршрут, можно перенести в Decisions. Decisions инструмент не выполняет.
- Astra / GPT-6.1 Sol: вызов инструментов уходит с
/v1/chat/completions. В Responses поле усилия —reasoning.effort. - Определение сделать плоским и записать strict. Chat Completions по умолчанию нестрогий. Responses пробует строгий режим, если
strictопущен. - Маршрут и поиск заказа разделить.
choiceвозвращает перечисление. Поиск остаётсяlookup_order.
Что вышло 29 сентября: что вышло на DevDay 2026. Чем отличаются входы Responses и Agents API: чем отличаются Agents API и Responses. Этот текст их не переписывает. Он только переносит поля уже существующего цикла JSON Tool Calling.
Сначала назовите вызов, который код читает сейчас
В ответе Chat Completions один вызов выглядит так. id снаружи, name внутри function. arguments — строка. Заказ вымышленный, настоящих секретов нет:
{
"id": "call_3c91",
"type": "function",
"function": {
"name": "lookup_order",
"arguments": "{\"order_id\":\"A-1042\"}"
}
}
Определение инструмента Responses ставит name рядом с type. strict не опускайте. Если опустить, Responses пробует строгий режим. Несовместимая схема откатывается, и у возвращённого инструмента будет strict: false. Чтобы сохранить нестрогий режим, явно поставьте false. Хост всё равно проверяет arguments до выполнения:
{
"type": "function",
"name": "lookup_order",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"order_id": { "type": "string", "pattern": "^[A-Z]-\\d{4}$" }
},
"required": ["order_id"],
"additionalProperties": false
}
}
Запись результата узнаёт только call_id
Модель отдаёт элемент function_call, а не массив tool_calls. Парсер читает эти четыре поля:
{
"type": "function_call",
"call_id": "call_3c91",
"name": "lookup_order",
"arguments": "{\"order_id\":\"A-1042\"}"
}
Хост разбирает arguments, пропускает Schema, выполняет lookup_order и пишет назад с тем же call_id. Ошибка тоже объект внутри строки. Если историю отправляете вручную, верните элементы reasoning прошлого хода и function_call вместе с результатом. Один результат не отправляйте. Короткий путь — previous_response_id:
{
"type": "function_call_output",
"call_id": "call_3c91",
"output": "{\"order_id\":\"A-1042\",\"status\":\"paid\"}"
}
Медленный инструмент может поставить async: true в определении. Документация: модель может продолжать рассуждение или отвечать на части, которые не зависят от этого результата. У элемента вызова будет async: true. Позже вы отправляете function_call_output с исходным call_id. Выполняет хост. Встроенные инструменты и programmatic tool calling async не используют. В режиме multi-agent не совмещайте async с параллельными вызовами. В документации названы GPT-6 Astra и более поздние модели.
Пять циклов. Не склеивайте их в одно обновление
Переносите по той форме записи, которая уже есть. Разные имена объектов — разные парсеры:
| Текущий цикл | Куда он идёт |
|---|---|
| Chat Completions + tools, цель Astra или GPT-6.1 Sol | Переход на POST /v1/responses. tool_calls[].id становится call_id. name вынимается из function. |
| Chat Completions + tools, остаётесь на gpt-6-sol или gpt-6-luna | Остаться можно только пока reasoning_effort равен none. Рассуждение плюс инструменты — это Responses. |
| Уже function_call в Responses | Цикл остаётся. Меняется идентификатор модели. Astra и GPT-6.1 Sol не принимают none; ставьте low. Если усилие не none, уберите temperature, top_p и top_logprobs. |
| Инструмент, который возвращает только lookup / hold / escalate | Этот шаг уходит в POST /v1/decisions на gpt-6-luna. Поиск заказа остаётся function_call. |
| Сессия Agents API | Оставайтесь на Agents, если нужен управляемый harness. Запись остаётся turn_id, а не function_call_output. |
Шаг маршрута использует choice Decisions. Запрос повторяет форму публичной беты от 6 октября. Заказ вымышленный. Не отправляйте POST на /v1/decisions самодельный контракт ответов из текста от 30 сентября:
{
"model": "gpt-6-luna",
"input": "Order A-1042 is paid. What should the host do next?",
"questions": [{
"type": "choice",
"name": "next_step",
"instructions": "Pick the next host action. Do not invent a tool name.",
"choices": [
{ "value": "lookup", "description": "Read the order. No refund." },
{ "value": "hold", "description": "Stop and wait." },
{ "value": "escalate", "description": "Hand the case to a person." }
]
}]
}
Поля примера совпадают с официальным примером choice. Вероятности вымышленные. Хост вызывает lookup_order только когда choice равен lookup. hold останавливает. escalate передаёт человеку. refusal инструмент не вызывает. Порог задаёте вы. Изображения должны быть встроенными data URL в base64. HTTPS-адреса картинок и file_id этот вход не принимает:
{
"answers": [{
"type": "choice",
"name": "next_step",
"choice": "lookup",
"probabilities": [
{ "value": "lookup", "probability": 0.91 },
{ "value": "hold", "probability": 0.05 },
{ "value": "escalate", "probability": 0.04 }
],
"confidence": 0.88
}]
}
Ultrafast — это service_tier со значением ultrafast у gpt-6-astra. Поддерживаются только резидентность данных в США и глобальная обработка, не ЕС и не другие региональные точки. JSON инструментов не меняется. Ultrafast для GPT-6.1 Sol в обзоре 29 сентября всё ещё был «скоро». Этот текст не пишет, что он уже вышел. 29 сентября Agents API добавила Computer Use в браузере, который ведёт OpenAI. Одобрение сайтов и вход остаются в вашем приложении. Это не причина заменять function_call_output в Responses. Наблюдение за рассогласованием может предупредить или остановить разговор. Если ход остановился, тот же вызов инструмента вслепую не повторяйте.
Шесть шагов, затем переключайте трафик
Не начинайте с включения Ultrafast. Сначала запишите форму ответа:
- Назовите текущую запись. Это
role: toolплюсtool_call_id, илиfunction_call_output, илиturn_idAgents. Один парсер на все три не делится. - Выберите вход. Вызовы инструментов Astra и GPT-6.1 Sol идут на
POST /v1/responses. Sol и Luna остаются на Chat Completions только приreasoning_effortравномnone. - Сделайте определение плоским и запишите strict. Если схема использует форму, которую строгий режим отвергает, поставьте
strict: falseи оставьте проверку хоста. Поиск принимает толькоorder_id. - Совместите call_id и уберите параметры выборки.
argumentsостаётся строкой. У Astra и GPT-6.1 Sol заменитеnoneнаlow. Если усилие не none, уберитеtemperature,top_pиtop_logprobs. В Chat Completions уберите ещёlogprobs. В Responses уберитеmessage.output_text.logprobsизinclude. При переходе с GPT-5.5 или раньше заменитеprompt_cache_retentionнаprompt_cache_options.ttlсо значением30m. Чтобы сменить усилие посреди разговора, отправьте элементconfiguration_updateи не трогайтеreasoning.effortна уровне запроса. - В Decisions переносите только шаг с перечислением. Модель —
gpt-6-luna. Хост сопоставляетlookupсlookup_order.async: trueтолько у медленного инструмента, запись — на исходныйcall_id. - Сделайте diff двух JSON и только потом переключайте трафик. Проверьте
argumentsиanswers[].choiceпо Schema. Если не сходится, идентификатор модели не меняйте.
Как Schema становится воротами: Agents API + JSON Schema. Почему эти ворота нельзя оставить только в подсказке: зачем ИИ нужен JSON Schema. Форма записи Agents: JSON инструментов Agents API.
Перед переключением разложите три объекта JSON
Сбой чаще всего значит, что id не совпал, name остался внутри function, или choice приняли за уже найденный заказ.
- форматировать старый tool call рядом с новым function_call, затем проверка Schema: проходят ли
argumentsиanswers[0].choiceворота. - Через извлечение JSONPath достаньте
$.call_id,$.nameи$.answers[0].choice. - JSON Diff нагрузку до и после переноса. Сначала почините
call_id, потом подсказку. - Проверьте, что
call_3c91один и тот же на вызове и наfunction_call_output. - Заказы, токены и пути репозитория не вставляйте в публичный форматтер. JSONSort работает в браузере.
Если три объекта собираются заново по Schema, перенос закончен. Ultrafast эту проверку не заменяет.
Частые ошибки
- Считать Decisions новым Tool Calling. Он возвращает
choice,probabilityилиscore. Аргументы инструмента по-прежнему function calling в Responses. Объект по своей схеме — Structured Outputs в Responses. - Оставить вложенный объект function. Responses не читает старый
function.name. name стоит рядом с type. - Опустить strict и ждать нестрогий режим. Responses пробует строгий режим и при откате ставит
strict: false. Напишите нужное поведение. Проверка хоста остаётся. - Оставить none или temperature на Astra или GPT-6.1 Sol. Эти модели не принимают
none. GPT-6.1 Sol не принимает иminimal. Ставьтеlow. Если усилие не none, параметры выборки уберите. - Из-за Computer Use перенести весь цикл Responses в Agents API. Добавление 29 сентября — это размещённый браузер. Одобрения остаются в приложении. Запись Agents — это
turn_id. - Читать async: true как выполнение силами модели. Хост выполняет инструмент и держит незавершённые вызовы. Позже пишет на исходный
call_id.
FAQ
Нужно ли уходить с Chat Completions?
Если в запросе есть инструменты и модель gpt-6-astra или gpt-6.1-sol, эти вызовы переходят на Responses. Chat Completions на этих моделях всё ещё может нести запросы без инструментов. gpt-6-sol и gpt-6-luna вызывают функции в Chat Completions только при reasoning_effort none. Рассуждение вместе с инструментами идёт через Responses.
Может ли Decisions выдать function_call?
Нет. Он возвращает типизированный ответ: probability предиката, choice или score. Хост сопоставляет choice с уже существующей функцией. Вход публичной беты — POST /v1/decisions, сегодня единственная модель gpt-6-luna. OpenAI пишет, что это примерно в 10 раз быстрее Responses. Это скорость классификации, а не поиск заказа.
Что будет, если не писать strict?
Chat Completions по умолчанию нестрогий. В Responses пропуск strict запускает попытку строгого режима. Если схему нельзя сделать совместимой, API откатывается, и у инструмента будет strict: false. Чтобы сохранить нестрогий режим, явно поставьте false. Хост проверяет arguments в обоих случаях.
Нужно ли менять запись у уже существующей сессии Agents?
Нет. Agents API всё ещё в публичной бете. Оставьте turn_id. Computer Use — отдельное разрешение в размещённом браузере. Одобрение сайтов и вход обрабатывает приложение. Если каждый шаг нужен у вас, оставайтесь на Responses и function_call_output.
Меняет ли Ultrafast JSON инструментов?
Нет. Это service_tier: ultrafast у gpt-6-astra, только резидентность данных в США и глобальная обработка. Определение инструмента, call_id и Schema не меняются. Ultrafast для GPT-6.1 Sol не пишите как уже доступный.
Вывод
Перенос JSON Tool Calling после DevDay 2026 — это смена формы записи. Вызовы инструментов Astra и GPT-6.1 Sol идут через Responses. name стоит рядом с type. Результат возвращается по call_id. Шаг, который только выбирает перечисление, можно перенести в Decisions. Поиск заказа выполняет хост.
Сначала запишите, уходит ли A-1042 в arguments у lookup_order или в input Decisions. Укажите на call_3c91 и answers[0].choice, и только потом переключайте трафик.
Дальше по теме
- Что OpenAI выпустила на DevDay 2026 Список 29 сентября, а не эти шаги переноса
- Agents API и Responses API Два входа пишут результат по-разному
- OpenAI Agents API и JSON Tool Calling Объекты публичной беты; этот текст их не переписывает
- Agents API + JSON Schema Стабильно, проверяемо, исполнимо
- Зачем ИИ нужен JSON Schema Schema — это ворота
- Локальные инструменты JSONSort Формат, проверка, Diff, Schema
- Все статьи Другие заметки о JSON и разработке ИИ
История: Первая публикация