Wire переписал рантайм для своих AI-агентов. Раньше каждый контейнер контекста жил внутри Cloudflare Durable Object. Теперь это собственный data plane на Fly Machines.
Причина — не надёжность, а четыре структурных ограничения. Первое: векторный индекс лежал снаружи, в сервисе Vectorize. Каждый запрос на поиск делал лишний сетевой прыжок, а копия состояния могла рассинхронизироваться. В DO SQLite нельзя загружать расширения, так что index никогда не попал бы внутрь. Второе: обработка запроса — гибридная генерация кандидатов, fusion, расширение запроса, широкий rerank — на Durable Objects работала только малая часть. Остальное улетало во внешние сервисы. Каждый прыжок ложился на критический путь. Третье: объект привязывается к региону при создании и больше не двигается. Контейнер, созданный в Лондоне, вечно обслуживает агентов из Вирджинии. И нельзя купить выделенные ресурсы для одного клиента. Четвёртое: Durable Object нельзя запустить на своей инфраструктуре. Регулируемые команды просили — ответа не было.
Что построили: каждая организация получает один процесс (Bun) на Fly Machines для всех своих контейнеров. Один контейнер — один SQLite-файл с векторным индексом внутри через sqlite-vec. Кандидаты ищутся прямо в процессе. Модельные вызовы, эмбеддинг запроса и rerank уходят наружу, на инференс. Снимки — в object storage, контейнер восстанавливается побайтово где угодно. Региональный роутер ставит контейнер рядом с caller'ом. Control plane общается с data plane через подписанные запросы и не касается содержимого.
Цифры: тёплый вызов инструмента — стабильные ~0.3 секунды против ~0.4 со всплесками за 2. Холодный старт контейнера — 1.4 секунды с конца в конец против 3.7. Кстати, 3.7 — не cold start DO, это своя сборка стека пересобиралась.
Ничего не поменялось снаружи. Те же URL контейнеров, пять инструментов MCP, REST API, форматы ответов. Агенты звонят по тому же адресу, просто отвечает новый рантайм.
Пришлось решать проблему durability. Durable Objects давали её бесплатно и консистентность одного писателя. Cloudflare реплицировал каждую запись перед подтверждением. В первой версии durability была только на следующем checkpoint. Тесты с убийством машин под нагрузкой показали потерю подтверждённых записей. Починили непрерывной отправкой WAL: запись не подтверждается, пока её фрейм не попал в object storage. Group commit держит задержку около 100 мс.
Прирост recall@5 с 78.1% до 89.1% не только от архитектуры — ещё и новая модель эмбеддингов. Архитектура делает дорогое дешёвым: внутрипроцессный поиск позволяет over-fetch и широкий rerank, а индексы маленькие, хватает точного nearest-neighbor.
Новый рантайм в бете: preview и опциональные продакшен-воркспейсы. Полный переход — когда durability tripwires зелёные. После разреза планируют открыть код.