Gå direkt till huvudinnehåll
OpenAI

22 april 2026

Teknik

Påskynda agentbaserade arbetsflöden med WebSockets i Responses APIPP

Av Brian Yu och Ashwin Nathan, medlemmar i teknikteamet

Laddar …

När du ber Codex att åtgärda en bugg söker den igenom din kodbas efter relevanta filer, läser dem för att skapa kontext, gör ändringar och kör tester för att verifiera att åtgärden lyckades. Bakom kulisserna innebär det dussintals förfrågningar fram och tillbaka till/från Responses API: Fastställ modellens nästa åtgärd, kör ett verktyg på din dator, skicka verktygsutdata tillbaka till API:et och upprepa.

Alla dessa förfrågningar kan tillsammans innebära att användare får vänta i flera minuter på att Codex ska slutföra komplexa uppgifter. Ur ett latensperspektiv tillbringar Codex agentloop större delen av tiden i tre huvudsakliga steg: arbete i API-tjänsterna (för att validera och behandla förfrågningar), modellinferens och tid på klientsidan (för att köra verktyg och bygga modellkontext). Inferens är det steg där modellen körs på GPU:er för att generera nya tokens. Tidigare var inferens för stora LLM:er på GPU:er den långsammaste delen av den agentiska loopen, vilket gjorde att overheaden i API-tjänsterna var lätt att dölja. I takt med att inferensen blir snabbare blir den samlade overheaden i API-tjänsterna under en agentisk körning betydligt mer märkbar.

I det här inlägget förklarar vi hur vi gjorde agentloopar som använder API:et 40 % snabbare från början till slut, vilket gör att användarna faktiskt märker ökningen i inferenshastighet från 65 till nästan 1 000 token per sekund. Vi uppnådde detta genom cachning, genom att eliminera onödiga nätverkshopp, förbättra vår säkerhetsstack så att problem kan flaggas snabbt och – viktigast av allt – genom att bygga ett sätt att skapa en beständig anslutning till Responses API i stället för att behöva göra en serie synkrona API-anrop.

Diagram med titeln ”A Codex agent loop in practice” som visar ett iterativt flöde mellan Codex och Responses API, där verktygsanrop (rg, sed, apply_patch, pytest) och resultat utbyts fram till det slutliga meddelandet: ”The bug has been fixed.”

När API:et blev en flaskhals

I Responses API körde tidigare flaggskeppsmodeller som GPT‑5 och GPT‑5.2 med ungefär 65 token per sekund (TPS). Vid lanseringen av GPT‑5.3‑Codex‑Spark, en snabb modell för kodning, var vårt mål att vara tio gånger snabbare: över 1 000 TPS, tack vare specialiserad Cerebras-hårdvara optimerad för LLM-inferens. För att säkerställa att användarna kunde uppleva den verkliga hastigheten hos den här nya modellen var vi tvungna att minska API-belastningen. 

Omkring november 2025 inledde vi en prestandasprint för Responses API, där vi genomförde många optimeringar av latensen i den kritiska sökvägen för en enskild begäran. 

  • Cacha renderade tokens och modellkonfiguration i minnet för att undvika kostsam tokenisering och nätverksanrop vid fleromgångssvar
  • Minskad latens från nätverkshopp genom att eliminera anrop till mellanliggande tjänster (till exempel upplösning vid bildbehandling) och anropa inferenstjänsten direkt
  • Förbättra vår säkerhetsstack så att vi kunde köra vissa klassificerare för att flagga samtal snabbare

Med dessa förbättringar såg vi nästan 45 % förbättring i tid till första token (TTFT) – vilket återspeglar hur responsivt API:et känns – men dessa förbättringar var fortfarande inte tillräckligt snabba för GPT‑5.3‑Codex‑Spark. Trots dessa förbättringar var omkostnaderna för Responses API fortfarande för stora i förhållande till modellens hastighet, det vill säga att användarna var tvungna att vänta på de processorer som körde vårt API innan de kunde använda de grafikprocessorer som servade modellen.

Det djupare problemet var strukturellt: Vi behandlade varje Codex-begäran som fristående och bearbetade konversationens tillstånd och annan återanvändbar kontext i varje efterföljande begäran. Även när större delen av konversationen inte hade ändrats betalade vi fortfarande för arbete som var knutet till hela historiken. När samtalen blev längre blev den upprepade bearbetningen dyrare.

Skapa en beständig anslutning

För att förbättra designen omvärderade vi transportprotokollet: Kunde vi behålla en beständig anslutning och lagra tillstånd i cache, istället för att skapa en ny anslutning via HTTP och skicka hela konversationshistoriken för varje uppföljningsförfrågan? Tanken var att endast skicka ny information som behövde valideras och bearbetas samt lagra återanvändbart tillstånd i minnet under anslutningens livstid. Detta skulle minska arbetsbördan från överflödigt arbete.

Vi övervägde några olika metoder, inklusive WebSockets och gRPC-dubbelriktad strömning. Vi valde WebSockets eftersom det är ett enkelt protokoll för meddelandeöverföring, vilket innebär att användarna inte behövde ändra sina in- och utdataformat för Responses API. Det var utvecklarvänligt och passade väl in i vår befintliga arkitektur med minimala störningar.

