Responses API для GPT-6 Astra: что учесть при миграции

Responses API для GPT-6 Astra: что менять в схемах, вызовах инструментов и состоянии, как оценить стоимость и безопасно провести миграцию в продакшене.

Friday, September 4, 2026Omid Saffari
Tools
Responses API для GPT-6 Astra: что учесть при миграции

С GPT-6 Astra использование инструментов превращается в полноценную миграцию на Responses API, а не в замену имени модели одной строкой. OpenAI выпустила модель 3 сентября 2026 года: Chat Completions по-прежнему подходит для текста, но все сценарии Astra с вызовом инструментов необходимо перенести на Responses; асинхронные инструменты и корректировки во время генерации меняют сам подход к долгим задачам.

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

Что изменилось в Responses API с выходом Astra

До релиза Astra оставалась исследовательской моделью с закрытым доступом. В сентябре модель получила публичный идентификатор gpt-6-astra, официальные тарифы и поддержку как в Chat Completions, так и в Responses. Сначала доступ открывается предприятиям из OpenAI Trusted Access Program, а подключение API и других тарифных планов ожидается в ближайшие дни.

Выбор эндпоинта зависит от задач приложения. Текстовая интеграция с Chat Completions может работать с Astra. Но если Astra должна вызывать ваши функции или инструменты, размещённые у OpenAI, потребуется Responses API.

У Responses другой контракт с приложением. Chat Completions принимает список сообщений и возвращает список вариантов ответа. Responses оперирует типизированными Items: сообщение — один Item, function_call — другой, а результат инструмента возвращается как function_call_output с исходным call_id.

Часть приложенияChat CompletionsResponses
Запросmessagesinput и необязательный instructions
Итоговый текстchoices[0].message.contentresponse.output_text или типизированные Items в output
Описание инструментаФункция вложена в оболочку инструментаПоля функции находятся непосредственно в Item инструмента
Результат инструментаСообщение инструментаfunction_call_output, сопоставленный по call_id
Продолжение состоянияВаша история сообщенийprevious_response_id, ручное воспроизведение Items или Conversations
Потоковая передачаФрагменты с deltaТипизированные события, например response.output_text.delta

При миграции легко попасть в две ловушки. Параметр instructions верхнего уровня не переносится при создании цепочки через previous_response_id, поэтому его нужно отправлять заново. Для Structured Outputs параметр также меняется: вместо response_format теперь используется text.format. Полный перечень изменений в парсере, состоянии, инструментах и стриминге приведён в руководстве по миграции.

Почему теперь нужно планировать два бюджета

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

Второй бюджет — стоимость завершённой задачи. При стандартном коротком контексте GPT-6 Astra стоит $10.00 за 1 млн входных токенов, $1.00 за кэшированный ввод, $12.50 за запись в кэш и $50.00 за вывод. Текущие промотарифы GPT-5.6 Sol по тем же четырём позициям составляют $4.00, $0.40, $5.00 и $20.00. При одинаковом количестве токенов Astra обходится в 2.5 раза дороже по каждой позиции.

Отдельной платы за сам эндпоинт нет. Счёт складывается из токенов модели, тарифицируемых встроенных инструментов, вашей инфраструктуры инструментов, повторных попыток и незавершённой работы. Если во входном промпте больше 272,000 токенов, для всего запроса Astra удваиваются тарифы на ввод и кэш, а тариф на вывод увеличивается в 1.5 раза. Именно эти значения со страницы актуальных тарифов следует закладывать в бюджет пилота.

Часть разницы потенциально можно компенсировать, но ответ дадут только собственные данные. По внутренним тестам OpenAI, эффективность использования кэша в Responses на 40%–80% выше, чем в Chat Completions. Компания также сообщает, что в ряде оценок расчётная стоимость задачи через Astra API была ниже: несмотря на более дорогие токены, модель генерировала меньше выходных токенов. Ни одно из этих наблюдений не гарантирует экономию для любого сценария.

Вместо этого измеряйте:

cost per completed job = model tokens + built-in tool fees + your tool costs + retries + operator time

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

Как асинхронный вызов инструментов меняет ожидание

Обычный вызов функции приостанавливает модель до тех пор, пока приложение не вернёт результат. В Astra функция, которую выполняет приложение, или custom tool может содержать async: true. Модель способна отправить вызов и продолжить рассуждение, обратиться к другому независимому инструменту или ответить на самостоятельную часть запроса, пока приложение выполняет задачу.

За выполнение по-прежнему отвечает ваш сервер. Он должен запустить задачу, вести реестр, сохранить исходный call_id и передать результат в одном из следующих запросов Responses. Если до получения результата состоялись другие ходы, продолжение должно ссылаться на последний response ID, а вывод инструмента — всё ещё на исходный call ID.

