Все статьи
announcement ai-agents dogfooding 5 мин чтения

OpenAI построит сайт вашему пользователю. Вашему продукту — не построит

ChatGPT Sites закрыл половину задачи про сборку сайтов ИИ — ту, что для конечного пользователя, — и закрыл её наглухо. Нет управляющего API, нет мультиарендности, нет способа поставить это за кнопку в вашем собственном продукте. Forge выпустил вторую форму: на входе бриф, на выходе живой HTTPS-адрес, с ревизиями и откатом, и всё это как HTTP API, который ваш продукт вызывает от имени своих заказчиков.

автор Ilia Sadykov

«Опиши сайт — получи сайт» стало решённой потребительской фичей, и решила её крупнейшая компания отрасли. ChatGPT Sites генерирует сайт, хостит его, версионирует, даёт аналитику и направит на него ваш собственный домен. Это хорошо сделано, и этим будет пользоваться огромное число людей.

Но прочитайте документацию как строитель продукта, а не как конечный пользователь, — и картина окажется другой. Sites создаются и управляются разговором, в приложении ChatGPT или на chatgpt.com/sites; управляющего API в документации нет. Работает это на платном тарифе — Plus, Pro, Business, Enterprise или Edu, — а значит, каждому вашему заказчику нужна собственная подписка. Подключение своего домена означает, что владелец домена копирует DNS-записи из настроек сайта и вставляет их к своему DNS-провайдеру. Каждая выкатка — это выкатка в прод, если только кто-то явно не попросил сначала сохранить версию. А условия использования исключают применение для проведения финансовых операций.

Ничто из этого не недостаток. Это форма продукта. Форма фичи, сделанной для человека, который печатает в окне чата.

Если вы строите CRM, маркетплейс, онбординг или систему бронирования — вы не этот человек. Вам нужно выдать сайт вашему заказчику, из вашего интерфейса, в рамках ваших биллинговых отношений, не объясняя ему, что такое CNAME. Это другой продукт, и это тот, который выпустили мы.

Та половина, от которой зависит, поедет ли оно вообще

Большинство демо «сайт, собранный ИИ» заканчивается скриншотом. Интересное начинается после: должен появиться бакет, должен включиться хостинг, должны доехать файлы, должен выпуститься сертификат, DNS должен куда-то указать — и кто-то должен отвечать за отказ, когда третий шаг сработал, а четвёртый нет. Именно из-за этой возни фича так часто и заканчивается скачиваемым ZIP-архивом.

Мы сделали эту половину — а потом открыли её наружу.

В процессе два персонажа. Дизайнер превращает описание в сам сайт. Публикатор берёт на себя неблагодарную часть: создаёт бакет хранилища, включает хостинг статического сайта, заливает файлы, ставит перед этим CDN с сертификатом, чтобы результат был по HTTPS, а не по голому HTTP, и обновляет DNS-запись, чтобы поддомен резолвился.

Никто не вставляет DNS-записи руками. Ни вы, ни ваш заказчик — учётные данные держит публикатор, он и делает вызов. Эти облачные учётные данные разрешаются на сервере в момент вызова; они никогда не попадают в контекст модели, в транскрипт или в коммит — то же правило, по которому работает любой другой процесс Forge.

На выходе не макет. На выходе адрес, который можно открыть.

Повторная генерация, которая правит, а не бросает кости заново

Вторая итерация — то, что превратило демо в рабочий инструмент. Запрос на изменение читает манифест файлов текущей ревизии и контекст дизайнера до регенерации, так что «сделай блок с ценами короче» означает правку названных файлов, а не генерацию нового сайта с нуля в надежде, что на этот раз попадём точнее.

Это и есть разница между сайтом, который за пять запросов доводится до нужного, и сайтом, который мечется из стороны в сторону. И это важнее, когда запрос делает ваш заказчик, а не вы, — потому что к третьей попытке он не будет снисходительным.

Кнопка отмены — и кто вправе на неё нажать

Каждая опубликованная ревизия помечается и записывается, а хук завершения помечает каждый запуск как успешный или упавший. Отсюда два эндпоинта: получить список ревизий сайта и откатить его на конкретную. Есть и путь удаления.

Заметьте, что даёт слово «эндпоинт»: ваш продукт решает, кому и когда можно откатывать. Откат можно спрятать за инструмент поддержки, выдать конечному заказчику или запускать автоматически при провале проверки здоровья. Откат, существующий только как пункт меню в чужом приложении, — это откат, вокруг которого нельзя построить процесс поддержки.

Отрасль спорит о том, как присматривать за агентами: переписывание вызовов инструментов, барьеры на уровне системных вызовов , контуры с подтверждением. Всё это важно. Но добрая половина страха растёт из работы, которую нельзя забрать назад. Агенту, который публикует в версионируемую и обратимую среду, можно позволить работать быстро: худший исход здесь — один клик отмены.

Сам продукт: это можно встроить

Вся возможность доступна как HTTP API. Один POST запускает сборку, у запуска опрашивается результат, а дальше эндпоинты дают список ревизий, откат и удаление. Разделение по арендаторам держится на токене вызывающего, так что сайты одного клиента отделены от сайтов другого самим устройством системы, а не договорённостью.

Конкретно: продукт, который уже собирает описание со своих пользователей, может выдать этим пользователям живой сайт, не заводя у себя объектное хранилище, CDN, сертификаты, DNS и сборочный конвейер. Вы дёргаете эндпоинт; ваш заказчик получает адрес. Он никогда не узнаёт, что тут был замешан агент, нигде не регистрируется и не видит нашего имени, если вы сами этого не захотите.

Есть и настройка под каждого конечного заказчика: персонажей можно клонировать, так что один ваш пользователь получает дизайнера, настроенного под его голос бренда, а другой — иного, и вам не приходится вести два продукта.

Последний барьер тоже убран: привязка аккаунта и вход без учётки GitHub появились в те же две недели и сейчас раскатываются через стенд. Ваши заказчики всё равно не стали бы заводить аккаунт на GitHub ради лендинга — и не придётся.

Чему нас научила эксплуатация

Это молодая возможность, и мы предпочитаем описывать её точно, а не расплывчато.

Выпущено и проверено вживую: бриф → сгенерированный сайт → бакет и хостинг → заливка → CDN с HTTPS → DNS → работающий адрес, плюс ревизии, откат и удаление.

Живые прогоны поймали четыре дефекта, которые юнит-тесты поймать не могли: облачный API, потребовавший другой content type; инструмент, существовавший на одном пути исполнения и отсутствовавший на другом; три недостающих гранта IAM; и enum, который должен был быть в верхнем регистре. Зелёная сборка — не работающий конвейер. Поэтому мы всё прогоняем на настоящей системе, и поэтому же нам спокойно выставлять это наружу эндпоинтом.

Границы: выпущенный адаптер работает с объектным хранилищем, CDN и DNS одного облака. Сама форма процесса к нему не привязана. Распространение сертификата по краю облака на свежем домене может занимать часы — это физика и бюрократия, а не код, и текст онбординга стоит писать с учётом этого.

Что из этого следует

Сгенерировать страницу — простая половина, и у простой половины теперь есть самая щедро профинансированная реализация в мире. Опубликовать её, версионировать, уметь забрать назад и уметь делать всё это от имени чужого заказчика — та половина, которая решает, сможет ли это стать фичей вашего продукта.

Именно её мы и продаём. Сценарий использования описан здесь , или запустите процесс .