Jäta vahele ja mine põhisisu juurde
OpenAI

4. veebruar 2026

Inseneriteadus

Codexi raamistiku avastamine: kuidas me App Serveri ehitasime

Celia Chen, tehnilise meeskonna liige

Laadimine…

OpenAI kodeerimisagent Codex on saadaval paljudel erinevatel platvormidel: veebirakenduse(avaneb uues aknas), CLI(avaneb uues aknas), IDE laienduse(avaneb uues aknas) ja uue Codex macOS-i rakendusena. Tegelikult juhib neid kõiki sama Codexi raamistik—agendi tsükkel ja loogika, mis on kõigi Codexi kogemuste aluseks. Mis on nendevaheline kriitiline seos? Codex App Server(avaneb uues aknas), kliendisõbralik ja kahesuunaline JSON-RPC1 API.

Selles postituses tutvustame Codexi rakendusserverit; jagame oma seniseid õppetunde parimate viiside kohta, kuidas tuua Codexi võimalused sinu tootesse, et aidata kasutajatel oma töövooge märkimisväärselt kiirendada. Käsitleme App Serveri arhitektuuri ja protokolli ning seda, kuidas see integreerub erinevate Codexi kasutuspindadega, samuti näpunäiteid Codexi kasutamiseks, olenemata sellest, kas tahad muuta Codexi koodiretsensendiks, SRE agendiks või kodeerimisassistendiks.

App Serveri päritolu

Enne arhitektuuri juurde sukeldumist on kasulik teada App Serveri taustalugu. Algselt oli App Server praktiline viis raamistiku Codex taaskasutamiseks eri toodetes, mis aja jooksul arenes meie standardprotokolliks.

Codex CLI alustas TUI-na (terminali kasutajaliides), mis tähendab, et Codexile pääseb ligi terminali kaudu. Kui me ehitasime VS Code'i laienduse (IDE-sõbralikuma viisi Codexi agentidega suhtlemiseks), vajasime viisi, kuidas kasutada sama raamistikku, et saaksime IDE kasutajaliidesest käivitada sama agendi tsükli ilma seda uuesti rakendamata. See tähendas rikkalike interaktsioonimustrite toetamist väljaspool päringut/vastust, näiteks tööjaama uurimist, edenemise voogedastust, kui agent arutleb, ja erinevuste väljastamist. Esmalt katsetasime seda, et avalikustame Codexi MCP-serverina(avaneb uues aknas), kuid MCP semantika säilitamine viisil, mis oleks VS Code'i jaoks mõistlik, osutus keeruliseks. Selle asemel tutvustasime JSON-RPC protokolli, mis peegeldas TUI tsüklit ja millest sai App Serveri mitteametlik esimene versioon(avaneb uues aknas). Sel ajal ei arvanud me, et teised kliendid hakkavad App Serverist sõltuma, seega ei olnud see kavandatud olema stabiilne API.

Kuna Codexi kasutuselevõtt kasvas järgmiste kuude jooksul, soovisid sisemised meeskonnad ja välised partnerid võimalust integreerida sama raamistikku oma toodetesse, et kiirendada oma kasutajate tarkvaraarenduse töövooge. Näiteks soovisid JetBrains ja Xcode IDE-tasemel agendikogemust, samal ajal kui Codexi töölauarakendus pidi orkestreerima samaaegselt paljude Codexi agentide toimimist. Need nõudmised sundisid meid looma platvormi pinnast, millele nii meie tooted kui ka partnerite integratsioonid saaksid aja jooksul turvaliselt toetuda. Seda pidi olema lihtne integreerida ja see pidi olema tagasiühilduv, mis tähendas, et saime protokolli arendada ilma olemasolevaid kliente lõhkumata.

Järgmiseks vaatame, kuidas me kujundasime arhitektuuri ja protokolli, et erinevad kliendid saaksid sama raamistikku kasutada.

Codexi raamistiku sees

Esmalt vaatame lähemalt, mis on Codexi raamistiku sees ja kuidas Codex App Server selle klientidele kättesaadavaks teeb. Meie viimases Codex blogis analüüsisime agendi tsükli põhiloogikat, mis korraldab kasutaja, mudeli ja tööriistade vahelist suhtlust. See on Codexi raamistiku põhiline loogika, kuid täieliku agendi kogemuse jaoks on veel enamat:

