Како смо изградили OWL, нову архитектуру иза нашег прегледача Atlas заснованог на ChatGPT‑у
Поглед у нашу нову процесну архитектуру, која вам даје бржи и паметнији начин коришћења веба.
Аутори: Ken Rockot, члан техничког особља, и Ben Goodger, директор инжењеринга, ChatGPT Atlas
Прошле недеље смо представили ChatGPT Atlas, нов начин прегледања веба уз ChatGPT поред вас. Поред тога што је веб-прегледач са пуним скупом функција, Atlas нуди и увид у будућност: свет у коме ChatGPT можете повести са собом широм интернета да постављате питања, добијате предлоге и обављате задатке. У овом тексту објашњавамо један од најсложенијих инжењерских аспеката производа: како смо ChatGPT претворили у прегледач који постаје кориснији што га више користите.
Претворити ChatGPT у правог копилота за веб значило је поново осмислити целокупну архитектуру прегледача: одвојити Atlas од Chromium runtime-а. То је подразумевало развој новог начина интеграције Chromium-а који нам омогућава да испунимо циљеве производа: тренутно покретање, одзивност чак и када отворите више картица и стварање чврсте основе за агентске случајеве употребе.

Chromium је био природан градивни елемент. Пружа најсавременији веб механизам са робусним безбедносним моделом, доказаним перформансама и ненадмашном веб компатибилношћу. Поред тога, развија га глобална заједница која га непрестано унапређује. То је чест избор за модерне десктоп веб-прегледаче.
Наш талентовани дизајнерски тим имао је амбициозне циљеве за корисничко искуство, укључујући богате анимације и визуелне ефекте за функције као што је Agent mode. То је захтевало да наш инжењерски тим користи најсавременије изворне оквире за наш UI (SwiftUI, AppKit и Metal), уместо да само визуелно препакује open source Chromium UX. Као резултат тога, UI Atlas-а је свеобухватна поновна изградња целокупног UX-а апликације.
Имали смо и друге циљеве производа, попут брзог покретања и подршке за стотине картица без нарушавања перформанси. Те циљеве је било тешко постићи са Chromium-ом каквим долази, јер има јасно дефинисан став о многим детаљима, од секвенце покретања, преко модела нити, до модела картица. Разматрали смо значајне измене у том делу, али смо желели да наш скуп закрпа у односу на Chromium остане усмерен, како бисмо могли брзо да интегришемо нове верзије. Да бисмо максимално убрзали темпо развоја, морали смо да осмислимо другачији начин интеграције и управљања Chromium runtime-ом.
Лакмус тест за наше техничко улагање није био само то да ће омогућити брже експериментисање, итерације и испоруку нових функција – већ и то да ће нам омогућити да задржимо кључни део инжењерске културе у OpenAI-ју: испоруку већ првог дана. Сваки нови инжењер направи и споји малу измену поподне првог радног дана. Морали смо да се уверимо да је то могуће иако за преузимање и изградњу Chromium-а могу бити потребни сати.
Наш одговор на ове изазове био је да изградимо нови архитектонски слој који зовемо OWL: OpenAI’s Web Layer. OWL је наша интеграција Chromium-а, што подразумева покретање Chromium-овог browser process-а изван главног процеса апликације Atlas.
Замислите то овако: Chromium је револуционисао прегледаче премештањем картица у засебне процесе. Ми ту идеју идемо корак даље тако што сам Chromium измештамо из главног процеса апликације у изоловани сервисни слој. Та промена доноси низ предности:
- Једноставнија, модерна апликација: Atlas је скоро у потпуности изграђен у SwiftUI-ју и AppKit-у. Један језик, један технолошки стек, једна чиста база кода.
- Брже покретање: Chromium се асинхроно покреће у позадини. Atlas не чека — пиксели се појављују на екрану готово тренутно.
- Изолација од застоја и падова: Chromium је моћан и сложен веб механизам. Ако му се главна нит заглави, Atlas не стаје. Ако се сруши, Atlas остаје активан.
- Мање проблема при спајању: Пошто не градимо на толиком делу Chromium open source UI-ја, наша разлика у односу на upstream Chromium је много мања и лакша за одржавање.
- Брже итерације: Већина инжењера никада не мора локално да гради Chromium. OWL се интерно испоручује као унапред изграђен бинарни фајл, па изградња Atlas-а траје минуте, а не сате.
Пошто већина инжењера у нашем тиму не гради редовно Chromium из изворног кода, развој може да иде много брже — чак и нови чланови тима могу да споје једноставне измене већ првог поподнева.
На високом нивоу, прегледач Atlas је OWL Client, а Chromium browser process је OWL Host. Они комуницирају преко IPC-а, конкретно преко Mojo(отвара се у новом прозору), Chromium-овог сопственог система за размену порука. Написали смо прилагођене Swift (па чак и TypeScript) binding-е за Mojo, тако да наша Swift апликација може директно да позива интерфејсе на страни host-а.
Библиотека OWL client-а излаже једноставан јавни Swift API, који апстрахује неколико кључних концепата које излаже сервисни слој host-а:
- Session: Конфигуришите и глобално контролишите host
- Profile: Управљајте стањем прегледача за одређени кориснички профил
- WebView: Контролишите и уградите појединачне веб садржаје (нпр. приказ, унос, навигација, зум итд.)
- WebContentRenderer: Прослеђујте улазне догађаје у Chromium-ов pipeline за исцртавање и примајте повратне информације од renderer-а
- LayerHost/Client: Размењујте информације о композитовању између UI-ја и Chromium-а
Постоји и широк спектар service endpoint-ова за управљање функцијама вишег нивоа као што су обележивачи, преузимања, екстензије и аутоматско попуњавање.
WebView-ови, који деле међусобно искључив простор за приказ у клијентској апликацији, смењују се унутар заједничког контејнера за композитовање. На пример, прозор прегледача често има један видљив заједнички контејнер и избор картице у траци картица замењује WebView те картице у том контејнеру. На Chromium страни, овај контејнер одговара објекту gfx::AcceleratedWidget који је на крају подржан објектом CALayer. ID контекста тог слоја излажемо клијенту, где га NSView уграђује користећи приватни API CALayerHost.
Посебни случајеви као што су падајући менији <select> или бирачи боја, које Chromium исцртава у засебним popup widget-има, користе исти приступ. Они немају content::WebContents, али имају content::RenderWidgetHostView са сопственим gfx::AcceleratedWidget, тако да се исти делегирани модел исцртавања примењује.
OWL интерно одржава геометрију приказа синхронизованом са Chromium страном, тако да GPU композитор може сходно томе да се ажурира и увек производи садржај слоја исправне величине и размере уређаја.
Ову технику такође поново користимо да бисмо селективно пројектовали елементе Chromium-овог сопственог изворног Views UI-ја у Atlas (ово је такође корисно за брзо покретање функција као што су упити за дозволе без израде замена од нуле у SwiftUI-ју). Ова техника се у великој мери ослања на постојећу Chromium инфраструктуру за инсталибилне веб апликације на macOS-у.
Chromium UI преводи догађаје платформе (попут macOS NSEvent-а) у Blink-ов модел WebInputEvent пре него што их проследи renderer-има. Али пошто OWL покреће Chromium у скривеном процесу, ми тај превод радимо сами унутар Swift client библиотеке и већ преведене догађаје прослеђујемо Chromium-у.
Одатле они прате исти животни циклус који би прави улазни догађаји обично пратили за веб садржај. То укључује и да се догађаји врате клијенту кад год страница укаже да није обрадила догађај. Када се то деси, поново синтетишемо NSEvent и дајемо остатку апликације прилику да обради унос.
Агентска функција прегледања у Atlas-у поставља неке јединствене изазове за наше приступе исцртавању, прослеђивању улазних догађаја и складиштењу података.
Наш модел за коришћење рачунара очекује једну слику екрана као улаз. Али неки UI елементи, као што су падајући менији <select> , исцртавају се изван граница картице у засебним прозорима. У Agent mode-у те popup-ове поново композитујемо у главну слику странице на тачним координатама како би модел видео пуни контекст у једном кадру.
За унос примењујемо исти принцип: догађаји које генерише агент усмеравају се директно рендереру, никада кроз привилеговани слој прегледача. То чува границу sandbox-а чак и под аутоматизованом контролом. На пример, не желимо да ова класа догађаја синтетише пречице са тастатуре које наводе прегледач да ради ствари које нису повезане са приказаним веб садржајем.
Агентско прегледање може да ради и у ефемерном контексту „одјављеног“ корисника. Уместо да делимо постојећи кориснички Incognito профил, што би могло да открије стање, користимо Chromium-ову инфраструктуру StoragePartition да покренемо изолована складишта у меморији. Свака агентска сесија почиње изнова и, када се заврши, сви колачићи и подаци сајта се одбацују. Можете покренути више „одјављених“ агентских сесија, сваку у сопственој картици прегледача, и сваку потпуно изоловану од осталих.
Ништа од овога не би било могуће без глобалне Chromium заједнице и њиховог невероватног рада на изградњи темеља за савремени веб. OWL гради на том темељу на нов начин: раздвајањем механизма од апликације, спајањем веб платформе светске класе са модерним изворним оквирима и откључавањем брже и флексибилније архитектуре.
Поновним промишљањем начина на који прегледач држи Chromium, стварамо простор за нове врсте искустава: глаткије покретање, богатији UI, теснију интеграцију са остатком ОС-а и развојни циклус који се креће брзином идеја. Ако вам то звучи као изазов по вашој мери, погледајте отворене позиције за рад на Atlas-у као Software Engineer, Atlas, Software Engineer, iOS и друге.
Испробајте Atlas на chatgpt.com/atlas(отвара се у новом прозору).
Захвалнице
Посебно се захваљујемо Darin Fisher-у и Marie Shin, који су допринели овом тексту, као и целом OpenAI тиму који је изградио Atlas.


