opencode-mem — долговременная память для AI-агентов на OpenCode
📂 Исходный код на GitHubПлагин для OpenCode, дающий кодинг-агентам постоянную память на основе локальной векторной базы Turso/libSQL: автосохранение технического контекста, профиль пользователя, веб-интерфейс и векторный поиск.
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, и плагин скачается автоматически при следующем запуске.
Повседневное использование
С дефолтными настройками память накапливается сама по себе — просить агента «запомнить» что-то не нужно.
- Включите плагин и перезапустите OpenCode.
- Настройте AI-провайдера для авто-захвата:
opencodeProvider+opencodeModel(или"opencodeModel": "inherit"). - Работайте как обычно. Когда сессия уходит в idle, auto-capture извлекает запомнившийся технический контекст.
- В следующих сессиях релевантные воспоминания подставляются в контекст (настройки
chatMessage/ compaction). Просматривать и редактировать их можно в веб-интерфейсе по адресуhttp://127.0.0.1:4747. - Инструмент
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 в репозитории.
Ссылки
- Репозиторий: https://github.com/tickernelz/opencode-mem
- Issues: https://github.com/tickernelz/opencode-mem/issues
- Платформа OpenCode: https://opencode.ai
- Вдохновлён: opencode-supermemory
Лицензия MIT.