Перейти к основному содержимому

Как устроен ClawAI

Восемнадцать независимо развёртываемых сервисов, каждый со своей базой данных, связанных событийной архитектурой. Ответы передаются потоково по мере генерации, и каждый уровень защищён отдельно.

Последняя проверка 2026-07-25

Как устроен ClawAI

ClawAI — это восемнадцать независимо разворачиваемых сервисов за единым обратным прокси. Аутентификация, чат, маршрутизация, коннекторы, память, файлы, исследования, рабочее пространство, генерация изображений, экспорт документов, оплата, аудит и журналирование работают как отдельные процессы со своими базами данных. Веб-приложение обращается ко всем ним через единую поверхность API.

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

18
Независимо разворачиваемых сервисов
По одной на сервис
Никогда никакой общей базы данных
HTTP + события
Синхронные вызовы плюс асинхронная шина событий
Одна точка входа
Единый обратный прокси перед всей системой

Сервисы

Не каждый сервис интересен снаружи. Здесь перечислены те, которых обычно касается один запрос, примерно в том порядке, в каком он их касается.

АутентификацияPostgreSQL
Аккаунты, сессии, выпуск токенов и их ротация при обновлении, роли и наборы разрешений.
ЧатPostgreSQL
Беседы и сообщения, сборка контекста, потоковое выполнение и мультимодельная оркестрация.
МаршрутизацияPostgreSQL
Классифицирует каждое сообщение, применяет активный режим и действующие политики и фиксирует решение вместе с цепочкой резервных вариантов.
КоннекторыPostgreSQL
Учётные данные провайдеров, каталоги моделей, флаги возможностей и непрерывные проверки работоспособности.
Память и контекстPostgreSQL + pgvector
Записи памяти, очередь предложений, пакеты контекста и их версии, а также семантический поиск.
ФайлыPostgreSQL
Загрузка, проверка безопасности, извлечение текста, OCR, разбиение на фрагменты и хранение.
ИсследованияPostgreSQL
Поиск в интернете, загрузка страниц и сборка доказательной базы для ответов со ссылками на источники.
Рабочее пространствоPostgreSQL
OAuth-подключения к двенадцати сторонним инструментам, вебхуки, синхронизация по расписанию и сквозной поиск.
Генерация изображенийPostgreSQL
Запросы на изображения, адаптеры провайдеров и пошаговый прогресс во время отрисовки.
Генерация документовPostgreSQL
Преобразование ответов в PDF, DOCX, CSV, HTML, Markdown, TXT и JSON.
ОплатаPostgreSQL
Тарифы, подписки, версионированные цены, счета и контроль лимитов.
АудитMongoDB
Неизменяемая запись того, кто и что сделал, плюс журнал использования, из которого выводится каждый показатель лимита.
ЖурналированиеMongoDB
Структурированные журналы всех сервисов и браузера, хранимые в скользящем окне.

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

Одна база данных на сервис

Каждый сервис владеет ровно одной базой данных и является единственным, кто к ней подключается. Нет общей схемы, нет межсервисных объединений и нет отчётной базы, которая тихо читает чужие таблицы.

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

Никаких межбазовых запросов
Сервис читает свои таблицы и ничьи больше. Данные извне поступают через вызов API или событие.
Схемы приватны
Сервис может менять свои таблицы, ни с кем не согласовывая, потому что от их структуры не зависит ни один внешний потребитель.
Миграции выполняются по сервисам
Каждый сервис мигрирует свою базу данных при запуске. Нет глобальной миграции, которой всем приходится ждать.
Сбои остаются локальными
Медленная или недоступная база данных ухудшает одну возможность, а не весь продукт.

Жизнь одного запроса