В исследовательском продукте медленный запрос к поставщику данных может выполняться, пока Astra систематизирует уже найденные источники. Во внутреннем ops-агенте два независимых запроса по аккаунтам можно запустить заранее, а модель в это время подготовит часть отчёта, которая от них не зависит. Выигрыш здесь — сокращение простоя, а не бесплатное выполнение.

Как mid-turn steering сокращает число перезапусков

Mid-turn steering позволяет пользователю скорректировать задачу, пока Astra ещё работает. Приложение отправляет событие response.steer через то же WebSocket-соединение Responses, указывает активный ответ в previous_response_id и передаёт новую инструкцию. Сервер завершает текущий выходной Item и уже запущенную работу размещённых инструментов, после чего создаёт продолжение с учётом правки.

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

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

Steering доступен только в Astra и требует Responses WebSocket. Правки в очереди существуют лишь внутри этого соединения, поэтому приложение должно записывать каждое принятое обновление и аккуратно восстанавливаться после разрыва. OpenAI ограничивает время жизни WebSocket-соединения 60 минутами. Для сценариев с 20 и более вызовами инструментов руководство по WebSocket указывает ускорение сквозного выполнения примерно до 40%, но это результат смены транспорта, а не обещанная экономия от steering.

Мастерская с Astra-агентом: он продолжает полезную работу, пока выполняется асинхронный инструмент, а корректировка через steering добавляется в продолжение
Асинхронные инструменты убирают вынужденное ожидание. Steering добавляет правку в продолжение. За задачу и состояние по-прежнему отвечает ваше приложение.

Пошаговая миграция на Responses API

Начните с одного низкорискового сценария вызова функции. Самый загруженный продакшен-агент для первого шага не подходит.

  1. Проведите инвентаризацию всего контура

    Перечислите все пути Chat Completions, в которых передаются инструменты. Для каждого отметьте сборщик запросов, схему инструментов, обработчик результатов, хранилище состояния, потребитель потока, правила повторных попыток и телеметрию использования. Текстовые пути можно не трогать, пока вы переносите один сценарий с инструментами.

  2. Создайте теневой путь через Responses

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

  3. Подключите async для одного независимого инструмента

    Выберите медленную функцию, результат которой не нужен модели для следующего этапа работы. Установите async: true, сохраните задачу вместе с её call_id и верните результат по тому же ID. Полный цикл показан ниже в официальном примере на Python.

  4. Добавляйте steering только после отладки восстановления

    Работайте через Responses WebSocket, записывайте ID и содержимое принятых steering-правок и проверьте принудительный разрыв соединения. Если нет воспроизведения и восстановления, функция корректировки может незаметно потерять инструкцию пользователя.

Установите актуальную версию Python SDK и задайте переменную окружения, как показано в кратком руководстве OpenAI:

Bash
pip install openai
export OPENAI_API_KEY="your_api_key_here"

Ниже приведён запускаемый пример OpenAI для асинхронного инструмента с демонстрационными погодными данными. Его можно выполнить после того, как проект API получит доступ к Astra:

Python
import json
from concurrent.futures import ThreadPoolExecutor

from openai import OpenAI
from openai.types.responses import FunctionToolParam

def get_weather(city):
    # Demo data. Replace this function with your weather service.
    weather = {
        "Paris": {
            "city": "Paris",
            "temperature_c": 22,
            "condition": "Clear",
            "source": "demo weather snapshot",
        }
    }
    return weather[city]

worker = ThreadPoolExecutor()

def main():
    client = OpenAI()
    model = "gpt-6-astra"
    tools: list[FunctionToolParam] = [
        {
            "type": "function",
            "name": "get_weather",
            "description": "Read the demo weather snapshot for a city.",
            "async": True,
            "strict": True,
            "parameters": {
                "type": "object",
                "properties": {"city": {"type": "string"}},
                "required": ["city"],
                "additionalProperties": False,
            },
        },
    ]

    instructions = (
        "Start the weather lookup and answer the independent packing "
        "question without waiting. Use the actual tool result when it "
        "arrives; never invent it. Identify the weather as demo data."
    )
    response = client.responses.create(
        model=model,
        tools=tools,
        instructions=instructions,
        input=(
            "Check the demo weather in Paris. Meanwhile, "
            "list three essentials for any city trip."
        ),
    )

    call = next(item for item in response.output if item.type == "function_call")
    arguments = json.loads(call.arguments)
    if call.name != "get_weather" or arguments != {"city": "Paris"}:
        raise ValueError("Expected a weather lookup for Paris")

    latest_response_id = response.id
    if call.async_:
        job = worker.submit(get_weather, **arguments)
        print(response.output_text)
        # Independent work or conversation turns can happen here.
        # Update latest_response_id after each continuation.
        result = job.result()
    else:
        result = get_weather(**arguments)

    response = client.responses.create(
        model=model,
        tools=tools,
        instructions=instructions,
        previous_response_id=latest_response_id,
        input=[
            {
                "type": "function_call_output",
                "call_id": call.call_id,
                "output": json.dumps(result),
            },
        ],
    )
    print(response.output_text)

