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

OpenAI Agents API vs Responses API: как выбрать в 2026? Tool Calling, Structured Output, мультиагент

Около 16 мин

После беты Agents API 10 сентября обычный вопрос не «какая модель умнее», а кто крутит цикл. Responses API оставляет вам function_call. Agents API хостит Codex harness. Этот текст идёт от tool calling и structured output к мультиагенту и даёт таблицу, из которой можно выбрать.

Сразу

Дверь Одна строка Что вы держите
Agents API OpenAI крутит Codex harness Session / Environment
Responses API Вы бьёте модель и крутите цикл input / output items
Agents SDK Цикл остаётся в вашем процессе runner / handoff
JSON-цепь Имена, аргументы, результаты остаются объектами call_id / Schema

Сначала подлежащее: хотите ли вы владеть циклом. Смените дверь — JSON-цепь вызова останется.

Вы выбираете, кто крутит цикл, не кто умнее

В 2026 tool calling GPT-6 Astra уже идёт через Responses. Agents API — другой слой: хостинг сессий, сжатый контекст, субагенты. Та же JSON-цепь. Другое подлежащее.

  • Нужно владеть каждым прыжком — approvals, ретраи, писать назад function_call_output — Responses API.
  • Нужны часовые задачи, хостинг-восстановление, песочница или субагенты — Agents API.
  • Цикл должен остаться в вашем процессе, но нужен runner — Agents SDK; снизу часто Responses.

Как Agents API сам вызывает инструменты: Разбор OpenAI Agents API. Если Agent и Function Calling всё ещё одно слово — Полный гид по AI Agent.

Каждый API владеет слоем

Responses — нижний слой: /v1/responses. Вы шлёте input, получаете типизированные items: message, reasoning, function_call. Tool calling Гид GPT-6 Astra требует этот путь. Structured output живёт в text.format, не в response_format Chat Completions.

Agents API — управляемый harness: POST /v1/agents/sessions. Вы объявляете Agent, Tools, Environment; OpenAI крутит цикл, compact и восстановление. Когда ваша функция должна ответить, сессия шлёт requires_action; вы возвращаете tool_result по turn_id / call_id.

Agents SDK — не третий протокол. Это runner в вашем процессе: handoff, approvals и хранение ваши; вызовы модели часто падают на Responses. Доки считают Session, SDK-сессию, Responses conversation и sandbox четырьмя разными ресурсами.

Tool calling: одна цепь, две записи назад

На Responses вы каждый ход делаете responses.create. Таблица инструментов и финальная карточка могут сидеть в одном запросе:

{
  "model": "gpt-6-astra",
  "input": "Look up order A-1042.",
  "tools": [
    {
      "type": "function",
      "name": "lookup_order",
      "parameters": {
        "type": "object",
        "properties": {
          "order_id": { "type": "string", "pattern": "^[A-Z]-\\d{4}$" }
        },
        "required": ["order_id"],
        "additionalProperties": false
      }
    }
  ],
  "text": {
    "format": {
      "type": "json_schema",
      "name": "order_card",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "order_id": { "type": "string" },
          "status": { "enum": ["paid", "pending", "void"] }
        },
        "required": ["order_id", "status"],
        "additionalProperties": false
      }
    }
  }
}

Если модели нужна выборка, в output отдельный item. call_id сшивает вызов и результат:

{
  "output": [
    {
      "type": "function_call",
      "call_id": "call_3c91",
      "name": "lookup_order",
      "arguments": "{\"order_id\":\"A-1042\"}"
    }
  ]
}

Приложение исполняет функцию и шлёт результат следующим input item:

{
  "type": "function_call_output",
  "call_id": "call_3c91",
  "output": "{\"status\":\"paid\",\"amount\":99.00}"
}

Agents API складывает эти ходы в session. Создать один раз: инструменты, песочница, включён ли multi_agent:

{
  "agent": {
    "model": "gpt-6-astra",
    "tools": [
      { "type": "function", "name": "lookup_order", "parameters": {
        "type": "object",
        "properties": { "order_id": { "type": "string", "pattern": "^[A-Z]-\\d{4}$" } },
        "required": ["order_id"],
        "additionalProperties": false
      }},
      { "type": "web_search" }
    ],
    "multi_agent": { "enabled": true, "max_concurrent_subagents": 3 }
  },
  "environment": { "type": "hosted", "workspace_directory": "/workspace" },
  "input": [{ "role": "user", "content": [{ "type": "input_text", "text": "Look up A-1042." }] }]
}

Когда очередь вашей функции, harness стопорится на required_actions. Запись назад — не function_call_output, а tool result с turn_id:

{
  "type": "tool_result",
  "turn_id": "turn_2",
  "call_id": "call_3c91",
  "success": true,
  "output": "{\"status\":\"paid\"}"
}

Имена разные. Дверь одна: Schema решает, что можно исполнить. Строка MCP — другое написание той же таблицы; граница в MCP Tool Schema vs Function Calling.

Structured output запирает финальную карточку, не аргументы инструмента

Responses кладёт финальную форму в text.format. Это ограничивает то, что видит пользователь, не аргументы инструментов. Инструментам нужна своя Schema. Договор в Зачем ИИ нужен JSON Schema.

  • Responses: text.format.json_schema + strict: true запирает финальную карточку.
  • Agents API: цикл на хостинге; финальный артефакт всё равно хочет Schema. Параметры function / MCP остаются узкими.
  • Оба: structured output — не дверь. Суммы, подтверждение и выпуск пишет хост.

