opencode-mem — долговременная память для AI-агентов на OpenCode

· 3 мин чтения
ai-agents opencode memory local-first vector-db
📂 Исходный код на GitHub

Плагин для OpenCode, дающий кодинг-агентам постоянную память на основе локальной векторной базы Turso/libSQL: автосохранение технического контекста, профиль пользователя, веб-интерфейс и векторный поиск.

opencode-mem — долговременная память для AI-агентов на OpenCode

open-mem — плагин для OpenCode, который даёт кодинг-агентам постоянную память между сессиями. Вместо того чтобы каждый новый диалог начинался «с чистого листа», агент автоматически запоминает контекст реальной работы и возвращает его в дальнейшем. Память хранится локально, в векторной базе данных Turso/libSQL, поэтому никакие записи не покидают вашу машину.

Плагин распространяется через npm как opencode-mem и ставится одной строкой в конфигурации OpenCode. Поддерживает автоматический захват контекста, изучение профиля пользователя, единую ленту «память → промпт» и полноценный веб-интерфейс для просмотра и управления воспоминаниями.

Основные возможности

  • Локальная база Turso/libSQL с нативным векторным поиском (F32_BLOB, vector_top_k).
  • Постоянные проектные воспоминания — одна память на проект.
  • Автоматическое изучение профиля пользователя (предпочтения и привычки в работе).
  • Единая лента «память → промпт» (timeline).
  • Полноценный веб-UI, доступный локально по адресу http://127.0.0.1:4747.
  • Извлечение памяти на основе промпта через фоновый AI-запрос (auto-capture).
  • Поддержка нескольких AI-провайдеров: OpenAI и Anthropic.
  • Более 12 локальных embedding-моделей.
  • Умная дедупликация и встроенная защита приватности.

Для работы не нужна отдельная векторная база или кастомная сборка SQLite — плагин использует встроенное embedded Turso/libSQL. Поддерживаемые CLI-платформы: Linux, Windows, macOS 15 и macOS 26 на Intel и Apple Silicon.

Установка

Добавьте плагин в конфигурацию OpenCode по адресу ~/.config/opencode/opencode.json:

{
  "plugin": ["opencode-mem"],
}

На Windows используйте %USERPROFILE%\.config\opencode\opencode.json — плагин не читает %APPDATA% или %LOCALAPPDATA% для точки входа в OpenCode. После добавления перезапустите OpenCode, и плагин скачается автоматически при следующем запуске.

Повседневное использование

С дефолтными настройками память накапливается сама по себе — просить агента «запомнить» что-то не нужно.

  1. Включите плагин и перезапустите OpenCode.
  2. Настройте AI-провайдера для авто-захвата: opencodeProvider + opencodeModel (или "opencodeModel": "inherit").
  3. Работайте как обычно. Когда сессия уходит в idle, auto-capture извлекает запомнившийся технический контекст.
  4. В следующих сессиях релевантные воспоминания подставляются в контекст (настройки chatMessage / compaction). Просматривать и редактировать их можно в веб-интерфейсе по адресу http://127.0.0.1:4747.
  5. Инструмент memory позволяет сохранить или достать что-то немедленно.

Автоматически и вручную

Подход Когда запускается Что вы делаете
Auto-capture (autoCaptureEnabled: true, по умолчанию) После ходов диалога, когда сессия уходит в idle Ничего — извлечение автоматическое
Вручную инструмент memory / команды По требованию add, search, list, profile, forget, list-shards, migrate, export, import

Ручной поиск/добавление/список работают даже без настроенного провайдера. Auto-capture и изучение профиля требуют провайдера, который умеет возвращать структурированный вывод (structured/tool-call).

Память vs. AGENTS.md

Хранить в памяти Хранить в AGENTS.md / статике
Проектные решения, паттерны багов, «мы пробовали X, и не сработало» Стабильные правила и рабочие процессы, которые редко меняются
Предпочтения пользователя, выявленные за сессии Постоянные соглашения и кодинг-конвенции
Факты, которые переходят между чатами Инструкции, которые каждый агент должен видеть независимо от поиска

Правило: если это устойчивая инструкция проекта — в AGENTS.md; если это контекст, который растёт из реальной работы, — пусть память (или auto-capture) хранит его.

Использование инструмента memory

Инструмент вызывается из сессии OpenCode с JSON-аргументами:

memory({ mode: "add", content: "Project uses microservices architecture" });
memory({ mode: "search", query: "architecture decisions" });
memory({ mode: "search", query: "architecture decisions", scope: "all-projects" });
memory({ mode: "profile" });
memory({ mode: "list", limit: 10 });
memory({ mode: "export", outputPath: "./memories.json" });
memory({ mode: "import", inputPath: "./memories.json" });

Веб-интерфейс открывается по адресу http://127.0.0.1:4747 для визуального просмотра и управления памятью.

Настройки

Конфигурация выполняется в ~/.config/opencode/opencode-mem.jsonc (на Windows — %USERPROFILE%\.config\opencode\opencode-mem.jsonc). При первом старте плагин создаёт полный комментированный шаблон по этому пути. Самые частые настройки:

{
  "storagePath": "~/.opencode-mem/data",
  "embeddingModel": "Xenova/nomic-embed-text-v1",
  "memory": { "defaultScope": "project" },
  "webServerEnabled": true,
  "webServerPort": 4747,
  "autoCaptureEnabled": true,
  "opencodeProvider": "anthropic",
  "opencodeModel": "claude-haiku-4-5-20251001",
  "compaction": { "enabled": true, "memoryLimit": 10 },
  "chatMessage": { "enabled": true, "maxMemories": 3 }
}

