WebSockets в Responses API: агентный цикл на 40% быстрее
Как OpenAI применила WebSockets и кэширование в Responses API, чтобы ускорить агентные воркфлоу Codex на 40% и достичь 1000 токенов/сек.
Когда модель быстрее API: новая проблема AI-разработчиков
С точки зрения задержки агентный цикл Codex проводит большую часть времени в трёх основных стадиях: работа в API-сервисах (валидация и обработка запросов), инференс модели и клиентское время (выполнение инструментов и формирование контекста модели).
Раньше запуск LLM-инференса на GPU был самой медленной частью агентного цикла, поэтому накладные расходы API легко скрывались. Но по мере того как инференс становится быстрее, накопленные API-издержки от агентного прогона становятся всё заметнее.
Иными словами: модели стали настолько быстрыми, что узким местом оказалась уже не сама нейросеть, а инфраструктура вокруг неё.
От 65 до 1000 токенов в секунду: масштаб задачи
В Responses API предыдущие флагманские модели, такие как GPT-5 и GPT-5.2, работали со скоростью около 65 токенов в секунду (TPS). Для запуска GPT-5.3-Codex-Spark — быстрой модели для написания кода — цель была на порядок выше: свыше 1000 TPS, что стало возможным благодаря специализированному железу Cerebras, оптимизированному для LLM-инференса.
Чтобы пользователи могли ощутить истинную скорость новой модели, необходимо было снизить накладные расходы API.
Быстрые модели перестают ощущаться быстрыми, если оркестрационные издержки поглощают весь выигрыш в скорости.
Почему старый подход не работал
Ранее каждый запрос Codex обрабатывался как независимая единица. Это означало, что каждый последующий запрос заново обрабатывал состояние диалога и весь переиспользуемый контекст. По мере роста диалогов росло и количество лишней работы. Разработчики фактически платили за «почти ту же историю» снова и снова, даже когда между шагами менялась лишь небольшая часть диалога.
Задача на исправление ошибки в стиле Codex может потребовать десятков итераций: выбрать следующее действие, вызвать инструмент, вернуть его результат — и повторить.
Как работает агентный цикл: до и после
graph TD
A[Запрос пользователя] --> B[HTTP-запрос к API]
B --> C[Валидация и обработка]
C --> D[Маршрутизация]
D --> E[Инференс модели на GPU]
E --> F[Вызов инструмента]
F --> G{Ещё итерации?}
G -- Да --> B
G -- Нет --> H[Результат]
style B fill:#ff9999
style C fill:#ff9999
style D fill:#ff9999
Красным выделены стадии, где каждый раз повторялась лишняя работа при стандартных HTTP-запросах.
После внедрения WebSockets картина меняется: соединение остаётся открытым, состояние кэшируется в памяти, и каждый следующий вызов инструмента не требует повторной обработки всей истории.
graph TD
A[Запрос пользователя] --> B[WebSocket-соединение]
B --> C[Кэш состояния в памяти]
C --> E[Инференс модели на GPU]
E --> F[Вызов инструмента]
F --> G{Ещё итерации?}
G -- Да --> C
G -- Нет --> H[Результат]
style C fill:#99ff99
style B fill:#99ff99
Почему WebSockets, а не gRPC
OpenAI рассматривала несколько подходов, включая WebSockets и двунаправленную потоковую передачу gRPC. В итоге выбор пал на WebSockets: будучи простым протоколом передачи сообщений, он не требовал от пользователей изменения форматов входных и выходных данных Responses API. Он был удобен для разработчиков и вписывался в существующую архитектуру с минимальными изменениями.
response.create с тем же телом запроса, добавляя previous_response_id для ссылки на кэшированное состояние.Как устроено кэширование на уровне соединения
OpenAI добавила WebSocket-режим, чтобы клиенты могли поддерживать постоянное соединение с Responses API, пока сервер хранит привязанный к соединению in-memory кэш предыдущего состояния ответа.
Последующие вызовы по-прежнему используют привычный паттерн response.create, но когда клиент передаёт previous_response_id, сервер может переиспользовать предыдущий объект ответа, входные и выходные элементы, определения инструментов, пространства имён и даже артефакты отрендеренных токенов — вместо того чтобы заново восстанавливать полную историю с нуля.
# Пример использования WebSocket-режима в Responses API
import openai
client = openai.OpenAI()
# Первый вызов — создаём начальный контекст
response = client.responses.create(
model="gpt-5.3-codex-spark",
input="Проанализируй структуру проекта и найди баги",
tools=[{"type": "shell"}],
stream=True, # WebSocket-режим
)
# Последующие вызовы — переиспользуем кэш
response2 = client.responses.create(
model="gpt-5.3-codex-spark",
input="Исправь найденные баги и запусти тесты",
previous_response_id=response.id, # ключевой параметр
stream=True,
)
Дополнительно API вводит возможность предварительного прогрева. Разработчики могут отправить запрос с generate: false, чтобы заранее загрузить инструменты, инструкции или пользовательские сообщения. Это «подготавливает» соединение, гарантируя, что при поступлении реального пользовательского ввода модель сможет сгенерировать ответ почти мгновенно.
Оптимизации до WebSockets: Sprint по производительности
В конце 2025 года — примерно в ноябре — OpenAI запустила спринт производительности, сосредоточенный на критически важной задержке Responses API, то есть времени от получения запроса до момента, когда может быть получен первый полезный вывод. В рамках этого спринта OpenAI реализовала несколько оптимизаций для улучшения времени до первого токена (TTFT — Time To First Token). По её данным, улучшение составило около 45%.
До архитектурного редизайна компания уже добилась почти 45-процентного улучшения времени до первого токена за счёт небольших оптимизаций: кэширования отрендеренных токенов, сокращения сетевых переходов и ускорения части стека безопасности. WebSockets стали структурным шагом, поднявшим планку выше.
Сравнение подходов: HTTP vs WebSockets
| Параметр | Стандартные HTTP-запросы | WebSocket-режим |
|---|---|---|
| Соединение | Новое на каждый запрос | Постоянное (persistent) |
| Передача истории | Полная при каждом вызове | Только дельта (изменения) |
| Кэш состояния | Нет | In-memory, на уровне соединения |
| Валидация | Полная при каждом запросе | Только новые данные |
| Скорость агентного цикла | Базовая | До +40% быстрее |
| Изменения в коде клиента | — | Минимальные |
Результаты: цифры из реального мира
Это позволило сделать агентные циклы, использующие API, на 40% быстрее в сквозном режиме, дав пользователям возможность ощутить скачок скорости инференса — с 65 до почти 1000 токенов в секунду.
После выхода WebSocket-режима система достигла всплесков до 4000 токенов в секунду на продуктовом трафике.
Выигрыш быстро почувствовали и сторонние разработчики:
OpenAI сообщает, что Codex перевёл большинство своего трафика Responses API на WebSocket-режим, Vercel зафиксировал снижение задержки до 40% после интеграции в AI SDK, многофайловые воркфлоу Cline ускорились на 39%, а модели OpenAI в Cursor стали работать до 30% быстрее.
Прототип: от идеи до продакшена за несколько недель
Первый WebSocket-прототип изменил представления о том, чего можно достичь в плане задержки Responses API. Инженер из команды Codex с глубокой экспертизой по всему стеку API собрал прототип, запустив агента Codex на ночь. В этом прототипе агентные прогоны моделировались как единый долгоживущий Response.
WebSocket-режим — одна из наиболее значимых новых возможностей Responses API со времени его запуска в марте 2025 года. От идеи до запуска в продакшен прошло всего несколько недель — благодаря тесному взаимодействию команд API и Codex внутри OpenAI.
Что это значит для разработчиков агентных систем
Это означает, что следующая фаза конкуренции в области агентов может зависеть не только от качества самой модели, но и от того, кто сможет предотвратить потерю скорости из-за инфраструктурных издержек. Быстрые модели перестают ощущаться быстрыми, если накладные расходы оркестрации поглощают этот выигрыш.
Это важный сигнал для разработчиков: скорость агента становится системной проблемой.
Практические рекомендации по миграции
- Используйте
previous_response_id— ключевой параметр для активации кэша состояния на сервере. - Предварительно прогревайте соединение — отправьте запрос с
generate: falseдля загрузки инструментов и системных инструкций заранее. - Убедитесь, что ваш клиент поддерживает постоянные WebSocket-соединения — большинство современных SDK это умеют.
- Протестируйте граничные случаи — обрывы соединения, повторное подключение, обработка ошибок при потере кэша.
Итог
WebSocket-режим не только кардинально улучшает задержку агентных прогонов, но и отвечает растущей потребности разработчиков: по мере ускорения инференса модели сервисы и системы вокруг него тоже должны ускоряться, чтобы передать этот выигрыш пользователям.
Внедрение WebSockets в Responses API — это напоминание о том, что в эпоху сверхбыстрых AI-моделей архитектурные решения вокруг модели становятся не менее важными, чем сама модель. Узким местом больше не является GPU — теперь это сеть, протокол и способ управления состоянием.