Что происходит между нажатием «отправить» и чтением ответа.

  1. Запрос проходит аутентификацию

    обратный прокси передаёт его сервису чата, который проверяет ваш токен доступа и разрешения, привязанные к вашей роли.

  2. Проверяется лимит

    сервис оплаты подтверждает, что ваш тариф допускает запрошенную модель и что в дневном и месячном лимите ещё есть запас.

  3. Сообщение сохраняется и публикуется

    чат записывает сообщение в свою базу данных и публикует событие. Маршрутизация его слушает.

  4. Маршрутизация выбирает модель

    сообщение классифицируется, применяются активный режим и политики, учитывается работоспособность коннекторов, и решение с цепочкой резервных вариантов фиксируется.

  5. Собирается контекст

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

  6. Модель вызывается и стримится

    чат вызывает провайдера и передаёт этапы, текст, рассуждения и метрики в ваш браузер через Server-Sent Events по мере их поступления.

  7. Результат сохраняется

    ответ, решение о маршрутизации, счётчики токенов и квитанция контекста записываются вместе.

  8. Фиксируются использование и аудит

    сервис оплаты списывает стоимость с вашего лимита, а аудит записывает событие. Здесь же выполняется извлечение памяти.

Шаги с 1 по 7 синхронны — вы их ждёте. Шаг 8 и извлечение памяти происходят уже после того, как ответ появился на экране, поэтому они не добавляют задержки к тому, что вы видите.

Шина событий

Работа, которая не обязана завершиться до того, как вы увидите ответ, публикуется как событие в топик-обменнике RabbitMQ и обрабатывается теми сервисами, которым она нужна. Так работают учёт использования, записи аудита и извлечение памяти.

Именно события позволяют чату не знать о существовании аудита. Чат сообщает, что произошло; всё, что должно на это отреагировать, подписывается само. Добавление потребителя не требует изменений у публикатора.

Топик-обменник
Публикаторы называют то, что произошло, а не того, кто должен об этом услышать. Потребители подписываются на интересующие их шаблоны.
Повторы с задержкой
Обработчик, завершившийся с ошибкой, повторяется три раза с нарастающей задержкой, что покрывает временные сбои, составляющие большинство случаев.
Очередь недоставленных сообщений
Сообщение, которое не удалось обработать даже после повторов, попадает в очередь недоставленных сообщений, а не теряется и не блокирует всё, что стоит за ним.
Идемпотентные обработчики
Обработчики спокойно переносят повторное поступление одного и того же события, потому что доставка «хотя бы один раз» рано или поздно это гарантирует.
Всё поддаётся аудиту
Аудит подписан на все доменные события, поэтому запись о произошедшем не зависит от того, вспомнит ли каждый сервис её сделать.

Потоковая передача

Ответы приходят через Server-Sent Events, а не опросом. Соединение открывается, когда вы отправляете сообщение, и передаёт всё, пока ответ не завершён или не отменён.

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

По одному и тому же каналу идут генерация текста, прогресс генерации изображений и длительные исследования, поэтому интерфейс показывает выполняемую работу одним способом, а не тремя.

Смена этапов
В очереди, маршрутизация, сборка контекста, вызов модели, завершение — чтобы у любой паузы была видимая причина.
Приращения текста
Текст ответа по мере того, как модель его создаёт, токен за токеном.
Приращения рассуждений
Для моделей, раскрывающих ход мысли, поток рассуждений передаётся отдельно от ответа и отображается тоже отдельно.
Тики метрик
Токенов на данный момент, токенов в секунду, время до первого токена и то, куда фактически ушло время — на загрузку модели, обработку промпта или генерацию.
Завершающие события
Итоговая сводка использования либо явная ошибка или отмена. Поток никогда не обрывается просто так.

Что и где хранится

Четыре вида хранилищ, каждое используется по своему назначению.

PostgreSQL
Система записи для аккаунтов, бесед, решений о маршрутизации, памяти, файлов, подключений и оплаты — по одной базе данных на сервис.
pgvector
Поиск по векторному сходству внутри PostgreSQL, применяется для извлечения релевантных единиц памяти и элементов пакетов контекста без отдельной векторной базы данных.
MongoDB
События аудита, журнал использования и структурированные логи: большой объём данных, только добавляемых, со скользящим окном хранения.
Redis
Кеширование, счётчики ограничения частоты и недолговечное состояние координации. Ничего важного здесь не хранится в единственном экземпляре.