Выбор embedding-моделей

Embeddings обеспечивают векторный поиск по памяти и профилю пользователя. Локальный (по умолчанию) используется только embeddingModel — модель загружается с Hugging Face при первом использовании и кэшируется в {storagePath}/.cache. Локальный backend не использует MLX — local embeddings работают через @huggingface/transformers с ONNX.

Рекомендуемые локальные модели:

Модель Размерность Замечания
Xenova/nomic-embed-text-v1 768 По умолчанию; мультиязычная, контекст 8192
Xenova/jina-embeddings-v2-base-en 768 Только английский, контекст 8192
Xenova/jina-embeddings-v2-small-en 512 Быстрее, контекст 8192
Xenova/all-MiniLM-L6-v2 384 Очень быстрая, контекст 512
Xenova/all-mpnet-base-v2 768 Хорошее качество, контекст 512

Ремоутный OpenAI-совместимый endpoint настраивается через embeddingApiUrl и embeddingApiKey:

{
  "embeddingApiUrl": "https://api.openai.com/v1",
  "embeddingApiKey": "env://OPENAI_API_KEY",
  "embeddingModel": "text-embedding-3-small",
}

Менять embedding-модель (или размерность) стоит аккуратно: это может запустить пере-embedding сохранённых воспоминаний при следующем старте.

Область памяти (scope)

  • scope: "project" — запрос только по текущему проекту. Это значение по умолчанию.
  • scope: "all-projects" — поиск/список по всем проектным шардам.
  • memory.defaultScope задаёт область по умолчанию, когда явный scope не передан.

Общий доступ к памяти между репозиториями

По умолчанию проект определяется по охватывающему git-репозиторию, поэтому каждый физический репозиторий получает изолированное хранилище памяти. Для multi-repo воркспейсов (monorepo, деревья repo от Google и т.п.) ставьте пустой маркерный файл .opencode-mem-project в корень воркспейса:

my-workspace/
├── .opencode-mem-project   ← корень воркспейса
├── kernel/                 (собственный git-репозиторий)
├── userspace/              (собственный git-репозиторий)
└── tools/                  (собственный git-репозиторий)
touch ~/my-workspace/.opencode-mem-project

Тогда каждая сессия, запущенная где-либо под маркером, разрешается в этот корень и делит одно хранилище. Маркер приоритетнее git-детекции: когда он есть, git-remote вложенного репозитория игнорируется.

Перенос и восстановление памяти

Ключи проектных шардов — хэши от проектной идентичности. Переезд репозитория (миграция ОС, изменение пути, смена mount) может «осиротить» старый шард под ~/.opencode-mem/data/projects/. Перенос делается инструментом memory:

memory({ mode: "migrate", fromPath: "/old/path/to/project", dryRun: true });
memory({ mode: "migrate", fromPath: "/old/path/to/project" });

Если старый путь исчез — сначала найдите осиротевший шард через list-shards, затем мигрируйте по хэшу:

memory({ mode: "list-shards" });
memory({ mode: "migrate", fromHash: "fa645294d88bbae2" });

Резервное копирование между машинами:

// на исходной машине / старом чекауте
memory({ mode: "export", outputPath: "./memories.json" });

// на целевой машине / новом чекауте
memory({ mode: "import", inputPath: "./memories.json", dryRun: true });
memory({ mode: "import", inputPath: "./memories.json" });

Экспорт пишет версионный JSON-документ без векторов; импорт пересчитывает embeddings текущей моделью. Экспортные файлы — обычный текст и могут содержать ваш контент памяти, имена и e-mail, URL репозиториев и абсолютные пути, поэтому храните их как другие чувствительные резервные копии.

Auto-capture AI-провайдер

Auto-capture запускает фоновый AI-запрос, чтобы получить итог технической работы и сохранить его в память. Рекомендуется провайдер, уже аутентифицированный в OpenCode:

"opencodeProvider": "anthropic",
"opencodeModel": "claude-haiku-4-5-20251001",

Плагин отправляет запросы к сессии opencode (structured-output), а не к endpoints провайдера напрямую, поэтому авторизацией, обновлением токенов и роутингом занимается OpenCode. opencodeModel: "inherit" позволяет переиспользовать модель конкретного промпта. Резервная ручная конфигурация:

"memoryProvider": "openai-chat",
"memoryModel": "gpt-4o-mini",
"memoryApiUrl": "https://api.openai.com/v1",
"memoryApiKey": "env://OPENAI_API_KEY",

Поддерживаемые форматы API-ключа: литерал, file://..., env://....

Публичный подмодуль opencode-mem/tags

Стабильный сабпат, который могут импортировать другие плагины для записи в тот же memory-store:

import { getProjectTagInfo, getUserTagInfo, getTags } from "opencode-mem/tags";

const projectTag = getProjectTagInfo(process.cwd()).tag;
const userTag = getUserTagInfo().tag;
const { user, project } = getTags(process.cwd());

Канонический тег проекта формируется из git remote (или корня проекта) вида opencode_project_<sha16>, тег пользователя — из git config user.email вида opencode_user_<sha16>. Эти же теги пишет auto-capture, поэтому сторонние плагины, вызывающие POST /api/memories, попадут в те же шарды.

Разработка и контрибьюшн

Локальная сборка и тесты:

bun install
bun run build
bun run typecheck
bun run format

Проект активно ищет контрибьюторов, чтобы стать де-факто стандартным memory-плагином для AI кодинг-агентов. Если наткнулись на баг или есть идеи улучшений — оформляйте pull request в репозитории.

Ссылки

Лицензия MIT.

Источник: https://github.com/tickernelz/opencode-mem