if __name__ == "__main__":
    try:
        main()
    finally:
        worker.shutdown(wait=True)

Чаще всего пропустят строку call_id: call.call_id. Позднее полученный результат относится к исходному вызову инструмента, даже если новые ходы диалога уже изменили последний response ID.

Кому и какие возможности подойдут

Backend-команде, которая уже вызывает функции

До внедрения Astra в такой сценарий заложите бюджет на миграцию в Responses. Поэтапный переход даст сопоставимые логи и evals, а команде не придётся одновременно отлаживать новый эндпоинт, парсер и модель.

SaaS-агенту, который ждёт медленные сервисы

Используйте async только для действительно независимой работы. Запрос к CRM, внутренний поиск или экспорт документа можно запустить, пока Astra занимается другой веткой. Если от зависимости нельзя перейти к следующему решению, оставьте синхронный режим или примените явный инструмент ожидания.

Ops-команде или агентству, которые контролируют долгие задачи

Предлагайте steering для правок, которые иначе потребовали бы отмены и перезапуска. Считайте, сколько перезапусков удалось предотвратить и какой объём готовой работы сохранила каждая корректировка. Так появится бизнес-обоснование, а не просто демонстрация функции.

Регулируемой организации с Zero Data Retention

Responses WebSocket работает с store: false и Zero Data Retention, но управление состоянием ложится на приложение. При необходимости сохраняйте зашифрованные reasoning Items, полностью воспроизводите контекст, если response ID больше недоступен, и спроектируйте восстановление до того, как steering появится у пользователей.

Без иллюзий

Доступ к Astra всё ещё открывается поэтапно. Подготовить миграцию можно уже сейчас, но полностью переключать продакшен стоит лишь после получения доступа для проекта и evals на вашей нагрузке.

Асинхронные инструменты требуют реестра задач и обработки результатов, которые приходят не по порядку. Steering добавляет состояние соединения, работу с продолжениями и восстановление. Оба механизма способны сократить бесполезное ожидание или число перезапусков — и оба добавляют код, в котором возможны сбои.

Окончательный вывод о цене появится только после сбора собственной телеметрии. При одинаковом количестве токенов Astra стоит в 2.5 раза дороже текущих промотарифов GPT-5.6 Sol. Более эффективное кэширование, меньше выходных токенов и меньше перезапусков в некоторых задачах могут сократить разрыв. Ограничьте пилот жёстким лимитом расходов, а затем оценивайте Astra по стоимости завершённой задачи и времени оператора.

Что сделать в понедельник

  • Если приложение вызывает инструменты через Chat Completions и вам нужна Astra, на этой неделе разберите один продакшен-сценарий и выделите ресурсы на теневой путь через Responses.
  • Если приложение работает только с текстом, не меняйте его, пока доступ разворачивается. Для такого сценария обязательной миграции на другой эндпоинт нет.
  • Если основное время уходит на медленные инструменты, протестируйте одну асинхронную функцию и измерьте простой, сбои и стоимость завершённой задачи.
  • Если поздние правки людей приводят к перезапускам, переходите к прототипу steering только после успешных тестов переподключения WebSocket и воспроизведения состояния.
  • Если тариф Astra на токены, который в 2.5 раза выше, разрушает юнит-экономику ещё до измерения возможной компенсации, оставьте эту нагрузку на GPT-5.6 Sol, Terra или Luna.

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

Последнее обновление

4 сент. 2026 г.

КатегорияExplained

Сделать этот сайт предпочтительным в Google

Добавить omidsaffari.com как предпочтительный источник в Google Поиске

Отметьте omidsaffari.com как предпочтительный источник — и Google будет поднимать его для вас в Top Stories, AI Overviews и AI Mode.

Ещё из Explained

Все статьи Explained
Рассылка

Одно письмо, каждое воскресенье. Работающие системы, а не горячие мнения.

Билд-логи, системы в продакшене и полевые заметки из портфеля ИИ-проектов.

Еженедельно. Без спама. Отписка в любой момент.