Обычная ошибка — запереть карточку и оставить lookup_order широким object. Карточка чистая. Побочный эффект уже пробежал.

Мультиагент: хостинг-веер или свой handoff

«Мультиагентное сотрудничество» — не третий вид интеллекта. Это кто держит оркестрацию:

  • Agents API: multi_agent.enabled. У каждого субагента свой контекст. Главный агент использует create / wait / interrupt. Ставьте потолок параллелизма.
  • Agents SDK: объекты handoff живут в вашем runner. Approvals и хранение ваши.
  • Responses: встроенного субагента нет. Вы сами цепляете responses.create или паркуете состояние в Conversations.

Handoff должен быть проверяемым JSON, не «передайте в биллинг». Как удержать это Schema: JSON Schema и workflow агентов.

Одна таблица, три двери

Официальное сравнение сжимается в инженерные вопросы:

Ось Agents API Responses API Agents SDK
Кто крутит цикл Harness под OpenAI Вы крутите на каждом create Runner в вашем процессе
Где живёт состояние Session / turns / items Вы собираете history или Conversations Ваше хранилище или SDK-сессия
Запись инструмента назад tool_result + turn_id function_call_output + call_id SDK оборачивает; часто Responses снизу
Structured output Schema финального артефакта отдельно text.format.json_schema Куда повесите
Мультиагент Встроенные субагенты Оркестрируете вы Handoff в runner

Нет «лучшего API». Есть только «подлежащее на вашей стороне?»

Четыре вопроса, которые выбирают дверь

Не выбирайте со страницы продукта. Эти четыре:

  1. Может ли деловой побочный эффект покинуть ваш процесс? Возвраты и записи, которым нужно ваше «да», начинают с Responses или SDK.
  2. Работа переживёт одно окно контекста? Да, и compact сами не хотите — Agents API.
  3. Нужна песочница для команд и файлов? Environment Agents API готов. Responses оставляет мир исполнения вам.
  4. Нужны параллельные субагенты? Да, и оркестрацию не строите — включите multi_agent и заморозьте потолок.

Если все четыре «да» на стороне хостинга — Agents API. Если один прыжок должен остаться в руке — с Responses. SDK — третий вариант: цикл ваш, клея меньше.

Перед сравнением разложите оба JSON-следа

Неверная дверь обычно значит: объекты никто не смотрел. Положите оба следа на стол.

  • форматировать output[] Responses и items сессии Agents. Проверьте, что call_id совпадает.
  • извлечь JSONPath вытаскивает name, arguments и text.format. Не сканируйте доку глазом.
  • JSON Diff один и тот же заказ под обеими дверями. Цикл поплыл — сначала форма записи назад, потом модель.
  • Schema финальной карточки и Schema аргументов инструмента смотрите отдельно. Запереть карточку без аргументов — фасад.
  • Не кладите заказы и внутренние MCP URL в публичный форматтер. JSONSort крутится локально в браузере.

Оба следа собираются заново — вы выбираете дверь, не лозунг.

Ловушки

  • Думать, что Agents API заменяет Responses. Доки дают две точки старта. Tool calling Astra по-прежнему идёт через Responses.
  • Считать Session и Conversation одним ресурсом. Удаление одного не чистит другой.
  • Schema только на финальной карточке, широкие аргументы инструмента. Побочные эффекты случаются, когда бежит function_call.
  • Включить multi_agent без потолка параллелизма. Хостинг-веер всё равно жжёт токены и ширит побочные эффекты.
  • Взять SDK и пропустить дверь. Runner крутит цикл. Сумму он не проверяет.
  • Выбирать API по демо-ролику. Демо спрятало цикл. Спросите, где сидит подлежащее.

FAQ

С какого API начинать проект в 2026?

С Responses: виден каждый прыжок. Отдавайте цикл Agents API только если работа должна пережить окна или нужна хостинг-песочница / субагенты.

Может ли GPT-6 Astra жить только на Agents API без Responses?

Можно открыть только Agents session. Документация tool calling Astra всё ещё указывает на Responses. Короткие цепи, structured output и цикл, который крутите вы, остаются на Responses.

Может ли structured output заменить tool calling?

Нет. Structured output запирает финальный объект. Tool calling запирает побочные эффекты. Возвраты, выборки, правки файлов идут через JSON инструмента; карточка для пользователя — через text.format.

Мультиагенту обязателен Agents API?

Нет. Handoff SDK и ваша собственная цепь вызовов Responses — тоже мультиагент. Agents API только делает веер хостинг-способностью.

Можно ли смешивать два API?

Да — не смешивайте ресурсы. Структурированную карточку снимайте на Responses; длинную работу гоните на Agents session. Session, Conversation и sandbox создавайте и удаляйте раздельно.

Вывод

Agents API и Responses API — не два поколения. Один хостит цикл. Другой отдаёт цикл вам. Tool calling, structured output и мультиагент — просто разные объекты на этой цепи.

Сначала напишите подлежащее: должен ли этот прыжок покинуть ваш процесс. Потом выбирайте дверь. Модели сменятся. call_id и Schema стоит стабилизировать первыми.

Дальше

Журнал: Первая публикация