1. Lõime elutsükkel ja püsivus. Lõim on Codexi vestlus kasutaja ja agendi vahel. Codex loob, jätkab, kahveldab ja arhiveerib lõimesid ning säilitab sündmuste ajaloo, et kliendid saaksid uuesti ühenduda ja kuvada järjepideva ajajoone.

2. Konfiguratsioon ja autentimine. Codex laadib konfiguratsiooni, haldab vaikeseadeid ja käivitab autentimisvooge, nagu „Logi sisse ChatGPT‑ga“, sealhulgas mandaadi olekut.

3. Tööriista käivitamine ja laiendused. Codex käivitab koore/faili tööriistu liivakastis ja ühendab integratsioone, nagu MCP-serverid ja oskused, et need saaksid osaleda agendi tsüklis ühtse poliitikamudeli alusel.

Kogu siin mainitud agendi loogika, sealhulgas põhiline agendi tsükkel, asub Codex CLI koodibaasi osas nimega “Codex core(avaneb uues aknas).” Codex core on nii teek, kus asub kogu agendi kood, kui ka käituskeskkond, mida saab käivitada agendi tsükli käitamiseks ja ühe Codexi lõime (vestluse) püsivuse haldamiseks.

Olemaks kasulik, peab Codex olema klientidele kättesaadav. Siin astub mängu App Server.

Diagramm pealkirjaga „Rakendusserveri protsessivoog”. Klient saadab JSON-RPC sõnumeid stdio-lugejale, mis suunab päringud Codexi sõnumiprotsessorile. Protsessor suhtleb lõimehalduri ja tuumlõimega otsingulõimede, lõimepidemete, esitatud päringute ja sündmuste/värskenduste kaudu ning seejärel tagastab vastused kliendile.

Rakendusserver on nii JSON-RPC protokoll kliendi ja serveri vahel kui ka pikaealine protsess, mis majutab Codexi tuumlõimesid. Nii nagu ülaltoodud diagrammist näeme, on App Serveri protsessil neli põhikomponenti: stdio-lugeja, Codexi sõnumiprotsessor, lõimehaldur ja põhilõimed. Lõimehaldur käivitab iga lõime jaoks ühe tuumsessiooni ning Codexi sõnumiprotsessor suhtleb seejärel iga tuumsessiooniga otse, et esitada kliendipäringuid ja saada värskendusi.

Üks kliendipäring võib põhjustada palju sündmuste värskendusi ning just need üksikasjalikud sündmused võimaldavad meil luua rikkaliku kasutajaliidese App Serveri peale. Lisaks toimivad stdio reader ja Codexi sõnumiprotsessor tõlkekihina kliendi ja Codexi tuumlõimede vahel. Nad tõlgivad kliendi JSON-RPC päringud Codexi tuumtoiminguteks, kuulavad Codexi tuuma sisemist sündmuste voogu ja seejärel teisendavad need madala taseme sündmused väikeseks hulgaks stabiilseteks, kasutajaliidesele valmis JSON-RPC teavitusteks.

JSON-RPC protokoll kliendi ja App Serveri vahel on täielikult kahesuunaline. Tüüpilisel lõimel on kliendi päring ja palju serveriteateid. Lisaks võib server algatada päringuid, kui agent vajab sisendit, näiteks kinnitust, ja seejärel peatada käigu, kuni klient vastab.

Vestluse põhielemendid

Järgmisena võtame lahti vestluse põhielemendid, App Serveri protokolli ehitusplokid. Agenditsükli jaoks API kujundamine on keeruline, sest kasutaja/agendi suhtlus ei ole kõigest päring/vastus põhine. Üks kasutaja päring võib lahti rulluda struktureeritud tegevuste jadaks, mida klient peab täpselt esitama: kasutaja sisend, agendi järkjärguline edenemine, teel loodud artefaktid (nt erinevused). Selleks, et muuta see interaktsioonivoog hõlpsasti integreeritavaks ja vastupidavaks erinevates kasutajaliidestes, jõudsime kolme selgete piiride ja elutsüklitega põhiprimitiivini:

1. kirje: kirje on Codexis sisendi/väljundi aatomühik. Üksused on tüübistatud (nt kasutaja sõnum, agendi sõnum, tööriista käivitamine, kinnitustaotlus, diff) ja igal neist on selge elutsükkel.

  • objekt/alustatud kui üksus algab
  • valikulised objekt/*/delta sündmused sisuvoogudena (voogedastatavate objektide tüüpide jaoks)
  • objekt/lõpetatud, kui üksus lõpetab oma lõpliku koormusega

See elutsükkel võimaldab klientidel alustada renderdamist kohe, kui olek on alustatud, voogedastada järkjärgulisi värskendusi olekus delta ja lõpetada, kui olek on lõpetatud.

2. Käik: käik on üks agendi tööühik, mille algatab kasutaja sisend. See algab siis, kui klient esitab sisendi (näiteks „käivita testid ja summeeri vead”) ja lõpeb siis, kui agent lõpetab selle sisendi väljundite loomise. Käik sisaldab üksuste jada, mis esindavad vahepealseid samme ja väljundeid, mis teekonna jooksul luuakse.

3. Lõim: lõim on vastupidav konteiner, mis hoiab käimasolevat Codexi seanssi kasutaja ja agendi vahel. See sisaldab mitut käiku. Lõime saab luua, jätkata, hargneda ja arhiveerida. Lõime ajalugu salvestatakse püsivalt, et kliendid saaksid uuesti ühenduda ja kuvada ühtset ajajoont.

Nüüd vaatame lihtsustatud vestlust kliendi ja agendi vahel, kus vestlus on esitatud algelementidena:

Diagramm sildiga „Kliendi-serveri protokolli sõnumivoog: algatamise kinnitus.” Klient saadab serverile algatuspäringu koos kliendiinfoga. Server vastab tulemussündmusega, mis sisaldab kasutaja agendi sõne "my_client/1.0.”

Vestluse alguses peavad klient ja server looma algatamise kinnituse. Klient peab enne mistahes muud meetodit saatma ühe algatmaise päringu ja server kinnitab selle vastusega. See annab serverile võimaluse oma võimekusi reklaamida ja võimaldab mõlemal poolel kokku leppida protokolli versioonihalduses, funktsioonilippudes ja vaikeseadetes enne, kui tegelik töö algab. Siin on näide OpenAI VS Code'i laienduse päringust:

JSON

1
{
2
"method": "initialize",
3
"id": 0,
4
"params": {
5
"clientInfo": {
6
"name": "codex_vscode",
7
"title": "Codex VS Code Extension",
8
"version": "0.1.0"
9
}
10
}
11
}

See on see, mille server tagastab:

JSON

1
{
2
"id": 0,
3
"result": {
4
"userAgent": "codex_vscode/0.94.0-alpha.7 (Mac OS 26.2.0; arm64) vscode/2.4.22 (codex_vscode; 0.1.0)"
5
}
6
}
Diagramm pealkirjaga „Kliendi-serveri protokolli sõnumivoog: lõime ja käigu elutsükkel.” Klient saadab serverile lõim/algus ja käik/algus päringud. Server väljastab sündmusi—lõim/alustatud, käik/alustatud, objekt/alustatud ja objekt/lõpetatud—mis näitavad käiku, kus kasutaja sõnum on „tee testid ja kokkuvõte vigadest.”

Kui klient esitab uue päringu, loob see esmalt lõime ja seejärel käigu. Server saadab tagasi edenemise teavitused (thread/started ja turn/started). See saadab tagasi ka sisendeid, mida see registreerib objektidena, näiteks siin oleva kasutaja sõnumi.

Diagramm pealkirjaga „Kliendi-serveri protokolli sõnumivoog: tööriista käivitamine valikulise kinnitusega.” Tööriistakõne ajal väljastab server item/started ja seejärel objekt/käsu täitmine/päringu kinnitamine põhjendusega (“käivita testid”). Klient tagastab kinnitussündmuse (luba/keela). Seejärel väljastab server objekt/lõpetatud, mis näitab käsu täitmist ("pnpm test").

Tööriista kutsungid saadetakse samuti üksustena tagasi kliendile. Lisaks võib server küsida sinu kinnitust enne, kui saab toimingu käivitada, saates serveripäringu. Kinnitus peatab käigu, kuni klient vastab, kas „luban” või „keelan”. Selline näeb heakskiitmise voog välja VS Code'i laienduses:

Tumeda teemaga liidese loa viip, mis küsib: „Kas sa tahad lubada mul selle tööjaama jaoks teha pnpm testi?” See loetleb valikud: 1) Jah, 2) Jah ja ära küsi enam käskude puhul, mis algavad pnpm testiga, ja 3) Ei, allosas on nupp Esita.
Diagramm pealkirjaga „Kliendi-serveri protokolli sõnumivoog: voogedastuse agendi sõnumivoog.” Server voogedastab assistendi teate osade kaupa: objekt/käivitatud, kaks agendisõnumit/delta sündmust (“tegi 3 testi.”, “kõik läbitud”), siis üksus/lõpetatud. Voor lõpeb olekuga käik/lõpetatud.

Lõpuks saadab server agendi sõnumi ja lõpetab käigu käik/lõpetatud käsuga. Agendi sõnumi delta-sündmuste voog edastab sõnumi osad tagasi, kuni sõnum on lõpule viidud sündmusega objekt/lõpetatud.

Diagrammil olevad sõnumid on lihtsustatud, et neid oleks lihtsam lugeda. Kui soovid näha täieliku pöörde JSON-i, saad käivitada testkliendi Codex CLI repo-st.

Bash

1
codex debug app-server send-message-v2 "run tests and summarize failures"

Klientidega integreerimine

Nüüd vaatame, kuidas erinevad kliendipinnad integreerivad Codexi App Serveri kaudu. Käsitleme kolme mustrit: kohalikud rakendused ja IDE-d, Codexi veebikäitusaeg ja TUI.

Diagramm pealkirjaga „Codexi kliendid, mis on rakendusserveri kaudu Codexi rakendusega integreeritud.” Esimese osapoole kliendid (Codex Desktop App, TUI/CLI, Web Runtime) ja kolmandate osapoolte integratsioonid (JetBrains IDE-d, VS Code, Xcode) suhtlevad Codexi raamistikuga JSON-RPC kutsete kaudu.

Kõigi kolme puhul toimub transport JSON-RPC kaudu stdio (JSONL). JSON-RPC muudab lihtsaks kliendisidumiste loomise teie valitud keeles. Codexi pinnad ja partnerite integratsioonid on rakendanud rakendusserveri kliente sellistes keeltes nagu Go, Python, TypeScript, Swift ja Kotlin. TypeScripti jaoks saad definitsioonid otse Rusti protokollist luua, käivitades:

Bash

1
codex app-server generate-ts

Teiste keelte jaoks saad genereerida JSON-skeemi komplekti ja suunata selle oma eelistatud koodigeneraatorisse, käivitades:

Bash

1
codex app-server generate-json-schema
Kohalikud rakendused ja IDE-d
Kuvatõmmis VS Code'ist, millel on töös Codexi laiendus. Rusti testifail on avatud ja selle all kirjeldab Codexi paneel fmt ja cargo test -p codex-app-server käivitamist, teatades, et vormindamine ja testid on käimas, oodates lõplikku õnnestumise/ebaõnnestumise tulemust.

Kohalikud kliendid komplekteerivad või hangivad tavaliselt platvormispetsiifilise App Serveri binaarfaili, käivitavad selle pikaajaliselt töötava alamprotsessina ja hoiavad JSON-RPC jaoks avatud kahesuunalise stdio-kanali. Näiteks meie VS Code'i laienduses ja töölauarakenduses sisaldab tarnitud artefakt platvormipõhist Codexi binaarfaili ning on seotud testitud versiooniga, et klient käivitaks alati täpselt need bitid, mida me valideerisime.

Mitte iga integratsioon ei saa kliendivärskendusi sageli saata. Mõned partnerid, nagu Xcode, eraldavad väljalasketsüklid, hoides kliendi stabiilsena ja võimaldades sellel vajaduse korral osutada uuemale App Serveri binaarile. Nii saavad nad kasutusele võtta serveripoolsed täiustused (näiteks parem automaatne tihendamine Codexi tuumas või äsja toetatud konfiguratsioonivõtmed) ja juurutada veaparandusi, ootamata kliendiväljalaset. Rakendusserveri JSON-RPC liides on loodud tagurpidi ühilduvaks, et vanemad kliendid saaksid turvaliselt uuemate serveritega suhelda.

Codex Web
Kuvatõmmis Codexi veebiliidesest, mis näitab värskendust pealkirjaga „Uuenda sisselogimise õnnestumise teadet.” Vasak paneel võtab kokku muudatused, testid ja muudetud failid, samal ajal kui parem paneel kuvab login.rs koodierinevuse koos uuendatud sisselogimise õnnestumise sõnumi sõnastusega.

Codex Web kasutab Codex raamistikku, kuid käitab seda konteinerkeskkonnas. Töötaja varustab konteineri välja registreeritud tööjaamaga, käivitab selle sees App Serveri binaarfaili ja hoiab stdio2 kanali kaudu pikaajalist JSON-RPC ühendust. Veebirakendus (töötab kasutaja brauseri vahekaardil) suhtleb Codexi taustsüsteemiga HTTP ja SSE kaudu, mis voogedastab töötleja poolt toodetud tööülesannete sündmusi. See hoiab brauseripoolse kasutajaliidese kergena, pakkudes samal ajal meile ühtlast käitusaega nii töölaual kui ka veebis.

Kuna veebiseansid on lühiajalised (vahekaardid suletakse, võrgud katkevad), ei saa veebirakendus olla pikaajaliste ülesannete tõeallikaks. Oleku ja edenemise hoidmine serveris tähendab, et töö jätkub isegi siis, kui vahekaart kaob. Voogedastusprotokoll ja salvestatud lõimeseansid muudavad uue seansi jaoks lihtsaks uuesti ühenduse loomise, jätkamise sealt, kus see pooleli jäi, ja järele jõudmise ilma kliendis olekut uuesti üles ehitamata.

TUI/Codex CLI
Kuvatõmmis terminalist, kus töötab Codex CLI. See kuvab OpenAI Codexi bännerit mudeliga GPT-5.2-Codex keskmine, kasutaja käsk „selgita mulle rakendusserverit“ ja olek „Töötlemisel“. Allpool kuvatakse soovitus: “kirjuta testid @failinimi jaoks,” koos kiirklahvide valikutega.

Ajalooliselt oli TUI „natiivne“ klient, mis töötas samas protsessis kui agendi tsükkel ja suhtles otse Rusti tuumtüüpidega, mitte rakendusserveri protokolliga. See tegi varajase iteratsiooni kiireks, kuid muutis TUI ka erijuhtumiks.

Nüüd, kui App Server on olemas, plaanime TUI ümber refaktoreerida(avaneb uues aknas), et see seda kasutaks ja käituks nagu iga teine klient: käivitada App Serveri alamprotsess, suhelda JSON-RPC kaudu stdio peal ning renderdada samad voogedastuse sündmused ja kinnitused. See avab töövood, kus TUI saab ühenduda kaugmasinas töötava Codex serveriga, hoides agenti arvutuse lähedal ja võimaldades tööd jätkata isegi siis, kui sülearvuti läheb unerežiimi või ühendus katkeb, pakkudes samal ajal kohapeal reaalajas värskendusi ja juhtnuppe.

Õige protokolli valimine

Codex App Server on edaspidi esmaklassiline integratsioonimeetod, mida me hooldame, kuid olemas on ka teisi meetodeid, mille funktsionaalsus on piiratum. Vaikimisi soovitame klientidel kasutada Codex App Serverit Codexiga integreerumiseks, kuid tasub uurida ka erinevaid integratsioonimeetodeid ja mõista nende eeliseid ja puudusi. Allpool on kõige levinumad viisid Codexi juhtimiseks ja millal igaüks neist võiks hästi sobida.

JSON-RPC protokollid

Codex MCP-serverina

Käivita codex mcp-server(avaneb uues aknas) ja ühenda mis tahes MCP-kliendiga, mis toetab stdio servereid (nt OpenAI Agents SDK(avaneb uues aknas)). See sobib hästi, kui sul on juba MCP-põhine töövoog ja soovid Codexi kutsutava tööriistana kasutada. Puuduseks on see, et saad ainult selle, mida MCP avaldab, seega Codex-spetsiifilised interaktsioonid, mis tuginevad rikkalikumale seansi semantikale (nt diff updates), ei pruugi MCP lõpp-punktide kaudu puhtalt kaardistuda.

Teenusepakkujate ülesed agendi raamistikprotokollid

Mõned ökosüsteemid pakuvad teisaldatavat liidest, mis suudab sihtida mitut mudelipakkujat ja käituskeskkonda. See võib hästi sobida, kui sa tahad üht abstraktsiooni, mis koordineerib mitut agenti. Kompromiss seisneb selles, et need protokollid koonduvad sageli võimekuste ühisele alamhulgale, mis võib muuta rikkalikumate interaktsioonide esitamise keerulisemaks, eriti kui teenusepakkujaspetsiifiliste tööriistade ja seansside semantika on oluline. See valdkond areneb kiiresti ja me eeldame, et tekivad levinumad standardid, kui leiame parimad primitiivid, millega esitada reaalse maailma agentide töövooge (oskused(avaneb uues aknas) on selle hea näide).

Codex App Server

Vali App Server, kui soovid, et täielik Codexi raamistik oleks kättesaadav stabiilse, kasutajasõbraliku sündmuste voona. Saad nii agendi tsükli täieliku funktsionaalsuse kui ka muud toetavad funktsioonid, nagu sisselogimine ChatGPT‑sse, mudelite avastamine ja konfiguratsioonihaldus. Peamine kulu on integreerimistöö, kuna sa pead oma keeles looma kliendipoolse JSON-RPC seostuse. Praktikas suudab Codex aga teha suure osa raskest tööst, kui annad talle JSON-skeemi ja dokumentatsiooni. Paljud meeskonnad, kellega me töötasime, suutsid Codexi abil kiiresti toimiva integratsiooni luua.

Muud viisid Codexi manustamiseks

Kerge, skriptitav CLI-režiim ühekordsete ülesannete ja CI-käivituste jaoks. See sobib hästi automatiseerimiseks ja andmetorustikeks, kus sa tahad, et üks käsk töötaks mitteinteraktiivselt lõpuni, voogedastaks logide jaoks struktureeritud väljundit ja lõpetaks selge õnnestumise või ebaõnnestumise signaaliga.

TypeScripti teek kohalike Codexi agentide programmiliseks juhtimiseks sinu enda rakenduse seest. See on parim, kui sa tahad serveripoolsete tööriistade ja töövoogude jaoks natiivset teegi liidest, ilma et peaksid eraldi JSON-RPC klienti looma. Kuna see tarniti varem kui App Server, toetab see praegu vähem keeli ja väiksemat funktsionaalsust. Kui arendajad on huvitatud, võime lisada täiendavaid SDK-sid, mis mähivad App Serveri protokolli, et meeskonnad saaksid katta suurema osa rakenduse pinnast ilma JSON-RPC sidumisi kirjutamata.

Seda edasi viies

Selles postituses jagasime, kuidas me läheneme agentidega suhtlemiseks uue standardi loomisele ja kuidas muuta Codexi raamistik stabiilseks, kliendisõbralikuks protokolliks. Me käsitlesime, kuidas App Server teeb Codexi tuuma kättesaadavaks, võimaldab klientidel juhtida kogu agendi tsüklit ning toetab laia valikut kasutuspindu, sealhulgas TUI-d, kohalikke IDE-integratsioone ja veebikäitusaega.

Kui see tekitas sul ideid Codexi integreerimiseks oma töövoogudesse, tasub App Serverit proovida. Kogu lähtekood asub Codex CLI avatud lähtekoodiga repo(avaneb uues aknas)s. Jaga julgelt oma tagasisidet ja funktsioonitaotlusi. Meil on hea meel sinust kuulda ja jätkata agentide kõigile kättesaadavamaks tegemist.

Autor

Celia Chen

Tänuavaldused

Erilised tänud Michael Bolinile, Owen Linile, Eric Trautile ja Rasmus Rygaardile, kes panustasid sellesse postitusse, ning kogu Codexi meeskonnale, kes App Serveri kallal töötas.

Joonealused märkused

  1. 1

    Kasutame “JSON‑RPC lite” varianti: see säilitab päringu/vastuse/teavituse kuju, kuid jätab välja "jsonrpc": "2.0" päis ja on vormistatud JSONL-ina stdio kaudu, mitte range JSON‑RPC 2.0-na.

  2. 2

     “stdio” viitab rakendusserveri stdin/stdout'ile konteineri sees. Hostitud seadistustes tunnelitakse need vood sageli üle püsiva võrguühenduse (nt WebSocket-laadse) konteineri käitusaja keskkonda—nii et see käitub nagu stdio isegi siis, kui see ei ole sõna otseses mõttes kohalik toru.