Как мы создали OWL — новую архитектуру нашего браузера Atlas на базе ChatGPT
Рассказываем о нашей новой архитектуре процессов, которая делает работу в Интернете быстрее и умнее.
Авторы: Кен Рокот (Ken Rockot), сотрудник технического отдела, и Бен Гудгер (Ben Goodger), руководитель инженерного отдела, ChatGPT Atlas
На прошлой неделе мы представили ChatGPT Atlas — новый способ работы в Интернете с ChatGPT под рукой. Помимо того, что Atlas является полнофункциональным веб-браузером, он открывает окно в будущее: мир, где вы можете брать ChatGPT с собой на любые сайты, чтобы задавать вопросы, получать рекомендации и выполнять задачи. В этой статье мы подробно разбираем один из самых сложных инженерных аспектов продукта: как мы превратили ChatGPT в браузер, который становится тем полезнее, чем дольше вы им пользуетесь.
Чтобы сделать ChatGPT настоящим вторым пилотом для веб-серфинга, потребовалось полностью переосмыслить архитектуру браузера: отделить Atlas от среды выполнения Chromium. Это повлекло за собой разработку нового способа интеграции Chromium, который позволяет нам достигать поставленных продуктовых целей: мгновенного запуск, отзывчивости даже при открытии большого количества вкладок, а также создания прочного фундамента для сценариев использования автономных агентов.
Формирование фундамента

