Agenter portet Copilot-runtimen til 800 000 linjer Rust for 120 000 dollar i tokens
GitHub har portet hele Copilot-agentruntimen fra TypeScript til 832 378 linjer produksjons-Rust med agenter som skrev det meste av koden, til en tokenregning på rundt 120 000 dollar.
130,6 milliarder cachede input-tokens, 4,2 milliarder cache-skrivinger, 900 millioner ferske input-tokens og 600 millioner output-tokens. Det er forbruket Stephen Toub, Distinguished Engineer i Microsoft, oppgir for porteringen av Copilot-agentruntimen i et innlegg på GitHub-bloggen 16. september. Han anslår i tillegg at porteringen utgjorde rundt 20 prosent av hans egne pull requests i perioden, altså omtrent tre ukers utviklertid.
«Den grove regningen for porteringsarbeidet var omtrent 120 000 dollar i tilskrevet tokenforbruk pluss tre uker av en utviklers tid» > — Stephen Toub, GitHub-bloggen
Runtimen er motoren bak Copilot CLI, Copilot-appen og Copilot SDK, og den samme koden ligger også under nyere utgaver av VS Code, Visual Studio og Copilot Code Review. Den var skrevet i TypeScript på Node.js, et fornuftig valg for et terminalverktøy, men dyrere når den samme runtimen skal betjene mange samtidige klienter i en tjeneste. Den opprinnelige planen fra mai anslo runtimen til rundt 130 000 linjer TypeScript. Toub anslår i ettertid at omtrent 430 000 linjer produksjons-TypeScript faktisk passerte gjennom porten, fordi resten av teamet fortsatte å skrive ny TypeScript mens jobben pågikk.
Ytelsestallene forklarer hvorfor de gadd. I en test som oppretter og river ned ti klientsesjoner etter hverandre, klarte TypeScript-versjonen 7,55 sykluser i sekundet. Rust ut-av-prosess klarte 57,45, og Rust i prosess 120,0. Minnebruken over baselinje for den samme ti-klientbatchen falt fra 1 383 MB til 247 MB ut-av-prosess og 126 MB i prosess.
Arbeidet gikk over 128 pull requests som ble slått sammen i main underveis, i et vindu på rundt fjorten og en halv uke med 135 utgivelser. GitHub valgte komponent-for-komponent-portering med interop mellom Rust og den gjenværende TypeScript-en, ikke en stor utskifting til slutt. Rene hjelpefunksjoner uten I/O kom først, session-orkestreringen sist. Rundt 60 npm-avhengigheter forsvant på veien, og js-tiktoken ble til tiktoken-rs med samme o200k_base-koding.
Det mest nyttige funnet ligger i verktøyloggen. Av 1 130 921 verktøykall kom 61 prosent fra subagenter og ikke fra hovedsesjonen, og agentene brukte omtrent ti ganger så mye arbeid på å lese filer, søke i repoet og kjøre diagnosekommandoer som på å endre kode. Den vanskeligste enkeltfilen, session.ts på rundt 30 000 linjer, ble tatt til slutt: sesjonen som portet den brukte de første 56 minuttene og 122 verktøykall på å lese, før den skrev en eneste linje.
«Ende-til-ende-tester er helt og uten forbehold kritiske» > — Stephen Toub, om den viktigste lærdommen fra porteringen
Hva bør du gjøre?
- Bygg ut ende-til-ende-testene før du slipper agenter løs på en portering. Toub skriver at så godt som alle regresjonene med manglende funksjonalitet skyldtes for tynn E2E-dekning, og at testene ikke kan skrives om underveis uten at du mister orakelet ditt.
- Vær eksplisitt om sluttilstanden i instruksjonen. «Port komponent X til Rust» ble lest som bare de varme stiene eller bare logikken, og agentene behandlet I/O og orkestrering som utenfor omfanget helt til målet ble formulert som en ferdig binærfil uten TypeScript igjen.
- Ikke stol på at kompilatoren fanger alt. Toub avviser eksplisitt forestillingen om at Rust-kode som kompilerer er riktig: regresjonslista var stort sett korrekthetsfeil, ikke minnefeil.
KI-kuratert — innholdet er generert av KI-agenter basert på originalkilden.