Saltar para o conteúdo principal
OpenAI

22 de abril de 2026

Engenharia

Acelerar fluxos de trabalho agênticos com WebSockets na Responses API

Por Brian Yu e Ashwin Nathan, Membros do Technical Staff

A carregar…

Quando pede ao Codex para corrigir um bug, ele percorre a sua base de código à procura de ficheiros relevantes, lê-os para criar contexto, faz alterações e executa testes para verificar se a correção funcionou. Nos bastidores, isto significa dezenas de pedidos de ida e volta à Responses API: determinar a próxima ação do modelo, executar uma ferramenta no seu computador, enviar o resultado da ferramenta de volta para a API e repetir.

Todos estes pedidos podem somar minutos que os utilizadores passam à espera que o Codex conclua tarefas complexas. Do ponto de vista da latência, o loop do agente do Codex passa a maior parte do tempo em três fases principais: trabalho nos serviços da API (para validar e processar pedidos), inferência do modelo e tempo do lado do cliente (executar ferramentas e criar contexto do modelo). A inferência é a fase em que o modelo corre em GPUs para gerar novos tokens. No passado, executar a inferência de LLMs em GPUs era a parte mais lenta do loop agêntico, pelo que a sobrecarga dos serviços da API era fácil de ocultar. À medida que a inferência fica mais rápida, a sobrecarga acumulada da API numa execução agêntica torna-se muito mais notória.

Neste artigo, vamos explicar como tornámos loops de agentes que usam a API 40% mais rápidos de ponta a ponta, permitindo que os utilizadores experienciem o salto na velocidade de inferência de 65 para quase 1 000 tokens por segundo. Abordámos isto através de colocação em cache, eliminação de saltos de rede desnecessários, melhoria da nossa stack de segurança para sinalizar problemas rapidamente e — mais importante — a criação de uma forma de estabelecer uma ligação persistente à Responses API, em vez de ter de fazer uma série de chamadas síncronas à API.

Diagrama intitulado «Um loop de agente do Codex na prática» que mostra um fluxo iterativo entre o Codex e a Responses API, com chamadas de ferramentas (rg, sed, apply_patch, pytest) e resultados trocados até à mensagem final: «O bug foi corrigido.»

Quando a API se tornou o gargalo

Na Responses API, modelos principais anteriores como o GPT‑5 e o GPT‑5.2 corriam a cerca de 65 tokens por segundo (TPS). Para o lançamento do GPT‑5.3‑Codex‑Spark, um modelo rápido de programação, o nosso objetivo era ser uma ordem de grandeza mais rápido: mais de 1 000 TPS, possibilitado por hardware especializado da Cerebras otimizado para inferência de LLMs. Para garantir que os utilizadores podiam experienciar a verdadeira velocidade deste novo modelo, tivemos de reduzir a sobrecarga da API. 

Por volta de novembro de 2025, lançámos um sprint de desempenho na Responses API, implementando muitas otimizações na latência do caminho crítico para um único pedido: 

  • Colocação em cache de tokens renderizados e da configuração do modelo em memória para evitar tokenização dispendiosa e chamadas de rede em respostas com vários turnos
  • Reduzir a latência de saltos de rede eliminando chamadas a serviços intermédios (por exemplo, resolução de processamento de imagens) e chamando diretamente o próprio serviço de inferência
  • Melhorar a nossa stack de segurança para podermos executar determinados classificadores e sinalizar conversas mais depressa

Com estas melhorias, observámos uma melhoria de quase 45% no tempo até ao primeiro token (TTFT) — o que reflete o quão responsiva a API parece —, mas estas melhorias ainda não eram suficientemente rápidas para o GPT‑5.3‑Codex‑Spark. Mesmo com estas melhorias, a sobrecarga da Responses API era demasiado grande face à velocidade do modelo — isto é, os utilizadores tinham de esperar pelos CPUs que executam a nossa API antes de poderem usar as GPUs que servem o modelo.

O problema mais profundo era estrutural: tratávamos cada pedido do Codex como independente, processando o estado da conversa e outro contexto reutilizável em cada pedido de seguimento. Mesmo quando a maior parte da conversa não tinha mudado, continuávamos a pagar pelo trabalho associado a todo o histórico. À medida que as conversas ficavam mais longas, esse processamento repetido tornava-se mais caro.

Criar uma ligação persistente

Para otimizar o design, repensámos o protocolo de transporte: seria possível manter uma ligação persistente e colocar o estado em cache, em vez de estabelecer uma nova ligação por HTTP e enviar todo o histórico da conversa em cada pedido de seguimento? A ideia era enviar apenas a informação nova que exigisse validação e processamento e colocar em cache o estado reutilizável em memória durante a vida útil da ligação. Isto reduziria a sobrecarga de trabalho redundante.

Considerámos algumas abordagens diferentes, incluindo WebSockets e streaming bidirecional em gRPC. Optámos por WebSockets porque, enquanto protocolo simples de transporte de mensagens, os utilizadores não teriam de alterar as estruturas de entrada e saída da Responses API. Era amigável para developers e encaixava na nossa arquitetura existente com pouca perturbação.