Den första WebSocket-prototypen förändrade vad vi trodde var möjligt för latensen i Responses API. En ingenjör i Codex-teamet med djup expertis inom hela API-stacken tog fram en prototyp genom att köra en Codex-agent över natten.

I den prototypen modellerades agentiska körningar som ett enda långvarigt Response-objekt. Med hjälp av funktioner i asyncio blockerade Responses API asynkront i samplingsloopen efter att ett verktygsanrop hade genererats, och skickade sedan tillbaka en response.done-händelse till klienten. När verktygsanropet hade körts skickade klienten tillbaka en response.append-händelse med verktygsresultatet, vilket avblockerade samplingsloopen och gjorde att modellen kunde fortsätta.

En liknelse här är att se det lokala verktygsanropet som ett värdbaserat verktygsanrop. När modellen anropar webbsökning blockeras inferensloopen, en webbsökningstjänst anropas och tjänstens svar placeras i modellens kontext. I vår design gjorde vi samma sak, men i stället för att anropa en fjärrtjänst skickade vi modellens verktygsanrop tillbaka till klienten via WebSocket-anslutningen. När klienten svarade lade vi klientens verktygsanropssvar i kontexten och fortsatte att generera.

Den här designen var mycket effektiv eftersom den eliminerade upprepat API-arbete vid en agents utrullning. Vi kunde utföra arbete före inferens en gång, pausa för verktygskörning och sedan utföra arbete efter inferens en gång i slutet.

Tyvärr skedde detta på bekostnad av en mindre välbekant och mer komplicerad API-utformning. Vi ville göra det möjligt för utvecklare att lägga till stöd för WebSocket utan att behöva skriva om sin API-integration kring ett nytt interaktionssätt.

Bevara API:et välbekant samtidigt som stacken görs mer stegvis

För den version vi lanserade gick vi tillbaka till ett välbekant upplägg: Att fortsätta använda response.create med samma brödtext, och använda previous_response_id för att fortsätta konversationens kontext utifrån den föregående responsens tillstånd.

På en WebSocket-anslutning håller servern en anslutningsspecifik cache i minnet för tidigare svarstillstånd. När en efterföljande response.create innehåller previous_response_id hämtar vi tillståndet från cachen istället för att bygga upp hela konversationen från grunden.

Det cachelagrade tillståndet inkluderar:

  • Det föregående response-objektet
  • Tidigare indata- och utdataobjekt
  • Verktygsdefinitioner och namnrymder
  • Återanvändbara artefakter för sampling, som tidigare renderade tokens
Diagram med titeln ”From sequential requests to overlapped execution” som jämför en sekventiell förfrågningspipeline med en WebSocket-baserad metod där flera förfrågningar överlappar mellan validerings-, preinference-, sampling- och postinference-steg.

Genom att återanvända det tidigare svarstillståndet i minnet kunde vi genomföra flera större optimeringar:

  • Låta vissa av våra säkerhetsklassificerare och begärandevalidatorer bara bearbeta nya indata, inte hela historiken varje gång
  • Behålla en cache i minnet med renderade token som vi successivt lägger till i, så att vi kan hoppa över onödig tokenisering.
  • Återanvända vår framgångsrika logik för modellupplösning och dirigering mellan förfrågningar 
  • Överlappande icke-blockerande arbete efter inferens, såsom fakturering, med efterföljande förfrågningar

Målet var att komma så nära som möjligt en prototyp med minimal overhead, men med en API-struktur som utvecklare redan förstod och hade byggt kring.

Ny standard för hastighet

Efter en två månader lång sprint för att bygga WebSocket-läget lanserade vi en alfaversion tillsammans med ledande startups inom kodagenter, så att de kunde integrera lösningen i sin infrastruktur och successivt skala upp trafiken på ett säkert sätt. Alfaanvändarna gillade detta skarpt och rapporterade förbättringar på upp till 40 %(öppnas i ett nytt fönster) i sina agentiska arbetsflöden. Med tanke på den positiva feedbacken från alfaversionen var vi redo att lansera.

Resultaten av lanseringen kom omedelbart. Codex styrde snabbt över merparten av sin trafik för Responses API till WebSocket-läge och såg betydande latensförbättringar. För GPT‑5.3‑Codex‑Spark nådde vi vårt mål på 1 000 TPS och såg toppar på upp till 4 000 TPS, vilket visade att Responses API kunde hålla jämna steg med betydligt snabbare inferens i verklig produktionstrafik. Effekten visade sig snabbt också i utvecklarcommunityt:

WebSocket-läget är en av de mest betydelsefulla nya funktionerna i Responses API sedan lanseringen i mars 2025. Vi gick från idé till drift i produktion på bara några veckor genom ett nära samarbete mellan OpenAI:s API- och Codex-team. Det förbättrar inte bara latensen för agentutrullning dramatiskt, utan stöder också ett växande behov hos utvecklare: i takt med att modellinferens blir snabbare måste även de tjänster och system som omger inferensen snabbas upp för att föra vidare dessa förbättringar till användarna. 

Författare

Brian Yu, Ashwin Nathan

Tack

Ett stort tack till Responses API- och Codex-teamen som har arbetat med att utveckla WebSocket-läget.