AI-разработка

Как перенести JSON Tool Calling после обновления API на OpenAI DevDay 2026

Около 16 мин

Сначала смените форму записи результата, потом идентификатор модели. Если цель — 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. Сначала запишите форму ответа:

  1. Назовите текущую запись. Это role: tool плюс tool_call_id, или function_call_output, или turn_id Agents. Один парсер на все три не делится.
  2. Выберите вход. Вызовы инструментов Astra и GPT-6.1 Sol идут на POST /v1/responses. Sol и Luna остаются на Chat Completions только при reasoning_effort равном none.
  3. Сделайте определение плоским и запишите strict. Если схема использует форму, которую строгий режим отвергает, поставьте strict: false и оставьте проверку хоста. Поиск принимает только order_id.
  4. Совместите 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 на уровне запроса.
  5. В Decisions переносите только шаг с перечислением. Модель — gpt-6-luna. Хост сопоставляет lookup с lookup_order. async: true только у медленного инструмента, запись — на исходный call_id.
  6. Сделайте 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, и только потом переключайте трафик.

Дальше по теме

История: Первая публикация