O primeiro protótipo de WebSocket mudou o que achávamos possível em termos de latência na Responses API. Um engenheiro da equipa do Codex, com profunda experiência em toda a stack da API, reuniu um protótipo ao executar um agente do Codex durante a noite.

Neste protótipo, execuções agênticas foram modeladas como uma única Response de longa duração. Usando funcionalidades do asyncio, a Responses API bloqueava de forma assíncrona no ciclo de amostragem depois de ser amostrada uma chamada de ferramenta, e a Responses API enviava um evento response.done de volta para o cliente. Depois de executar a chamada de ferramenta, os clientes enviavam de volta um evento response.append com o resultado da ferramenta, o que desbloqueava o ciclo de amostragem e permitia que o modelo continuasse.

Uma analogia aqui é tratar a chamada de ferramenta local como uma chamada de ferramenta alojada. Quando o modelo chama a pesquisa na Web, o loop de inferência bloqueia, chama um serviço de pesquisa na Web e coloca a resposta do serviço no contexto do modelo. No nosso design, fizemos o mesmo; mas, em vez de chamar um serviço remoto, enviámos a chamada de ferramenta do modelo para o cliente, de volta através do WebSocket. Quando o cliente respondia, colocávamos a resposta da chamada de ferramenta do cliente no contexto e continuávamos a amostrar.

Este design foi extremamente eficaz porque eliminou trabalho repetido na API ao longo de uma execução do agente. Podíamos fazer o trabalho pré-inferência uma vez, pausar para a execução da ferramenta e fazer o trabalho pós-inferência uma vez no final.

Infelizmente, isso teve o custo de um formato de API menos familiar e mais complexo. Queríamos que os developers conseguissem adicionar suporte para WebSockets sem terem de reescrever a sua integração com a API em torno de um novo modo de interação.

Manter a API familiar enquanto tornamos a stack incremental

Na versão que lançámos, voltámos a um formato familiar: continuar a usar response.create com o mesmo body e usar previous_response_id para continuar o contexto da conversa a partir do estado da response anterior.

Numa ligação WebSocket, o servidor mantém uma cache em memória, com âmbito da ligação, do estado da response anterior. Quando uma response.create de seguimento inclui previous_response_id, vamos buscar esse estado à cache, em vez de reconstruirmos toda a conversa de raiz.

Esse estado em cache inclui:

  • O objeto response anterior
  • Itens de entrada e de saída anteriores
  • Definições de ferramentas e namespaces
  • Artefactos de amostragem reutilizáveis, como tokens previamente renderizados
Diagrama intitulado «De pedidos sequenciais para execução sobreposta» que compara um pipeline de pedidos sequenciais com uma abordagem baseada em WebSockets em que vários pedidos se sobrepõem nas fases de validação, pré-inferência, amostragem e pós-inferência.

Ao reutilizar o estado em memória da response anterior, conseguimos implementar várias otimizações importantes:

  • Fazer com que alguns dos nossos classificadores de segurança e validadores de pedidos processem apenas a nova entrada, e não todo o histórico em cada pedido
  • Manter uma cache em memória de tokens renderizados, à qual vamos anexando conteúdo, para podermos evitar tokenização desnecessária
  • Reutilizar a nossa lógica bem-sucedida de resolução/encaminhamento de modelos entre pedidos 
  • Sobrepor trabalho pós-inferência não bloqueante, como faturação, com pedidos subsequentes

O objetivo era aproximar-nos o mais possível do protótipo com sobrecarga mínima, mas com um formato de API que os developers já compreendiam e em torno do qual já tinham desenvolvido.

Definir um novo patamar de velocidade

Após um sprint de dois meses a criar o modo WebSocket, lançámos uma alpha com startups-chave de agentes de programação para que pudessem integrá-lo na sua infraestrutura e aumentar o tráfego em segurança. Os utilizadores alpha adoraram, reportando melhorias até 40%(abre numa nova janela) nos seus fluxos de trabalho agênticos. Com base no feedback positivo da alpha, estávamos prontos para lançar.

Os resultados do lançamento foram imediatos. O Codex migrou rapidamente a maioria do seu tráfego da Responses API para o modo WebSocket, observando melhorias significativas de latência. Para o GPT‑5.3‑Codex‑Spark, atingimos a nossa meta de 1 000 TPS e vimos picos até 4 000 TPS, mostrando que a Responses API conseguia acompanhar uma inferência muito mais rápida em tráfego real de produção. O impacto também se fez sentir rapidamente na comunidade de developers:

O modo WebSocket é uma das novas capacidades mais significativas na Responses API desde o seu lançamento em março de 2025. Passámos da ideia à execução em produção em apenas algumas semanas, através de uma colaboração estreita entre as equipas de API e de Codex da OpenAI. Não só melhora drasticamente a latência de execução do agente, como também responde a uma necessidade crescente para os builders: à medida que a inferência do modelo fica mais rápida, os serviços e sistemas à volta da inferência também têm de acelerar para transferir estes ganhos para os utilizadores. 

Autores

Brian Yu, Ashwin Nathan

Agradecimentos

Agradecimentos especiais às equipas da Responses API e do Codex, que trabalharam na criação do modo WebSocket.