Chromium был естественным строительным блоком. Он предоставляет современный веб-движок с надежной моделью безопасности, проверенными показателями производительности и непревзойденной совместимостью с веб-стандартами. Кроме того, его развивает глобальное сообщество, которое постоянно его совершенствует. Это стандартный выбор для современных настольных веб-браузеров.
Переосмысление интерфейса браузера
Наша талантливая команда дизайнеров поставила амбициозные цели в отношении пользовательского опыта, включая сложную анимацию и визуальные эффекты для таких функций, как режим агента. Из-за этого нашей инженерной команде пришлось задействовать самые современные нативные фреймворки для пользовательского интерфейса (SwiftUI, AppKit и Metal), вместо того чтобы просто изменить оформление открытого исходного кода пользовательского интерфейса Chromium. В результате пользовательский интерфейс Atlas представляет собой полностью переработанную версию UX всего приложения.
У нас были и другие продуктовые цели, такие как высокая скорость запуска и поддержка сотен вкладок без ущерба для производительности. Достичь этих целей с помощью стандартного Chromium было непросто, поскольку он имеет жесткие внутренние требования к последовательности загрузки, модели потоков и управлению вкладками. Мы рассматривали возможность внесения серьезных изменений, но хотели сохранить набор патчей для Chromium адресным, чтобы иметь возможность быстро интегрировать новые версии. Чтобы максимально ускорить темпы разработки, нам нужно было найти другой способ интеграции и управления средой выполнения Chromium.
Проверкой на прочность для наших технических инвестиций стало не только то, что они позволили бы быстрее экспериментировать, итерировать и выпускать новые функции, но и то, что они помогли бы сохранить важнейшую часть инженерной культуры OpenAI: релиз в первый же день. Каждый новый инженер создает и объединяет небольшой пул изменений во второй половине своего первого дня работы. Нам нужно было убедиться, что это возможно, несмотря на то, что выгрузка и сборка Chromium могут занять часы.
Наше решение: OWL
Нашим ответом на эти вызовы стало создание нового архитектурного слоя, который мы назвали OWL: OpenAI«s Web Layer (веб-слой от OpenAI). OWL — это наша интеграция Chromium, которая подразумевает запуск процесса браузера Chromium вне основного процесса приложения Atlas.
Суть подхода в следующем: Chromium произвел революцию в браузерах, вынеся вкладки в отдельные процессы. Мы развиваем эту идею дальше, перенося сам Chromium из основного процесса приложения в изолированный сервисный слой. Этот сдвиг дает целый ряд преимуществ:
- Более простое и современное приложение: Atlas почти полностью написан на SwiftUI и AppKit. Один язык, один технологический стек, одна чистая кодовая база.
- Более быстрый запуск: Chromium загружается асинхронно в фоновом режиме. Atlas не ждет — пиксели появляются на экране практически мгновенно.
- Изоляция от зависаний и сбоев: Chromium — мощный и сложный веб-движок. Если его основной поток зависает, Atlas продолжает работать. Если происходит сбой, Atlas остается активным.
- Меньше проблем при слиянии кода: Поскольку мы не задействуем большую часть интерфейса из открытого исходного кода Chromium, наши отличия от исходного репозитория Chromium намного меньше и проще в обслуживании.
- Более быстрая итерация: Большинству инженеров никогда не приходится собирать Chromium локально. OWL поставляется внутри компании в виде предварительно собранного бинарного файла, поэтому сборка Atlas занимает минуты, а не часы.
Поскольку большинство инженеров в нашей команде не собирают Chromium из исходного кода регулярно, разработка идет значительно быстрее — даже новые члены команды могут вливать простые изменения уже в первую половину своего первого дня.
Как работает OWL
Если говорить в общих чертах, браузер Atlas выступает в роли клиента OWL, а процесс браузера Chromium — в роли хоста OWL. Они общаются через межпроцессное взаимодействие (IPC), а именно черезMojo — собственную систему обмена сообщениями Chromium. Мы написали пользовательские привязки (bindings) на Swift (и даже на TypeScript) для Mojo, благодаря чему наше приложение на Swift может напрямую вызывать интерфейсы на стороне хоста.
Клиентская библиотека OWL предоставляет простой публичный API на Swift, который абстрагирует несколько ключевых концепций сервисного слоя хоста:
- Session (Сеанс): Настройка хоста и управление им в глобальном масштабе
- Profile (Профиль): Управление состоянием браузера для конкретного профиля пользователя
- WebView: Управление отдельными веб-компонентами и их встраивание (например, отрисовка, ввод, навигация, масштабирование и т. д.)
- WebContentRenderer: Передача событий ввода в конвейер рендеринга Chromium и получение обратной связи от движка рендеринга
- LayerHost/Client: Обмен информацией о компоновке между пользовательским интерфейсом и Chromium
Кроме того, имеется широкий спектр конечных точек сервиса для управления высокоуровневыми функциями, такими как закладки, загрузки, расширения и автозаполнение.
Рендеринг: перенос пикселей через границу процессов
Компоненты WebView, использующие взаимоисключающее пространство отображения в клиентском приложении, поочередно подключаются к общему контейнеру компоновки и отключаются от него. Например, окно браузера часто имеет один видимый общий контейнер, а выбор вкладки на панели вкладок переносит WebView этой вкладки в данный контейнер. На стороне Chromium этому контейнеру соответствует gfx::AcceleratedWidget, который в конечном итоге опирается на CALayer. Мы передаем идентификатор контекста этого слоя клиенту, где NSView встраивает его с помощью приватного API CALayerHost.
Особые случаи, такие как выпадающие списки или палитры цветов, которые Chromium отображает в отдельных всплывающих виджетах, используют тот же подход. У них нет content::WebContents, но у них естьcontent::RenderWidgetHostView со своим собственным gfx::AcceleratedWidget, поэтому применяется та же модель делегированного рендеринга.
OWL внутренне поддерживает геометрию представления в синхронизации со стороной Chromium, благодаря чему графический композитор может своевременно обновляться и всегда выдавать содержимое слоев правильного размера и с учетом масштаба устройства.
Мы также используем этот прием для выборочного проецирования элементов собственного нативного интерфейса Views от Chromium в Atlas (это также полезно для быстрого внедрения таких функций, как запросы разрешений, без необходимости создавать их заменители с нуля в SwiftUI). Этот метод во многом заимствован из существующей инфраструктуры Chromium для устанавливаемых веб-приложений на macOS.
Входные события: Распознавание и перенаправление
Интерфейс Chromium преобразует события платформы (такие как macOS NSEvents) в модель WebInputEvent движка Blink перед их перенаправлением в отрисовщики. Но поскольку OWL запускает Chromium в скрытом процессе, мы выполняем это преобразование самостоятельно внутри клиентской библиотеки Swift и передаем уже переведенные события в Chromium.
Далее они проходят тот же жизненный цикл, который обычно проходят реальные входные события для веб-контента. Это включает в себя возврат событий клиенту всякий раз, когда страница сигнализирует, что она не обработала событие. Когда это происходит, мы повторно синтезируем NSEvent и даем остальной части приложения возможность обработать ввод.
Режим агента: Особые случаи
Функция агентного просмотра в Atlas ставит перед нашими подходами к рендерингу, перенаправлению входных событий и хранению данных ряд уникальных задач.
Наша модель взаимодействия с компьютером ожидает в качестве входных данных единое изображение экрана. Но некоторые элементы интерфейса, такие как выпадающие списки , отображаются за пределами границ вкладки в отдельных окнах. В режиме агента мы компонуем эти всплывающие окна обратно в изображение основной страницы с правильными координатами, чтобы модель видела полный контекст в рамках одного кадра.
Для ввода мы применяем тот же принцип: события, сгенерированные агентом, направляются непосредственно в отрисовщик, минуя привилегированный слой браузера. Это сохраняет границу песочницы даже при автоматизированном управлении. Например, мы не хотим, чтобы этот класс событий синтезировал сочетания клавиш, заставляющие браузер выполнять действия, не связанные с отображаемым веб-контентом.
Просмотр с помощью агента также может работать в эфемерном контексте «без входа в систему» (logged-out). Вместо того чтобы использовать существующий профиль Инкогнито пользователя, что может привести к утечке состояния, мы используем инфраструктуру StoragePartition в Chromium для запуска изолированных хранилищ в оперативной памяти. Каждая сессия агента начинается с чистого листа, а по ее завершении все файлы cookie и данные сайтов удаляются. Вы можете запускать несколько сессий агента «без входа в систему» — каждая в собственной вкладке браузера и каждая полностью изолированная от остальных.
Новый способ использования интернета
Ничего из этого было бы невозможно без глобального сообщества Chromium и его невероятной работы по созданию фундамента для современного веба. OWL опирается на этот фундамент по-новому: отделяя движок от приложения, объединяя первоклассную веб-платформу с современными нативными фреймворками и открывая более быструю и гибкую архитектуру.
Переосмысливая то, как браузер удерживает Chromium, мы создаем пространство для нового опыта: более плавной работы при запуске, более богатого интерфейса, более тесной интеграции с остальной частью ОС и цикла разработки, который движется со скоростью идей. Если это звучит как задача для вас, ознакомьтесь с нашими вакансиями и присоединяйтесь к работе над Atlas в качестве Инженера-программиста Atlas, Инженера-программиста iOS и другим вакансиям.
Попробуйте Atlas по адресу chatgpt.com/atlas.
Выражение признательности
Особая благодарность Дарину Фишеру и Мари Шин, которые внесли свой вклад в эту публикацию, а также всей команде OpenAI, создавшей Atlas.
Авторы
Полный текст статьи читайте на OpenAI
