Walrus Memory даёт агенту память, которая живёт вне вашего приложения: SDK на Python и TypeScript, MCP-сервер одной командой, шифрование Seal и хранение в децентрализованной сети Walrus. Разбираем, как это подключить и где здесь грабли.
Память агента обычно заканчивается там, где заканчивается сессия: чат, документ, векторная база внутри одного приложения. Walrus Memory (второе имя — MemWal) от Mysten Labs решает это честнее: записи лежат в сети Walrus, зашифрованы, привязаны к вашему аккаунту в Sui и достаются откуда угодно — из другого агента, другого рантайма или другой сессии. Подключается SDK на Python или TypeScript/JavaScript, а для готовых агентов есть MCP-сервер, который ставится одной командой. Ниже — рабочий путь: аккаунт, ключ, первый remember и recall, интеграция в цикл агента и честный список того, что в молодом SDK пока кусается.
docs.wal.app/walrus-memory, репозиторию MystenLabs/MemWal (README, changelog’и пакетов и папка docs/) и реестрам npm и PyPI — снимок 05.10.2026. Все команды и имена методов взяты из документации дословно. Продукт молодой: версии SDK — 0.1.x, интерфейсы ещё меняются, поэтому перед продакшном сверяйтесь с changelog своего пакета.Классическая «память» агента — это либо история сообщений, либо векторная база внутри вашего сервиса. Обе живут в вашем стеке: сменили фреймворк — перепишите, сменили сервер — перелейте, завели второго агента — расскажите ему всё заново. Walrus Memory строит третий вариант: прослойка памяти существует отдельно от приложения, а приложение только пишет и читает.
Данные не ходят из вашего кода напрямую в сеть. Схема такая: SDK подписывает запрос вашим делегированным ключом (Ed25519), релейер проверяет права, шифрует текст, заливает его в Walrus как блоб и добавляет запись в векторный индекс. Поиск идёт по namespace и возвращает уже расшифрованные совпадения.
Память делится на изолированные участки — memory space. Он определяется тремя значениями одновременно, и этого достаточно, чтобы два приложения или два пользователя не пересеклись:
| Значение | Что это | Кто задаёт |
|---|---|---|
| Адрес владельца | кошелёк Sui, которому принадлежит память | аккаунт Walrus Memory |
| Namespace | ваш ярлык, например chatbot-prod или team-support | разработчик |
| App ID | идентификатор пакета Walrus Memory (MEMWAL_PACKAGE_ID), свой у каждого развёртывания релейера | платформа |
Для production-контура аккаунт и делегированный ключ выдают на memory.walrus.xyz, для теста — на staging.memory.walrus.xyz. Из этой пары и адреса релейера собирается конфигурация клиента; в коде они читаются из переменных окружения и никогда не хардкодятся.
accountId клиента.relayer.memory.walrus.xyz (mainnet) или relayer-staging.memory.walrus.xyz (testnet). Namespace — свой для каждого приложения.export MEMWAL_KEY="<ваш Ed25519 приватный ключ, hex>" export MEMWAL_ACCOUNT_ID="<account ID из memory.walrus.xyz>" export MEMWAL_SERVER_URL="https://relayer.memory.walrus.xyz" # тестовый контур: https://relayer-staging.memory.walrus.xyz
Python-пакет memwal повторяет TypeScript-клиент: тот же релейер, та же авторизация, те же методы. Ставится без зависимостей, подпись — через PyNaCl. На 05.10.2026 в PyPI лежит версия 0.1.11.
pip install memwal pip install memwal[langchain] # middleware для LangChain pip install memwal[openai] # middleware для OpenAI SDK pip install memwal[all] # всё сразу
Клиент создаётся из ключа, аккаунта и пресета окружения. Дальше — шесть методов, которые покрывают почти всё:
| Метод | Что делает | Когда нужен |
|---|---|---|
remember / remember_and_wait | сохраняет одну запись; вариант с _and_wait дожидается, пока релейер зашифрует, зальёт и проиндексирует, и возвращает blob ID | когда нужно подтверждение записи |
recall | ищет по смыслу в рамках namespace, возвращает совпадения с расстоянием | перед каждым ответом агента |
analyze | сам вытаскивает факты из длинного текста и сохраняет их | когда на входе протокол встречи или длинный лог |
ask | отвечает на вопрос, опираясь на сохранённые записи | когда не нужен сырой список совпадений |
restore | пересобирает потерянный индекс из Walrus, по одному namespace | после сбоя индекса |
health | проверяет доступность релейера без авторизации | в мониторинге и при старте |
import asyncio, os
from memwal import MemWal, RecallParams
memwal = MemWal.create(
key=os.environ["MEMWAL_KEY"],
account_id=os.environ["MEMWAL_ACCOUNT_ID"],
env="prod", # или server_url="https://<свой релейер>"
namespace="chatbot-prod",
)
async def main():
# 1. сохраняем факт и ждём подтверждения
done = await memwal.remember_and_wait("Клиент работает в Hanoi и предпочитает тёмную тему.")
print(done.blob_id)
# 2. достаём по смыслу
res = await memwal.recall(RecallParams(query="Что мы знаем о клиенте?", limit=5))
for m in res.results:
print(m.text, m.distance)
asyncio.run(main())Если приложение не async, есть MemWalSync с тем же API — он просто выполняет вызовы через asyncio.run(), поэтому в ноутбуках и скриптах удобнее он. Для LangChain и OpenAI SDK предусмотрены готовые middleware: with_memwal_langchain и with_memwal_openai — они добавляют память к существующей цепочке, не переписывая её.
В npm-пакете @mysten-incubation/memwal (на 05.10.2026 — версия 0.1.8) три точки входа. Выбирать нужно по тому, кто выполняет криптографию: релейер или ваш клиент.
| Импорт | Когда использовать | Что подтянуть |
|---|---|---|
@mysten-incubation/memwal | По умолчанию: релейер сам считает эмбеддинги, делает Seal-шифрование и загрузку. Меньше кода, меньше ключей на клиенте. | ничего |
@mysten-incubation/memwal/manual | Когда эмбеддинги и локальные Seal-операции должны остаться на клиенте. | @mysten/sui, @mysten/seal, @mysten/walrus |
@mysten-incubation/memwal/ai | Когда уже есть Vercel AI SDK и память нужна как middleware (withMemWal). | ai, zod |
npm install @mysten-incubation/memwal # для режима manual: npm install @mysten/sui @mysten/seal @mysten/walrus # для Vercel AI SDK: npm install ai zod
@mysten/sui@^2.16.2, @mysten/seal@^1.1.3, @mysten/walrus@^1.1.7. Пакет @mysten/walrus@0.x тянет за собой @mysten/sui@1.x и конфликтует с @mysten/seal@1.x — если установка падает с ERESOLVE, виноват именно этот перекос версий.import { MemWal } from "@mysten-incubation/memwal";
const memwal = MemWal.create({
key: process.env.MEMWAL_KEY!, // Ed25519, hex
accountId: process.env.MEMWAL_ACCOUNT_ID!,
serverUrl: "https://relayer.memory.walrus.xyz",
namespace: "chatbot-prod",
});
await memwal.remember("Клиент предпочитает тёмную тему.");
const hits = await memwal.recall({ query: "Какие предпочтения у клиента?" });В JavaScript-приложении, которое работает в браузере, есть отдельный нюанс: в версии 0.1.8 хэширование тел запросов перевели на @noble/hashes, потому что прежний путь тянул встроенный модуль Node и ломался в Vite-сборке. Если вы сидите на версии ниже — обновитесь, это как раз тот случай. И у TypeScript-SDK объявлен пол Node 20.
Самый быстрый путь для тех, кто уже работает в агентской среде: MCP-сервер Walrus Memory. Он один для всех клиентов — отличается только место, где лежит конфигурация. Пакет запускается через npx, отдельная установка не нужна, но требуется Node.js 20 или новее.
| Клиент | Куда добавляется сервер |
|---|---|
| Claude Code | командой claude mcp add либо плагином из маркетплейса (плагин добавляет хуки автоматической памяти) |
| Claude Desktop и веб-чат | OAuth-коннектор — локальный Node.js и CLI не нужны |
| Cursor | JSON-блок mcpServers в ~/.cursor/mcp.json; плагин ставится в ~/.cursor/plugins/local/memwal |
| Codex | файл config.toml |
| OpenCode | файл opencode.json |
| Antigravity | плагин или JSON-блок конфигурации |
npx -y @mysten-incubation/memwal-mcp
# пример для Cursor (~/.cursor/mcp.json):
# {
# "mcpServers": {
# "memwal": {
# "command": "npx",
# "args": ["-y", "@mysten-incubation/memwal-mcp"]
# }
# }
# }memwal_login и открыть выданную ссылку. Аккаунт можно создать прямо в этом потоке..memwal/credentials.json внутри репозитория больше не решает сам, куда писать память: пока вы явно не одобрите проектный путь, аккаунт, ключ и релейер командой memwal-mcp approve-project, используются глобальные учётные данные. Одобрение хранится вне репозитория, в ~/.memwal/project-approvals.json. Причина простая: файл в репозитории мог молча увести все записи на чужой аккаунт.Если хочется не только инструментов, но и автоматики, ставьте плагин, а не одиночную запись сервера: он добавляет хуки на старт сессии, на подсказку пользователя и на вызов инструментов, и память подтягивается и сохраняется сама. Тогда есть и «умолчание по умолчанию» — риск, что в память уедет лишнее, поэтому в плагине есть и политика записи, и выключатель автосохранения.
Память — не «функция», а место в цикле. Рабочая схема: перед ответом подтянуть контекст, после ответа сохранить то, что стоит помнить. Всё остальное — детали реализации.
remember после сетевого сбоя создаст вторую копию. Считайте хэш содержимого и не пишите то же самое дважды.remember_and_wait дожидается blob ID; вариант без ожидания только принимает задание.Сам SDK бесплатный: лицензия Apache-2.0. Платят за хранение и операции сети, и здесь две разные монеты — в этом месте чаще всего путаются.
| За что | Чем платят | Кто платит в типовой схеме |
|---|---|---|
| Хранение блобов в сети Walrus | WAL | релейер, если он спонсирует; иначе ваш кошелёк |
| Газ за запись в Sui | SUI | то же |
| Вызовы SDK и MCP | ничего | платформа (SDK бесплатен) |
| Свой релейер | инфраструктура + WAL + SUI | вы: кошелёк с WAL и SUI, свой сервер |
На практике почти все начинают с managed relayer Walrus Foundation: кошелёк не нужен, оплата спрятана за релейером, контур общий. Обратная сторона — доверие и отсутствие гарантий: документация прямо пишет, что hosted-релейер видит текст до шифрования, делит развёртывание с другими пользователями и не даёт SLA. Если это неприемлемо, есть три пути: развернуть свой релейер, использовать publisher-спонсирование или выдавать агенту заранее пополненные WAL и ресурсы хранения из общего казначейства.
.env рядом с кодом, и уметь отзывать делегата. Это не паранойя: утечка ключа означает не только чтение памяти, но и запись мусора в неё.| Симптом | Причина и что делать |
|---|---|
| Записи видны не тому, кому должны | Скорее всего, взят чужой account ID из примера в документации: recall ограничен связкой аккаунт + namespace. Создайте свой аккаунт и проверьте, что memwal_health показывает именно ваш аккаунт и релейер. |
| Дубликаты в памяти | Релейер не дедуплицирует записи. Считайте хэш содержимого перед записью и не повторяйте уже сохранённое. |
| Установка падает с ERESOLVE | Перекос версий @mysten/*. Держите проверенный набор из quick-start и не смешивайте @mysten/walrus@0.x с @mysten/seal@1.x. |
| Память «пропала» после сбоя | Индекс можно пересобрать: restore умеет перечитывать записи из Walrus по namespace. В свежих версиях он ещё и возвращает список неудачных записей отдельно от пропущенных — не считайте их успешными. |
| Таймаут записи выглядит успехом | В версиях до MCP 0.0.13 тайм-аут мог отражаться как безопасная запись. Обновите пакет и не полагайтесь на «принято» без blob ID. |
| Клиент не видит память | Проверьте Node.js 20+ и то, что MCP-сервер вообще стартует: npx разрешает имя пакета относительно каталога, из которого запущен клиент. |
Слоёв памяти для агентов много, и по зрелости они пока разного возраста. Чтобы не создавать ложного впечатления, вот честный снимок звёзд на GitHub — это мера размера сообщества, а не качества продукта.
| Критерий | Walrus Memory | Обычный слой памяти в вашем стеке |
|---|---|---|
| Где живут записи | в сети Walrus, зашифрованными блобами | в вашей БД или облаке вендора |
| Кому принадлежит память | вашему кошельку Sui | аккаунту в сервисе или вашему серверу |
| Доступ | делегированные ключи, явные права | ключ API сервиса |
| Зрелость | 0.1.x, changelog меняется каждую неделю | зависит от проекта (от месяцев до лет) |
| Порог входа | аккаунт, ключ, две монеты в стоимости | обычно регистрация и API-ключ |
| Когда брать | нужна переносимость, проверимость и владение | нужна память «сегодня и просто» |
Короткий вывод: Walrus Memory — не замена mem0 «по умолчанию», а другой выбор по владению. Если память должна принадлежать пользователю, переживать смену рантайма и быть проверяемой — смотрите сюда. Если нужно быстро добавить память в существующее приложение — начните с привычного слоя, а сюда приходите, когда упрётесь в их границы.
chatbot-prod, он организует записи внутри аккаунта, но изоляцию между пользователями обеспечивает владелец.