OpenViking
Своя память и RAG для AI-агента вместо облачных memory-SaaS вроде Mem0 и Zep: долговременная память, поиск по документам и навыки в одном сервисе на вашем сервере (вендор называет его контекстной базой). Развернули 0.5.0 на Fatmetal Cloud Server, замерили расход ресурсов и проверили, что факты из диалога доходят до семантического поиска.
Вердикт
- тем, кто строит AI-агента (Claude Code, Codex, OpenCode, OpenClaw) и хочет держать его память у себя
- кому нужны память, RAG и навыки в одном сервисе, а не три разных
- тем, кто готов подключить модель: локальную (ollama) или внешнюю по ключу
- если нужен managed-сервис без администрирования
- если документов больше пары штук, а эмбеддер локальный: уже на 10 файлах (~26 КБ) он упирается в CPU и поиск перестает отвечать
- если у агента нет доступа к LLM: без него память из диалога не извлекается
Что это и какую задачу решает
OpenViking - открытая контекстная база для AI-агентов от команды Viking (Volcengine, ByteDance). Она закрывает боль, которая вылезает у любого агента дальше прототипа: где хранить то, что агент узнал, чтобы он помнил это между сессиями и находил нужное по смыслу, а не по точному совпадению строки.
Внутри три вещи в одном хранилище: долговременная память (факты о пользователе, события, предпочтения), RAG по вашим документам и реестр навыков агента. Все лежит в едином пространстве имен вида viking://user/имя/memories. Наружу торчит HTTP-сервер с REST API, веб-интерфейс Web Studio и шлюз vikingbot. Клиенты - Python SDK, CLI ov и обычный curl с заголовком X-API-Key. Хранилище мультитенантное: аккаунты, пользователи и отдельные ключи под каждого.
Чем отличается от платных аналогов
Сравниваем с облачными сервисами памяти для агентов по тому, что влияет на выбор.
| Параметр | OpenViking (self-hosted) | Облачный memory-SaaS |
|---|---|---|
| Модель цены | бесплатно, платите за свою VM | подписка: Mem0 от $19/мес, Zep от $125/мес |
| Где данные | на вашем сервере, в вашей сети | на стороне вендора |
| Память + RAG + навыки | в одном сервисе | обычно разные продукты |
| Выбор модели | любой: локальный или по ключу | то, что дает вендор |
| Привязка к вендору | нет, namespace ваш | есть |
Что изменилось с прошлого разбора
Мы разбирали 0.4.16 в августе, сейчас актуальна 0.5.0. Вот что поменялось для того, кто ставит продукт.
Главное новое - OpenViking Gateway в статусе беты. Это отдельный процесс, который встает между клиентом и провайдером моделей: любой клиент, у которого можно сменить base URL, получает память OpenViking без плагина и правок кода. В 0.5.0 это отдельный сервис на порту 1935, в карточке маркетплейса он выключен.
Второе заметное - Working Memory выключена по умолчанию. Диалог по-прежнему архивируется и из него извлекается долговременная память, но сводки и контрольные точки больше не генерируются, если не попросить явно.
Еще три вещи, которые заденут тех, кто обновляется со старой версии: переписан поиск (единый recall и один rerank, оценки косинуса нормированы в диапазон 0-1, старые пороги надо калибровать заново); ключи настройки авто-коммита сессий объединены в один, старые молча игнорируются; в образе больше нет ripgrep, а рабочий каталог контейнера переехал в /app/.openviking.
Тех-стек и архитектура
Сервер написан на Python 3.13 поверх FastAPI. Индекс файлов и уровневое чтение вынесены в нативный Rust-биндинг - он грузится быстро и не упирается в GIL. Векторный слой по умолчанию локальный, данные лежат в рабочей директории. Один контейнер поднимает сразу HTTP API на порту 1933, Web Studio на /studio и шлюз vikingbot.
Ключевой момент: OpenViking не считает эмбеддинги и не извлекает факты сам. Ему нужны две модели - эмбеддер (превращает текст в вектор для поиска) и VLM/LLM (читает диалог сессии и вытаскивает из него структурированные факты). Обе можно взять локальными или указать любой OpenAI-совместимый провайдер по ключу. Именно модели, а не сам сервис, определяют, сколько нужно ресурсов.
Минимальная конфигурация
Реальные требования против того, что обещает вендор.
| Официальный старт | 2 vCPU / 4 GB / 30 GB |
| Контейнер в простое | ~750 MiB |
| Хост с локальной моделью | ~1,4-2 GB |
| Образ на диске | 1,74 GB |
| Рекомендуем тариф | CPU4-RAM8-DISK100 |
Важно: по памяти хватило бы и CPU2-RAM4-DISK50, но узкое место - процессор. Локальный эмбеддер на 4 ядрах уже не успевает за небольшим корпусом документов (подробнее ниже), поэтому рекомендуем CPU4-RAM8-DISK100. Если эмбеддер и LLM внешние по ключу, хватит и CPU2-RAM4-DISK50.
В маркетплейсе Fatmetal
Не хотите ставить руками?
OpenViking есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий домен, валидный TLS, локальный эмбеддер и файл с доступами.
Рекомендуемая конфигурация:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe от 990 ₽/мес
Развертывание на Fatmetal Cloud Server
Базовый путь - Cloud Server с Ubuntu 24.04, Docker, локальный эмбеддер и Caddy для TLS. На чистой машине это занимает около семи минут.
Создать сервер
Тариф CPU4-RAM8-DISK100, ОС Ubuntu 24.04 LTS. Отдельное приложение из маркетплейса не нужно: Docker поставим сами.
Установить Docker
Образ Ubuntu идет без Docker. Официальный скрипт поставит движок и плагин compose:
curl -fsSL https://get.docker.com | sudo sh sudo systemctl enable --now dockerПоднять локальный эмбеддер
ollama считает векторы на самой машине, без внешнего ключа. Модель тянем через HTTP API - CLI в неинтерактивной среде падает:
curl -fsSL https://ollama.com/install.sh | sh sudo mkdir -p /etc/systemd/system/ollama.service.d printf '[Service]\nEnvironment="OLLAMA_HOST=0.0.0.0:11434"\n' | sudo tee /etc/systemd/system/ollama.service.d/override.conf sudo systemctl daemon-reload && sudo systemctl restart ollama curl -sS http://127.0.0.1:11434/api/pull -d '{"name":"nomic-embed-text","stream":false}'Подготовить ov.conf
Сервер не стартует без
root_api_key. Здесь же задаем том данных и адрес эмбеддера. Для извлечения памяти добавьте блокvlmс вашим ключом (BYOM) - без него память останется пустой:mkdir -p ~/.openviking cat > ~/.openviking/ov.conf <<'EOF' { "server": { "root_api_key": "СГЕНЕРИРОВАННЫЙ_КЛЮЧ", "host": "0.0.0.0", "port": 1933 }, "storage": { "workspace": "/app/.openviking/data" }, "embedding": { "dense": { "provider": "ollama", "model": "nomic-embed-text", "api_base": "http://172.17.0.1:11434/v1", "dimension": 768 } }, "vlm": { "provider": "openai", "model": "ВАША_МОДЕЛЬ", "api_key": "ВАШ_КЛЮЧ", "api_base": "https://ПРОВАЙДЕР/v1" } } EOF chmod 600 ~/.openviking/ov.confЗапустить OpenViking
Версию закрепляем тегом, порт держим на localhost. Переменные прокси нужны, если VLM внешний и отвечает из-за рубежа:
sudo docker run -d --name ov --restart unless-stopped \ -p 127.0.0.1:1933:1933 --add-host=host.docker.internal:host-gateway \ -e HTTP_PROXY=http://api-proxy.fatmetal.net:8080 \ -e HTTPS_PROXY=http://api-proxy.fatmetal.net:8080 \ -e NO_PROXY=172.17.0.1,localhost,127.0.0.1,::1 \ -v ~/.openviking:/app/.openviking \ ghcr.io/volcengine/openviking:v0.5.0Проверка:
curl 127.0.0.1:1933/healthотдает{"status":"ok","version":"v0.5.0"}.Домен и TLS
Порт 1933 наружу не открываем. Caddy проксирует на него и сам выпускает сертификат. Подставьте свой домен, направленный A-записью на IP сервера:
sudo tee /opt/Caddyfile >/dev/null <<'EOF' ваш-домен { reverse_proxy 127.0.0.1:1933 } EOF sudo docker run -d --name ov-caddy --restart unless-stopped --network host \ -v /opt/Caddyfile:/etc/caddy/Caddyfile -v caddy_data:/data caddy:2
Что измерили после запуска
Цифры с тестового CPU4-RAM8-DISK100: эмбеддер локальный (ollama nomic-embed-text), извлечение памяти на внешнем LLM.
| Установка от чистой Ubuntu | ~7 минут |
| RAM контейнера в простое | ~750 MiB |
| Caddy рядом | ~10 MiB |
| Образ на диске | 1,74 GB |
| Отклик /health | ~4 мс |
| Семантический поиск (малый набор) | ~0,6 с |
Главное: полный конвейер отработал сквозняком. Записали документ в viking://resources - поиск по смыслу вернул его с оценкой 0,84. Отправили три сообщения в сессию и закоммитили - сервер извлек из них факты (имя, профессию, стек) в identity.md, и они нашлись запросом. Данные переживают пересоздание контейнера, если том смонтирован.
Проверено на версии v0.5.0, октябрь 2026. На новых версиях результаты могут отличаться.
Где может сломаться
Реальные грабли, на которые наткнулись при запуске.
Причина. numpy в образе собран под уровень инструкций x86-64-v2 (нужны SSE4.2, POPCNT, SSSE3). Если гипервизор отдает гостю обобщенный CPU уровня qemu64, контейнер падает при импорте numpy.
Решение. нужна VM, где гостю проброшен реальный CPU хоста. На тарифах Fatmetal гость видит настоящий Xeon с полным набором флагов, и образ стартует штатно.
Локальный эмбеддер не тянет корпус. На 4 ядрах один эмбеддинг чанка документа (около 950 токенов) занимает 5-30 секунд. Когда мы поставили в индекс 10 документов на ~26 КБ, процесс ollama занял все ядра, запросы к нему стали падать по таймауту, а поиск перестал отвечать. Для реального корпуса берите внешний эмбеддер по ключу - прокси Fatmetal уже прописан в рецепте; локальный ollama годится для пары документов и демо.
Персистентность. По умолчанию storage.workspace равен ./data и пишется в слой контейнера. После docker rm все аккаунты и векторы теряются. Вынесите workspace в смонтированный том, как в конфиге выше - мы проверили, данные так переживают пересоздание.
Путь эмбеддера. Для provider: ollama адрес обязан заканчиваться на /v1 (OpenAI-совместимый эндпоинт), иначе будет 404 на /embeddings.
Два ключа. root-ключ управляет аккаунтами, но в data-API не ходит. Для записи и поиска заведите аккаунт и пользователя и работайте его ключом.
Gateway и документация. В 0.5.0 gateway - отдельный процесс на порту 1935, а сайт-документация уже описывает следующую схему со встроенным gateway под /gateway на 1933. На 0.5.0 такой путь вернет 404: сверяйтесь с версией, которая у вас стоит.
Безопасность и обновления
Сервер не поднимается без root_api_key - это уже базовая защита. Порт 1933 держим на localhost и открываем наружу только 443 через Caddy с валидным TLS. Web Studio закрыт api-key, доступ к данным идет по пользовательским ключам с разделением по аккаунтам. Перед продом закройте четыре пункта: TLS, api-key на Studio, том под данные, отдельные ключи пользователей. Обновление - тот же том с новым тегом:
sudo docker pull ghcr.io/volcengine/openviking:v0.5.0
sudo docker rm -f ov && sudo docker run -d --name ov ... # тот же том
Бэкап - это каталог тома. Останавливаем контейнер и архивируем:
sudo docker stop ov && tar czf ov-backup.tgz -C ~/.openviking data
Связь с другими стеками
- Обратный прокси - Caddy для авто-TLS на вашем домене.
- Локальные модели - ollama рядом для эмбеддера и/или LLM без внешнего ключа.
- AI-агенты - плагины памяти для Claude Code, Codex, OpenCode, OpenClaw; gateway (бета) добавляет память любому клиенту сменой base URL.
- Бэкапы - tar тома данных, при желании с выгрузкой на отдельный диск.
Когда это НЕ ваш выбор
Нужен готовый managed-сервис
OpenViking надо администрировать: конфиг, модели, том, обновления. Если хочется просто дернуть API и не думать про инфраструктуру - берите облачный memory-SaaS.
Большой корпус и только локальный эмбеддер
На CPU без внешнего эмбеддера индексация десятков документов упирается в процессор и блокирует поиск. Нужен либо внешний эмбеддер по ключу, либо заметно больше ядер.
У агента нет доступа к LLM
Извлечение фактов в память идет через LLM. Без внешнего ключа и без локальной модели этот шаг не заработает, и память останется пустой.
AGPL-3.0 не подходит по политике
Лицензия с сетевым копилефтом: если раздаете OpenViking как сервис третьим лицам, придется раскрывать изменения. Для внутреннего self-host ограничений нет.
Частые вопросы
Можно поднять без внешнего ключа?
Эмбеддер - да, локально через ollama. Для извлечения памяти нужен LLM: либо локальная модель, либо ключ любого OpenAI-совместимого провайдера.
Хватит ли CPU2-RAM4-DISK50?
По памяти да. Но локальный эмбеддер на 4 ядрах не успевает за корпусом документов, поэтому для реальной работы рекомендуем CPU4-RAM8-DISK100 или внешний эмбеддер.
Данные переживают пересоздание контейнера?
Только если storage.workspace вынесен в смонтированный том. По умолчанию нет.
Что нового в 0.5.0?
Gateway в бете, Working Memory выключена по умолчанию, переписан поиск. Подробнее - в разделе об изменениях.
Как искать по памяти?
Семантически: запрос эмбеддится и сопоставляется по вектору, ответ ранжируется по релевантности. Есть и режимы grep/glob по содержимому.
Можно в продакшен?
Да, с оговорками: TLS через Caddy, порт на localhost, api-key на Studio, том под данные, отдельные ключи пользователей.
Какая лицензия?
AGPL-3.0. Для внутреннего использования свободна; при сетевом доступе третьих лиц надо открывать изменения.
Итог
OpenViking закрывает связку память + RAG + навыки для AI-агентов одним self-hosted сервисом с мультитенантностью и выбором любых моделей. Контейнер занимает около 750 MiB в простое, весь конвейер памяти отрабатывает сквозняком: факты из диалога ложатся в память и находятся по смыслу. Два момента держите в голове: гостю нужен реальный CPU (host-passthrough) и том под данные, а локальный эмбеддер годится только для небольшого корпуса. На тарифах Fatmetal первое снимается из коробки, второе решается внешним эмбеддером через прокси.
Рекомендуемая конфигурация для установки:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe
Не хотите устанавливать вручную?
Запустите OpenViking на этой конфигурации автоматически - от 990 ₽/мес.
Этот стек у нас запущен на тарифе CPU4-RAM8-DISK100. Нашли баг в гайде - напишите, поправим в течение дня.