Механизмы безопасности

Конкретные меры, которые есть в продукте. Никаких заявлений о сертификации — см. примечание в конце.

Токены доступа и обновления
Недолговечные токены доступа с ротацией при обновлении. Повторное использование уже заменённого токена аннулирует сессию.
Хеширование паролей
Argon2 с индивидуальной солью для каждого пользователя. Пароли никогда не хранятся и не пишутся в журналы в восстановимом виде.
Ролевое управление доступом
Роли несут конкретные наборы разрешений, которые проверяются гардами на каждом эндпоинте каждого сервиса, а не только в интерфейсе.
Шифрование учётных данных
Секреты провайдеров и коннекторов шифруются в состоянии покоя по AES-256-GCM и никогда не возвращаются через API.
Валидация схем
Каждое тело запроса проверяется по схеме Zod с явными ограничениями длины и размера, прежде чем попасть в какую-либо логику.
Ограничение частоты запросов
Ограничение по каждому аккаунту на каждом сервисе, чтобы один клиент не мог исчерпать ёмкость для всех остальных.
Заголовки безопасности
Строгая политика безопасности контента с одноразовыми nonce для каждого запроса, HSTS и стандартные защитные заголовки в каждом ответе.
TLS повсюду
TLS от браузера до периметра и снова на каждом внутреннем переходе, с проверкой сертификатов между сервисами.
Очистка журналов
Токены, пароли, ключи API и заголовки авторизации удаляются до того, как что-либо попадёт в журнал.

Сегодня у ClawAI нет сторонних сертификатов по безопасности — ни SOC 2, ни ISO 27001, ни HIPAA. Мы описываем перечисленные выше механизмы, а не намекаем на гарантии, которых у нас нет. Организациям с формальными требованиями стоит сообщить о них, чтобы их можно было учесть в рамках отдельного проекта.

Наблюдаемость

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

Структурированные журналы
Журналы в формате JSON от каждого сервиса и из браузера, доставляемые по шине событий и хранимые в скользящем окне.
Корреляция запросов
Идентификатор запроса создаётся в браузере и передаётся через каждый переход между сервисами, поэтому один идентификатор восстанавливает весь путь.
События аудита
Отдельная неизменяемая запись действий, значимых для безопасности и бизнеса, хранится отдельно от операционных журналов.
Журнал использования
Каждый учтённый вызов записывается как запись журнала. Показатели лимита выводятся из журнала, а не из счётчика, который может разойтись с реальностью.
Агрегация работоспособности
Отдельный сервис опрашивает все остальные и выдаёт единое сводное представление о том, что работает.

Когда что-то ломается

У провайдеров моделей случаются сбои, ограничения частоты и медленные дни. Платформа построена так, чтобы поглощать их, а не передавать вам в виде вечно крутящегося индикатора.

Цепочки резервных вариантов
Каждое решение о маршрутизации несёт упорядоченный список альтернатив. Если выбранная модель даёт сбой, автоматически пробуется следующая, а замена фиксируется.
Обход по работоспособности
Коннекторы непрерывно проверяются, и провайдер, у которого сбои, пропускается маршрутизатором до восстановления.
Безопасные повторы
Обработчики событий переносят повторную доставку, поэтому повтор исправляет сбой, а не списывает ваш лимит дважды.
Ошибки видны
Когда отказывают все варианты, в беседу записывается явная ошибка и отправляется в поток. Нет молчаливого сбоя, оставляющего интерфейс в ожидании.
Радиус поражения
Раздельные процессы и раздельные базы данных означают, что сбой ухудшает одну возможность. Недоступная генерация изображений не мешает вам общаться в чате.

Та же архитектура, но внутри вашей сети

Всё на этой странице описывает размещённый сервис, но архитектура к нему не привязана. Те же восемнадцать сервисов, та же шина событий и та же модель данных могут быть развёрнуты внутри собственной сети организации.

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

Посмотрите, как это работает

Быстрее всего судить об архитектуре по тому, что она производит. Настройка бесплатного тарифа занимает минуту.